Skip to content

Commit 4b2a081

Browse files
Merge pull request #351 from Real-Dev-Squad/migrate-member-userRole
Script to migrate user roles
2 parents 642f813 + 93b5765 commit 4b2a081

File tree

5 files changed

+193
-9
lines changed

5 files changed

+193
-9
lines changed

controllers/members.js

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const memberQuery = require('../models/members')
1+
const { fetchMembers, migrateUsers, deleteIsMemberProperty } = require('../models/members')
22
const tasks = require('../models/tasks')
33

44
/**
@@ -10,7 +10,7 @@ const tasks = require('../models/tasks')
1010

1111
const getMembers = async (req, res) => {
1212
try {
13-
const allMembers = await memberQuery.fetchMembers()
13+
const allMembers = await fetchMembers()
1414

1515
return res.json({
1616
message: allMembers.length ? 'Members returned successfully!' : 'No member found',
@@ -31,7 +31,7 @@ const getMembers = async (req, res) => {
3131

3232
const getIdleMembers = async (req, res) => {
3333
try {
34-
const allMembers = await memberQuery.fetchMembers()
34+
const allMembers = await fetchMembers()
3535
const taskParticipants = await tasks.fetchActiveTaskMembers()
3636
const idleMembers = allMembers?.filter(({ id }) => !taskParticipants.has(id))
3737
const idleMemberUserNames = idleMembers?.map((member) => member.username)
@@ -46,7 +46,47 @@ const getIdleMembers = async (req, res) => {
4646
}
4747
}
4848

49+
/**
50+
* Returns the lists of usernames migrated
51+
*
52+
* @param req {Object} - Express request object
53+
* @param res {Object} - Express response object
54+
*/
55+
const migrateUserRoles = async (req, res) => {
56+
try {
57+
const migratedUserData = await migrateUsers()
58+
return res.json({
59+
message: 'Users migrated successfully',
60+
...migratedUserData
61+
})
62+
} catch (error) {
63+
logger.error(`Error while migrating user roles: ${error}`)
64+
return res.boom.badImplementation('Something went wrong. Please contact admin')
65+
}
66+
}
67+
68+
/**
69+
* Returns the lists of usernames whose isMember property was deleted
70+
*
71+
* @param req {Object} - Express request object
72+
* @param res {Object} - Express response object
73+
*/
74+
const deleteIsMember = async (req, res) => {
75+
try {
76+
const deletedIsMemberData = await deleteIsMemberProperty()
77+
return res.json({
78+
message: 'Users isMember deleted successfully',
79+
...deletedIsMemberData
80+
})
81+
} catch (error) {
82+
logger.error(`Error while deleting isMember: ${error}`)
83+
return res.boom.badImplementation('Something went wrong. Please contact admin')
84+
}
85+
}
86+
4987
module.exports = {
5088
getMembers,
51-
getIdleMembers
89+
getIdleMembers,
90+
migrateUserRoles,
91+
deleteIsMember
5292
}

