fix: assignment errors en return json
This commit is contained in:
		
							parent
							
								
									dbc1da741c
								
							
						
					
					
						commit
						2c4bc644fd
					
				
					 2 changed files with 43 additions and 75 deletions
				
			
		|  | @ -1,6 +1,8 @@ | ||||||
| import { Request, Response } from 'express'; | import { Request, Response } from 'express'; | ||||||
| import { createAssignment, getAllAssignments, getAssignment, getAssignmentsSubmissions } from '../services/assignments.js'; | import { createAssignment, getAllAssignments, getAssignment, getAssignmentsSubmissions } from '../services/assignments.js'; | ||||||
| import { AssignmentDTO } from '@dwengo-1/common/interfaces/assignment'; | import { AssignmentDTO } from '@dwengo-1/common/interfaces/assignment'; | ||||||
|  | import {requireFields} from "./error-helper"; | ||||||
|  | import {BadRequestException} from "../exceptions/bad-request-exception"; | ||||||
| 
 | 
 | ||||||
| // Typescript is annoying with parameter forwarding from class.ts
 | // Typescript is annoying with parameter forwarding from class.ts
 | ||||||
| interface AssignmentParams { | interface AssignmentParams { | ||||||
|  | @ -9,69 +11,55 @@ interface AssignmentParams { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function getAllAssignmentsHandler(req: Request<AssignmentParams>, res: Response): Promise<void> { | export async function getAllAssignmentsHandler(req: Request<AssignmentParams>, res: Response): Promise<void> { | ||||||
|     const classid = req.params.classid; |     const classId = req.params.classid; | ||||||
|     const full = req.query.full === 'true'; |     const full = req.query.full === 'true'; | ||||||
|  |     requireFields({ classId }); | ||||||
| 
 | 
 | ||||||
|     const assignments = await getAllAssignments(classid, full); |     const assignments = await getAllAssignments(classId, full); | ||||||
| 
 | 
 | ||||||
|     res.json({ |     res.json({ assignments }); | ||||||
|         assignments: assignments, |  | ||||||
|     }); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function createAssignmentHandler(req: Request<AssignmentParams>, res: Response): Promise<void> { | export async function createAssignmentHandler(req: Request<AssignmentParams>, res: Response): Promise<void> { | ||||||
|     const classid = req.params.classid; |     const classid = req.params.classid; | ||||||
|     const assignmentData = req.body as AssignmentDTO; |     const description = req.body.description; | ||||||
|  |     const language = req.body.language; | ||||||
|  |     const learningPath = req.body.learningPath; | ||||||
|  |     const title = req.body.title; | ||||||
| 
 | 
 | ||||||
|     if (!assignmentData.description || !assignmentData.language || !assignmentData.learningPath || !assignmentData.title) { |     requireFields({ description, language, learningPath, title }); | ||||||
|         res.status(400).json({ |     const assignmentData = req.body as AssignmentDTO; | ||||||
|             error: 'Missing one or more required fields: title, description, learningPath, language', |  | ||||||
|         }); |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     const assignment = await createAssignment(classid, assignmentData); |     const assignment = await createAssignment(classid, assignmentData); | ||||||
| 
 | 
 | ||||||
|     if (!assignment) { |     res.json({ assignment }); | ||||||
|         res.status(500).json({ error: 'Could not create assignment ' }); |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     res.status(201).json(assignment); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function getAssignmentHandler(req: Request<AssignmentParams>, res: Response): Promise<void> { | export async function getAssignmentHandler(req: Request<AssignmentParams>, res: Response): Promise<void> { | ||||||
|     const id = Number(req.params.id); |     const id = Number(req.params.id); | ||||||
|     const classid = req.params.classid; |     const classid = req.params.classid; | ||||||
|  |     requireFields({ id, classid }); | ||||||
| 
 | 
 | ||||||
|     if (isNaN(id)) { |     if (isNaN(id)) { | ||||||
|         res.status(400).json({ error: 'Assignment id must be a number' }); |         throw new BadRequestException("Assignment id should be a number") | ||||||
|         return; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const assignment = await getAssignment(classid, id); |     const assignment = await getAssignment(classid, id); | ||||||
| 
 | 
 | ||||||
|     if (!assignment) { |     res.json({ assignment }); | ||||||
|         res.status(404).json({ error: 'Assignment not found' }); |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     res.json(assignment); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function getAssignmentsSubmissionsHandler(req: Request<AssignmentParams>, res: Response): Promise<void> { | export async function getAssignmentsSubmissionsHandler(req: Request<AssignmentParams>, res: Response): Promise<void> { | ||||||
|     const classid = req.params.classid; |     const classid = req.params.classid; | ||||||
|     const assignmentNumber = Number(req.params.id); |     const assignmentNumber = Number(req.params.id); | ||||||
|     const full = req.query.full === 'true'; |     const full = req.query.full === 'true'; | ||||||
|  |     requireFields({ assignmentNumber, classid }); | ||||||
| 
 | 
 | ||||||
|     if (isNaN(assignmentNumber)) { |     if (isNaN(assignmentNumber)) { | ||||||
|         res.status(400).json({ error: 'Assignment id must be a number' }); |         throw new BadRequestException("Assignment id should be a number") | ||||||
|         return; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const submissions = await getAssignmentsSubmissions(classid, assignmentNumber, full); |     const submissions = await getAssignmentsSubmissions(classid, assignmentNumber, full); | ||||||
| 
 | 
 | ||||||
|     res.json({ |     res.json({ submissions }); | ||||||
|         submissions: submissions, |  | ||||||
|     }); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -3,15 +3,12 @@ import { mapToAssignment, mapToAssignmentDTO, mapToAssignmentDTOId } from '../in | ||||||
| import { mapToSubmissionDTO, mapToSubmissionDTOId } from '../interfaces/submission.js'; | import { mapToSubmissionDTO, mapToSubmissionDTOId } from '../interfaces/submission.js'; | ||||||
| import { AssignmentDTO } from '@dwengo-1/common/interfaces/assignment'; | import { AssignmentDTO } from '@dwengo-1/common/interfaces/assignment'; | ||||||
| import { SubmissionDTO, SubmissionDTOId } from '@dwengo-1/common/interfaces/submission'; | import { SubmissionDTO, SubmissionDTOId } from '@dwengo-1/common/interfaces/submission'; | ||||||
| import { getLogger } from '../logging/initalize.js'; | import {fetchClass} from "./classes"; | ||||||
|  | import {Assignment} from "../entities/assignments/assignment.entity"; | ||||||
|  | import {NotFoundException} from "../exceptions/not-found-exception"; | ||||||
| 
 | 
 | ||||||
| export async function getAllAssignments(classid: string, full: boolean): Promise<AssignmentDTO[]> { | export async function getAllAssignments(classid: string, full: boolean): Promise<AssignmentDTO[]> { | ||||||
|     const classRepository = getClassRepository(); |     const cls = await fetchClass(classid); | ||||||
|     const cls = await classRepository.findById(classid); |  | ||||||
| 
 |  | ||||||
|     if (!cls) { |  | ||||||
|         return []; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     const assignmentRepository = getAssignmentRepository(); |     const assignmentRepository = getAssignmentRepository(); | ||||||
|     const assignments = await assignmentRepository.findAllAssignmentsInClass(cls); |     const assignments = await assignmentRepository.findAllAssignmentsInClass(cls); | ||||||
|  | @ -23,43 +20,34 @@ export async function getAllAssignments(classid: string, full: boolean): Promise | ||||||
|     return assignments.map(mapToAssignmentDTOId); |     return assignments.map(mapToAssignmentDTOId); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function createAssignment(classid: string, assignmentData: AssignmentDTO): Promise<AssignmentDTO | null> { | export async function createAssignment(classid: string, assignmentData: AssignmentDTO): Promise<AssignmentDTO> { | ||||||
|     const classRepository = getClassRepository(); |     const cls = await fetchClass(classid); | ||||||
|     const cls = await classRepository.findById(classid); |  | ||||||
| 
 |  | ||||||
|     if (!cls) { |  | ||||||
|         return null; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     const assignment = mapToAssignment(assignmentData, cls); |     const assignment = mapToAssignment(assignmentData, cls); | ||||||
|     const assignmentRepository = getAssignmentRepository(); |     const assignmentRepository = getAssignmentRepository(); | ||||||
| 
 | 
 | ||||||
|     try { |     const newAssignment = assignmentRepository.create(assignment); | ||||||
|         const newAssignment = assignmentRepository.create(assignment); |     await assignmentRepository.save(newAssignment, {preventOverwrite: true}); | ||||||
|         await assignmentRepository.save(newAssignment); | 
 | ||||||
|  |     return mapToAssignmentDTO(newAssignment); | ||||||
| 
 | 
 | ||||||
|         return mapToAssignmentDTO(newAssignment); |  | ||||||
|     } catch (e) { |  | ||||||
|         getLogger().error(e); |  | ||||||
|         return null; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function getAssignment(classid: string, id: number): Promise<AssignmentDTO | null> { | export async function fetchAssignment(classid: string, id: number): Promise<Assignment> { | ||||||
|     const classRepository = getClassRepository(); |     const cls = await fetchClass(classid); | ||||||
|     const cls = await classRepository.findById(classid); |  | ||||||
| 
 |  | ||||||
|     if (!cls) { |  | ||||||
|         return null; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     const assignmentRepository = getAssignmentRepository(); |     const assignmentRepository = getAssignmentRepository(); | ||||||
|     const assignment = await assignmentRepository.findByClassAndId(cls, id); |     const assignment = await assignmentRepository.findByClassAndId(cls, id); | ||||||
| 
 | 
 | ||||||
|     if (!assignment) { |     if (!assignment){ | ||||||
|         return null; |         throw new NotFoundException('Assignment with id not found'); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     return assignment; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export async function getAssignment(classid: string, id: number): Promise<AssignmentDTO> { | ||||||
|  |     const assignment = await fetchAssignment(classid, id); | ||||||
|     return mapToAssignmentDTO(assignment); |     return mapToAssignmentDTO(assignment); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -68,23 +56,15 @@ export async function getAssignmentsSubmissions( | ||||||
|     assignmentNumber: number, |     assignmentNumber: number, | ||||||
|     full: boolean |     full: boolean | ||||||
| ): Promise<SubmissionDTO[] | SubmissionDTOId[]> { | ): Promise<SubmissionDTO[] | SubmissionDTOId[]> { | ||||||
|     const classRepository = getClassRepository(); |     const assignment = await fetchAssignment(classid, assignmentNumber); | ||||||
|     const cls = await classRepository.findById(classid); |  | ||||||
| 
 |  | ||||||
|     if (!cls) { |  | ||||||
|         return []; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     const assignmentRepository = getAssignmentRepository(); |  | ||||||
|     const assignment = await assignmentRepository.findByClassAndId(cls, assignmentNumber); |  | ||||||
| 
 |  | ||||||
|     if (!assignment) { |  | ||||||
|         return []; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     const groupRepository = getGroupRepository(); |     const groupRepository = getGroupRepository(); | ||||||
|     const groups = await groupRepository.findAllGroupsForAssignment(assignment); |     const groups = await groupRepository.findAllGroupsForAssignment(assignment); | ||||||
| 
 | 
 | ||||||
|  |     if (groups.length === 0){ | ||||||
|  |         throw new NotFoundException('No groups for assignment found'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     const submissionRepository = getSubmissionRepository(); |     const submissionRepository = getSubmissionRepository(); | ||||||
|     const submissions = (await Promise.all(groups.map(async (group) => submissionRepository.findAllSubmissionsForGroup(group)))).flat(); |     const submissions = (await Promise.all(groups.map(async (group) => submissionRepository.findAllSubmissionsForGroup(group)))).flat(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Reference in a new issue
	
	 Gabriellvl
						Gabriellvl