feat: requirefields in backend controllers (class, assignment, submission, group)
This commit is contained in:
		
							parent
							
								
									d2f5219b69
								
							
						
					
					
						commit
						c52bcde3ae
					
				
					 3 changed files with 38 additions and 63 deletions
				
			
		|  | @ -22,8 +22,8 @@ export async function createAssignmentHandler(req: Request, res: Response): Prom | ||||||
|     const title = req.body.title; |     const title = req.body.title; | ||||||
| 
 | 
 | ||||||
|     requireFields({ description, language, learningPath, title }); |     requireFields({ description, language, learningPath, title }); | ||||||
|     const assignmentData = req.body as AssignmentDTO; |  | ||||||
| 
 | 
 | ||||||
|  |     const assignmentData = req.body as AssignmentDTO; | ||||||
|     const assignment = await createAssignment(classid, assignmentData); |     const assignment = await createAssignment(classid, assignmentData); | ||||||
| 
 | 
 | ||||||
|     res.json({ assignment }); |     res.json({ assignment }); | ||||||
|  |  | ||||||
|  | @ -1,29 +1,22 @@ | ||||||
| import { Request, Response } from 'express'; | import { Request, Response } from 'express'; | ||||||
| import { createGroup, getAllGroups, getGroup, getGroupSubmissions } from '../services/groups.js'; | import { createGroup, getAllGroups, getGroup, getGroupSubmissions } from '../services/groups.js'; | ||||||
| import { GroupDTO } from '@dwengo-1/common/interfaces/group'; | 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
 | export async function getGroupHandler(req: Request, res: Response): Promise<void> { | ||||||
| interface GroupParams { |  | ||||||
|     classid: string; |  | ||||||
|     assignmentid: string; |  | ||||||
|     groupid?: string; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| export async function getGroupHandler(req: Request<GroupParams>, res: Response): Promise<void> { |  | ||||||
|     const classId = req.params.classid; |     const classId = req.params.classid; | ||||||
|  |     const assignmentId = parseInt(req.params.assignmentid); | ||||||
|  |     const groupId = parseInt(req.params.groupid); | ||||||
|     const full = req.query.full === 'true'; |     const full = req.query.full === 'true'; | ||||||
|     const assignmentId = Number(req.params.assignmentid); |     requireFields({ classId, assignmentId, groupId }); | ||||||
| 
 | 
 | ||||||
|     if (isNaN(assignmentId)) { |     if (isNaN(assignmentId)) { | ||||||
|         res.status(400).json({ error: 'Assignment id must be a number' }); |         throw new BadRequestException('Assignment id must be a number'); | ||||||
|         return; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const groupId = Number(req.params.groupid!); // Can't be undefined
 |  | ||||||
| 
 |  | ||||||
|     if (isNaN(groupId)) { |     if (isNaN(groupId)) { | ||||||
|         res.status(400).json({ error: 'Group id must be a number' }); |         throw new BadRequestException('Group id must be a number'); | ||||||
|         return; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const group = await getGroup(classId, assignmentId, groupId, full); |     const group = await getGroup(classId, assignmentId, groupId, full); | ||||||
|  | @ -33,68 +26,57 @@ export async function getGroupHandler(req: Request<GroupParams>, res: Response): | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     res.json(group); |     res.json({ group }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function getAllGroupsHandler(req: Request, res: Response): Promise<void> { | export async function getAllGroupsHandler(req: Request, res: Response): Promise<void> { | ||||||
|     const classId = req.params.classid; |     const classId = req.params.classid; | ||||||
|     const full = req.query.full === 'true'; |  | ||||||
| 
 |  | ||||||
|     const assignmentId = Number(req.params.assignmentid); |     const assignmentId = Number(req.params.assignmentid); | ||||||
|  |     const full = req.query.full === 'true'; | ||||||
|  |     requireFields({ classId, assignmentId }); | ||||||
| 
 | 
 | ||||||
|     if (isNaN(assignmentId)) { |     if (isNaN(assignmentId)) { | ||||||
|         res.status(400).json({ error: 'Assignment id must be a number' }); |         throw new BadRequestException('Assignment id must be a number'); | ||||||
|         return; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const groups = await getAllGroups(classId, assignmentId, full); |     const groups = await getAllGroups(classId, assignmentId, full); | ||||||
| 
 | 
 | ||||||
|     res.json({ |     res.json({ groups }); | ||||||
|         groups: groups, |  | ||||||
|     }); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function createGroupHandler(req: Request, res: Response): Promise<void> { | export async function createGroupHandler(req: Request, res: Response): Promise<void> { | ||||||
|     const classid = req.params.classid; |     const classid = req.params.classid; | ||||||
|     const assignmentId = Number(req.params.assignmentid); |     const assignmentId = Number(req.params.assignmentid); | ||||||
| 
 | 
 | ||||||
|  |     requireFields({ classid, assignmentId }); | ||||||
|  | 
 | ||||||
|     if (isNaN(assignmentId)) { |     if (isNaN(assignmentId)) { | ||||||
|         res.status(400).json({ error: 'Assignment id must be a number' }); |         throw new BadRequestException('Assignment id must be a number'); | ||||||
|         return; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const groupData = req.body as GroupDTO; |     const groupData = req.body as GroupDTO; | ||||||
|     const group = await createGroup(groupData, classid, assignmentId); |     const group = await createGroup(groupData, classid, assignmentId); | ||||||
| 
 | 
 | ||||||
|     if (!group) { |     res.status(201).json({ group }); | ||||||
|         res.status(500).json({ error: 'Something went wrong while creating group' }); |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     res.status(201).json(group); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function getGroupSubmissionsHandler(req: Request, res: Response): Promise<void> { | export async function getGroupSubmissionsHandler(req: Request, res: Response): Promise<void> { | ||||||
|     const classId = req.params.classid; |     const classId = req.params.classid; | ||||||
|     const full = req.query.full === 'true'; |  | ||||||
| 
 |  | ||||||
|     const assignmentId = Number(req.params.assignmentid); |     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)) { |     if (isNaN(assignmentId)) { | ||||||
|         res.status(400).json({ error: 'Assignment id must be a number' }); |         throw new BadRequestException('Assignment id must be a number'); | ||||||
|         return; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const groupId = Number(req.params.groupid); // Can't be undefined
 |  | ||||||
| 
 |  | ||||||
|     if (isNaN(groupId)) { |     if (isNaN(groupId)) { | ||||||
|         res.status(400).json({ error: 'Group id must be a number' }); |         throw new BadRequestException('Group id must be a number'); | ||||||
|         return; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const submissions = await getGroupSubmissions(classId, assignmentId, groupId, full); |     const submissions = await getGroupSubmissions(classId, assignmentId, groupId, full); | ||||||
| 
 | 
 | ||||||
|     res.json({ |     res.json({ submissions }); | ||||||
|         submissions: submissions, |  | ||||||
|     }); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -5,22 +5,22 @@ import { NotFoundException } from '../exceptions/not-found-exception.js'; | ||||||
| import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; | import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; | ||||||
| import { Language, languageMap } from '@dwengo-1/common/util/language'; | import { Language, languageMap } from '@dwengo-1/common/util/language'; | ||||||
| import { SubmissionDTO } from '@dwengo-1/common/interfaces/submission'; | import { SubmissionDTO } from '@dwengo-1/common/interfaces/submission'; | ||||||
|  | import { requireFields } from './error-helper.js'; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| export async function getSubmissionHandler(req: Request, res: Response): Promise<void> { | export async function getSubmissionHandler(req: Request, res: Response): Promise<void> { | ||||||
|     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)) { |     if (isNaN(submissionNumber)) { | ||||||
|         throw new BadRequestException('Submission number must be a number'); |         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 loId = new LearningObjectIdentifier(lohruid, lang, version); | ||||||
| 
 |  | ||||||
|     const submission = await getSubmission(loId, submissionNumber); |     const submission = await getSubmission(loId, submissionNumber); | ||||||
| 
 | 
 | ||||||
|     res.json({ submission }); |     res.json({ submission }); | ||||||
|  | @ -30,9 +30,9 @@ export async function getAllSubmissionsHandler(req: Request, res: Response): Pro | ||||||
|     const lohruid = req.params.hruid; |     const lohruid = req.params.hruid; | ||||||
|     const lang = languageMap[req.query.language as string] || Language.Dutch; |     const lang = languageMap[req.query.language as string] || Language.Dutch; | ||||||
|     const version = (req.query.version || 1) as number; |     const version = (req.query.version || 1) as number; | ||||||
|  |     requireFields({ lohruid }); | ||||||
| 
 | 
 | ||||||
|     const loId = new LearningObjectIdentifier(lohruid, lang, version); |     const loId = new LearningObjectIdentifier(lohruid, lang, version); | ||||||
| 
 |  | ||||||
|     const submissions = await getAllSubmissions(loId); |     const submissions = await getAllSubmissions(loId); | ||||||
| 
 | 
 | ||||||
|     res.json({ submissions }); |     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<void> { | export async function createSubmissionHandler(req: Request, res: Response): Promise<void> { | ||||||
|     const submissionDTO = req.body as SubmissionDTO; |     const submissionDTO = req.body as SubmissionDTO; | ||||||
| 
 |  | ||||||
|     const submission = await createSubmission(submissionDTO); |     const submission = await createSubmission(submissionDTO); | ||||||
| 
 | 
 | ||||||
|     if (!submission) { |  | ||||||
|         res.status(400).json({ error: 'Failed to create submission' }); |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     res.json({ submission }); |     res.json({ submission }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function deleteSubmissionHandler(req: Request, res: Response): Promise<void> { | export async function deleteSubmissionHandler(req: Request, res: Response): Promise<void> { | ||||||
|     const hruid = req.params.hruid; |     const hruid = req.params.hruid; | ||||||
|     const submissionNumber = Number(req.params.id); |  | ||||||
| 
 |  | ||||||
|     const lang = languageMap[req.query.language as string] || Language.Dutch; |     const lang = languageMap[req.query.language as string] || Language.Dutch; | ||||||
|     const version = (req.query.version || 1) as number; |     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 loId = new LearningObjectIdentifier(hruid, lang, version); | ||||||
| 
 |  | ||||||
|     const submission = await deleteSubmission(loId, submissionNumber); |     const submission = await deleteSubmission(loId, submissionNumber); | ||||||
| 
 | 
 | ||||||
|     if (!submission) { |  | ||||||
|         throw new NotFoundException('Could not delete submission'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     res.json({ submission }); |     res.json({ submission }); | ||||||
| } | } | ||||||
|  |  | ||||||
		Reference in a new issue
	
	 Adriaan Jacquet
						Adriaan Jacquet