docs/swaggerDefinition.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,17 @@ const swaggerOptions = {
398398
}
399399
}
400400
},
401+
migratedUsers: {
402+
type: 'object',
403+
properties: {
404+
count: {
405+
type: 'number'
406+
},
407+
users: {
408+
type: 'array'
409+
}
410+
}
411+
},
401412
users: {
402413
type: 'object',
403414
properties: {

models/members.js

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,67 @@ const fetchMembers = async () => {
3737
}
3838
}
3939

40+
/**
41+
* Migrate user roles
42+
* @return {Promise<usersMigrated|Object>}
43+
*/
44+
const migrateUsers = async () => {
45+
try {
46+
const userSnapShot = await userModel.where('isMember', '==', true).get()
47+
const migratedUsers = []
48+
49+
const usersArr = []
50+
51+
userSnapShot.forEach(doc => usersArr.push({ id: doc.id, ...doc.data() }))
52+
53+
for (const user of usersArr) {
54+
const roles = { ...user.roles, member: true }
55+
56+
await userModel.doc(user.id).set({
57+
...user,
58+
roles
59+
})
60+
61+
migratedUsers.push(user.username)
62+
}
63+
64+
return { count: migratedUsers.length, users: migratedUsers }
65+
} catch (err) {
66+
logger.error('Error migrating user roles', err)
67+
throw err
68+
}
69+
}
70+
71+
/**
72+
* Deletes isMember property from user object
73+
* @return {Promise<usersMigrated|Object>}
74+
*/
75+
const deleteIsMemberProperty = async () => {
76+
try {
77+
const userSnapShot = await userModel.where('roles', '!=', false).get()
78+
const migratedUsers = []
79+
80+
const usersArr = []
81+
82+
userSnapShot.forEach(doc => usersArr.push({ id: doc.id, ...doc.data() }))
83+
84+
for (const user of usersArr) {
85+
delete user.isMember
86+
87+
await userModel.doc(user.id).set({ ...user })
88+
89+
migratedUsers.push(user.username)
90+
}
91+
92+
return { count: migratedUsers.length, users: migratedUsers }
93+
} catch (err) {
94+
logger.error('Error deleting isMember property', err)
95+
throw err
96+
}
97+
}
98+
4099
module.exports = {
41-
fetchMembers
100+
fetchMembers,
101+
migrateUsers,
102+
deleteIsMemberProperty
42103
}

public/apiSchema.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

routes/members.js

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
const express = require('express')
22
const router = express.Router()
3-
const members = require('../controllers/members')
3+
const { getMembers, getIdleMembers, migrateUserRoles, deleteIsMember } = require('../controllers/members')
4+
const { authorizeUser } = require('../middlewares/authorization')
5+
const authenticate = require('../middlewares/authenticate')
46
const { addRecruiter } = require('../controllers/recruiters')
57
const { validateRecruiter } = require('../middlewares/validators/recruiter')
68

@@ -26,7 +28,7 @@ const { validateRecruiter } = require('../middlewares/validators/recruiter')
2628
* $ref: '#/components/schemas/errors/badImplementation'
2729
*/
2830

29-
router.get('/', members.getMembers)
31+
router.get('/', getMembers)
3032

3133
/**
3234
* @swagger
@@ -50,7 +52,7 @@ router.get('/', members.getMembers)
5052
* $ref: '#/components/schemas/errors/badImplementation'
5153
*/
5254

53-
router.get('/idle', members.getIdleMembers)
55+
router.get('/idle', getIdleMembers)
5456

5557
/**
5658
* @swagger
@@ -84,4 +86,74 @@ router.get('/idle', members.getIdleMembers)
8486

8587
router.post('/intro/:username', validateRecruiter, addRecruiter)
8688

89+
/**
90+
* @swagger
91+
* /members/member-to-role-migration:
92+
* patch:
93+
* summary: One time call to update roles of the users
94+
* tags:
95+
* - Members
96+
* responses:
97+
* 200:
98+
* description: Details of the users migrated
99+
* content:
100+
* application/json:
101+
* schema:
102+
* $ref: '#/components/schemas/migratedUsers'
103+
* 401:
104+
* description: unAuthorized
105+
* content:
106+
* application/json:
107+
* schema:
108+
* $ref: '#/components/schemas/errors/unAuthorized'
109+
* 403:
110+
* description: forbidden
111+
* content:
112+
* application/json:
113+
* schema:
114+
* $ref: '#/components/schemas/errors/forbidden'
115+
* 500:
116+
* description: badImplementation
117+
* content:
118+
* application/json:
119+
* schema:
120+
* $ref: '#/components/schemas/errors/badImplementation'
121+
*/
122+
router.patch('/member-to-role-migration', authenticate, authorizeUser('superUser'), migrateUserRoles)
123+
124+
/**
125+
* @swagger
126+
* /members/delete-isMember:
127+
* patch:
128+
* summary: One time call to remove isMember field for all the migrated users
129+
* tags:
130+
* - Members
131+
* responses:
132+
* 200:
133+
* description: Details of the users migrated
134+
* content:
135+
* application/json:
136+
* schema:
137+
* $ref: '#/components/schemas/migratedUsers'
138+
* 401:
139+
* description: unAuthorized
140+
* content:
141+
* application/json:
142+
* schema:
143+
* $ref: '#/components/schemas/errors/unAuthorized'
144+
* 403:
145+
* description: forbidden
146+
* content:
147+
* application/json:
148+
* schema:
149+
* $ref: '#/components/schemas/errors/forbidden'
150+
* 500:
151+
* description: badImplementation
152+
* content:
153+
* application/json:
154+
* schema:
155+
* $ref: '#/components/schemas/errors/badImplementation'
156+
*/
157+
router.patch('/delete-isMember', authenticate, authorizeUser('superUser'), deleteIsMember)
158+
87159
module.exports = router

0 commit comments

Comments
 (0)