From 7c453467df8dfd0ce8aadc1ce69b50f25af202aa Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Tue, 11 Mar 2025 18:04:27 +0100 Subject: [PATCH] feat: submission endpoint geimplementeerd (ongetest) --- backend/src/controllers/submissions.ts | 25 +++++++++++++++++++++ backend/src/interfaces/submission.ts | 30 ++++++++++++++++++++++++++ backend/src/routes/learning-objects.ts | 4 ++++ backend/src/routes/submissions.ts | 14 ++++-------- backend/src/services/submissions.ts | 22 +++++++++++++++++++ 5 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 backend/src/controllers/submissions.ts create mode 100644 backend/src/interfaces/submission.ts create mode 100644 backend/src/services/submissions.ts diff --git a/backend/src/controllers/submissions.ts b/backend/src/controllers/submissions.ts new file mode 100644 index 00000000..24449ae8 --- /dev/null +++ b/backend/src/controllers/submissions.ts @@ -0,0 +1,25 @@ +import { Request, Response } from "express"; +import { getSubmission } from "../services/submissions"; +import { Language } from "../entities/content/language"; + +interface SubmissionParams { + lohruid: string, + submissionNumber: number; +} + +export async function getSubmissionHandler( + req: Request, + res: Response, +): Promise { + const lohruid = req.params.lohruid; + const submissionNumber = req.params.submissionNumber; + + const submission = getSubmission(lohruid, Language.Dutch, '1', submissionNumber); + + if (!submission) { + res.status(404).json({ error: 'Submission not found' }); + return; + } + + res.json(submission); +} \ No newline at end of file diff --git a/backend/src/interfaces/submission.ts b/backend/src/interfaces/submission.ts new file mode 100644 index 00000000..daf00a64 --- /dev/null +++ b/backend/src/interfaces/submission.ts @@ -0,0 +1,30 @@ +import { Submission } from "../entities/assignments/submission.entity"; +import { Language } from "../entities/content/language"; +import { GroupDTO, mapToGroupDTO } from "./group"; +import { mapToStudentDTO, StudentDTO } from "./student"; + +export interface SubmissionDTO { + learningObjectHruid: string, + learningObjectLanguage: Language, + learningObjectVersion: string, + + submissionNumber: number, + submitter: StudentDTO | string, + time: Date, + group?: GroupDTO | string, + content: string, +} + +export function mapToSubmissionDTO(submission: Submission): SubmissionDTO { + return { + learningObjectHruid: submission.learningObjectHruid, + learningObjectLanguage: submission.learningObjectLanguage, + learningObjectVersion: submission.learningObjectVersion, + + submissionNumber: submission.submissionNumber, + submitter: mapToStudentDTO(submission.submitter), + time: submission.submissionTime, + group: submission.onBehalfOf ? mapToGroupDTO(submission.onBehalfOf) : undefined, + content: submission.content, + } +} \ No newline at end of file diff --git a/backend/src/routes/learning-objects.ts b/backend/src/routes/learning-objects.ts index 3717095a..77094955 100644 --- a/backend/src/routes/learning-objects.ts +++ b/backend/src/routes/learning-objects.ts @@ -4,6 +4,8 @@ import { getLearningObject, } from '../controllers/learning-objects.js'; +import submissionRoutes from './submissions.js'; + const router = express.Router(); // DWENGO learning objects @@ -24,4 +26,6 @@ router.get('/', getAllLearningObjects); // Example: http://localhost:3000/learningObject/un_ai7 router.get('/:hruid', getLearningObject); +router.use('/:hruid/submissions', submissionRoutes); + export default router; diff --git a/backend/src/routes/submissions.ts b/backend/src/routes/submissions.ts index cb4d3e85..b4e34c74 100644 --- a/backend/src/routes/submissions.ts +++ b/backend/src/routes/submissions.ts @@ -1,6 +1,9 @@ import express from 'express'; +import { getSubmissionHandler } from '../controllers/submissions'; const router = express.Router(); + + // Root endpoint used to search objects router.get('/', (req, res) => { res.json({ @@ -9,15 +12,6 @@ router.get('/', (req, res) => { }); // Information about an submission with id 'id' -router.get('/:id', (req, res) => { - res.json({ - id: req.params.id, - student: '0', - group: '0', - time: new Date(2025, 1, 1), - content: 'Wortel 2 is rationeel', - learningObject: '0', - }); -}); +router.get('/:id', getSubmissionHandler); export default router; diff --git a/backend/src/services/submissions.ts b/backend/src/services/submissions.ts new file mode 100644 index 00000000..2c2e1aad --- /dev/null +++ b/backend/src/services/submissions.ts @@ -0,0 +1,22 @@ +import { getSubmissionRepository } from "../data/repositories"; +import { Language } from "../entities/content/language"; +import { LearningObjectIdentifier } from "../entities/content/learning-object-identifier"; +import { mapToSubmissionDTO, SubmissionDTO } from "../interfaces/submission"; + +export async function getSubmission( + learningObjectHruid: string, + language: Language, + version: string, + submissionNumber: number, +): Promise { + const loId = new LearningObjectIdentifier(learningObjectHruid, language, version); + + const submissionRepository = getSubmissionRepository(); + const submission = await submissionRepository.findSubmissionByLearningObjectAndSubmissionNumber(loId, submissionNumber); + + if (!submission) { + return null; + } + + return mapToSubmissionDTO(submission); +} \ No newline at end of file