diff --git a/ExpressAPI/src/managers/GitlabManager.ts b/ExpressAPI/src/managers/GitlabManager.ts index bd2746ab4323f39d16b3ab7cee410c463b42ddfe..56e81f79d705a44dbac9fe77c73e5bb33a70b990 100644 --- a/ExpressAPI/src/managers/GitlabManager.ts +++ b/ExpressAPI/src/managers/GitlabManager.ts @@ -3,7 +3,7 @@ import { StatusCodes } import GitlabVisibility from '../shared/types/Gitlab/GitlabVisibility.js'; import express from 'express'; import SharedConfig from '../shared/config/SharedConfig.js'; -import { CommitSchema, ExpandedUserSchema, Gitlab, MemberSchema, ProjectBadgeSchema, ProjectSchema, ReleaseSchema, RepositoryFileExpandedSchema, RepositoryFileSchema, RepositoryTreeSchema } from '@gitbeaker/rest'; +import { ArchiveType, CommitSchema, ExpandedUserSchema, Gitlab, MemberSchema, ProjectBadgeSchema, ProjectSchema, ReleaseSchema, RepositoryFileExpandedSchema, RepositoryFileSchema, RepositoryTreeSchema } from '@gitbeaker/rest'; import logger from '../shared/logging/WinstonLogger.js'; import { AccessLevel, EditProjectOptions, ProjectVariableSchema, ProtectedBranchAccessLevel, ProtectedBranchSchema } from '@gitbeaker/core'; import DojoStatusCode from '../shared/types/Dojo/DojoStatusCode.js'; @@ -267,6 +267,17 @@ class GitlabManager extends SharedGitlabManager { return Promise.reject(e); } } + + async exportRepository(repoId: number, extension: ArchiveType): Promise<Blob> { + try { + return await this.api.Repositories.showArchive(repoId, { + fileType: extension + }); + } catch ( e ) { + logger.error(JSON.stringify(e)); + return Promise.reject(e); + } + } } diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts index 5f46129df7cf916d4b7a94f17bb108f32289ee4c..acac72d10747afad42f00b81099bf2651728e80a 100644 --- a/ExpressAPI/src/routes/AssignmentRoutes.ts +++ b/ExpressAPI/src/routes/AssignmentRoutes.ts @@ -80,6 +80,7 @@ class AssignmentRoutes implements RoutesManager { backend.post('/assignments/:assignmentNameOrUrl/corrections', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), ParamsValidatorMiddleware.validate(this.assignmentAddCorrigeValidator), this.linkUpdateAssignmentCorrection(false).bind(this) as RequestHandler); backend.patch('/assignments/:assignmentNameOrUrl/corrections/:exerciseIdOrUrl', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), ParamsValidatorMiddleware.validate(this.assignmentUpdateCorrigeValidator), this.linkUpdateAssignmentCorrection(true).bind(this) as RequestHandler); backend.delete('/assignments/:assignmentNameOrUrl/corrections/:exerciseIdOrUrl', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), this.unlinkAssignmentCorrection.bind(this) as RequestHandler); + backend.get('/assignments/:assignmentNameOrUrl/export', SecurityMiddleware.check(true, SecurityCheckType.ASSIGNMENT_STAFF), this.exportAssignment.bind(this) as RequestHandler); } // Get an assignment by its name or gitlab url @@ -299,6 +300,12 @@ class AssignmentRoutes implements RoutesManager { return req.session.sendResponse(res, StatusCodes.OK); } + + private async exportAssignment(req: express.Request, res: express.Response) { + let ext : Gitlab.ArchiveType = 'zip'; + await GitlabManager.exportRepository(req.boundParams.assignment!.gitlabId, ext); + return req.session.sendResponse(res, StatusCodes.OK); + } }