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

EnonceRoutes => Refactor code

parent 64aebc22
Branches
Tags
No related merge requests found
import User from '../models/User'; import User from '../models/User';
import db from '../helpers/DatabaseHelper'; import db from '../helpers/DatabaseHelper';
import GitlabUser from '../shared/types/Gitlab/GitlabUser';
class UserManager { class UserManager {
...@@ -44,6 +45,23 @@ class UserManager { ...@@ -44,6 +45,23 @@ class UserManager {
async getByGitlabIds(gitlabIds: Array<number>): Promise<Array<User | number>> { async getByGitlabIds(gitlabIds: Array<number>): Promise<Array<User | number>> {
return Promise.all(gitlabIds.map(gitlabId => this.getByGitlabId(gitlabId))); return Promise.all(gitlabIds.map(gitlabId => this.getByGitlabId(gitlabId)));
} }
async getFromGitlabUser(gitlabUser: GitlabUser, createIfNotExist: boolean = false): Promise<User | number> {
let user = await this.getByGitlabId(gitlabUser.id);
if ( typeof user === 'number' && createIfNotExist ) {
user = await User.createFromSql({
userFirstName: gitlabUser.name,
userGitlabId : gitlabUser.id
}).create();
}
return user;
}
async getFromGitlabUsers(gitlabUsers: Array<GitlabUser>, createIfNotExist: boolean = false): Promise<Array<User | number>> {
return Promise.all(gitlabUsers.map(gitlabUser => this.getFromGitlabUser(gitlabUser, createIfNotExist)));
}
} }
......
...@@ -19,6 +19,7 @@ import Enonce from '../models/Enonce'; ...@@ -19,6 +19,7 @@ import Enonce from '../models/Enonce';
import EnonceStaff from '../models/EnonceStaff'; import EnonceStaff from '../models/EnonceStaff';
import { AxiosError } from 'axios'; import { AxiosError } from 'axios';
import logger from '../shared/logging/WinstonLogger'; import logger from '../shared/logging/WinstonLogger';
import DojoValidators from '../helpers/DojoValidators';
class EnonceRoutes implements RoutesManager { class EnonceRoutes implements RoutesManager {
...@@ -41,38 +42,32 @@ class EnonceRoutes implements RoutesManager { ...@@ -41,38 +42,32 @@ class EnonceRoutes implements RoutesManager {
}, },
members : { members : {
trim : true, trim : true,
notEmpty: true notEmpty : true,
customSanitizer: DojoValidators.arraySanitizer
}, },
template: { template: {
optional: true,
trim : true, trim : true,
notEmpty: true custom : DojoValidators.templateUrlValidator,
customSanitizer: DojoValidators.templateUrlSanitizer
} }
}; };
registerOnBackend(backend: Express) { registerOnBackend(backend: Express) {
backend.get('/enonces/:enonceNameOrUrl', SecurityMiddleware.check(true), this.getEnonce);
backend.post('/enonces', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), ParamsValidatorMiddleware.validate(this.enonceValidator), this.createEnonce); backend.post('/enonces', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), ParamsValidatorMiddleware.validate(this.enonceValidator), this.createEnonce);
} }
private async createEnonce(req: ApiRequest, res: express.Response) { // Get an enonce by its name or gitlab url
const params: { name: string, members: string, template: string | null } = req.body; private async getEnonce(req: ApiRequest, res: express.Response) {
const gitlabMembers: Array<GitlabUser> = JSON.parse(params.members) as Array<GitlabUser>; return req.boundParams.enonce ? req.session.sendResponse(res, StatusCodes.OK, req.boundParams.enonce.toJsonObject()) : res.status(StatusCodes.NOT_FOUND).send();
let template: string = Config.enonce.default.template;
if ( params.template ) {
template = params.template;
const templateAccess = await GitlabHelper.checkTemplateAccess(template, req);
if ( templateAccess !== StatusCodes.OK ) {
return res.status(templateAccess).send();
} else {
template = `${ Config.gitlab.urls[0].replace(/^([a-z]{3,5}:\/{2})?(.*)/, `$1${ Config.gitlab.account.username }:${ Config.gitlab.account.token }@$2`) }${ template }.git`;
}
} }
private async createEnonce(req: ApiRequest, res: express.Response) {
const params: { name: string, members: Array<GitlabUser>, template: string } = req.body;
let repository: GitlabRepository; let repository: GitlabRepository;
try { try {
repository = await GitlabHelper.createRepository(params.name, Config.enonce.default.description.replace('{{ENONCE_NAME}}', params.name), Config.enonce.default.visibility, Config.enonce.default.initReadme, Config.gitlab.group.enonces, Config.enonce.default.sharedRunnersEnabled, Config.enonce.default.wikiEnabled, template); repository = await GitlabHelper.createRepository(params.name, Config.enonce.default.description.replace('{{ENONCE_NAME}}', params.name), Config.enonce.default.visibility, Config.enonce.default.initReadme, Config.gitlab.group.enonces, Config.enonce.default.sharedRunnersEnabled, Config.enonce.default.wikiEnabled, params.template);
} catch ( error ) { } catch ( error ) {
if ( error instanceof AxiosError ) { if ( error instanceof AxiosError ) {
if ( error.response.data.message.name && error.response.data.message.name == 'has already been taken' ) { if ( error.response.data.message.name && error.response.data.message.name == 'has already been taken' ) {
...@@ -82,11 +77,12 @@ class EnonceRoutes implements RoutesManager { ...@@ -82,11 +77,12 @@ class EnonceRoutes implements RoutesManager {
return res.status(error.response.status).send(); return res.status(error.response.status).send();
} }
logger.error(error);
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).send(); return res.status(StatusCodes.INTERNAL_SERVER_ERROR).send();
} }
try { try {
const members: Array<GitlabMember | false> = await Promise.all([ req.session.profile.userGitlabId, ...gitlabMembers.map(member => member.id) ].map(async (memberId: number): Promise<GitlabMember | false> => { const members: Array<GitlabMember | false> = await Promise.all([ req.session.profile.userGitlabId, ...params.members.map(member => member.id) ].map(async (memberId: number): Promise<GitlabMember | false> => {
try { try {
return await GitlabHelper.addRepositoryMember(repository.id, memberId, GitlabAccessLevel.Maintainer); return await GitlabHelper.addRepositoryMember(repository.id, memberId, GitlabAccessLevel.Maintainer);
} catch ( e ) { } catch ( e ) {
...@@ -94,48 +90,29 @@ class EnonceRoutes implements RoutesManager { ...@@ -94,48 +90,29 @@ class EnonceRoutes implements RoutesManager {
} }
})); }));
const enonce: Enonce = Enonce.createFromSql({ const enonce: Enonce = await Enonce.createFromSql({
enonceName : repository.name, enonceName : repository.name,
enonceGitlabId : repository.id, enonceGitlabId : repository.id,
enonceGitlabLink : repository.web_url, enonceGitlabLink : repository.web_url,
enonceGitlabCreationInfo: JSON.stringify(repository), enonceGitlabCreationInfo: JSON.stringify(repository),
enonceGitlabLastInfo : JSON.stringify(repository), enonceGitlabLastInfo : JSON.stringify(repository),
enonceGitlabLastInfoTs : new Date().getTime() enonceGitlabLastInfoTs : new Date().getTime()
}); }).create();
await enonce.create();
let dojoUsers: Array<User> = [ req.session.profile, ...(await Promise.all((await UserManager.getByGitlabIds(gitlabMembers.map(member => member.id))).map(async (user: User | number) => {
if ( typeof user === 'number' ) {
const gitlabUser = gitlabMembers.find(member => member.id === user);
user = User.createFromSql({ let dojoUsers: Array<User> = [ req.session.profile, ...(await UserManager.getFromGitlabUsers(params.members, true) as Array<User>) ];
userFirstName: gitlabUser.name,
userGitlabId : gitlabUser.id
});
await user.create();
}
return user as User;
}))) ];
dojoUsers = dojoUsers.reduce((unique, user) => (unique.findIndex(uniqueUser => uniqueUser.userID === user.userID) !== -1 ? unique : [ ...unique, user ]), Array<User>()); dojoUsers = dojoUsers.reduce((unique, user) => (unique.findIndex(uniqueUser => uniqueUser.userID === user.userID) !== -1 ? unique : [ ...unique, user ]), Array<User>());
await Promise.all(dojoUsers.map(async (dojoUser: User) => { await Promise.all(dojoUsers.map(dojoUser => EnonceStaff.createFromSql({
const enonceStaff = EnonceStaff.createFromSql({ enonceName: enonce.enonceName,
enonceID: enonce.enonceID,
userID : dojoUser.userID userID : dojoUser.userID
}); }).create()));
await enonceStaff.create();
}));
return req.session.sendResponse(res, StatusCodes.OK, enonce.toJsonObject()); return req.session.sendResponse(res, StatusCodes.OK, enonce.toJsonObject());
} catch ( error ) { } catch ( error ) {
if ( error instanceof AxiosError ) { if ( error instanceof AxiosError ) {
return res.status(error.response.status).send(); return res.status(error.response.status).send();
} else {
logger.error(error);
} }
logger.error(error);
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).send(); return res.status(StatusCodes.INTERNAL_SERVER_ERROR).send();
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment