11// Copyright 2020 Itty Bitty Apps Pty Ltd
22
33import ArgumentParser
4+ import FileSystem
5+ import Foundation
46import struct Model. BetaGroup
57
68struct 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}
0 commit comments