Skip to content

Commit fe92a6c

Browse files
committed
Wire up PushBetaGroupCommand with sync funcs and strategies
1 parent 2082ac6 commit fe92a6c

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

Sources/AppStoreConnectCLI/Commands/TestFlight/BetaGroups/Sync/PushBetaGroupsCommand.swift

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright 2020 Itty Bitty Apps Pty Ltd
22

33
import ArgumentParser
4+
import FileSystem
5+
import Foundation
46
import struct Model.BetaGroup
57

68
struct PushBetaGroupsCommand: CommonParsableCommand {
@@ -22,7 +24,66 @@ struct PushBetaGroupsCommand: CommonParsableCommand {
2224
var dryRun: Bool
2325

2426
func run() throws {
27+
let service = try makeService()
2528

29+
let resourceProcessor = BetaGroupProcessor(path: .folder(path: inputPath))
30+
31+
let serverGroups = Set(try service.pullBetaGroups().map{ $0.betaGroup })
32+
let localGroups = Set(try resourceProcessor.read())
33+
34+
let strategies = compareGroups(
35+
localGroups: localGroups,
36+
serverGroups: serverGroups
37+
)
38+
39+
let renderer = Renderers.SyncResultRenderer<BetaGroup>()
40+
41+
if dryRun {
42+
renderer.render(strategies, isDryRun: true)
43+
} else {
44+
try strategies.forEach { (strategy: SyncStrategy) in
45+
switch strategy {
46+
case .create(let group):
47+
_ = try service.createBetaGroup(
48+
appBundleId: group.app.bundleId!,
49+
groupName: group.groupName,
50+
publicLinkEnabled: group.publicLinkEnabled ?? false,
51+
publicLinkLimit: group.publicLinkLimit
52+
)
53+
case .delete(let group):
54+
try service.deleteBetaGroup(with: group.id!)
55+
case .update(let group):
56+
try service.updateBetaGroup(betaGroup: group)
57+
}
58+
59+
renderer.render(strategy, isDryRun: false)
60+
}
61+
62+
let betaGroupWithTesters = try service.pullBetaGroups()
63+
64+
try resourceProcessor.write(groupsWithTesters: betaGroupWithTesters)
65+
}
66+
}
67+
68+
func compareGroups(localGroups: Set<BetaGroup>, serverGroups: Set<BetaGroup>) -> [SyncStrategy<BetaGroup>] {
69+
var strategies: [SyncStrategy<BetaGroup>] = []
70+
71+
let groupToCreate = localGroups.subtracting(serverGroups)
72+
let groupToDelete = serverGroups.subtracting(localGroups)
73+
74+
groupToDelete.forEach { group in
75+
if !localGroups.contains(where: { group.id == $0.id }) {
76+
strategies.append(.delete(group))
77+
}
78+
}
79+
80+
groupToCreate.forEach { group in
81+
serverGroups.contains(where: { group.id == $0.id })
82+
? strategies.append(.update(group))
83+
: strategies.append(.create(group))
84+
}
85+
86+
return strategies
2687
}
2788

2889
}

Sources/AppStoreConnectCLI/Model/BetaGroup.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,9 @@ extension BetaGroup {
7373
)
7474
}
7575
}
76+
77+
extension BetaGroup: SyncResultRenderable {
78+
var syncResultText: String {
79+
"\(app.bundleId ?? "" )_\(groupName)"
80+
}
81+
}

0 commit comments

Comments
 (0)