diff --git a/ExpressAPI/src/config/Config.ts b/ExpressAPI/src/config/Config.ts index 14733202d9585c21f050eef5c0aced5c0528dd89..ec34e5c6c00b9e831db93e362c9de04ea41e1997 100644 --- a/ExpressAPI/src/config/Config.ts +++ b/ExpressAPI/src/config/Config.ts @@ -1,6 +1,4 @@ class Config { - private static _instance: Config; - public readonly api: { port: number }; @@ -28,7 +26,7 @@ class Config { public readonly userPasswordLength: number; public readonly userPasswordSaltRounds: number; - private constructor() { + constructor() { this.api = { port: Number(process.env.API_PORT) }; @@ -82,15 +80,7 @@ class Config { } - - public static get instance(): Config { - if ( !Config._instance ) { - Config._instance = new Config(); - } - - return Config._instance; - } } -export default Config.instance; +export default new Config(); diff --git a/ExpressAPI/src/helpers/DojoValidators.ts b/ExpressAPI/src/helpers/DojoValidators.ts index ca7124c59324d49881359c7d2111420ea27761f1..d86a8f711e6dad056a5a80f16c5d7a4ba9cb4daa 100644 --- a/ExpressAPI/src/helpers/DojoValidators.ts +++ b/ExpressAPI/src/helpers/DojoValidators.ts @@ -14,18 +14,6 @@ declare type DojoCustomValidator = (input: any, meta: DojoMeta) => any; class DojoValidators { - private static _instance: DojoValidators; - - private constructor() { } - - public static get instance(): DojoValidators { - if ( !DojoValidators._instance ) { - DojoValidators._instance = new DojoValidators(); - } - - return DojoValidators._instance; - } - private toValidatorSchemaOptions(arg: { errorMessage?: FieldMessageFactory | ErrorMessage, negated?: boolean, bail?: boolean | BailOptions, if?: DojoCustomValidator | ValidationChain, options?: DojoCustomValidator }) { // This is a hack to make the types work with req arg as ApiRequest instead of Request return arg as unknown as { errorMessage?: FieldMessageFactory | ErrorMessage, negated?: boolean, bail?: boolean | BailOptions, if?: CustomValidator | ValidationChain, options?: CustomValidator }; @@ -94,4 +82,4 @@ class DojoValidators { } -export default DojoValidators.instance; \ No newline at end of file +export default new DojoValidators(); \ No newline at end of file diff --git a/ExpressAPI/src/managers/GitlabManager.ts b/ExpressAPI/src/managers/GitlabManager.ts index 8474c7db75277b916546c49ff7378dc303a67a71..f4b6354e761ac203e8fc40d5417fb0eafe782790 100644 --- a/ExpressAPI/src/managers/GitlabManager.ts +++ b/ExpressAPI/src/managers/GitlabManager.ts @@ -11,18 +11,6 @@ import GitlabRoutes from '../shared/types/Gitlab/GitlabRoutes'; class GitlabManager { - private static _instance: GitlabManager; - - private constructor() { } - - public static get instance(): GitlabManager { - if ( !GitlabManager._instance ) { - GitlabManager._instance = new GitlabManager(); - } - - return GitlabManager._instance; - } - private getApiUrl(route: GitlabRoutes): string { return `${ Config.gitlab.apiURL }${ route }`; } @@ -126,4 +114,4 @@ class GitlabManager { } -export default GitlabManager.instance; +export default new GitlabManager(); diff --git a/ExpressAPI/src/managers/HttpManager.ts b/ExpressAPI/src/managers/HttpManager.ts index 87e636e0a45294065c936ad7aa8045ca3c7845bd..958f8b921b8fddf66ae254818a01fb4c15aab235 100644 --- a/ExpressAPI/src/managers/HttpManager.ts +++ b/ExpressAPI/src/managers/HttpManager.ts @@ -5,20 +5,6 @@ import logger from '../shared/logging/Winsto class HttpManager { - public handleCommandErrors: boolean = true; - - private static _instance: HttpManager; - - public static get instance(): HttpManager { - if ( !HttpManager._instance ) { - HttpManager._instance = new HttpManager(); - } - - return HttpManager._instance; - } - - private constructor() { } - registerAxiosInterceptor() { this.registerRequestInterceptor(); this.registerResponseInterceptor(); @@ -54,5 +40,5 @@ class HttpManager { } -export default HttpManager.instance; +export default new HttpManager(); diff --git a/ExpressAPI/src/managers/UserManager.ts b/ExpressAPI/src/managers/UserManager.ts index 545683878358a0970adca8d37835c6a50d2e1498..35f63d19c25a7e903d892e40abd3f11162249618 100644 --- a/ExpressAPI/src/managers/UserManager.ts +++ b/ExpressAPI/src/managers/UserManager.ts @@ -5,18 +5,6 @@ import { User } from '../types/DatabaseTypes'; class UserManager { - private static _instance: UserManager; - - private constructor() { } - - public static get instance(): UserManager { - if ( !UserManager._instance ) { - UserManager._instance = new UserManager(); - } - - return UserManager._instance; - } - async getByMail(mail: string, include: Prisma.UserInclude | undefined = undefined): Promise<User | undefined> { return db.user.findUnique({ where : { @@ -65,4 +53,4 @@ class UserManager { } -export default UserManager.instance; +export default new UserManager(); diff --git a/ExpressAPI/src/middlewares/ParamsCallbackManager.ts b/ExpressAPI/src/middlewares/ParamsCallbackManager.ts index 4c09baa0c2f7bae21dcd62e9caaa0891a09231e2..c0ccb3919fe05658801ab0734a9f08685d4f6446 100644 --- a/ExpressAPI/src/middlewares/ParamsCallbackManager.ts +++ b/ExpressAPI/src/middlewares/ParamsCallbackManager.ts @@ -6,18 +6,6 @@ import EnonceManager from '../managers/EnonceManager'; class ParamsCallbackManager { - private static _instance: ParamsCallbackManager; - - private constructor() { } - - public static get instance(): ParamsCallbackManager { - if ( !ParamsCallbackManager._instance ) { - ParamsCallbackManager._instance = new ParamsCallbackManager(); - } - - return ParamsCallbackManager._instance; - } - protected listenParam(paramName: string, backend: Express, getFunction: (id: string | number, ...args: Array<any>) => Promise<any>, args: Array<any>, indexName: string) { backend.param(paramName, (req: ApiRequest, res: express.Response, next: express.NextFunction, id: string | number) => { getFunction(id, ...args).then(result => { @@ -42,17 +30,12 @@ class ParamsCallbackManager { } register(backend: Express) { - this.listenParam('enonceNameOrUrl', - backend, - EnonceManager.get.bind(EnonceManager), - [ { - exercices: true, - staff: true - } ], - 'enonce' - ); + this.listenParam('enonceNameOrUrl', backend, EnonceManager.get.bind(EnonceManager), [ { + exercices: true, + staff : true + } ], 'enonce'); } } -export default ParamsCallbackManager.instance; +export default new ParamsCallbackManager(); diff --git a/ExpressAPI/src/middlewares/ParamsValidatorMiddleware.ts b/ExpressAPI/src/middlewares/ParamsValidatorMiddleware.ts index f9a927c3969b9713daaaf3967ff6bb759bc166cc..9d70f6cc44e676c98da81496b3efc30bec2a5e52 100644 --- a/ExpressAPI/src/middlewares/ParamsValidatorMiddleware.ts +++ b/ExpressAPI/src/middlewares/ParamsValidatorMiddleware.ts @@ -5,18 +5,6 @@ import ApiRequest from '../types/ApiRequest'; class ParamsValidatorMiddleware { - private static _instance: ParamsValidatorMiddleware; - - private constructor() { } - - public static get instance(): ParamsValidatorMiddleware { - if ( !ParamsValidatorMiddleware._instance ) { - ParamsValidatorMiddleware._instance = new ParamsValidatorMiddleware(); - } - - return ParamsValidatorMiddleware._instance; - } - validate(validations: Array<ExpressValidator.ValidationChain> | ExpressValidator.Schema): (req: ApiRequest, res: express.Response, next: express.NextFunction) => void { return async (req: ApiRequest, res: express.Response, next: express.NextFunction) => { @@ -37,4 +25,4 @@ class ParamsValidatorMiddleware { } -export default ParamsValidatorMiddleware.instance; +export default new ParamsValidatorMiddleware(); diff --git a/ExpressAPI/src/middlewares/SecurityMiddleware.ts b/ExpressAPI/src/middlewares/SecurityMiddleware.ts index a48803754c61d05df9dee9e2111864439ada4026..62030f9446a1cf25d7e0d0eed0e7fcc11248a733 100644 --- a/ExpressAPI/src/middlewares/SecurityMiddleware.ts +++ b/ExpressAPI/src/middlewares/SecurityMiddleware.ts @@ -6,18 +6,6 @@ import ApiRequest from '../types/ApiRequest'; class SecurityMiddleware { - private static _instance: SecurityMiddleware; - - private constructor() { } - - public static get instance(): SecurityMiddleware { - if ( !SecurityMiddleware._instance ) { - SecurityMiddleware._instance = new SecurityMiddleware(); - } - - return SecurityMiddleware._instance; - } - // First check if connected then check if at least ONE rule match. It's NOT an AND but it's a OR function. check(checkIfConnected: boolean, ...checkTypes: Array<SecurityCheckType>): (req: ApiRequest, res: express.Response, next: express.NextFunction) => void { return async (req: ApiRequest, res: express.Response, next: express.NextFunction) => { @@ -57,4 +45,4 @@ class SecurityMiddleware { } -export default SecurityMiddleware.instance; +export default new SecurityMiddleware(); diff --git a/ExpressAPI/src/middlewares/SessionMiddleware.ts b/ExpressAPI/src/middlewares/SessionMiddleware.ts index 883918f6308035bc81b58474beae47e91ffb8786..120409163750ae01debdf5bbc13b3aeed7036a64 100644 --- a/ExpressAPI/src/middlewares/SessionMiddleware.ts +++ b/ExpressAPI/src/middlewares/SessionMiddleware.ts @@ -4,18 +4,6 @@ import Session from '../controllers/Session'; class SessionMiddleware { - private static _instance: SessionMiddleware; - - private constructor() { } - - public static get instance(): SessionMiddleware { - if ( !SessionMiddleware._instance ) { - SessionMiddleware._instance = new SessionMiddleware(); - } - - return SessionMiddleware._instance; - } - register(): (req: ApiRequest, res: express.Response, next: express.NextFunction) => void { return async (req: ApiRequest, res: express.Response, next: express.NextFunction) => { req.session = new Session(); @@ -27,4 +15,4 @@ class SessionMiddleware { } -export default SessionMiddleware.instance; +export default new SessionMiddleware(); diff --git a/ExpressAPI/src/routes/ApiRoutesManager.ts b/ExpressAPI/src/routes/ApiRoutesManager.ts index f45b5cf3fd3f65a869098440d3ec85b71725f90f..d7641bc9c66668f9983e8ac70379fe375e5b5f48 100644 --- a/ExpressAPI/src/routes/ApiRoutesManager.ts +++ b/ExpressAPI/src/routes/ApiRoutesManager.ts @@ -8,18 +8,6 @@ import ExerciceRoutes from './ExerciceRoutes'; class AdminRoutesManager implements RoutesManager { - private static _instance: AdminRoutesManager; - - private constructor() { } - - public static get instance(): AdminRoutesManager { - if ( !AdminRoutesManager._instance ) { - AdminRoutesManager._instance = new AdminRoutesManager(); - } - - return AdminRoutesManager._instance; - } - registerOnBackend(backend: Express) { BaseRoutes.registerOnBackend(backend); SessionRoutes.registerOnBackend(backend); @@ -30,4 +18,4 @@ class AdminRoutesManager implements RoutesManager { } -export default AdminRoutesManager.instance; +export default new AdminRoutesManager(); diff --git a/ExpressAPI/src/routes/BaseRoutes.ts b/ExpressAPI/src/routes/BaseRoutes.ts index e78112aba02b67110e29c8ce2bd6b1d945e70e0d..d8cbce5ede3c65953e5fa904181a9d2bf91b2bad 100644 --- a/ExpressAPI/src/routes/BaseRoutes.ts +++ b/ExpressAPI/src/routes/BaseRoutes.ts @@ -6,18 +6,6 @@ import RoutesManager from '../express/RoutesManager'; class BaseRoutes implements RoutesManager { - private static _instance: BaseRoutes; - - private constructor() { } - - public static get instance(): BaseRoutes { - if ( !BaseRoutes._instance ) { - BaseRoutes._instance = new BaseRoutes(); - } - - return BaseRoutes._instance; - } - registerOnBackend(backend: Express) { backend.get('/', (req: ApiRequest, res: express.Response) => { res.status(StatusCodes.OK).end(); }); backend.get('/health_check', (req: ApiRequest, res: express.Response) => { res.status(StatusCodes.OK).end(); }); @@ -25,4 +13,4 @@ class BaseRoutes implements RoutesManager { } -export default BaseRoutes.instance; +export default new BaseRoutes(); diff --git a/ExpressAPI/src/routes/EnonceRoutes.ts b/ExpressAPI/src/routes/EnonceRoutes.ts index 1a5843759c88553a48f32e7895243c1b2c71eab2..3881412b9960ad6874bf69d279493aa31d006686 100644 --- a/ExpressAPI/src/routes/EnonceRoutes.ts +++ b/ExpressAPI/src/routes/EnonceRoutes.ts @@ -19,21 +19,10 @@ import DojoValidators from '../helpers/DojoValidators'; import { Prisma } from '@prisma/client'; import db from '../helpers/DatabaseHelper'; import { Enonce } from '../types/DatabaseTypes'; +import EnonceManager from '../managers/EnonceManager'; class EnonceRoutes implements RoutesManager { - private static _instance: EnonceRoutes; - - private constructor() { } - - public static get instance(): EnonceRoutes { - if ( !EnonceRoutes._instance ) { - EnonceRoutes._instance = new EnonceRoutes(); - } - - return EnonceRoutes._instance; - } - private readonly enonceValidator: ExpressValidator.Schema = { name : { trim : true, @@ -58,7 +47,19 @@ class EnonceRoutes implements RoutesManager { // Get an enonce by its name or gitlab url private async getEnonce(req: ApiRequest, res: express.Response) { - return req.boundParams.enonce ? req.session.sendResponse(res, StatusCodes.OK, req.boundParams.enonce) : res.status(StatusCodes.NOT_FOUND).send(); + const enonce: Enonce = req.boundParams.enonce; + + if ( enonce && !enonce.published && !await EnonceManager.isUserAllowedToAccessEnonce(enonce, req.session.profile) ) { + delete enonce.gitlabId; + delete enonce.gitlabLink; + delete enonce.gitlabCreationInfo; + delete enonce.gitlabLastInfo; + delete enonce.gitlabLastInfoDate; + delete enonce.staff; + delete enonce.exercices; + } + + return enonce ? req.session.sendResponse(res, StatusCodes.OK, enonce) : res.status(StatusCodes.NOT_FOUND).send(); } private async createEnonce(req: ApiRequest, res: express.Response) { @@ -129,4 +130,4 @@ class EnonceRoutes implements RoutesManager { } -export default EnonceRoutes.instance; +export default new EnonceRoutes(); diff --git a/ExpressAPI/src/routes/ExerciceRoutes.ts b/ExpressAPI/src/routes/ExerciceRoutes.ts index 840f4ed221381dc3753dc4ecf69b4be4eca7193b..49ac712e2ace3c2791a89713e5b3a2ba4970841c 100644 --- a/ExpressAPI/src/routes/ExerciceRoutes.ts +++ b/ExpressAPI/src/routes/ExerciceRoutes.ts @@ -22,18 +22,6 @@ import db from '../helpers/DatabaseHelper'; class ExerciceRoutes implements RoutesManager { - private static _instance: ExerciceRoutes; - - private constructor() { } - - public static get instance(): ExerciceRoutes { - if ( !ExerciceRoutes._instance ) { - ExerciceRoutes._instance = new ExerciceRoutes(); - } - - return ExerciceRoutes._instance; - } - private readonly exerciceValidator: ExpressValidator.Schema = { members: { trim : true, @@ -133,4 +121,4 @@ class ExerciceRoutes implements RoutesManager { } -export default ExerciceRoutes.instance; +export default new ExerciceRoutes(); diff --git a/ExpressAPI/src/routes/GitlabRoutes.ts b/ExpressAPI/src/routes/GitlabRoutes.ts index 99ff714d85edd2f1bd610bbb854ba3236c185360..6804d9467e72dc598964d16df4c378c82df22d63 100644 --- a/ExpressAPI/src/routes/GitlabRoutes.ts +++ b/ExpressAPI/src/routes/GitlabRoutes.ts @@ -8,18 +8,6 @@ import GitlabManager from '../managers/GitlabManager'; class EnonceRoutes implements RoutesManager { - private static _instance: EnonceRoutes; - - private constructor() { } - - public static get instance(): EnonceRoutes { - if ( !EnonceRoutes._instance ) { - EnonceRoutes._instance = new EnonceRoutes(); - } - - return EnonceRoutes._instance; - } - registerOnBackend(backend: Express) { backend.get('/gitlab/project/:idOrNamespace/checkTemplateAccess', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), this.checkTemplateAccess); } @@ -32,4 +20,4 @@ class EnonceRoutes implements RoutesManager { } -export default EnonceRoutes.instance; +export default new EnonceRoutes(); diff --git a/ExpressAPI/src/routes/SessionRoutes.ts b/ExpressAPI/src/routes/SessionRoutes.ts index 08c3f35b098fd96042016016bb25aff5fe5a6d81..839d091e23075b03886e6df03089c08c2347a3fc 100644 --- a/ExpressAPI/src/routes/SessionRoutes.ts +++ b/ExpressAPI/src/routes/SessionRoutes.ts @@ -12,18 +12,6 @@ import { User } from '../types/DatabaseTypes'; class SessionRoutes implements RoutesManager { - private static _instance: SessionRoutes; - - private constructor() { } - - public static get instance(): SessionRoutes { - if ( !SessionRoutes._instance ) { - SessionRoutes._instance = new SessionRoutes(); - } - - return SessionRoutes._instance; - } - private readonly loginValidator: ExpressValidator.Schema = { user : { trim : true, @@ -59,4 +47,4 @@ class SessionRoutes implements RoutesManager { } -export default SessionRoutes.instance; +export default new SessionRoutes(); diff --git a/ExpressAPI/src/shared b/ExpressAPI/src/shared index 0328c67fd0cade4b51fbf82afc7a07a7d16abe5d..f20c94b884f7ab76936b059b712274a35fcc6318 160000 --- a/ExpressAPI/src/shared +++ b/ExpressAPI/src/shared @@ -1 +1 @@ -Subproject commit 0328c67fd0cade4b51fbf82afc7a07a7d16abe5d +Subproject commit f20c94b884f7ab76936b059b712274a35fcc6318