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
Branches
Tags
No related merge requests found
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);
});
}
......
......@@ -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;
......@@ -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;
}
......
......@@ -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();
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment