From 3598cdeb43798c28f271984671d0e0efe7323f4b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <michael@minelli.me>
Date: Fri, 17 May 2024 18:05:02 +0200
Subject: [PATCH] AssignmentRoute => Get assignment: add possibility to get his
 exercises related

---
 ExpressAPI/src/routes/AssignmentRoutes.ts | 52 +++++++++++++++++------
 1 file changed, 40 insertions(+), 12 deletions(-)

diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts
index 2055e65..6a54f9c 100644
--- a/ExpressAPI/src/routes/AssignmentRoutes.ts
+++ b/ExpressAPI/src/routes/AssignmentRoutes.ts
@@ -12,7 +12,7 @@ import logger                      from '../shared/logging/WinstonLogger.js';
 import DojoValidators              from '../helpers/DojoValidators.js';
 import { Prisma }                  from '@prisma/client';
 import db                          from '../helpers/DatabaseHelper.js';
-import { Assignment }              from '../types/DatabaseTypes.js';
+import { Assignment, Exercise }    from '../types/DatabaseTypes.js';
 import AssignmentManager           from '../managers/AssignmentManager.js';
 import fs                          from 'fs';
 import path                        from 'path';
@@ -66,17 +66,45 @@ class AssignmentRoutes implements RoutesManager {
     private async getAssignment(req: express.Request, res: express.Response) {
         const assignment: Partial<Assignment> | undefined = req.boundParams.assignment;
 
-        if ( assignment && !assignment.published && !await AssignmentManager.isUserAllowedToAccessAssignment(assignment as Assignment, req.session.profile) ) {
-            delete assignment.gitlabId;
-            delete assignment.gitlabLink;
-            delete assignment.gitlabCreationInfo;
-            delete assignment.gitlabLastInfo;
-            delete assignment.gitlabLastInfoDate;
-            delete assignment.staff;
-            delete assignment.exercises;
-        }
+        if ( assignment ) {
+            if ( !assignment.published && !await AssignmentManager.isUserAllowedToAccessAssignment(assignment as Assignment, req.session.profile) ) {
+                delete assignment.gitlabId;
+                delete assignment.gitlabLink;
+                delete assignment.gitlabCreationInfo;
+                delete assignment.gitlabLastInfo;
+                delete assignment.gitlabLastInfoDate;
+                delete assignment.staff;
+                delete assignment.exercises;
+            }
+
+            const getExercises = req.query.getMyExercises;
+            let exercises: Array<Omit<Exercise, 'assignment'>> = [];
+            if ( getExercises ) {
+                if ( !assignment ) {
+                    return res.status(StatusCodes.NOT_FOUND).send();
+                }
 
-        return assignment ? req.session.sendResponse(res, StatusCodes.OK, DojoModelsHelper.getFullSerializableObject(assignment)) : res.status(StatusCodes.NOT_FOUND).send();
+                exercises = await db.exercise.findMany({
+                                                           where  : {
+                                                               assignmentName: assignment.name,
+                                                               members       : {
+                                                                   some: {
+                                                                       id: req.session.profile.id
+                                                                   }
+                                                               }
+                                                           },
+                                                           include: {
+                                                               assignment: false,
+                                                               members   : true,
+                                                               results   : true
+                                                           }
+                                                       });
+            }
+
+            return req.session.sendResponse(res, StatusCodes.OK, DojoModelsHelper.getFullSerializableObject(Object.assign(assignment, { myExercises: exercises })));
+        } else {
+            return res.status(StatusCodes.NOT_FOUND).send();
+        }
     }
 
     private async createAssignment(req: express.Request, res: express.Response) {
@@ -204,7 +232,7 @@ class AssignmentRoutes implements RoutesManager {
             } else if ( isUpdate && !req.boundParams.exercise?.isCorrection ) {
                 return req.session.sendResponse(res, StatusCodes.BAD_REQUEST, undefined, 'This exercise is not a correction', DojoStatusCode.EXERCISE_CORRECTION_NOT_EXIST);
             }
-            
+
             const lastCommit = await GitlabManager.getRepositoryLastCommit(req.boundParams.exercise!.gitlabId);
 
             if ( lastCommit ) {
-- 
GitLab