import express from 'express'; import logger from '../shared/logging/WinstonLogger'; import GitlabManager from '../managers/GitlabManager'; import DojoStatusCode from '../shared/types/Dojo/DojoStatusCode'; import { StatusCodes } from 'http-status-codes'; import { GitbeakerRequestError } from '@gitbeaker/requester-utils'; import * as Gitlab from '@gitbeaker/rest'; class GlobalHelper { repoCreationFnExecCreator(req: express.Request, res: express.Response, gitlabError: DojoStatusCode, internalError: DojoStatusCode, repositoryToRemove?: Gitlab.ProjectSchema) { return async (toExec: () => Promise<unknown>, errorMessage?: string) => { try { return await toExec(); } catch ( error ) { if ( errorMessage ) { logger.error(errorMessage); logger.error(JSON.stringify(error)); try { if ( repositoryToRemove ) { await GitlabManager.deleteRepository(repositoryToRemove.id); } } catch ( deleteError ) { logger.error('Repository deletion error'); logger.error(JSON.stringify(deleteError)); } if ( error instanceof GitbeakerRequestError ) { req.session.sendResponse(res, StatusCodes.INTERNAL_SERVER_ERROR, {}, `Unknown gitlab error: ${ errorMessage }`, gitlabError); throw error; } req.session.sendResponse(res, StatusCodes.INTERNAL_SERVER_ERROR, {}, `Unknown error: ${ errorMessage }`, internalError); throw error; } } }; } } export default new GlobalHelper();