Skip to content

Commit 03e1f1a

Browse files
authored
Merge pull request #34 from topcoder-platform/forums-issues-60
Synced Topcoder roles
2 parents 2b47f64 + 4be9cca commit 03e1f1a

File tree

2 files changed

+78
-12
lines changed

2 files changed

+78
-12
lines changed

src/services/vanilla.js

Lines changed: 66 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,30 +25,65 @@ async function manageVanillaUser (data) {
2525
throw new Error('The group wasn\'t not found by challengeID')
2626
}
2727
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+
2856
if (!vanillaUser) {
2957
logger.info(`The '${username}' user wasn't found in Vanilla`)
30-
const { text: topcoderProfileResponseStr, status } = await topcoderApi.getUserDetailsByHandle(username)
3158

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+
4062
const userData = {
4163
bypassSpam: true,
42-
email: topcoderProfile.email + '2',
64+
email: topcoderProfile.email,
4365
emailConfirmed: true,
4466
name: username,
4567
password: utils.randomValue(8),
4668
photo: null,
47-
roleID: roleIDs
69+
roleID: [...defaultVanillaRoleIDs, ...userTopcoderRoleIDs]
4870
}
71+
4972
const { body: user } = await vanillaClient.addUser(userData)
5073
vanillaUser = user
5174
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)
5287
}
5388

5489
const { body: categories } = await vanillaClient.getCategoriesByParentUrlCode(challengeId)
@@ -83,6 +118,26 @@ async function manageVanillaUser (data) {
83118
}
84119
}
85120

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+
86141
/**
87142
* Create a vanilla forum group for a challenge.
88143
*

src/utils/topcoder-api.util.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,20 @@ async function updateChallenge (challengeId, data) {
9191
return reqToAPI('PATCH', path, data)
9292
}
9393

94+
/**
95+
* Gets the roles for an user
96+
* @param {int} userId User's ID
97+
*/
98+
async function getRoles (userId) {
99+
const path = `${config.TOPCODER.API_URL}/v3/roles?filter=subjectID%3D${userId}`
100+
return reqToAPI('GET', path)
101+
}
102+
103+
94104
module.exports = {
95105
getUserDetailsById,
96106
getUserDetailsByHandle,
97107
getChallenge,
98-
updateChallenge
108+
updateChallenge,
109+
getRoles
99110
}

0 commit comments

Comments
 (0)