|
1 | 1 | // Copyright 2020 Itty Bitty Apps Pty Ltd |
2 | 2 |
|
3 | 3 | import ArgumentParser |
4 | | -import Foundation |
5 | | -import Files |
6 | 4 |
|
7 | 5 | struct PushBetaGroupsCommand: CommonParsableCommand { |
8 | 6 |
|
9 | 7 | static var configuration = CommandConfiguration( |
10 | 8 | commandName: "push", |
11 | | - abstract: "TODO." |
| 9 | + abstract: "Push local beta group config files to server, update server beta groups" |
12 | 10 | ) |
13 | 11 |
|
14 | 12 | @OptionGroup() |
15 | 13 | var common: CommonOptions |
16 | 14 |
|
17 | | - @Flag(help: "TODO") |
| 15 | + @Option( |
| 16 | + default: "./config/betagroups", |
| 17 | + help: "Path to the Folder containing the information about beta groups. (default: './config/betagroups')" |
| 18 | + ) var inputPath: String |
| 19 | + |
| 20 | + @Flag(help: "Perform a dry run.") |
18 | 21 | var dryRun: Bool |
19 | 22 |
|
20 | 23 | func run() throws { |
21 | 24 | let service = try makeService() |
| 25 | + let folderManager = BetaGroupFolderManager(path: inputPath) |
22 | 26 |
|
23 | 27 | let serverGroups = Set(try service.pullBetaGroups().map{ $0.betaGroup }) |
| 28 | + let localGroups = Set(try folderManager.read()) |
| 29 | + |
| 30 | + let strategies = compareGroups( |
| 31 | + localGroups: localGroups, |
| 32 | + serverGroups: serverGroups |
| 33 | + ) |
| 34 | + |
| 35 | + let renderer = Renderers.SyncResultRenderer<BetaGroup>() |
| 36 | + |
| 37 | + if dryRun { |
| 38 | + renderer.render(strategies, isDryRun: true) |
| 39 | + } else { |
| 40 | + try strategies.forEach { (strategy: SyncStrategy) in |
| 41 | + switch strategy { |
| 42 | + case .create(let group): |
| 43 | + _ = try service.createBetaGroup( |
| 44 | + appBundleId: group.app.bundleId!, |
| 45 | + groupName: group.groupName!, |
| 46 | + publicLinkEnabled: group.publicLinkEnabled ?? false, |
| 47 | + publicLinkLimit: group.publicLinkLimit |
| 48 | + ) |
| 49 | + case .delete(let group): |
| 50 | + try service.deleteBetaGroup(with: group.id!) |
| 51 | + case .update(let group): |
| 52 | + try service.updateBetaGroup(betaGroup: group) |
| 53 | + } |
| 54 | + |
| 55 | + renderer.render(strategy, isDryRun: false) |
| 56 | + } |
24 | 57 |
|
25 | | - var localGroups = Set<BetaGroup>() |
26 | | - |
27 | | - for file in try Folder(path: "./config/betagroups").files { |
28 | | - if file.extension == "yml" { |
29 | | - let group = Readers |
30 | | - .FileReader<BetaGroup>(format: .yaml) |
31 | | - .read(filePath: file.path) |
| 58 | + let betaGroupWithTesters = try service.pullBetaGroups() |
32 | 59 |
|
33 | | - localGroups.insert(group) |
34 | | - } |
| 60 | + try folderManager.save(groupsWithTesters: betaGroupWithTesters) |
35 | 61 | } |
| 62 | + } |
| 63 | + |
| 64 | + func compareGroups(localGroups: Set<BetaGroup>, serverGroups: Set<BetaGroup>) -> [SyncStrategy<BetaGroup>] { |
| 65 | + var strategies: [SyncStrategy<BetaGroup>] = [] |
36 | 66 |
|
37 | 67 | let groupToCreate = localGroups.subtracting(serverGroups) |
38 | 68 | let groupToDelete = serverGroups.subtracting(localGroups) |
39 | 69 |
|
40 | | - guard !dryRun else { |
41 | | - groupToCreate.forEach { |
42 | | - print("+\($0.groupName!)") |
| 70 | + groupToDelete.forEach { group in |
| 71 | + if !localGroups.contains(where: { group.id == $0.id }) { |
| 72 | + strategies.append(.delete(group)) |
43 | 73 | } |
44 | | - |
45 | | - groupToDelete.forEach { |
46 | | - print("-\($0.groupName!)") |
47 | | - } |
48 | | - return |
49 | 74 | } |
50 | 75 |
|
51 | | - try groupToDelete.forEach { |
52 | | - try service.deleteBetaGroup(with: $0.id!) |
53 | | - print("➖ \($0.groupName!)") |
| 76 | + groupToCreate.forEach { group in |
| 77 | + serverGroups.contains(where: { group.id == $0.id }) |
| 78 | + ? strategies.append(.update(group)) |
| 79 | + : strategies.append(.create(group)) |
54 | 80 | } |
55 | 81 |
|
56 | | - try groupToCreate.forEach { |
57 | | - _ = try service.createBetaGroup( |
58 | | - appBundleId: $0.app.bundleId!, |
59 | | - groupName: $0.groupName ?? "group name", |
60 | | - publicLinkEnabled: $0.publicLinkEnabled ?? false, |
61 | | - publicLinkLimit: $0.publicLinkLimit |
62 | | - ) |
63 | | - |
64 | | - print("➕ \($0.groupName!)") |
65 | | - } |
| 82 | + return strategies |
66 | 83 | } |
67 | | - |
68 | 84 | } |
0 commit comments