diff --git a/src/resources/groups/groupsModel.js b/src/resources/groups/groupsModel.js index f9fc054694c65b3db8580ae1dd44abe4f5a40725..c3dc1c442db5b0b1bdce38bd21a4b543a3dc02a3 100644 --- a/src/resources/groups/groupsModel.js +++ b/src/resources/groups/groupsModel.js @@ -4,6 +4,7 @@ const GroupsSchema = new mongoose.Schema({ name: { type: String, required: true, + index: { unique: true }, }, description: { type: String, @@ -15,8 +16,6 @@ const GroupsSchema = new mongoose.Schema({ }, }) -GroupsSchema.index({ name: 1 }) - const Groups = mongoose.model('groups', GroupsSchema) exports.Groups = Groups diff --git a/src/resources/user/__tests__/userFuncTest.js b/src/resources/user/__tests__/userFuncTest.js index 619a9b3a16f98f29bfc1e536e9bcd1706cca3a42..973d7671562048b880459fecb73d62e4fe4f854d 100644 --- a/src/resources/user/__tests__/userFuncTest.js +++ b/src/resources/user/__tests__/userFuncTest.js @@ -130,6 +130,15 @@ describe('/user "Mentor" Functionality', () => { expect(response.statusCode).toBe(422) expect(response.body.messages).not.toBe(undefined) }) + test(`GET users by role`, async () => { + const user = await User.create(fakeUserJson) + let response = await authSession.get(`${endpointUrl}/role/normal`) + expect(response.body.data.length).toBe(1) + response = await authSession.get(`${endpointUrl}/role/accepted`) + expect(response.body.data.length).toBe(0) + response = await authSession.get(`${endpointUrl}/role/mentor`) + expect(response.body.data.length).toBe(1) + }) }) describe('/user "Accepted" Functionality', () => { diff --git a/src/resources/user/userControllers.js b/src/resources/user/userControllers.js index 696bdb30c907a84665f4c4f9c1edf140da7f99e8..875314b1a99dd76d79143b6950b1e87324ca017b 100644 --- a/src/resources/user/userControllers.js +++ b/src/resources/user/userControllers.js @@ -2,7 +2,7 @@ const { crudControllers, getMany } = require('../../utils/crud') const { User } = require('./userModel') const { pick } = require('lodash') -const defaultKeys = [ +const pickedKeys = [ 'schacc', 'fullName', 'secondaryEmail', @@ -33,7 +33,7 @@ module.exports.getOne = async (req, res) => { try { // Get Own User if (req.params.schacc === req.user.schacc && req.user.role !== 'mentor') - return res.status(200).json({ data: pick(req.user, defaultKeys) }) + return res.status(200).json({ data: pick(req.user, pickedKeys) }) // Get Other User if (req.user.role !== 'mentor') return res.status(403).end() @@ -47,7 +47,7 @@ module.exports.getOne = async (req, res) => { return res .status(200) - .json({ data: pick(user, [...defaultKeys, 'bit', 'presence']) }) + .json({ data: pick(user, [...pickedKeys, 'bit', 'presence']) }) } catch (err) { if (err.name === 'CastError') // Throwed by Mongoose @@ -59,7 +59,18 @@ module.exports.getOne = async (req, res) => { } // Overwrite the returned keys -module.exports.getMany = getMany(User, [...defaultKeys, 'bit', 'presence']) +module.exports.getMany = getMany(User, [...pickedKeys, 'bit', 'presence']) + +module.exports.getManyByRole = async (req, res) => { + try { + const docs = await User.find({ role: req.params.role }).lean().exec() + + res.status(200).json({ data: docs.map((e) => pick(e, pickedKeys)) }) + } catch (e) { + console.error(e) + res.status(400).end() + } +} // Doesn't delete the user just disable it module.exports.softRemove = async (req, res) => { @@ -81,7 +92,7 @@ module.exports.softRemove = async (req, res) => { return res .status(200) - .json({ data: pick(user, [...defaultKeys, 'bit', 'presence']) }) + .json({ data: pick(user, [...pickedKeys, 'bit', 'presence']) }) } catch (e) { console.error(e) return res.status(400).end() @@ -112,8 +123,8 @@ module.exports.updateOne = async (req, res) => { // Pick keys let returnData if (req.user.role === 'mentor') - returnData = pick(updatedUser, [...defaultKeys, 'bit', 'presence']) - else returnData = pick(updatedUser, defaultKeys) + returnData = pick(updatedUser, [...pickedKeys, 'bit', 'presence']) + else returnData = pick(updatedUser, pickedKeys) return res.status(200).json({ data: returnData, diff --git a/src/resources/user/userDocs.yml b/src/resources/user/userDocs.yml index d68a3367894859a225fb954fe46154da7867f39e..1a836b3532505d043001f9dd2b3e18d1bf83136f 100644 --- a/src/resources/user/userDocs.yml +++ b/src/resources/user/userDocs.yml @@ -52,6 +52,22 @@ paths: application/json: schema: $ref: '#/components/schemas/User' + /user/role/{role}: + get: + tags: + - 'User' + summary: 'Get a List of users by role' + description: 'This can only be done by a mentor.' + operationId: 'getAllUserByRole' + responses: + '200': + description: OK + content: + application/json: + schema: + type: 'array' + items: + $ref: '#/components/schemas/User' /user/schacc/{schacc}: get: tags: diff --git a/src/resources/user/userModel.js b/src/resources/user/userModel.js index 646dcfd8966343a6fe0459b6be99a83a1919f04a..9321af1c6a800207c6366647313bdfd892cc5264 100644 --- a/src/resources/user/userModel.js +++ b/src/resources/user/userModel.js @@ -10,7 +10,7 @@ const UserSchema = new mongoose.Schema( schacc: { type: String, required: true, - unique: true, + index: { unique: true }, }, fullName: { type: String, @@ -63,8 +63,6 @@ const UserSchema = new mongoose.Schema( { timestamps: true } ) -UserSchema.index({ schacc: 1 }) - const User = mongoose.model('user', UserSchema) exports.User = User diff --git a/src/resources/user/userRouter.js b/src/resources/user/userRouter.js index ee018b912fcb70e0806f9c57faaadd24ae452e6d..583a0c920c50a3a8cbc16aa0c3d9e8726492d0cf 100644 --- a/src/resources/user/userRouter.js +++ b/src/resources/user/userRouter.js @@ -7,6 +7,9 @@ const router = Router() // /api/v1/user router.route('/').get(isLoggedIn, isMentor, controllers.getMany) +// /api/v1/user/role/:role +router.route('/role/:role').get(isLoggedIn, isMentor, controllers.getManyByRole) + // /api/v1/user/schacc/:schacc router .route('/schacc/:schacc')