diff --git a/ExpressAPI/src/routes/ApiRoutesManager.ts b/ExpressAPI/src/routes/ApiRoutesManager.ts index 1508de4124baa104b7aac892da229685ecb9b998..1110c107f068052a254b5c3e1c55c681c2b9f461 100644 --- a/ExpressAPI/src/routes/ApiRoutesManager.ts +++ b/ExpressAPI/src/routes/ApiRoutesManager.ts @@ -6,6 +6,7 @@ import AssignmentRoutes from './AssignmentRoutes.js'; import GitlabRoutes from './GitlabRoutes.js'; import ExerciseRoutes from './ExerciseRoutes.js'; import TagsRoutes from './TagRoutes'; +import UserRoutes from './UserRoutes'; class AdminRoutesManager implements RoutesManager { @@ -16,6 +17,7 @@ class AdminRoutesManager implements RoutesManager { AssignmentRoutes.registerOnBackend(backend); ExerciseRoutes.registerOnBackend(backend); TagsRoutes.registerOnBackend(backend); + UserRoutes.registerOnBackend(backend); } } diff --git a/ExpressAPI/src/routes/UserRoutes.ts b/ExpressAPI/src/routes/UserRoutes.ts new file mode 100644 index 0000000000000000000000000000000000000000..4f729fe14f25c4ab8ff97ef118062737dbd6b06c --- /dev/null +++ b/ExpressAPI/src/routes/UserRoutes.ts @@ -0,0 +1,58 @@ +import { Express } from 'express-serve-static-core'; +import express, { RequestHandler } from 'express'; +import { StatusCodes } from 'http-status-codes'; +import RoutesManager from '../express/RoutesManager.js'; +import SecurityMiddleware from '../middlewares/SecurityMiddleware'; +import * as ExpressValidator from 'express-validator'; +import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware'; +import { Prisma, UserRole } from '@prisma/client'; +import UserManager from '../managers/UserManager'; + + +class UserRoutes implements RoutesManager { + private readonly usersGetValidator: ExpressValidator.Schema = { + role: { + trim : true, + notEmpty: false, + optional: true + } + }; + + registerOnBackend(backend: Express) { + backend.get('/users', SecurityMiddleware.check(true), ParamsValidatorMiddleware.validate(this.usersGetValidator), this.getUsers.bind(this) as RequestHandler); + } + + private async getUsers(req: express.Request, res: express.Response) { + + let roleFilter: Prisma.UserWhereInput | undefined = undefined; + + if ( req.query.role ) { + if ( req.query.role === UserRole.ADMIN ) { + roleFilter = { + role: UserRole.ADMIN + }; + } else if ( req.query.role === UserRole.TEACHING_STAFF ) { + roleFilter = { + OR: [ { + role: UserRole.ADMIN + }, { + role: UserRole.TEACHING_STAFF + } ] + }; + } else if ( req.query.role === UserRole.STUDENT ) { + roleFilter = { + role: UserRole.STUDENT + }; + } else { + return req.session.sendResponse(res, StatusCodes.FORBIDDEN); + } + } else if ( !req.session.profile.isAdmin ) { + return req.session.sendResponse(res, StatusCodes.FORBIDDEN); + } + + return req.session.sendResponse(res, StatusCodes.OK, await UserManager.getFiltered(roleFilter)); + } +} + + +export default new UserRoutes();