diff --git a/backend/src/controllers/classes.ts b/backend/src/controllers/classes.ts index a0ceff17..4e0095af 100644 --- a/backend/src/controllers/classes.ts +++ b/backend/src/controllers/classes.ts @@ -1,7 +1,11 @@ import { Request, Response } from 'express'; import { + addClassStudent, + addClassTeacher, createClass, deleteClass, + deleteClassStudent, + deleteClassTeacher, getAllClasses, getClass, getClassStudents, @@ -73,3 +77,43 @@ export async function getTeacherInvitationsHandler(req: Request, res: Response): res.json({ invitations }); } + +export async function deleteClassStudentHandler(req: Request, res: Response): Promise { + const classId = req.params.id; + const username = req.params.username; + requireFields({ classId, username }); + + const cls = await deleteClassStudent(classId, username); + + res.json({ class: cls }); +} + +export async function deleteClassTeacherHandler(req: Request, res: Response): Promise { + const classId = req.params.id; + const username = req.params.username; + requireFields({ classId, username }); + + const cls = await deleteClassTeacher(classId, username); + + res.json({ class: cls }); +} + +export async function addClassStudentHandler(req: Request, res: Response): Promise { + const classId = req.params.id; + const username = req.body.username; + requireFields({ classId, username }); + + const cls = await addClassStudent(classId, username); + + res.json({ class: cls }); +} + +export async function addClassTeacherHandler(req: Request, res: Response): Promise { + const classId = req.params.id; + const username = req.body.username; + requireFields({ classId, username }); + + const cls = await addClassTeacher(classId, username); + + res.json({ class: cls }); +} diff --git a/backend/src/routes/classes.ts b/backend/src/routes/classes.ts index 4ca8b0b9..aaf95567 100644 --- a/backend/src/routes/classes.ts +++ b/backend/src/routes/classes.ts @@ -1,7 +1,11 @@ import express from 'express'; import { + addClassStudentHandler, + addClassTeacherHandler, createClassHandler, deleteClassHandler, + deleteClassStudentHandler, + deleteClassTeacherHandler, getAllClassesHandler, getClassHandler, getClassStudentsHandler, getClassTeachersHandler, @@ -24,8 +28,16 @@ router.get('/:id/teacher-invitations', getTeacherInvitationsHandler); router.get('/:id/students', getClassStudentsHandler); +router.post('/:id/students', addClassStudentHandler); + +router.delete('/:id/students/:username', deleteClassStudentHandler); + router.get('/:id/teachers', getClassTeachersHandler); +router.post('/:id/teachers', addClassTeacherHandler); + +router.delete('/:id/teachers/:username', deleteClassTeacherHandler); + router.use('/:classid/assignments', assignmentRouter); export default router; diff --git a/backend/src/services/classes.ts b/backend/src/services/classes.ts index 4c8d4caf..9b74397b 100644 --- a/backend/src/services/classes.ts +++ b/backend/src/services/classes.ts @@ -101,3 +101,41 @@ export async function getClassTeacherInvitations(classId: string, full: boolean) return invitations.map(mapToTeacherInvitationDTOIds); } + +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) }); + + return mapToClassDTO(cls); +} + +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) }); + + return mapToClassDTO(cls); +} + +export async function addClassStudent(classId: string, username: string): Promise { + const cls = await fetchClass(classId); + const newStudent = await fetchStudent(username); + + const classRepository = getClassRepository(); + classRepository.assign(cls, { students: [...cls.students, newStudent] }); + + return mapToClassDTO(cls); +} + +export async function addClassTeacher(classId: string, username: string): Promise { + const cls = await fetchClass(classId); + const newTeacher = await fetchTeacher(username); + + const classRepository = getClassRepository(); + classRepository.assign(cls, { teachers: [...cls.teachers, newTeacher] }); + + return mapToClassDTO(cls); +}