@@ -25,30 +25,65 @@ async function manageVanillaUser (data) {
25
25
throw new Error ( 'The group wasn\'t not found by challengeID' )
26
26
}
27
27
let { body : [ vanillaUser ] } = await vanillaClient . getUserByName ( username )
28
+
29
+ const { text : topcoderProfileResponseStr , status } = await topcoderApi . getUserDetailsByHandle ( username )
30
+
31
+ const topcoderProfileResponse = JSON . parse ( topcoderProfileResponseStr ) . result
32
+ if ( status !== 200 ) {
33
+ throw new Error ( 'Couldn\'t load Topcoder profile' , topcoderProfileResponse . content )
34
+ }
35
+ const topcoderProfile = JSON . parse ( topcoderProfileResponseStr ) . result . content [ 0 ]
36
+
37
+ const { text : topcoderRolesResponseStr } = await topcoderApi . getRoles ( topcoderProfile . id )
38
+ const topcoderRolesResponse = JSON . parse ( topcoderRolesResponseStr ) . result . content
39
+ const topcoderRoleNames = _ . map ( topcoderRolesResponse , 'roleName' )
40
+
41
+ const { body : allVanillaRoles } = await vanillaClient . getAllRoles ( )
42
+
43
+ // Add all missing Topcoder roles
44
+ await addTopcoderRoles ( allVanillaRoles , topcoderRoleNames )
45
+
46
+ const { body : allNewVanillaRoles } = await vanillaClient . getAllRoles ( )
47
+
48
+ let allTopcoderRoles = _ . filter ( allNewVanillaRoles , { type : 'topcoder' } )
49
+
50
+ let nonTopcoderRoles = _ . filter ( allNewVanillaRoles , role => role [ 'type' ] != 'topcoder' )
51
+ let nonTopcoderRoleIDs = _ . map ( nonTopcoderRoles , 'roleID' )
52
+
53
+ let userTopcoderRoles = _ . filter ( allTopcoderRoles , role => topcoderRoleNames . includes ( role [ 'name' ] ) )
54
+ let userTopcoderRoleIDs = _ . map ( userTopcoderRoles , 'roleID' )
55
+
28
56
if ( ! vanillaUser ) {
29
57
logger . info ( `The '${ username } ' user wasn't found in Vanilla` )
30
- const { text : topcoderProfileResponseStr , status } = await topcoderApi . getUserDetailsByHandle ( username )
31
58
32
- const topcoderProfileResponse = JSON . parse ( topcoderProfileResponseStr ) . result
33
- if ( status !== 200 ) {
34
- throw new Error ( 'Couldn\'t load Topcoder profile' , topcoderProfileResponse . content )
35
- }
36
- const topcoderProfile = JSON . parse ( topcoderProfileResponseStr ) . result . content [ 0 ]
37
- const { body : roles } = await vanillaClient . getAllRoles ( )
38
- const defaultRoles = _ . filter ( roles , { type : 'member' } )
39
- const roleIDs = _ . map ( defaultRoles , 'roleID' )
59
+ const defaultVanillaRoles = _ . filter ( allNewVanillaRoles , { type : 'member' } )
60
+ const defaultVanillaRoleIDs = _ . map ( defaultVanillaRoles , 'roleID' )
61
+
40
62
const userData = {
41
63
bypassSpam : true ,
42
- email : topcoderProfile . email + '2' ,
64
+ email : topcoderProfile . email ,
43
65
emailConfirmed : true ,
44
66
name : username ,
45
67
password : utils . randomValue ( 8 ) ,
46
68
photo : null ,
47
- roleID : roleIDs
69
+ roleID : [ ... defaultVanillaRoleIDs , ... userTopcoderRoleIDs ]
48
70
}
71
+
49
72
const { body : user } = await vanillaClient . addUser ( userData )
50
73
vanillaUser = user
51
74
logger . info ( `New user with UserID=${ vanillaUser . userID } was added.` )
75
+ } else {
76
+ // Get a full user profile with roles
77
+ const { body : user } = await vanillaClient . getUser ( vanillaUser . userID )
78
+ vanillaUser = user
79
+
80
+ // Sync Topcoder roles
81
+ const allCurrentUserRoleIDs = _ . map ( vanillaUser . roles , 'roleID' ) ;
82
+ const currentVanillaRoleIDs = _ . intersection ( allCurrentUserRoleIDs , nonTopcoderRoleIDs )
83
+ const userData = {
84
+ roleID : [ ...currentVanillaRoleIDs , ...userTopcoderRoleIDs ]
85
+ }
86
+ await vanillaClient . updateUser ( vanillaUser . userID , userData )
52
87
}
53
88
54
89
const { body : categories } = await vanillaClient . getCategoriesByParentUrlCode ( challengeId )
@@ -83,6 +118,26 @@ async function manageVanillaUser (data) {
83
118
}
84
119
}
85
120
121
+ async function addTopcoderRoles ( allVanillaRoles , topcoderRoleNames ) {
122
+ const allTopcoderRoles = _ . filter ( allVanillaRoles , { type : 'topcoder' } )
123
+ const userTopcoderRoles = _ . filter ( allTopcoderRoles , role => topcoderRoleNames . includes ( role [ 'name' ] ) )
124
+ const userTopcoderRoleIDs = _ . map ( userTopcoderRoles , 'roleID' )
125
+
126
+ if ( topcoderRoleNames . length != userTopcoderRoleIDs . length ) {
127
+ const missingRoles = _ . difference ( topcoderRoleNames , _ . map ( userTopcoderRoles , 'name' ) )
128
+ logger . info ( 'Missing roles:' + JSON . stringify ( missingRoles ) )
129
+ for ( const missingRole of missingRoles ) {
130
+ await vanillaClient . createRole ( {
131
+ canSession : 1 ,
132
+ description : 'Added by Challenge Forum Processor' ,
133
+ name : missingRole ,
134
+ type : 'topcoder'
135
+ } )
136
+ logger . info ( `Missing roles ${ missingRole } was added` )
137
+ }
138
+ }
139
+ }
140
+
86
141
/**
87
142
* Create a vanilla forum group for a challenge.
88
143
*
0 commit comments