From e9d9e52f9d3fba770e40b89c62b77ca28e35fc02 Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Tue, 4 Mar 2025 16:32:59 +0100 Subject: [PATCH] feat: class/:id service en controller laag geimplementeerd (BEVAT NOG BUG) --- backend/src/controllers/classes.ts | 29 +++++++++++++++++++++++++++++ backend/src/interfaces/classes.ts | 20 ++++++++++++++------ backend/src/routes/class.ts | 17 ++--------------- backend/src/services/class.ts | 12 ++++++++++++ backend/src/services/students.ts | 15 +++------------ 5 files changed, 60 insertions(+), 33 deletions(-) create mode 100644 backend/src/controllers/classes.ts create mode 100644 backend/src/services/class.ts diff --git a/backend/src/controllers/classes.ts b/backend/src/controllers/classes.ts new file mode 100644 index 00000000..f4c8666d --- /dev/null +++ b/backend/src/controllers/classes.ts @@ -0,0 +1,29 @@ +import { Request, Response } from 'express'; +import { getClass } from '../services/class'; + +export async function getClassHandler( + req: Request, + res: Response, +): Promise { + try { + const classId = req.params.id; + const cls = await getClass(classId); + + if (!cls) { + res.status(404).json({ error: "Student not found" }); + return; + } else { + cls.endpoints = { + self: `${req.baseUrl}/${req.params.id}`, + invitations: `${req.baseUrl}/${req.params.id}/invitations`, + assignments: `${req.baseUrl}/${req.params.id}/assignments`, + students: `${req.baseUrl}/${req.params.id}/students`, + } + + res.json(cls); + } + } catch (error) { + console.error('Error fetching learning objects:', error); + res.status(500).json({ error: 'Internal server error' }); + } +} \ No newline at end of file diff --git a/backend/src/interfaces/classes.ts b/backend/src/interfaces/classes.ts index 78731b59..5c285446 100644 --- a/backend/src/interfaces/classes.ts +++ b/backend/src/interfaces/classes.ts @@ -1,6 +1,4 @@ -import { ClassJoinRequest } from "../entities/classes/class-join-request.entity"; -import { Student } from "../entities/users/student.entity"; -import { Teacher } from "../entities/users/teacher.entity"; +import { Class } from "../entities/classes/class.entity"; export interface ClassDTO { id: string; @@ -9,9 +7,19 @@ export interface ClassDTO { students: string[]; joinRequests: string[]; endpoints?: { - classes: string; - questions: string; + self: string; invitations: string; - groups: string; + assignments: string; + students: string; }; } + +export function mapToClassDTO(cls: Class): ClassDTO { + return { + id: cls.classId, + displayName: cls.displayName, + teachers: cls.teachers.map(teacher => teacher.username), + students: cls.students.map(student => student.username), + joinRequests: [], // TODO + } +}; diff --git a/backend/src/routes/class.ts b/backend/src/routes/class.ts index f310367d..65ca9362 100644 --- a/backend/src/routes/class.ts +++ b/backend/src/routes/class.ts @@ -1,4 +1,5 @@ import express from 'express' +import { getClassHandler } from '../controllers/classes'; const router = express.Router(); // root endpoint used to search objects @@ -12,21 +13,7 @@ router.get('/', (req, res) => { }); // information about an class with id 'id' -router.get('/:id', (req, res) => { - res.json({ - id: req.params.id, - displayName: 'Klas 4B', - teachers: [ '0' ], - students: [ '0' ], - joinRequests: [ '0' ], - endpoints: { - self: `${req.baseUrl}/${req.params.id}`, - classes: `${req.baseUrl}/${req.params.id}/invitations`, - questions: `${req.baseUrl}/${req.params.id}/assignments`, - students: `${req.baseUrl}/${req.params.id}/students`, - } - }); -}) +router.get('/:id', getClassHandler); router.get('/:id/invitations', (req, res) => { res.json({ diff --git a/backend/src/services/class.ts b/backend/src/services/class.ts new file mode 100644 index 00000000..3a3e8322 --- /dev/null +++ b/backend/src/services/class.ts @@ -0,0 +1,12 @@ +import { getClassRepository } from "../data/repositories"; +import { ClassDTO, mapToClassDTO } from "../interfaces/classes"; + +export async function getClass(classId: string): Promise { + const classRepository = getClassRepository(); + const cls = await classRepository.findById(classId); + + if (!cls) return null; + else { + return mapToClassDTO(cls); + } +} \ No newline at end of file diff --git a/backend/src/services/students.ts b/backend/src/services/students.ts index d38103ed..4bfd7673 100644 --- a/backend/src/services/students.ts +++ b/backend/src/services/students.ts @@ -1,6 +1,6 @@ import { getClassRepository, getStudentRepository } from "../data/repositories"; import { Class } from "../entities/classes/class.entity"; -import { ClassDTO } from "../interfaces/classes"; +import { ClassDTO, mapToClassDTO } from "../interfaces/classes"; import { StudentDTO } from "../interfaces/students"; export async function getAllStudents(): Promise { @@ -46,20 +46,11 @@ async function fetchStudentClasses(username: string): Promise { export async function getStudentClasses(username: string): Promise { const classes = await fetchStudentClasses(username); - - return classes.map((cls: Class): ClassDTO => { - return { - id: cls.classId, - displayName: cls.displayName, - teachers: cls.teachers.map(teacher => teacher.username), - students: cls.students.map(student => student.username), - joinRequests: [], // TODO - } - }); + return classes.map(mapToClassDTO); } export async function getStudentClassIds(username: string): Promise { const classes = await fetchStudentClasses(username); - return classes.map(cls => cls.classId); // class is a native keyword + return classes.map(cls => cls.classId); // 'class' is a native keyword }