diff --git a/helpers/Dojo/SharedAssignmentHelper.ts b/helpers/Dojo/SharedAssignmentHelper.ts index 8b52f8aa55fe3c4ce9c34f40f10545f59c377d29..9eb156d0099541f1ab43e6b5268a91cbf96d8fbe 100644 --- a/helpers/Dojo/SharedAssignmentHelper.ts +++ b/helpers/Dojo/SharedAssignmentHelper.ts @@ -2,6 +2,10 @@ import Ajv, { ErrorObject, JTDSchemaType } from 'ajv/dist/jtd'; import fs from 'fs'; import JSON5 from 'json5'; import AssignmentFile from '../../types/Dojo/AssignmentFile'; +import GitlabManager from '../../../managers/GitlabManager'; +import GitlabPipelineStatus from '../../types/Gitlab/GitlabPipelineStatus'; +import DojoStatusCode from '../../types/Dojo/DojoStatusCode'; +import GitlabPipeline from '../../types/Gitlab/GitlabPipeline'; class SharedAssignmentHelper { @@ -69,6 +73,37 @@ class SharedAssignmentHelper { }; } } + + async isPublishable(repositoryId: number): Promise<{ isPublishable: boolean, lastPipeline: GitlabPipeline | null, status?: { code: DojoStatusCode, message: string } }> { + const pipelines = await GitlabManager.getRepositoryPipelines(repositoryId, 'main'); + if ( pipelines.length > 0 ) { + const lastPipeline = pipelines[0]; + if ( lastPipeline.status != GitlabPipelineStatus.SUCCESS ) { + return { + isPublishable: false, + lastPipeline : pipelines[0], + status : { + code : DojoStatusCode.ASSIGNMENT_PUBLISH_PIPELINE_FAILED, + message: 'Last pipeline status is not "success".' + } + }; + } else { + return { + isPublishable: true, + lastPipeline : pipelines[0] + }; + } + } else { + return { + isPublishable: false, + lastPipeline : null, + status : { + code : DojoStatusCode.ASSIGNMENT_PUBLISH_NO_PIPELINE, + message: 'No pipeline found for this assignment.' + } + }; + } + } }