Skip to content

Commit b8e95f1

Browse files
hubab1hubab1
authored andcommitted
feat(research): add atomic project copy
1 parent 261594d commit b8e95f1

4 files changed

Lines changed: 1601 additions & 0 deletions

File tree

OpenASO.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@
162162
D34G00000000000000000003 /* KeywordResearchKeywordSelectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34G00000000000000000013 /* KeywordResearchKeywordSelectionTests.swift */; };
163163
D34H00000000000000000001 /* KeywordResearchHistorySheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34H00000000000000000011 /* KeywordResearchHistorySheet.swift */; };
164164
D34H00000000000000000002 /* KeywordResearchHistoryPresentationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34H00000000000000000012 /* KeywordResearchHistoryPresentationTests.swift */; };
165+
D34J00000000000000000001 /* Persistence/KeywordResearchProjectCopyService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34J00000000000000000011 /* Persistence/KeywordResearchProjectCopyService.swift */; };
166+
D34J00000000000000000002 /* KeywordResearchProjectCopyServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34J00000000000000000012 /* KeywordResearchProjectCopyServiceTests.swift */; };
165167
D20B00000000000000000007 /* Persistence/EstimatedKeywordDifficultyStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20B00000000000000000014 /* Persistence/EstimatedKeywordDifficultyStore.swift */; };
166168
D20B00000000000000000008 /* Persistence/EstimatedKeywordDifficultyStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20B00000000000000000014 /* Persistence/EstimatedKeywordDifficultyStore.swift */; };
167169
D20B00000000000000000009 /* EstimatedKeywordDifficultyStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20B00000000000000000015 /* EstimatedKeywordDifficultyStoreTests.swift */; };
@@ -451,6 +453,8 @@
451453
D34G00000000000000000013 /* KeywordResearchKeywordSelectionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeywordResearchKeywordSelectionTests.swift; sourceTree = "<group>"; };
452454
D34H00000000000000000011 /* KeywordResearchHistorySheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeywordResearchHistorySheet.swift; sourceTree = "<group>"; };
453455
D34H00000000000000000012 /* KeywordResearchHistoryPresentationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeywordResearchHistoryPresentationTests.swift; sourceTree = "<group>"; };
456+
D34J00000000000000000011 /* Persistence/KeywordResearchProjectCopyService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persistence/KeywordResearchProjectCopyService.swift; sourceTree = "<group>"; };
457+
D34J00000000000000000012 /* KeywordResearchProjectCopyServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeywordResearchProjectCopyServiceTests.swift; sourceTree = "<group>"; };
454458
D20B00000000000000000014 /* Persistence/EstimatedKeywordDifficultyStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persistence/EstimatedKeywordDifficultyStore.swift; sourceTree = "<group>"; };
455459
D20B00000000000000000015 /* EstimatedKeywordDifficultyStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EstimatedKeywordDifficultyStoreTests.swift; sourceTree = "<group>"; };
456460
A20000000000000000000011 /* KeywordTableCells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeywordTableCells.swift; sourceTree = "<group>"; };
@@ -609,6 +613,7 @@
609613
D34F00000000000000000012 /* KeywordResearchWorkspaceSelectionTests.swift */,
610614
D34G00000000000000000013 /* KeywordResearchKeywordSelectionTests.swift */,
611615
D34H00000000000000000012 /* KeywordResearchHistoryPresentationTests.swift */,
616+
D34J00000000000000000012 /* KeywordResearchProjectCopyServiceTests.swift */,
612617
D09D00000000000000000007 /* TrackedKeywordRefreshStatusTests.swift */,
613618
D20B00000000000000000015 /* EstimatedKeywordDifficultyStoreTests.swift */,
614619
D02000000000000000000004 /* v0.3.2-v1 */,
@@ -720,6 +725,7 @@
720725
0A1B2C3D4E5F678901234514 /* RatingsReviews/AppStorefrontReviewService.swift */,
721726
A30000000000000000000002 /* Persistence/BackgroundModelStore.swift */,
722727
D32C00000000000000000011 /* Persistence/KeywordResearchProjectStore.swift */,
728+
D34J00000000000000000011 /* Persistence/KeywordResearchProjectCopyService.swift */,
723729
D33B00000000000000000011 /* Persistence/KeywordResearchTargetResolver.swift */,
724730
D20B00000000000000000014 /* Persistence/EstimatedKeywordDifficultyStore.swift */,
725731
A0D71B4C0000000000000014 /* Persistence/DailyRefreshScheduler.swift */,
@@ -1180,6 +1186,7 @@
11801186
0A1B2C3D4E5F678901234513 /* RatingsReviews/AppStorefrontReviewService.swift in Sources */,
11811187
A30000000000000000000001 /* Persistence/BackgroundModelStore.swift in Sources */,
11821188
D32C00000000000000000001 /* Persistence/KeywordResearchProjectStore.swift in Sources */,
1189+
D34J00000000000000000001 /* Persistence/KeywordResearchProjectCopyService.swift in Sources */,
11831190
D33B00000000000000000001 /* Persistence/KeywordResearchTargetResolver.swift in Sources */,
11841191
D33B00000000000000000002 /* AppleAds/KeywordResearchMetricsWorkflow.swift in Sources */,
11851192
D20B00000000000000000007 /* Persistence/EstimatedKeywordDifficultyStore.swift in Sources */,
@@ -1332,6 +1339,7 @@
13321339
D34F00000000000000000002 /* KeywordResearchWorkspaceSelectionTests.swift in Sources */,
13331340
D34G00000000000000000003 /* KeywordResearchKeywordSelectionTests.swift in Sources */,
13341341
D34H00000000000000000002 /* KeywordResearchHistoryPresentationTests.swift in Sources */,
1342+
D34J00000000000000000002 /* KeywordResearchProjectCopyServiceTests.swift in Sources */,
13351343
D09D00000000000000000008 /* TrackedKeywordRefreshStatusTests.swift in Sources */,
13361344
D20B00000000000000000009 /* EstimatedKeywordDifficultyStoreTests.swift in Sources */,
13371345
D14000000000000000000002 /* AppMetadataRefreshProgressStoreTests.swift in Sources */,

