From d9eb8def72ee94fcc82e130085c086b5c8de6a7c Mon Sep 17 00:00:00 2001 From: Gabriellvl Date: Thu, 13 Mar 2025 16:45:59 +0100 Subject: [PATCH] feat: submission route post delete --- backend/src/controllers/submissions.ts | 41 ++++++++++++++++---- backend/src/interfaces/submission.ts | 27 ++++++++++--- backend/src/interfaces/teacher-invitation.ts | 2 +- backend/src/routes/groups.ts | 2 +- backend/src/routes/submissions.ts | 6 ++- backend/src/services/submissions.ts | 39 ++++++++++++++++++- 6 files changed, 100 insertions(+), 17 deletions(-) diff --git a/backend/src/controllers/submissions.ts b/backend/src/controllers/submissions.ts index 572dae43..1a5da7ea 100644 --- a/backend/src/controllers/submissions.ts +++ b/backend/src/controllers/submissions.ts @@ -1,28 +1,29 @@ import { Request, Response } from "express"; -import { getSubmission } from "../services/submissions.js"; +import {createSubmission, deleteSubmission, getSubmission} from "../services/submissions.js"; import { Language, languageMap } from "../entities/content/language.js"; +import {SubmissionDTO} from "../interfaces/submission"; interface SubmissionParams { - lohruid: string, - submissionNumber: number; + hruid: string, + id: number; } export async function getSubmissionHandler( req: Request, res: Response, ): Promise { - const lohruid = req.params.lohruid; - const submissionNumber = +req.params.submissionNumber; + const lohruid = req.params.hruid; + const submissionNumber = +req.params.id; if (isNaN(submissionNumber)) { - res.status(404).json({ error: 'Submission number is not a number' }); + res.status(400).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); + const submission = await getSubmission(lohruid, lang, version, submissionNumber); if (!submission) { res.status(404).json({ error: 'Submission not found' }); @@ -31,3 +32,29 @@ export async function getSubmissionHandler( res.json(submission); } + +export async function createSubmissionHandler(req: Request, res: Response){ + const submissionDTO = req.body as SubmissionDTO; + + const submission = await createSubmission(submissionDTO); + + if (!submission) + res.status(404).json({ error: 'Submission not added' }); + else + res.json(submission) +} + +export async function deleteSubmissionHandler(req: Request, res: Response){ + const hruid = req.params.hruid; + const submissionNumber = +req.params.id; + + let lang = languageMap[req.query.language as string] || Language.Dutch; + let version = req.query.version as string || '1'; + + const submission = await deleteSubmission(hruid, lang, version, submissionNumber); + + if (!submission) + res.status(404).json({ error: 'Submission not found' }); + else + res.json(submission) +} diff --git a/backend/src/interfaces/submission.ts b/backend/src/interfaces/submission.ts index e0fddf07..b6227fc4 100644 --- a/backend/src/interfaces/submission.ts +++ b/backend/src/interfaces/submission.ts @@ -1,17 +1,19 @@ import { Submission } from "../entities/assignments/submission.entity.js"; import { Language } from "../entities/content/language.js"; import { GroupDTO, mapToGroupDTO } from "./group.js"; -import { mapToStudentDTO, StudentDTO } from "./student.js"; +import {mapToStudent, mapToStudentDTO, StudentDTO} from "./student.js"; +import {mapToUser} from "./user"; +import {Student} from "../entities/users/student.entity"; export interface SubmissionDTO { learningObjectHruid: string, learningObjectLanguage: Language, learningObjectVersion: string, - submissionNumber: number, - submitter: StudentDTO | string, - time: Date, - group?: GroupDTO | string, + submissionNumber?: number, + submitter: StudentDTO, + time?: Date, + group?: GroupDTO, content: string, } @@ -28,3 +30,18 @@ export function mapToSubmissionDTO(submission: Submission): SubmissionDTO { content: submission.content, } } + +export function mapToSubmission(submissionDTO: SubmissionDTO): Submission { + const submission = new Submission(); + submission.learningObjectHruid = submissionDTO.learningObjectHruid; + submission.learningObjectLanguage = submissionDTO.learningObjectLanguage; + submission.learningObjectVersion = submissionDTO.learningObjectVersion; + // submission.submissionNumber = submissionDTO.submissionNumber; + submission.submitter = mapToStudent(submissionDTO.submitter) ; + // submission.submissionTime = submissionDTO.time; + // submission.onBehalfOf = submissionDTO.group!; + // TODO fix group + submission.content = submissionDTO.content; + + return submission; +} diff --git a/backend/src/interfaces/teacher-invitation.ts b/backend/src/interfaces/teacher-invitation.ts index badbbbd7..d29e7476 100644 --- a/backend/src/interfaces/teacher-invitation.ts +++ b/backend/src/interfaces/teacher-invitation.ts @@ -24,6 +24,6 @@ export function mapToTeacherInvitationDTOIds( return { sender: invitation.sender.username, receiver: invitation.receiver.username, - class: invitation.class.classId, + class: invitation.class.classId!, }; } diff --git a/backend/src/routes/groups.ts b/backend/src/routes/groups.ts index d17a330e..c2a462ca 100644 --- a/backend/src/routes/groups.ts +++ b/backend/src/routes/groups.ts @@ -12,7 +12,7 @@ router.get('/:groupid', getGroupHandler); router.get('/:groupid', getGroupSubmissionsHandler); // The list of questions a group has made -router.get('/:id/question', (req, res) => { +router.get('/:id/questions', (req, res) => { res.json({ questions: ['0'], }); diff --git a/backend/src/routes/submissions.ts b/backend/src/routes/submissions.ts index 1be419d4..e431260f 100644 --- a/backend/src/routes/submissions.ts +++ b/backend/src/routes/submissions.ts @@ -1,5 +1,5 @@ import express from 'express'; -import { getSubmissionHandler } from '../controllers/submissions.js'; +import {createSubmissionHandler, deleteSubmissionHandler, getSubmissionHandler} from '../controllers/submissions.js'; const router = express.Router({ mergeParams: true }); @@ -11,7 +11,11 @@ router.get('/', (req, res) => { }); }); +router.post('/:id', createSubmissionHandler); + // Information about an submission with id 'id' router.get('/:id', getSubmissionHandler); +router.delete('/:id', deleteSubmissionHandler); + export default router; diff --git a/backend/src/services/submissions.ts b/backend/src/services/submissions.ts index c805c717..bf30386b 100644 --- a/backend/src/services/submissions.ts +++ b/backend/src/services/submissions.ts @@ -1,7 +1,7 @@ -import { getSubmissionRepository } from "../data/repositories.js"; +import {getGroupRepository, getSubmissionRepository} from "../data/repositories.js"; import { Language } from "../entities/content/language.js"; import { LearningObjectIdentifier } from "../entities/content/learning-object-identifier.js"; -import { mapToSubmissionDTO, SubmissionDTO } from "../interfaces/submission.js"; +import {mapToSubmission, mapToSubmissionDTO, SubmissionDTO} from "../interfaces/submission.js"; export async function getSubmission( learningObjectHruid: string, @@ -20,3 +20,38 @@ export async function getSubmission( return mapToSubmissionDTO(submission); } + +export async function createSubmission(submissionDTO: SubmissionDTO) { + const submissionRepository = getSubmissionRepository(); + const submission = mapToSubmission(submissionDTO); + + try { + const newSubmission = await submissionRepository.create(submission); + await submissionRepository.save(newSubmission); + } catch (e) { + return null + } + + return submission; +} + +export async function deleteSubmission( + learningObjectHruid: string, + language: Language, + version: string, + submissionNumber: number +) { + const submissionRepository = getSubmissionRepository(); + + const submission = getSubmission(learningObjectHruid, language, version, submissionNumber); + + if (!submission) + return null + + const loId = new LearningObjectIdentifier(learningObjectHruid, language, version); + await submissionRepository.deleteSubmissionByLearningObjectAndSubmissionNumber(loId, submissionNumber); + + return submission; +} + +