From 913a7a24e07f11a9f7b237dbf39150effb68947e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <michael@minelli.me>
Date: Fri, 13 Oct 2023 15:56:28 +0200
Subject: [PATCH] AssignmentHelper => Add function to test if and assignment is
 publishable

---
 helpers/Dojo/SharedAssignmentHelper.ts | 35 ++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/helpers/Dojo/SharedAssignmentHelper.ts b/helpers/Dojo/SharedAssignmentHelper.ts
index 8b52f8a..9eb156d 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.'
+                }
+            };
+        }
+    }
 }
 
 
-- 
GitLab