diff --git a/backend/src/controllers/assignments.ts b/backend/src/controllers/assignments.ts index e04dc801..f70ae4a9 100644 --- a/backend/src/controllers/assignments.ts +++ b/backend/src/controllers/assignments.ts @@ -43,6 +43,20 @@ export async function getAssignmentHandler(req: Request, res: Response): Promise res.json({ assignment }); } +export async function putAssignmentHandler(req: Request, res: Response): Promise { + const id = Number(req.params.id); + const classid = req.params.classid; + requireFields({ id, classid }); + + if (isNaN(id)) { + throw new BadRequestException("Assignment id should be a number") + } + + const assignment = await putAssignment(classid, id); + + res.json({ assignment }); +} + export async function deleteAssignmentHandler(req: Request, res: Response): Promise { const id = Number(req.params.id); const classid = req.params.classid; diff --git a/backend/src/services/assignments.ts b/backend/src/services/assignments.ts index 8ab58070..9f5d9183 100644 --- a/backend/src/services/assignments.ts +++ b/backend/src/services/assignments.ts @@ -9,6 +9,9 @@ import { fetchClass } from './classes.js'; import { QuestionDTO, QuestionId } from '@dwengo-1/common/interfaces/question'; import { SubmissionDTO, SubmissionDTOId } from '@dwengo-1/common/interfaces/submission'; import { getLogger } from '../logging/initalize.js'; +import { EntityData, EntityDTO, FromEntityType } from '@mikro-orm/core'; +import { DwengoEntityRepository } from '../data/dwengo-entity-repository.js'; +import { putObject } from './service-helper.js'; export async function fetchAssignment(classid: string, assignmentNumber: number): Promise { const classRepository = getClassRepository(); @@ -58,6 +61,14 @@ export async function getAssignment(classid: string, id: number): Promise>): Promise { + const assignment = await fetchAssignment(classid, id); + + await putObject(assignment, assignmentData, getAssignmentRepository()); + + return mapToAssignmentDTO(assignment); +} + export async function deleteAssignment(classid: string, id: number): Promise { const assignment = await fetchAssignment(classid, id); const cls = await fetchClass(classid); diff --git a/backend/src/services/classes.ts b/backend/src/services/classes.ts index f3209c0d..128cdec8 100644 --- a/backend/src/services/classes.ts +++ b/backend/src/services/classes.ts @@ -13,6 +13,7 @@ import {fetchStudent, getStudent} from "./students"; import {TeacherDTO} from "@dwengo-1/common/interfaces/teacher"; import {mapToTeacherDTO} from "../interfaces/teacher"; import { EntityDTO } from '@mikro-orm/core'; +import { putObject } from './service-helper.js'; export async function fetchClass(classid: string): Promise { const classRepository = getClassRepository(); @@ -58,12 +59,10 @@ export async function createClass(classData: ClassDTO): Promise { return mapToClassDTO(newClass); } -export async function putClass(classId: string, classData: Partial): Promise { +export async function putClass(classId: string, classData: Partial>): Promise { const cls = await fetchClass(classId); - const classRepository = getClassRepository(); - classRepository.assign(cls, classData as Partial>); - await classRepository.getEntityManager().flush(); + await putObject(cls, classData, getClassRepository()); return mapToClassDTO(cls); } @@ -116,9 +115,8 @@ export async function getClassTeacherInvitations(classId: string, full: boolean) export async function deleteClassStudent(classId: string, username: string): Promise { const cls = await fetchClass(classId); - const classRepository = getClassRepository(); - classRepository.assign(cls, { students: cls.students.filter((student) => student.username !== username) }); - await classRepository.getEntityManager().flush(); + const newStudents = { students: cls.students.filter((student) => student.username !== username) }; + await putObject(cls, newStudents, getClassRepository()); return mapToClassDTO(cls); } @@ -126,9 +124,8 @@ export async function deleteClassStudent(classId: string, username: string): Pro export async function deleteClassTeacher(classId: string, username: string): Promise { const cls = await fetchClass(classId); - const classRepository = getClassRepository(); - classRepository.assign(cls, { teachers: cls.teachers.filter((teacher) => teacher.username !== username) }); - await classRepository.getEntityManager().flush(); + const newTeachers = { teachers: cls.teachers.filter((teacher) => teacher.username !== username) }; + await putObject(cls, newTeachers, getClassRepository()); return mapToClassDTO(cls); } @@ -137,10 +134,9 @@ export async function addClassStudent(classId: string, username: string): Promis const cls = await fetchClass(classId); const newStudent = await fetchStudent(username); - const classRepository = getClassRepository(); - classRepository.assign(cls, { students: [...cls.students, newStudent] }); - await classRepository.getEntityManager().flush(); - + const newStudents = { students: [...cls.students, newStudent] } + await putObject(cls, newStudents, getClassRepository()); + return mapToClassDTO(cls); } @@ -148,9 +144,8 @@ export async function addClassTeacher(classId: string, username: string): Promis const cls = await fetchClass(classId); const newTeacher = await fetchTeacher(username); - const classRepository = getClassRepository(); - classRepository.assign(cls, { teachers: [...cls.teachers, newTeacher] }); - await classRepository.getEntityManager().flush(); + const newTeachers = { teachers: [...cls.teachers, newTeacher] }; + await putObject(cls, newTeachers, getClassRepository()); return mapToClassDTO(cls); } diff --git a/backend/src/services/service-helper.ts b/backend/src/services/service-helper.ts new file mode 100644 index 00000000..28ff0eb0 --- /dev/null +++ b/backend/src/services/service-helper.ts @@ -0,0 +1,20 @@ +import { EntityDTO, FromEntityType } from "@mikro-orm/core"; +import { DwengoEntityRepository } from "../data/dwengo-entity-repository"; + +/** + * Utility function to perform an PUT on an object. + * + * @param object The object that needs to be changed + * @param data The datafields and their values that will be updated + * @param repo The repository on which this action needs to be performed + * + * @returns Nothing. + */ +export async function putObject( + object: T, + data: Partial>>, + repo: DwengoEntityRepository +): Promise { + repo.assign(object, data); + await repo.getEntityManager().flush(); +} \ No newline at end of file