diff --git a/backend/src/controllers/submissions.ts b/backend/src/controllers/submissions.ts index 512ac22e..5fa154b1 100644 --- a/backend/src/controllers/submissions.ts +++ b/backend/src/controllers/submissions.ts @@ -1,33 +1,41 @@ import { Request, Response } from 'express'; -import { createSubmission, deleteSubmission, getSubmission } from '../services/submissions.js'; +import { createSubmission, deleteSubmission, getAllSubmissions, getSubmission } from '../services/submissions.js'; import { Language, languageMap } from '../entities/content/language.js'; import { SubmissionDTO } from '../interfaces/submission'; +import { BadRequestException } from '../exceptions/bad-request-exception.js'; +import { NotFoundException } from '../exceptions/not-found-exception.js'; +import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; -interface SubmissionParams { - hruid: string; - id: number; -} -export async function getSubmissionHandler(req: Request, res: Response): Promise { - const lohruid = req.params.hruid; + +export async function getSubmissionHandler(req: Request, res: Response): Promise { const submissionNumber = +req.params.id; - + if (isNaN(submissionNumber)) { - res.status(400).json({ error: 'Submission number is not a number' }); - return; + throw new BadRequestException('Submission number must be a number'); } - + + const lohruid = req.params.hruid; const lang = languageMap[req.query.language as string] || Language.Dutch; const version = (req.query.version || 1) as number; - const submission = await getSubmission(lohruid, lang, version, submissionNumber); + const loId = new LearningObjectIdentifier(lohruid, lang, version); - if (!submission) { - res.status(404).json({ error: 'Submission not found' }); - return; - } + const submission = await getSubmission(loId, submissionNumber); - res.json(submission); + res.json({ submission }); +} + +export async function getAllSubmissionsHandler(req: Request, res: Response): Promise { + const lohruid = req.params.hruid; + const lang = languageMap[req.query.language as string] || Language.Dutch; + const version = (req.query.version || 1) as number; + + const loId = new LearningObjectIdentifier(lohruid, lang, version); + + const submissions = await getAllSubmissions(loId); + + res.json({ submissions }); } export async function createSubmissionHandler(req: Request, res: Response) { @@ -40,22 +48,23 @@ export async function createSubmissionHandler(req: Request, res: Response) { return; } - res.json(submission); + res.json({ submission }); } export async function deleteSubmissionHandler(req: Request, res: Response) { - const hruid = req.params.hruid; const submissionNumber = +req.params.id; - + + const hruid = req.params.hruid; const lang = languageMap[req.query.language as string] || Language.Dutch; const version = (req.query.version || 1) as number; - const submission = await deleteSubmission(hruid, lang, version, submissionNumber); + const loId = new LearningObjectIdentifier(hruid, lang, version); + + const submission = await deleteSubmission(loId, submissionNumber); if (!submission) { - res.status(404).json({ error: 'Submission not found' }); - return; + throw new NotFoundException('Could not delete submission'); } - res.json(submission); + res.json({ submission }); } diff --git a/backend/src/data/assignments/submission-repository.ts b/backend/src/data/assignments/submission-repository.ts index 251823fa..25a66956 100644 --- a/backend/src/data/assignments/submission-repository.ts +++ b/backend/src/data/assignments/submission-repository.ts @@ -14,6 +14,14 @@ export class SubmissionRepository extends DwengoEntityRepository { }); } + public findByLearningObject(loId: LearningObjectIdentifier): Promise { + return this.find({ + learningObjectHruid: loId.hruid, + learningObjectLanguage: loId.language, + learningObjectVersion: loId.version, + }); + } + public findMostRecentSubmissionForStudent(loId: LearningObjectIdentifier, submitter: Student): Promise { return this.findOne( { diff --git a/backend/src/routes/submissions.ts b/backend/src/routes/submissions.ts index 4db93027..7c91de52 100644 --- a/backend/src/routes/submissions.ts +++ b/backend/src/routes/submissions.ts @@ -1,13 +1,9 @@ import express from 'express'; -import { createSubmissionHandler, deleteSubmissionHandler, getSubmissionHandler } from '../controllers/submissions.js'; +import { createSubmissionHandler, deleteSubmissionHandler, getAllSubmissionsHandler, getSubmissionHandler } from '../controllers/submissions.js'; const router = express.Router({ mergeParams: true }); // Root endpoint used to search objects -router.get('/', (req, res) => { - res.json({ - submissions: ['0', '1'], - }); -}); +router.get('/', getAllSubmissionsHandler); router.post('/:id', createSubmissionHandler); diff --git a/backend/src/services/submissions.ts b/backend/src/services/submissions.ts index 0e1ad9ac..f9f42349 100644 --- a/backend/src/services/submissions.ts +++ b/backend/src/services/submissions.ts @@ -1,26 +1,32 @@ import { getGroupRepository, getSubmissionRepository } from '../data/repositories.js'; import { Language } from '../entities/content/language.js'; import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; +import { NotFoundException } from '../exceptions/not-found-exception.js'; import { mapToSubmission, mapToSubmissionDTO, SubmissionDTO } from '../interfaces/submission.js'; export async function getSubmission( - learningObjectHruid: string, - language: Language, - version: number, + loId: LearningObjectIdentifier, submissionNumber: number -): Promise { - const loId = new LearningObjectIdentifier(learningObjectHruid, language, version); - +): Promise { const submissionRepository = getSubmissionRepository(); const submission = await submissionRepository.findSubmissionByLearningObjectAndSubmissionNumber(loId, submissionNumber); if (!submission) { - return null; + throw new NotFoundException('Could not find submission'); } return mapToSubmissionDTO(submission); } +export async function getAllSubmissions( + loId: LearningObjectIdentifier, +): Promise { + const submissionRepository = getSubmissionRepository(); + const submissions = await submissionRepository.findByLearningObject(loId); + + return submissions.map(mapToSubmissionDTO); +} + export async function createSubmission(submissionDTO: SubmissionDTO) { const submissionRepository = getSubmissionRepository(); const submission = mapToSubmission(submissionDTO); @@ -35,16 +41,15 @@ export async function createSubmission(submissionDTO: SubmissionDTO) { return mapToSubmissionDTO(submission); } -export async function deleteSubmission(learningObjectHruid: string, language: Language, version: number, submissionNumber: number) { +export async function deleteSubmission(loId: LearningObjectIdentifier, submissionNumber: number) { const submissionRepository = getSubmissionRepository(); - const submission = getSubmission(learningObjectHruid, language, version, submissionNumber); + const submission = getSubmission(loId, submissionNumber); if (!submission) { - return null; + throw new NotFoundException('Could not delete submission because it does not exist'); } - const loId = new LearningObjectIdentifier(learningObjectHruid, language, version); await submissionRepository.deleteSubmissionByLearningObjectAndSubmissionNumber(loId, submissionNumber); return submission;