1
1
import { inject , injectable , multiInject } from 'inversify' ;
2
+ import { getLogger } from '@oclif/core' ;
2
3
3
4
import { TYPES } from '../inversify.types' ;
4
5
import { SourceService , SourceUser } from '../services/source.service' ;
5
- import { IntegrationConfig , RoleConfig } from '../types' ;
6
+ import { IntegrationConfig , RoleConfig , UserSummary } from '../types' ;
6
7
import { TargetService } from '../services/target.service' ;
8
+ import { SmtpNotificationService } from '../notification/smtp-notification.service' ;
9
+ import { roleFromConfig } from '../util/role.util' ;
7
10
8
11
type OutletMap = Map < string , Map < string , SourceUser > > ;
9
12
@@ -12,43 +15,67 @@ type OutletMap = Map<string, Map<string, SourceUser>>;
12
15
* Css sync controller
13
16
*/
14
17
export class AuthMemberSyncController {
18
+ private readonly console = getLogger ( 'AuthMemberSyncController' ) ;
15
19
/**
16
20
* Constructor
17
21
*/
18
22
constructor (
19
23
@multiInject ( TYPES . SourceService ) private sourceServices : SourceService [ ] ,
20
24
@inject ( TYPES . TargetService ) private targetService : TargetService ,
25
+ @inject ( TYPES . SmtpNotificationService )
26
+ private notificationService : SmtpNotificationService ,
21
27
) { }
22
28
23
29
public async sync ( integrationConfigs : IntegrationConfig [ ] ) {
24
30
const sdate = new Date ( ) ;
25
31
const userMap : { [ key in string ] : OutletMap } = { } ;
26
32
for ( const integrationConfig of integrationConfigs ) {
27
33
const idp = integrationConfig . idp ?? 'idir' ;
28
- console . log ( `>>> ${ integrationConfig . name } : Get users` ) ;
34
+ this . console . info ( `>>> ${ integrationConfig . name } : Get users` ) ;
29
35
userMap [ integrationConfig . name ] = await this . integrationMemberSync (
30
36
idp ,
31
37
integrationConfig . roles ,
32
38
) ;
33
39
34
40
for ( const environment of integrationConfig . environments ) {
35
41
const sEnvDate = new Date ( ) ;
36
- console . log ( `>>> ${ integrationConfig . name } - ${ environment } : start` ) ;
37
- await this . syncIntegrationRoleUsers (
38
- integrationConfig ,
39
- environment ,
40
- userMap [ integrationConfig . name ] ,
41
- idp ,
42
+ this . console . info (
43
+ `>>> ${ integrationConfig . name } - ${ environment } : start` ,
42
44
) ;
45
+ // const summaryMap = await this.syncIntegrationRoleUsers(
46
+ // integrationConfig,
47
+ // environment,
48
+ // userMap[integrationConfig.name],
49
+ // idp,
50
+ // );
51
+ const summaryMap = new Map < string , UserSummary > ( ) ;
52
+ summaryMap . set (
53
+ '483CFF50E3E94A22BDB082B56DE564B6' ,
54
+ new UserSummary ( {
55
+ guid : '483CFF50E3E94A22BDB082B56DE564B6' ,
56
+ domain : 'azureidir' ,
57
+ email : 'matthew.bystedt@gov.bc.ca' ,
58
+ name : 'Bystedt, Matthew WLRS:EX' ,
59
+ } ) ,
60
+ ) ;
61
+ summaryMap
62
+ . get ( '483CFF50E3E94A22BDB082B56DE564B6' )
63
+ ?. addRoles . push ( 'group_vault-user' ) ;
64
+ console . log ( summaryMap ) ;
65
+
66
+ this . notificationService . notifyUsers ( integrationConfig , [
67
+ ...summaryMap . values ( ) ,
68
+ ] ) ;
69
+
43
70
const eEnvDate = new Date ( ) ;
44
- console . log (
71
+ this . console . info (
45
72
`>>> ${ integrationConfig . name } - ${ environment } : done - ${ eEnvDate . getTime ( ) - sEnvDate . getTime ( ) } ms` ,
46
73
) ;
47
74
}
48
75
}
49
76
const edate = new Date ( ) ;
50
77
51
- console . log ( `Done - ${ edate . getTime ( ) - sdate . getTime ( ) } ms` ) ;
78
+ this . console . info ( `Done - ${ edate . getTime ( ) - sdate . getTime ( ) } ms` ) ;
52
79
}
53
80
54
81
private async syncIntegrationRoleUsers (
@@ -57,8 +84,9 @@ export class AuthMemberSyncController {
57
84
userRoles : OutletMap ,
58
85
idp : string ,
59
86
) {
87
+ const userSummary = new Map < string , UserSummary > ( ) ;
60
88
for ( const [ roleName , roleUserGuidMap ] of userRoles . entries ( ) ) {
61
- console . log ( `${ integrationConfig . id } ${ environment } ${ roleName } ` ) ;
89
+ this . console . info ( `${ integrationConfig . id } ${ environment } ${ roleName } ` ) ;
62
90
const existingUserGuidMap = await this . targetService . getRoleUsers (
63
91
integrationConfig . id ,
64
92
environment ,
@@ -74,11 +102,11 @@ export class AuthMemberSyncController {
74
102
. filter ( ( guid ) => ! existingUserGuidMap . has ( guid ) )
75
103
. map ( ( guid ) => roleUserGuidMap . get ( guid ) )
76
104
. filter ( ( user ) => ! ! user ) ;
77
- // console.log (`remove:`);
78
- // console.log (usersToRemove);
79
- // console.log (`add:`);
80
- // console.log (usersToAdd);
81
- await Promise . all ( [
105
+ // this. console.info (`remove:`);
106
+ // this. console.info (usersToRemove);
107
+ // this. console.info (`add:`);
108
+ // this. console.info (usersToAdd);
109
+ const [ finalizedAdd , finalizedDel ] = await Promise . all ( [
82
110
this . targetService . alterIntegrationRoleUser (
83
111
integrationConfig ,
84
112
environment ,
@@ -94,12 +122,25 @@ export class AuthMemberSyncController {
94
122
usersToRemove ,
95
123
) ,
96
124
] ) ;
125
+ for ( const finalize of finalizedAdd ) {
126
+ if ( ! userSummary . has ( finalize . guid ) ) {
127
+ userSummary . set ( finalize . guid , new UserSummary ( finalize ) ) ;
128
+ }
129
+ userSummary . get ( finalize . guid ) ?. addRoles . push ( roleName ) ;
130
+ }
131
+ for ( const finalize of finalizedDel ) {
132
+ if ( ! userSummary . has ( finalize . guid ) ) {
133
+ userSummary . set ( finalize . guid , new UserSummary ( finalize ) ) ;
134
+ }
135
+ userSummary . get ( finalize . guid ) ?. delRoles . push ( roleName ) ;
136
+ }
97
137
}
138
+ return userSummary ;
98
139
}
99
140
100
141
private async integrationMemberSync ( idp : string , roleConfigs : RoleConfig [ ] ) {
101
142
const roleConfigNames = roleConfigs . map ( ( roleConfig ) =>
102
- this . roleFromConfig ( roleConfig ) ,
143
+ roleFromConfig ( roleConfig ) ,
103
144
) ;
104
145
105
146
const outletMap = await this . addUserToRoleWithServices ( roleConfigs ) ;
@@ -174,19 +215,15 @@ export class AuthMemberSyncController {
174
215
if ( ! outletMap . has ( target ) ) {
175
216
continue ;
176
217
}
177
- callback (
178
- this . roleFromConfig ( roleConfig ) ,
179
- outletMap ,
180
- outletMap . get ( target ) ,
181
- ) ;
218
+ callback ( roleFromConfig ( roleConfig ) , outletMap , outletMap . get ( target ) ) ;
182
219
}
183
220
}
184
221
}
185
222
186
223
private async addUserToRoleWithServices ( roleConfigs : RoleConfig [ ] ) {
187
224
const outletMap = new Map < string , Map < string , SourceUser > > ( ) ;
188
225
for ( const roleConfig of roleConfigs ) {
189
- const role = this . roleFromConfig ( roleConfig ) ;
226
+ const role = roleFromConfig ( roleConfig ) ;
190
227
const users = await this . getUserMapFromServices ( roleConfig ) ;
191
228
if ( users . size > 0 ) {
192
229
outletMap . set ( role , users ) ;
@@ -203,12 +240,4 @@ export class AuthMemberSyncController {
203
240
}
204
241
return userMap ;
205
242
}
206
-
207
- private roleFromConfig ( roleConfig : RoleConfig ) {
208
- if ( roleConfig . group ) {
209
- return `${ roleConfig . group } _${ roleConfig . name } ` ;
210
- } else {
211
- return roleConfig . name ;
212
- }
213
- }
214
243
}
0 commit comments