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

GitlabHelper => Rename in manager + add fork repo function

parent b6d10fbd
No related branches found
No related tags found
No related merge requests found
import ApiRequest from '../models/ApiRequest'; import ApiRequest from '../models/ApiRequest';
import Config from '../config/Config'; import Config from '../config/Config';
import GitlabHelper from './GitlabHelper';
import { StatusCodes } from 'http-status-codes'; import { StatusCodes } from 'http-status-codes';
import { CustomValidator, ErrorMessage, FieldMessageFactory, Meta } from 'express-validator/src/base'; import { CustomValidator, ErrorMessage, FieldMessageFactory, Meta } from 'express-validator/src/base';
import { BailOptions, ValidationChain } from 'express-validator/src/chain'; import { BailOptions, ValidationChain } from 'express-validator/src/chain';
import GitlabManager from '../managers/GitlabManager';
declare type DojoMeta = Meta & { declare type DojoMeta = Meta & {
...@@ -74,7 +74,7 @@ class DojoValidators { ...@@ -74,7 +74,7 @@ class DojoValidators {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const template = this.getParamValue(req, path); const template = this.getParamValue(req, path);
if ( template ) { if ( template ) {
GitlabHelper.checkTemplateAccess(template, req).then((templateAccess) => { GitlabManager.checkTemplateAccess(template, req).then((templateAccess) => {
templateAccess !== StatusCodes.OK ? reject() : resolve(true); templateAccess !== StatusCodes.OK ? reject() : resolve(true);
}); });
} }
......
...@@ -6,33 +6,57 @@ import GitlabMember from '../shared/types/Gitlab/GitlabMember'; ...@@ -6,33 +6,57 @@ import GitlabMember from '../shared/types/Gitlab/GitlabMember';
import { StatusCodes } from 'http-status-codes'; import { StatusCodes } from 'http-status-codes';
import GitlabVisibility from '../shared/types/Gitlab/GitlabVisibility'; import GitlabVisibility from '../shared/types/Gitlab/GitlabVisibility';
import ApiRequest from '../models/ApiRequest'; import ApiRequest from '../models/ApiRequest';
import GitlabUser from '../shared/types/Gitlab/GitlabUser';
import GitlabRoutes from '../shared/types/Gitlab/GitlabRoutes';
enum GitlabRoutes { class GitlabManager {
REPOSITORY_GET = '/projects/{{id}}', private static _instance: GitlabManager;
REPOSITORY_CREATE = '/projects',
REPOSITORY_MEMBER_ADD = '/projects/{{id}}/members',
REPOSITORY_MEMBERS_GET = '/projects/{{id}}/members/all'
}
class GitlabHelper {
private static _instance: GitlabHelper;
private constructor() { } private constructor() { }
public static get instance(): GitlabHelper { public static get instance(): GitlabManager {
if ( !GitlabHelper._instance ) { if ( !GitlabManager._instance ) {
GitlabHelper._instance = new GitlabHelper(); GitlabManager._instance = new GitlabManager();
} }
return GitlabHelper._instance; return GitlabManager._instance;
} }
private getApiUrl(route: GitlabRoutes): string { private getApiUrl(route: GitlabRoutes): string {
return `${ Config.gitlab.apiURL }${ route }`; 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> { 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), { const response = await axios.post<GitlabRepository>(this.getApiUrl(GitlabRoutes.REPOSITORY_CREATE), {
name : name, name : name,
...@@ -48,14 +72,14 @@ class GitlabHelper { ...@@ -48,14 +72,14 @@ class GitlabHelper {
return response.data; return response.data;
} }
async getRepository(idOrNamespace: string): Promise<GitlabRepository> { async forkRepository(forkId: number, name: string, path: string, description: string, visibility: string, namespace: number): Promise<GitlabRepository> {
const response = await axios.get<GitlabRepository>(this.getApiUrl(GitlabRoutes.REPOSITORY_GET).replace('{{id}}', encodeURIComponent(idOrNamespace))); const response = await axios.post<GitlabRepository>(this.getApiUrl(GitlabRoutes.REPOSITORY_FORK).replace('{{id}}', String(forkId)), {
name : name,
return response.data; path : path,
} description : description,
namespace_id: namespace,
async getRepositoryMembers(idOrNamespace: string): Promise<Array<GitlabMember>> { visibility : visibility
const response = await axios.get<Array<GitlabMember>>(this.getApiUrl(GitlabRoutes.REPOSITORY_MEMBERS_GET).replace('{{id}}', encodeURIComponent(idOrNamespace))); });
return response.data; return response.data;
} }
...@@ -102,4 +126,4 @@ class GitlabHelper { ...@@ -102,4 +126,4 @@ class GitlabHelper {
} }
export default GitlabHelper.instance; export default GitlabManager.instance;
...@@ -8,7 +8,7 @@ import ApiRequest from '../models/ApiRequest'; ...@@ -8,7 +8,7 @@ import ApiRequest from '../models/ApiRequest';
import SecurityMiddleware from '../middlewares/SecurityMiddleware'; import SecurityMiddleware from '../middlewares/SecurityMiddleware';
import SecurityCheckType from '../types/SecurityCheckType'; import SecurityCheckType from '../types/SecurityCheckType';
import GitlabUser from '../shared/types/Gitlab/GitlabUser'; import GitlabUser from '../shared/types/Gitlab/GitlabUser';
import GitlabHelper from '../helpers/GitlabHelper'; import GitlabManager from '../managers/GitlabManager';
import Config from '../config/Config'; import Config from '../config/Config';
import GitlabMember from '../shared/types/Gitlab/GitlabMember'; import GitlabMember from '../shared/types/Gitlab/GitlabMember';
import GitlabAccessLevel from '../shared/types/Gitlab/GitlabAccessLevel'; import GitlabAccessLevel from '../shared/types/Gitlab/GitlabAccessLevel';
...@@ -67,7 +67,7 @@ class EnonceRoutes implements RoutesManager { ...@@ -67,7 +67,7 @@ class EnonceRoutes implements RoutesManager {
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, 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 ) { } 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' ) {
...@@ -84,7 +84,7 @@ class EnonceRoutes implements RoutesManager { ...@@ -84,7 +84,7 @@ class EnonceRoutes implements RoutesManager {
try { 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> => { 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 GitlabManager.addRepositoryMember(repository.id, memberId, GitlabAccessLevel.Maintainer);
} catch ( e ) { } catch ( e ) {
return false; return false;
} }
......
...@@ -4,7 +4,7 @@ import RoutesManager from '../express/RoutesManager'; ...@@ -4,7 +4,7 @@ import RoutesManager from '../express/RoutesManager';
import ApiRequest from '../models/ApiRequest'; import ApiRequest from '../models/ApiRequest';
import SecurityMiddleware from '../middlewares/SecurityMiddleware'; import SecurityMiddleware from '../middlewares/SecurityMiddleware';
import SecurityCheckType from '../types/SecurityCheckType'; import SecurityCheckType from '../types/SecurityCheckType';
import GitlabHelper from '../helpers/GitlabHelper'; import GitlabManager from '../managers/GitlabManager';
class EnonceRoutes implements RoutesManager { class EnonceRoutes implements RoutesManager {
...@@ -27,7 +27,7 @@ class EnonceRoutes implements RoutesManager { ...@@ -27,7 +27,7 @@ class EnonceRoutes implements RoutesManager {
private async checkTemplateAccess(req: ApiRequest, res: express.Response) { private async checkTemplateAccess(req: ApiRequest, res: express.Response) {
const idOrNamespace: string = req.params.idOrNamespace; const idOrNamespace: string = req.params.idOrNamespace;
return res.status(await GitlabHelper.checkTemplateAccess(idOrNamespace, req)).send(); return res.status(await GitlabManager.checkTemplateAccess(idOrNamespace, req)).send();
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment