From ef02d2417f1bcbc1462da90364dc244c147a0436 Mon Sep 17 00:00:00 2001 From: rlacko <rlacko@sch.bme.hu> Date: Sun, 2 Aug 2020 19:34:21 +0200 Subject: [PATCH] get list of users by role and set unique indexes --- src/resources/groups/groupsModel.js | 3 +-- src/resources/user/__tests__/userFuncTest.js | 9 +++++++ src/resources/user/userControllers.js | 25 ++++++++++++++------ src/resources/user/userDocs.yml | 16 +++++++++++++ src/resources/user/userModel.js | 4 +--- src/resources/user/userRouter.js | 3 +++ 6 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/resources/groups/groupsModel.js b/src/resources/groups/groupsModel.js index f9fc054..c3dc1c4 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 619a9b3..973d767 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 696bdb3..875314b 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 d68a336..1a836b3 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 646dcfd..9321af1 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 ee018b9..583a0c9 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') -- GitLab