From 074c5e510a2e3a3d295b6d3057618e6f90901add Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Tue, 22 Apr 2025 17:09:01 +0200 Subject: [PATCH] feat: group's questions route controller en service geimplementeerd --- backend/src/controllers/groups.ts | 16 +++++++++++++- .../src/data/questions/question-repository.ts | 7 ++++++ backend/src/services/groups.ts | 22 ++++++++++++++++++- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/backend/src/controllers/groups.ts b/backend/src/controllers/groups.ts index 217510f6..9f706af2 100644 --- a/backend/src/controllers/groups.ts +++ b/backend/src/controllers/groups.ts @@ -84,7 +84,7 @@ export async function createGroupHandler(req: Request, res: Response): Promise { +function getGroupParams(req: Request) { const classId = req.params.classid; const assignmentId = Number(req.params.assignmentid); const groupId = Number(req.params.groupid); @@ -100,7 +100,21 @@ export async function getGroupSubmissionsHandler(req: Request, res: Response): P throw new BadRequestException('Group id must be a number'); } + return { classId, assignmentId, groupId, full }; +} + +export async function getGroupSubmissionsHandler(req: Request, res: Response): Promise { + const { classId, assignmentId, groupId, full } = getGroupParams(req); + const submissions = await getGroupSubmissions(classId, assignmentId, groupId, full); res.json({ submissions }); } + +export async function getGroupQuestionsHandler(req: Request, res: Response): Promise { + const { classId, assignmentId, groupId, full } = getGroupParams(req); + + const questions = await getGroupQuestions(classId, assignmentId, groupId, full); + + res.json({ questions }); +} diff --git a/backend/src/data/questions/question-repository.ts b/backend/src/data/questions/question-repository.ts index 362ec4c9..40a6a631 100644 --- a/backend/src/data/questions/question-repository.ts +++ b/backend/src/data/questions/question-repository.ts @@ -77,6 +77,13 @@ export class QuestionRepository extends DwengoEntityRepository { }); } + public async findAllByGroup(inGroup: Group): Promise { + return this.findAll({ + where: { inGroup }, + orderBy: { timestamp: 'DESC' }, + }) + } + /** * Looks up all questions for the given learning object which were asked as part of the given assignment. * When forStudentUsername is set, only the questions within the given user's group are shown. diff --git a/backend/src/services/groups.ts b/backend/src/services/groups.ts index 382780d8..102f9cbc 100644 --- a/backend/src/services/groups.ts +++ b/backend/src/services/groups.ts @@ -1,5 +1,5 @@ import { EntityDTO } from '@mikro-orm/core'; -import { getGroupRepository, getSubmissionRepository } from '../data/repositories.js'; +import { getGroupRepository, getQuestionRepository, getSubmissionRepository } from '../data/repositories.js'; import { Group } from '../entities/assignments/group.entity.js'; import { mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; import { mapToSubmissionDTO, mapToSubmissionDTOId } from '../interfaces/submission.js'; @@ -12,6 +12,8 @@ import { fetchClass } from './classes.js'; import { BadRequestException } from '../exceptions/bad-request-exception.js'; import { Student } from '../entities/users/student.entity.js'; import { Class } from '../entities/classes/class.entity.js'; +import { QuestionDTO, QuestionId } from 'dwengo-1-common/interfaces/question'; +import { mapToQuestionDTO, mapToQuestionDTOId } from '../interfaces/question.js'; async function assertMembersInClass(members: Student[], cls: Class): Promise { if (!members.every((student) => cls.students.contains(student))) { @@ -121,3 +123,21 @@ export async function getGroupSubmissions( return submissions.map(mapToSubmissionDTOId); } + +export async function getGroupQuestions( + classId: string, + assignmentNumber: number, + groupNumber: number, + full: boolean +): Promise { + const group = await fetchGroup(classId, assignmentNumber, groupNumber); + + const questionRepository = getQuestionRepository(); + const questions = await questionRepository.findAllByGroup(group); + + if (full) { + return questions.map(mapToQuestionDTO); + } + + return questions.map(mapToQuestionDTOId); +}