From fd693dc55ff00fc18425376b1492429a0e78b36f Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Wed, 12 Mar 2025 15:23:33 +0100 Subject: [PATCH] feat: submissions van een assignment geimplementeerd --- backend/src/controllers/submissions.ts | 14 +++++++-- .../data/assignments/submission-repository.ts | 8 +++++ backend/src/entities/content/language.ts | 7 +++++ backend/src/routes/submissions.ts | 2 +- backend/src/services/assignments.ts | 31 +++++++++++++++++++ 5 files changed, 58 insertions(+), 4 deletions(-) diff --git a/backend/src/controllers/submissions.ts b/backend/src/controllers/submissions.ts index 24449ae8..c4911637 100644 --- a/backend/src/controllers/submissions.ts +++ b/backend/src/controllers/submissions.ts @@ -1,6 +1,6 @@ import { Request, Response } from "express"; import { getSubmission } from "../services/submissions"; -import { Language } from "../entities/content/language"; +import { Language, languageMap } from "../entities/content/language"; interface SubmissionParams { lohruid: string, @@ -12,9 +12,17 @@ export async function getSubmissionHandler( res: Response, ): Promise { const lohruid = req.params.lohruid; - const submissionNumber = req.params.submissionNumber; + const submissionNumber = +req.params.submissionNumber; - const submission = getSubmission(lohruid, Language.Dutch, '1', submissionNumber); + if (isNaN(submissionNumber)) { + res.status(404).json({ error: 'Submission number is not a number' }); + return; + } + + let lang = languageMap[req.query.language as string] || Language.Dutch; + let version = req.query.version as string || '1'; + + const submission = getSubmission(lohruid, lang, version, submissionNumber); if (!submission) { res.status(404).json({ error: 'Submission not found' }); diff --git a/backend/src/data/assignments/submission-repository.ts b/backend/src/data/assignments/submission-repository.ts index 5332d050..a4d34826 100644 --- a/backend/src/data/assignments/submission-repository.ts +++ b/backend/src/data/assignments/submission-repository.ts @@ -47,6 +47,14 @@ export class SubmissionRepository extends DwengoEntityRepository { ); } + public findAllSubmissionsForGroup( + group: Group, + ): Promise { + return this.find( + { onBehalfOf: group }, + ); + } + public deleteSubmissionByLearningObjectAndSubmissionNumber( loId: LearningObjectIdentifier, submissionNumber: number diff --git a/backend/src/entities/content/language.ts b/backend/src/entities/content/language.ts index b5d18c80..d62a2f22 100644 --- a/backend/src/entities/content/language.ts +++ b/backend/src/entities/content/language.ts @@ -4,3 +4,10 @@ export enum Language { English = 'en', Germany = 'de', } + +export const languageMap: Record = { + nl: Language.Dutch, + fr: Language.French, + en: Language.English, + de: Language.Germany, +}; \ No newline at end of file diff --git a/backend/src/routes/submissions.ts b/backend/src/routes/submissions.ts index b4e34c74..744b9e16 100644 --- a/backend/src/routes/submissions.ts +++ b/backend/src/routes/submissions.ts @@ -1,6 +1,6 @@ import express from 'express'; import { getSubmissionHandler } from '../controllers/submissions'; -const router = express.Router(); +const router = express.Router({ mergeParams: true }); diff --git a/backend/src/services/assignments.ts b/backend/src/services/assignments.ts index 1ecfb4d4..1f50a1c9 100644 --- a/backend/src/services/assignments.ts +++ b/backend/src/services/assignments.ts @@ -1,12 +1,15 @@ import { getAssignmentRepository, getClassRepository, + getGroupRepository, + getSubmissionRepository, } from '../data/repositories.js'; import { AssignmentDTO, mapToAssignmentDTO, mapToAssignmentDTOId, } from '../interfaces/assignment.js'; +import { mapToSubmissionDTO, SubmissionDTO } from '../interfaces/submission.js'; export async function getAllAssignments( classid: string, @@ -50,3 +53,31 @@ export async function getAssignment( return mapToAssignmentDTO(assignment); } + +export async function getAssignmentsSubmissions( + classid: string, + assignmentNumber: number, +): Promise { + const classRepository = getClassRepository(); + const cls = await classRepository.findById(classid); + + if (!cls) { + return []; + } + + const assignmentRepository = getAssignmentRepository(); + const assignment = await assignmentRepository.findByClassAndId(cls, assignmentNumber); + + if (!assignment) { + return []; + } + + const groupRepository = getGroupRepository(); + const groups = await groupRepository.findAllGroupsForAssignment(assignment); + + const submissionRepository = getSubmissionRepository(); + const submissions = + (await Promise.all(groups.map(group => submissionRepository.findAllSubmissionsForGroup(group)))).flat(); + + return submissions.map(mapToSubmissionDTO); +} \ No newline at end of file