Skip to content
Snippets Groups Projects
Commit 67e053dc authored by michael.minelli's avatar michael.minelli
Browse files

Singletons => Change method to make singleton class

parent a4e246cf
No related branches found
No related tags found
No related merge requests found
Showing
with 35 additions and 207 deletions
class Config { class Config {
private static _instance: Config;
public readonly api: { public readonly api: {
port: number port: number
}; };
...@@ -28,7 +26,7 @@ class Config { ...@@ -28,7 +26,7 @@ class Config {
public readonly userPasswordLength: number; public readonly userPasswordLength: number;
public readonly userPasswordSaltRounds: number; public readonly userPasswordSaltRounds: number;
private constructor() { constructor() {
this.api = { this.api = {
port: Number(process.env.API_PORT) port: Number(process.env.API_PORT)
}; };
...@@ -82,15 +80,7 @@ class Config { ...@@ -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();
...@@ -14,18 +14,6 @@ declare type DojoCustomValidator = (input: any, meta: DojoMeta) => any; ...@@ -14,18 +14,6 @@ declare type DojoCustomValidator = (input: any, meta: DojoMeta) => any;
class DojoValidators { 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 }) { 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 // 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 }; return arg as unknown as { errorMessage?: FieldMessageFactory | ErrorMessage, negated?: boolean, bail?: boolean | BailOptions, if?: CustomValidator | ValidationChain, options?: CustomValidator };
...@@ -94,4 +82,4 @@ class DojoValidators { ...@@ -94,4 +82,4 @@ class DojoValidators {
} }
export default DojoValidators.instance; export default new DojoValidators();
\ No newline at end of file \ No newline at end of file
...@@ -11,18 +11,6 @@ import GitlabRoutes from '../shared/types/Gitlab/GitlabRoutes'; ...@@ -11,18 +11,6 @@ import GitlabRoutes from '../shared/types/Gitlab/GitlabRoutes';
class GitlabManager { 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 { private getApiUrl(route: GitlabRoutes): string {
return `${ Config.gitlab.apiURL }${ route }`; return `${ Config.gitlab.apiURL }${ route }`;
} }
...@@ -126,4 +114,4 @@ class GitlabManager { ...@@ -126,4 +114,4 @@ class GitlabManager {
} }
export default GitlabManager.instance; export default new GitlabManager();
...@@ -5,20 +5,6 @@ import logger from '../shared/logging/Winsto ...@@ -5,20 +5,6 @@ import logger from '../shared/logging/Winsto
class HttpManager { 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() { registerAxiosInterceptor() {
this.registerRequestInterceptor(); this.registerRequestInterceptor();
this.registerResponseInterceptor(); this.registerResponseInterceptor();
...@@ -54,5 +40,5 @@ class HttpManager { ...@@ -54,5 +40,5 @@ class HttpManager {
} }
export default HttpManager.instance; export default new HttpManager();
...@@ -5,18 +5,6 @@ import { User } from '../types/DatabaseTypes'; ...@@ -5,18 +5,6 @@ import { User } from '../types/DatabaseTypes';
class UserManager { 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> { async getByMail(mail: string, include: Prisma.UserInclude | undefined = undefined): Promise<User | undefined> {
return db.user.findUnique({ return db.user.findUnique({
where : { where : {
...@@ -65,4 +53,4 @@ class UserManager { ...@@ -65,4 +53,4 @@ class UserManager {
} }
export default UserManager.instance; export default new UserManager();
...@@ -6,18 +6,6 @@ import EnonceManager from '../managers/EnonceManager'; ...@@ -6,18 +6,6 @@ import EnonceManager from '../managers/EnonceManager';
class ParamsCallbackManager { 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) { 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) => { backend.param(paramName, (req: ApiRequest, res: express.Response, next: express.NextFunction, id: string | number) => {
getFunction(id, ...args).then(result => { getFunction(id, ...args).then(result => {
...@@ -42,17 +30,12 @@ class ParamsCallbackManager { ...@@ -42,17 +30,12 @@ class ParamsCallbackManager {
} }
register(backend: Express) { register(backend: Express) {
this.listenParam('enonceNameOrUrl', this.listenParam('enonceNameOrUrl', backend, EnonceManager.get.bind(EnonceManager), [ {
backend,
EnonceManager.get.bind(EnonceManager),
[ {
exercices: true, exercices: true,
staff : true staff : true
} ], } ], 'enonce');
'enonce'
);
} }
} }
export default ParamsCallbackManager.instance; export default new ParamsCallbackManager();
...@@ -5,18 +5,6 @@ import ApiRequest from '../types/ApiRequest'; ...@@ -5,18 +5,6 @@ import ApiRequest from '../types/ApiRequest';
class ParamsValidatorMiddleware { 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 { 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) => { return async (req: ApiRequest, res: express.Response, next: express.NextFunction) => {
...@@ -37,4 +25,4 @@ class ParamsValidatorMiddleware { ...@@ -37,4 +25,4 @@ class ParamsValidatorMiddleware {
} }
export default ParamsValidatorMiddleware.instance; export default new ParamsValidatorMiddleware();
...@@ -6,18 +6,6 @@ import ApiRequest from '../types/ApiRequest'; ...@@ -6,18 +6,6 @@ import ApiRequest from '../types/ApiRequest';
class SecurityMiddleware { 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. // 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 { 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) => { return async (req: ApiRequest, res: express.Response, next: express.NextFunction) => {
...@@ -57,4 +45,4 @@ class SecurityMiddleware { ...@@ -57,4 +45,4 @@ class SecurityMiddleware {
} }
export default SecurityMiddleware.instance; export default new SecurityMiddleware();
...@@ -4,18 +4,6 @@ import Session from '../controllers/Session'; ...@@ -4,18 +4,6 @@ import Session from '../controllers/Session';
class SessionMiddleware { 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 { register(): (req: ApiRequest, res: express.Response, next: express.NextFunction) => void {
return async (req: ApiRequest, res: express.Response, next: express.NextFunction) => { return async (req: ApiRequest, res: express.Response, next: express.NextFunction) => {
req.session = new Session(); req.session = new Session();
...@@ -27,4 +15,4 @@ class SessionMiddleware { ...@@ -27,4 +15,4 @@ class SessionMiddleware {
} }
export default SessionMiddleware.instance; export default new SessionMiddleware();
...@@ -8,18 +8,6 @@ import ExerciceRoutes from './ExerciceRoutes'; ...@@ -8,18 +8,6 @@ import ExerciceRoutes from './ExerciceRoutes';
class AdminRoutesManager implements RoutesManager { 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) { registerOnBackend(backend: Express) {
BaseRoutes.registerOnBackend(backend); BaseRoutes.registerOnBackend(backend);
SessionRoutes.registerOnBackend(backend); SessionRoutes.registerOnBackend(backend);
...@@ -30,4 +18,4 @@ class AdminRoutesManager implements RoutesManager { ...@@ -30,4 +18,4 @@ class AdminRoutesManager implements RoutesManager {
} }
export default AdminRoutesManager.instance; export default new AdminRoutesManager();
...@@ -6,18 +6,6 @@ import RoutesManager from '../express/RoutesManager'; ...@@ -6,18 +6,6 @@ import RoutesManager from '../express/RoutesManager';
class BaseRoutes implements 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) { registerOnBackend(backend: Express) {
backend.get('/', (req: ApiRequest, res: express.Response) => { res.status(StatusCodes.OK).end(); }); 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(); }); backend.get('/health_check', (req: ApiRequest, res: express.Response) => { res.status(StatusCodes.OK).end(); });
...@@ -25,4 +13,4 @@ class BaseRoutes implements RoutesManager { ...@@ -25,4 +13,4 @@ class BaseRoutes implements RoutesManager {
} }
export default BaseRoutes.instance; export default new BaseRoutes();
...@@ -19,21 +19,10 @@ import DojoValidators from '../helpers/DojoValidators'; ...@@ -19,21 +19,10 @@ import DojoValidators from '../helpers/DojoValidators';
import { Prisma } from '@prisma/client'; import { Prisma } from '@prisma/client';
import db from '../helpers/DatabaseHelper'; import db from '../helpers/DatabaseHelper';
import { Enonce } from '../types/DatabaseTypes'; import { Enonce } from '../types/DatabaseTypes';
import EnonceManager from '../managers/EnonceManager';
class EnonceRoutes implements RoutesManager { 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 = { private readonly enonceValidator: ExpressValidator.Schema = {
name : { name : {
trim : true, trim : true,
...@@ -58,7 +47,19 @@ class EnonceRoutes implements RoutesManager { ...@@ -58,7 +47,19 @@ class EnonceRoutes implements RoutesManager {
// Get an enonce by its name or gitlab url // Get an enonce by its name or gitlab url
private async getEnonce(req: ApiRequest, res: express.Response) { 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) { private async createEnonce(req: ApiRequest, res: express.Response) {
...@@ -129,4 +130,4 @@ class EnonceRoutes implements RoutesManager { ...@@ -129,4 +130,4 @@ class EnonceRoutes implements RoutesManager {
} }
export default EnonceRoutes.instance; export default new EnonceRoutes();
...@@ -22,18 +22,6 @@ import db from '../helpers/DatabaseHelper'; ...@@ -22,18 +22,6 @@ import db from '../helpers/DatabaseHelper';
class ExerciceRoutes implements RoutesManager { 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 = { private readonly exerciceValidator: ExpressValidator.Schema = {
members: { members: {
trim : true, trim : true,
...@@ -133,4 +121,4 @@ class ExerciceRoutes implements RoutesManager { ...@@ -133,4 +121,4 @@ class ExerciceRoutes implements RoutesManager {
} }
export default ExerciceRoutes.instance; export default new ExerciceRoutes();
...@@ -8,18 +8,6 @@ import GitlabManager from '../managers/GitlabManager'; ...@@ -8,18 +8,6 @@ import GitlabManager from '../managers/GitlabManager';
class EnonceRoutes implements RoutesManager { 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) { registerOnBackend(backend: Express) {
backend.get('/gitlab/project/:idOrNamespace/checkTemplateAccess', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), this.checkTemplateAccess); backend.get('/gitlab/project/:idOrNamespace/checkTemplateAccess', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), this.checkTemplateAccess);
} }
...@@ -32,4 +20,4 @@ class EnonceRoutes implements RoutesManager { ...@@ -32,4 +20,4 @@ class EnonceRoutes implements RoutesManager {
} }
export default EnonceRoutes.instance; export default new EnonceRoutes();
...@@ -12,18 +12,6 @@ import { User } from '../types/DatabaseTypes'; ...@@ -12,18 +12,6 @@ import { User } from '../types/DatabaseTypes';
class SessionRoutes implements RoutesManager { 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 = { private readonly loginValidator: ExpressValidator.Schema = {
user : { user : {
trim : true, trim : true,
...@@ -59,4 +47,4 @@ class SessionRoutes implements RoutesManager { ...@@ -59,4 +47,4 @@ class SessionRoutes implements RoutesManager {
} }
export default SessionRoutes.instance; export default new SessionRoutes();
Subproject commit 0328c67fd0cade4b51fbf82afc7a07a7d16abe5d Subproject commit f20c94b884f7ab76936b059b712274a35fcc6318
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment