From 69659426dee62396a9f5a976a9f3bf52cade151f Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Wed, 9 Apr 2025 18:31:06 +0200 Subject: [PATCH] fix: werkende aan assignment fix --- backend/src/controllers/assignments.ts | 6 +++++ .../data/assignments/assignment-repository.ts | 4 +-- .../entities/assignments/assignment.entity.ts | 2 +- backend/src/interfaces/assignment.ts | 24 +++++++++-------- backend/src/services/assignments.ts | 27 ++++++++++++++----- common/src/interfaces/assignment.ts | 2 +- 6 files changed, 44 insertions(+), 21 deletions(-) diff --git a/backend/src/controllers/assignments.ts b/backend/src/controllers/assignments.ts index 2ecb35cb..adb0e479 100644 --- a/backend/src/controllers/assignments.ts +++ b/backend/src/controllers/assignments.ts @@ -12,6 +12,8 @@ import { requireFields } from './error-helper.js'; import { BadRequestException } from '../exceptions/bad-request-exception.js'; import { Assignment } from '../entities/assignments/assignment.entity.js'; import { EntityDTO } from '@mikro-orm/core'; +import { createGroup } from '../services/groups.js'; +import { getLogger } from '../logging/initalize.js'; export async function getAllAssignmentsHandler(req: Request, res: Response): Promise { const classId = req.params.classid; @@ -32,8 +34,12 @@ export async function createAssignmentHandler(req: Request, res: Response): Prom requireFields({ description, language, learningPath, title }); const assignmentData = req.body as AssignmentDTO; + Object.entries(assignmentData).forEach(getLogger().info); const assignment = await createAssignment(classid, assignmentData); + // should probably use Promise.all + //assignmentData.groups.forEach(group => await createGroup({}, classid, assignment.id)); + res.json({ assignment }); } diff --git a/backend/src/data/assignments/assignment-repository.ts b/backend/src/data/assignments/assignment-repository.ts index 3de5031d..2645de1e 100644 --- a/backend/src/data/assignments/assignment-repository.ts +++ b/backend/src/data/assignments/assignment-repository.ts @@ -4,10 +4,10 @@ import { Class } from '../../entities/classes/class.entity.js'; export class AssignmentRepository extends DwengoEntityRepository { public async findByClassAndId(within: Class, id: number): Promise { - return this.findOne({ within: within, id: id }); + return this.findOne({ within: within, id: id }, { populate: [ "groups" ]}); } public async findAllAssignmentsInClass(within: Class): Promise { - return this.findAll({ where: { within: within } }); + return this.findAll({ where: { within: within }, populate: [ "groups" ] }); } public async deleteByClassAndId(within: Class, id: number): Promise { return this.deleteWhere({ within: within, id: id }); diff --git a/backend/src/entities/assignments/assignment.entity.ts b/backend/src/entities/assignments/assignment.entity.ts index 36b24344..14d22756 100644 --- a/backend/src/entities/assignments/assignment.entity.ts +++ b/backend/src/entities/assignments/assignment.entity.ts @@ -14,7 +14,7 @@ export class Assignment { }) within!: Class; - @PrimaryKey({ type: 'number', autoincrement: true }) + @PrimaryKey({ type: 'integer', autoincrement: true }) id?: number; @Property({ type: 'string' }) diff --git a/backend/src/interfaces/assignment.ts b/backend/src/interfaces/assignment.ts index 7abb3d3c..a3c41e48 100644 --- a/backend/src/interfaces/assignment.ts +++ b/backend/src/interfaces/assignment.ts @@ -4,6 +4,9 @@ import { Assignment } from '../entities/assignments/assignment.entity.js'; import { Class } from '../entities/classes/class.entity.js'; import { getLogger } from '../logging/initalize.js'; import { AssignmentDTO } from '@dwengo-1/common/interfaces/assignment'; +import { mapToGroupDTO, mapToGroupDTOId } from './group.js'; +import { getAssignmentHandler } from '../controllers/assignments.js'; +import { getAssignmentRepository, getClassRepository } from '../data/repositories.js'; export function mapToAssignmentDTOId(assignment: Assignment): AssignmentDTO { return { @@ -13,6 +16,7 @@ export function mapToAssignmentDTOId(assignment: Assignment): AssignmentDTO { description: assignment.description, learningPath: assignment.learningPathHruid, language: assignment.learningPathLanguage, + groups: assignment.groups.map(mapToGroupDTOId), }; } @@ -24,19 +28,17 @@ export function mapToAssignmentDTO(assignment: Assignment): AssignmentDTO { description: assignment.description, learningPath: assignment.learningPathHruid, language: assignment.learningPathLanguage, - // Groups: assignment.groups.map(mapToGroupDTO), + groups: assignment.groups.map(mapToGroupDTO), }; } export function mapToAssignment(assignmentData: AssignmentDTO, cls: Class): Assignment { - const assignment = new Assignment(); - assignment.title = assignmentData.title; - assignment.description = assignmentData.description; - assignment.learningPathHruid = assignmentData.learningPath; - assignment.learningPathLanguage = languageMap[assignmentData.language] || FALLBACK_LANG; - assignment.within = cls; - - getLogger().debug(assignment); - - return assignment; + return getAssignmentRepository().create({ + within: cls, + title: assignmentData.title, + description: assignmentData.description, + learningPathHruid: assignmentData.learningPath, + learningPathLanguage: languageMap[assignmentData.language], + groups: [], + }) } diff --git a/backend/src/services/assignments.ts b/backend/src/services/assignments.ts index 5fd8f67f..99b6e20b 100644 --- a/backend/src/services/assignments.ts +++ b/backend/src/services/assignments.ts @@ -14,8 +14,10 @@ import { mapToSubmissionDTO, mapToSubmissionDTOId } from '../interfaces/submissi import { fetchClass } from './classes.js'; import { QuestionDTO, QuestionId } from '@dwengo-1/common/interfaces/question'; import { SubmissionDTO, SubmissionDTOId } from '@dwengo-1/common/interfaces/submission'; -import { EntityDTO } from '@mikro-orm/core'; +import { assign, EntityDTO } from '@mikro-orm/core'; import { putObject } from './service-helper.js'; +import { getLogger } from '../logging/initalize.js'; +import { languageMap } from '@dwengo-1/common/util/language'; export async function fetchAssignment(classid: string, assignmentNumber: number): Promise { const classRepository = getClassRepository(); @@ -51,13 +53,26 @@ export async function getAllAssignments(classid: string, full: boolean): Promise export async function createAssignment(classid: string, assignmentData: AssignmentDTO): Promise { const cls = await fetchClass(classid); - const assignment = mapToAssignment(assignmentData, cls); - const assignmentRepository = getAssignmentRepository(); - const newAssignment = assignmentRepository.create(assignment); - await assignmentRepository.save(newAssignment, { preventOverwrite: true }); + const assignment = assignmentRepository.create({ + within: cls, + title: assignmentData.title, + description: assignmentData.description, + learningPathHruid: assignmentData.learningPath, + learningPathLanguage: languageMap[assignmentData.language], + groups: [], + }) + // const assignment = mapToAssignment(assignmentData, cls); + Object.entries(assignmentData).forEach(getLogger().info); - return mapToAssignmentDTO(newAssignment); + try { + await assignmentRepository.save(assignment, { preventOverwrite: true }); + } catch(e) { + getLogger().error(e); + } + + getLogger().info(`Saved assignment ${assignment.id}`); + return mapToAssignmentDTO(assignment); } export async function getAssignment(classid: string, id: number): Promise { diff --git a/common/src/interfaces/assignment.ts b/common/src/interfaces/assignment.ts index 5cb8feff..b5fe8a79 100644 --- a/common/src/interfaces/assignment.ts +++ b/common/src/interfaces/assignment.ts @@ -7,5 +7,5 @@ export interface AssignmentDTO { description: string; learningPath: string; language: string; - groups?: GroupDTO[] | string[]; // TODO + groups: GroupDTO[] | string[]; }