From c52bcde3ae10768880205f733a02a2e622e10a3b Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Sun, 6 Apr 2025 18:21:37 +0200 Subject: [PATCH] feat: requirefields in backend controllers (class, assignment, submission, group) --- backend/src/controllers/assignments.ts | 2 +- backend/src/controllers/groups.ts | 66 ++++++++++---------------- backend/src/controllers/submissions.ts | 33 +++++-------- 3 files changed, 38 insertions(+), 63 deletions(-) diff --git a/backend/src/controllers/assignments.ts b/backend/src/controllers/assignments.ts index 7c94e2a7..42c822f0 100644 --- a/backend/src/controllers/assignments.ts +++ b/backend/src/controllers/assignments.ts @@ -22,8 +22,8 @@ export async function createAssignmentHandler(req: Request, res: Response): Prom const title = req.body.title; requireFields({ description, language, learningPath, title }); - const assignmentData = req.body as AssignmentDTO; + const assignmentData = req.body as AssignmentDTO; const assignment = await createAssignment(classid, assignmentData); res.json({ assignment }); diff --git a/backend/src/controllers/groups.ts b/backend/src/controllers/groups.ts index 989066a6..3faf4ff0 100644 --- a/backend/src/controllers/groups.ts +++ b/backend/src/controllers/groups.ts @@ -1,29 +1,22 @@ import { Request, Response } from 'express'; import { createGroup, getAllGroups, getGroup, getGroupSubmissions } from '../services/groups.js'; import { GroupDTO } from '@dwengo-1/common/interfaces/group'; +import { requireFields } from './error-helper.js'; +import { BadRequestException } from '../exceptions/bad-request-exception.js'; -// Typescript is annoywith with parameter forwarding from class.ts -interface GroupParams { - classid: string; - assignmentid: string; - groupid?: string; -} - -export async function getGroupHandler(req: Request, res: Response): Promise { +export async function getGroupHandler(req: Request, res: Response): Promise { const classId = req.params.classid; + const assignmentId = parseInt(req.params.assignmentid); + const groupId = parseInt(req.params.groupid); const full = req.query.full === 'true'; - const assignmentId = Number(req.params.assignmentid); + requireFields({ classId, assignmentId, groupId }); if (isNaN(assignmentId)) { - res.status(400).json({ error: 'Assignment id must be a number' }); - return; + throw new BadRequestException('Assignment id must be a number'); } - const groupId = Number(req.params.groupid!); // Can't be undefined - if (isNaN(groupId)) { - res.status(400).json({ error: 'Group id must be a number' }); - return; + throw new BadRequestException('Group id must be a number'); } const group = await getGroup(classId, assignmentId, groupId, full); @@ -33,68 +26,57 @@ export async function getGroupHandler(req: Request, res: Response): return; } - res.json(group); + res.json({ group }); } export async function getAllGroupsHandler(req: Request, res: Response): Promise { const classId = req.params.classid; - const full = req.query.full === 'true'; - const assignmentId = Number(req.params.assignmentid); + const full = req.query.full === 'true'; + requireFields({ classId, assignmentId }); if (isNaN(assignmentId)) { - res.status(400).json({ error: 'Assignment id must be a number' }); - return; + throw new BadRequestException('Assignment id must be a number'); } const groups = await getAllGroups(classId, assignmentId, full); - res.json({ - groups: groups, - }); + res.json({ groups }); } export async function createGroupHandler(req: Request, res: Response): Promise { const classid = req.params.classid; const assignmentId = Number(req.params.assignmentid); + requireFields({ classid, assignmentId }); + if (isNaN(assignmentId)) { - res.status(400).json({ error: 'Assignment id must be a number' }); - return; + throw new BadRequestException('Assignment id must be a number'); } const groupData = req.body as GroupDTO; const group = await createGroup(groupData, classid, assignmentId); - if (!group) { - res.status(500).json({ error: 'Something went wrong while creating group' }); - return; - } - - res.status(201).json(group); + res.status(201).json({ group }); } export async function getGroupSubmissionsHandler(req: Request, res: Response): Promise { const classId = req.params.classid; - const full = req.query.full === 'true'; - const assignmentId = Number(req.params.assignmentid); + const groupId = Number(req.params.groupid); + const full = req.query.full === 'true'; + + requireFields({ classId, assignmentId, groupId }); if (isNaN(assignmentId)) { - res.status(400).json({ error: 'Assignment id must be a number' }); - return; + throw new BadRequestException('Assignment id must be a number'); } - const groupId = Number(req.params.groupid); // Can't be undefined - if (isNaN(groupId)) { - res.status(400).json({ error: 'Group id must be a number' }); - return; + throw new BadRequestException('Group id must be a number'); } const submissions = await getGroupSubmissions(classId, assignmentId, groupId, full); - res.json({ - submissions: submissions, - }); + res.json({ submissions }); } diff --git a/backend/src/controllers/submissions.ts b/backend/src/controllers/submissions.ts index 499cbacc..a49992bb 100644 --- a/backend/src/controllers/submissions.ts +++ b/backend/src/controllers/submissions.ts @@ -5,22 +5,22 @@ import { NotFoundException } from '../exceptions/not-found-exception.js'; import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; import { Language, languageMap } from '@dwengo-1/common/util/language'; import { SubmissionDTO } from '@dwengo-1/common/interfaces/submission'; +import { requireFields } from './error-helper.js'; export async function getSubmissionHandler(req: Request, res: Response): Promise { - const submissionNumber = +req.params.id; + const lohruid = req.params.hruid; + const lang = languageMap[req.query.language as string] || Language.Dutch; + const version = (req.query.version || 1) as number; + const submissionNumber = Number(req.params.id); + requireFields({ lohruid, submissionNumber }); if (isNaN(submissionNumber)) { 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 loId = new LearningObjectIdentifier(lohruid, lang, version); - const submission = await getSubmission(loId, submissionNumber); res.json({ submission }); @@ -30,9 +30,9 @@ export async function getAllSubmissionsHandler(req: Request, res: Response): Pro const lohruid = req.params.hruid; const lang = languageMap[req.query.language as string] || Language.Dutch; const version = (req.query.version || 1) as number; + requireFields({ lohruid }); const loId = new LearningObjectIdentifier(lohruid, lang, version); - const submissions = await getAllSubmissions(loId); res.json({ submissions }); @@ -40,31 +40,24 @@ export async function getAllSubmissionsHandler(req: Request, res: Response): Pro export async function createSubmissionHandler(req: Request, res: Response): Promise { const submissionDTO = req.body as SubmissionDTO; - const submission = await createSubmission(submissionDTO); - if (!submission) { - res.status(400).json({ error: 'Failed to create submission' }); - return; - } - res.json({ submission }); } export async function deleteSubmissionHandler(req: Request, res: Response): Promise { const hruid = req.params.hruid; - const submissionNumber = Number(req.params.id); - const lang = languageMap[req.query.language as string] || Language.Dutch; const version = (req.query.version || 1) as number; + const submissionNumber = Number(req.params.id); + requireFields({ hruid, submissionNumber }); + + if (isNaN(submissionNumber)) { + throw new BadRequestException('Submission number must be a number'); + } const loId = new LearningObjectIdentifier(hruid, lang, version); - const submission = await deleteSubmission(loId, submissionNumber); - if (!submission) { - throw new NotFoundException('Could not delete submission'); - } - res.json({ submission }); }