OpenASO/App/AppServices.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ final class AppServices {
4242
let refreshProgressStore: AppRefreshProgressStore
4343
let mcpServerController: OpenASOMCPServerController
4444
let keywordResearchProjectStore: KeywordResearchProjectStore?
45+
let keywordResearchProjectCopyService: KeywordResearchProjectCopyService?
4546
let keywordResearchRankingWorkflow: KeywordResearchRankingWorkflow?
4647
let keywordResearchMetricsWorkflow: KeywordResearchMetricsWorkflow?
4748
private(set) var backgroundModelStore: BackgroundModelStore?
@@ -57,6 +58,7 @@ final class AppServices {
5758
allowsIconNetworkFetches: Bool = true,
5859
backgroundModelStore: BackgroundModelStore? = nil,
5960
keywordResearchProjectStore: KeywordResearchProjectStore? = nil,
61+
keywordResearchProjectCopyService: KeywordResearchProjectCopyService? = nil,
6062
keywordResearchRankingWorkflow: KeywordResearchRankingWorkflow? = nil,
6163
keywordResearchMetricsWorkflow: KeywordResearchMetricsWorkflow? = nil,
6264
refreshObservationClock: RefreshObservationClock = .live,
@@ -167,6 +169,10 @@ final class AppServices {
167169
?? backgroundModelStore.map {
168170
KeywordResearchProjectStore(backgroundModelStore: $0)
169171
}
172+
let keywordResearchProjectCopyService = keywordResearchProjectCopyService
173+
?? backgroundModelStore.map {
174+
KeywordResearchProjectCopyService(backgroundModelStore: $0)
175+
}
170176
let metadataEnrichmentHandler: (@Sendable ([RankingMetadataEnrichmentRequest]) async -> Void)?
171177
if let backgroundModelStore {
172178
metadataEnrichmentHandler = { requests in
@@ -374,6 +380,7 @@ final class AppServices {
374380
self.appDetailRefreshService = appDetailRefreshService
375381
self.refreshProgressStore = refreshProgressStore
376382
self.keywordResearchProjectStore = keywordResearchProjectStore
383+
self.keywordResearchProjectCopyService = keywordResearchProjectCopyService
377384
self.keywordResearchRankingWorkflow = keywordResearchRankingWorkflow
378385
self.keywordResearchMetricsWorkflow = keywordResearchMetricsWorkflow
379386
self.mcpServerController = OpenASOMCPServerController(portProvider: {

0 commit comments

Comments
 (0)