diff --git a/ExpressAPI/src/helpers/DojoValidators.ts b/ExpressAPI/src/helpers/DojoValidators.ts index a5e22d715b5135444879f40a828854c41a5dbbd6..fb538734e4a7207e434b3177027bd7fca5005db9 100644 --- a/ExpressAPI/src/helpers/DojoValidators.ts +++ b/ExpressAPI/src/helpers/DojoValidators.ts @@ -1,9 +1,9 @@ import ApiRequest from '../models/ApiRequest'; import Config from '../config/Config'; -import GitlabHelper from './GitlabHelper'; import { StatusCodes } from 'http-status-codes'; import { CustomValidator, ErrorMessage, FieldMessageFactory, Meta } from 'express-validator/src/base'; import { BailOptions, ValidationChain } from 'express-validator/src/chain'; +import GitlabManager from '../managers/GitlabManager'; declare type DojoMeta = Meta & { @@ -74,7 +74,7 @@ class DojoValidators { return new Promise((resolve, reject) => { const template = this.getParamValue(req, path); if ( template ) { - GitlabHelper.checkTemplateAccess(template, req).then((templateAccess) => { + GitlabManager.checkTemplateAccess(template, req).then((templateAccess) => { templateAccess !== StatusCodes.OK ? reject() : resolve(true); }); } diff --git a/ExpressAPI/src/helpers/GitlabHelper.ts b/ExpressAPI/src/managers/GitlabManager.ts similarity index 69% rename from ExpressAPI/src/helpers/GitlabHelper.ts rename to ExpressAPI/src/managers/GitlabManager.ts index d4b61a7541c4963b85dc769aeab6dca45693eab4..1631bc346fe4f229819e0d628b6e783beccb5b3f 100644 --- a/ExpressAPI/src/helpers/GitlabHelper.ts +++ b/ExpressAPI/src/managers/GitlabManager.ts @@ -6,33 +6,57 @@ import GitlabMember from '../shared/types/Gitlab/GitlabMember'; import { StatusCodes } from 'http-status-codes'; import GitlabVisibility from '../shared/types/Gitlab/GitlabVisibility'; import ApiRequest from '../models/ApiRequest'; +import GitlabUser from '../shared/types/Gitlab/GitlabUser'; +import GitlabRoutes from '../shared/types/Gitlab/GitlabRoutes'; -enum GitlabRoutes { - REPOSITORY_GET = '/projects/{{id}}', - REPOSITORY_CREATE = '/projects', - REPOSITORY_MEMBER_ADD = '/projects/{{id}}/members', - REPOSITORY_MEMBERS_GET = '/projects/{{id}}/members/all' -} - - -class GitlabHelper { - private static _instance: GitlabHelper; +class GitlabManager { + private static _instance: GitlabManager; private constructor() { } - public static get instance(): GitlabHelper { - if ( !GitlabHelper._instance ) { - GitlabHelper._instance = new GitlabHelper(); + public static get instance(): GitlabManager { + if ( !GitlabManager._instance ) { + GitlabManager._instance = new GitlabManager(); } - return GitlabHelper._instance; + return GitlabManager._instance; } private getApiUrl(route: GitlabRoutes): string { return `${ Config.gitlab.apiURL }${ route }`; } + private async getGitlabUser(paramToSearch: string | number, paramName: string): Promise<GitlabUser | undefined> { + try { + const params: any = {}; + params[paramName] = paramToSearch; + return (await axios.get<Array<GitlabUser>>(this.getApiUrl(GitlabRoutes.USERS_GET), { params: params })).data[0]; + } catch ( e ) { } + + return undefined; + } + + public async getUserById(id: number): Promise<GitlabUser | undefined> { + return await this.getGitlabUser(id, 'id'); + } + + public async getUserByUsername(username: string): Promise<GitlabUser | undefined> { + return await this.getGitlabUser(username, 'search'); + } + + async getRepository(idOrNamespace: string): Promise<GitlabRepository> { + const response = await axios.get<GitlabRepository>(this.getApiUrl(GitlabRoutes.REPOSITORY_GET).replace('{{id}}', encodeURIComponent(idOrNamespace))); + + return response.data; + } + + async getRepositoryMembers(idOrNamespace: string): Promise<Array<GitlabMember>> { + const response = await axios.get<Array<GitlabMember>>(this.getApiUrl(GitlabRoutes.REPOSITORY_MEMBERS_GET).replace('{{id}}', encodeURIComponent(idOrNamespace))); + + return response.data; + } + async createRepository(name: string, description: string, visibility: string, initializeWithReadme: boolean, namespace: number, sharedRunnersEnabled: boolean, wikiEnabled: boolean, import_url: string): Promise<GitlabRepository> { const response = await axios.post<GitlabRepository>(this.getApiUrl(GitlabRoutes.REPOSITORY_CREATE), { name : name, @@ -48,14 +72,14 @@ class GitlabHelper { return response.data; } - async getRepository(idOrNamespace: string): Promise<GitlabRepository> { - const response = await axios.get<GitlabRepository>(this.getApiUrl(GitlabRoutes.REPOSITORY_GET).replace('{{id}}', encodeURIComponent(idOrNamespace))); - - return response.data; - } - - async getRepositoryMembers(idOrNamespace: string): Promise<Array<GitlabMember>> { - const response = await axios.get<Array<GitlabMember>>(this.getApiUrl(GitlabRoutes.REPOSITORY_MEMBERS_GET).replace('{{id}}', encodeURIComponent(idOrNamespace))); + async forkRepository(forkId: number, name: string, path: string, description: string, visibility: string, namespace: number): Promise<GitlabRepository> { + const response = await axios.post<GitlabRepository>(this.getApiUrl(GitlabRoutes.REPOSITORY_FORK).replace('{{id}}', String(forkId)), { + name : name, + path : path, + description : description, + namespace_id: namespace, + visibility : visibility + }); return response.data; } @@ -102,4 +126,4 @@ class GitlabHelper { } -export default GitlabHelper.instance; +export default GitlabManager.instance; diff --git a/ExpressAPI/src/routes/EnonceRoutes.ts b/ExpressAPI/src/routes/EnonceRoutes.ts index d194b06bccb042badd135d4007163e139e36ed3c..6585d07ebaf88cb706a8e06837bebd265c1a401f 100644 --- a/ExpressAPI/src/routes/EnonceRoutes.ts +++ b/ExpressAPI/src/routes/EnonceRoutes.ts @@ -8,7 +8,7 @@ import ApiRequest from '../models/ApiRequest'; import SecurityMiddleware from '../middlewares/SecurityMiddleware'; import SecurityCheckType from '../types/SecurityCheckType'; import GitlabUser from '../shared/types/Gitlab/GitlabUser'; -import GitlabHelper from '../helpers/GitlabHelper'; +import GitlabManager from '../managers/GitlabManager'; import Config from '../config/Config'; import GitlabMember from '../shared/types/Gitlab/GitlabMember'; import GitlabAccessLevel from '../shared/types/Gitlab/GitlabAccessLevel'; @@ -67,7 +67,7 @@ class EnonceRoutes implements RoutesManager { let repository: GitlabRepository; 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, params.template); + repository = await GitlabManager.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 ) { if ( error instanceof AxiosError ) { if ( error.response.data.message.name && error.response.data.message.name == 'has already been taken' ) { @@ -84,7 +84,7 @@ class EnonceRoutes implements RoutesManager { try { 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 { - return await GitlabHelper.addRepositoryMember(repository.id, memberId, GitlabAccessLevel.Maintainer); + return await GitlabManager.addRepositoryMember(repository.id, memberId, GitlabAccessLevel.Maintainer); } catch ( e ) { return false; } diff --git a/ExpressAPI/src/routes/GitlabRoutes.ts b/ExpressAPI/src/routes/GitlabRoutes.ts index be2257a92eada2b2cf4c2b61d0ff29f7eba089df..a9097f6fb409714c3d238947ec6a32ed238d1b4b 100644 --- a/ExpressAPI/src/routes/GitlabRoutes.ts +++ b/ExpressAPI/src/routes/GitlabRoutes.ts @@ -4,7 +4,7 @@ import RoutesManager from '../express/RoutesManager'; import ApiRequest from '../models/ApiRequest'; import SecurityMiddleware from '../middlewares/SecurityMiddleware'; import SecurityCheckType from '../types/SecurityCheckType'; -import GitlabHelper from '../helpers/GitlabHelper'; +import GitlabManager from '../managers/GitlabManager'; class EnonceRoutes implements RoutesManager { @@ -27,7 +27,7 @@ class EnonceRoutes implements RoutesManager { private async checkTemplateAccess(req: ApiRequest, res: express.Response) { const idOrNamespace: string = req.params.idOrNamespace; - return res.status(await GitlabHelper.checkTemplateAccess(idOrNamespace, req)).send(); + return res.status(await GitlabManager.checkTemplateAccess(idOrNamespace, req)).send(); } }