feat: gestart met implementeren van assignment service en controller laag

This commit is contained in:
Adriaan Jacquet 2025-03-05 17:45:09 +01:00
parent 241fe0103f
commit cfd0cce2df
8 changed files with 92 additions and 25 deletions

View file

@ -8,7 +8,6 @@ import learningObjectRoutes from './routes/learningObjects.js';
import studentRouter from './routes/student.js';
import groupRouter from './routes/group.js';
import assignmentRouter from './routes/assignment.js';
import submissionRouter from './routes/submission.js';
import classRouter from './routes/class.js';
import questionRouter from './routes/question.js';
@ -27,7 +26,6 @@ app.get('/', (_, res: Response) => {
app.use('/student', studentRouter);
app.use('/group', groupRouter);
app.use('/assignment', assignmentRouter);
app.use('/submission', submissionRouter);
app.use('/class', classRouter);
app.use('/question', questionRouter);

View file

@ -0,0 +1,30 @@
import { Request, Response } from 'express'
import { getAssignment } from '../services/assignments';
// typescript is annoywith with parameter forwarding from class.ts
interface AssignmentParams {
classid: string;
id: string;
}
export async function getAssignmentHandler(
req: Request<AssignmentParams>,
res: Response,
): Promise<void> {
const id = +req.params.id;
const classid = req.params.classid;
if (isNaN(id)) {
res.status(400).json({ error: "Assignment id must be a number" });
return;
}
const assignment = await getAssignment(classid, id);
if (!assignment) {
res.status(404).json({ error: "Assignment not found" });
return;
}
res.json(assignment);
}

View file

@ -0,0 +1,25 @@
import { Assignment } from "../entities/assignments/assignment.entity";
import { Class } from "../entities/classes/class.entity";
import { GroupDTO } from "./groups";
export interface AssignmentDTO {
id: number,
class: string, // id of class 'within'
title: string,
description: string,
learningPath: string,
language: string,
groups?: GroupDTO[], // TODO
}
export function mapToAssignmentDTO(assignment: Assignment, cls: Class): AssignmentDTO {
return {
id: assignment.id,
class: cls.classId,
title: assignment.title,
description: assignment.description,
learningPath: assignment.learningPathHruid,
language: assignment.learningPathLanguage,
//groups: assignment.groups.map(mapToGroupDTO),
};
}

View file

@ -0,0 +1,3 @@
export interface GroupDTO {
groupNumber: number,
}

View file

@ -0,0 +1,5 @@
// TODO: implement something like this but with named endpoints
export interface List<T> {
items: T[],
endpoints?: string[],
};

View file

@ -1,5 +1,8 @@
import express from 'express'
const router = express.Router();
import { getAssignmentHandler } from '../controllers/assignments';
const router = express.Router({ mergeParams: true });
// root endpoint used to search objects
router.get('/', (req, res) => {
@ -12,20 +15,7 @@ router.get('/', (req, res) => {
});
// information about an assignment with id 'id'
router.get('/:id', (req, res) => {
res.json({
id: req.params.id,
title: 'Dit is een test assignment',
description: 'Een korte beschrijving',
groups: [ '0' ],
learningPath: '0',
class: '0',
links: {
self: `${req.baseUrl}/${req.params.id}`,
submissions: `${req.baseUrl}/${req.params.id}`,
},
});
})
router.get('/:id', getAssignmentHandler);
router.get('/:id/submissions', (req, res) => {
res.json({

View file

@ -1,5 +1,7 @@
import express from 'express'
import { getAllClassesHandler, getClassHandler, getClassStudentsHandler } from '../controllers/classes';
import assignmentRouter from './assignment.js';
const router = express.Router();
// root endpoint used to search objects
@ -16,14 +18,8 @@ router.get('/:id/invitations', (req, res) => {
});
})
router.get('/:id/assignments', (req, res) => {
res.json({
assignments: [
'0'
],
});
})
router.get('/:id/students', getClassStudentsHandler);
router.use('/:classid/assignments', assignmentRouter);
export default router

View file

@ -0,0 +1,20 @@
import { getAssignmentRepository, getClassRepository } from "../data/repositories";
import { AssignmentDTO, mapToAssignmentDTO } from "../interfaces/assignments";
export async function getAssignment(classid: string, id: number): Promise<AssignmentDTO | null> {
const classRepository = getClassRepository();
const cls = await classRepository.findById(classid);
if (!cls) {
return null;
}
const assignmentRepository = getAssignmentRepository();
const assignment = await assignmentRepository.findByClassAndId(cls, id);
if (!assignment) {
return null;
}
return mapToAssignmentDTO(assignment, cls);
}