From 8bf927d1c959a58cac457d91f10d37a4f3810bf3 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 18:31:12 +0200 Subject: [PATCH 01/34] refactor(common): Introduceer common package --- common/package.json | 12 ++++++++++++ common/tsconfig.json | 9 +++++++++ package-lock.json | 9 +++++++++ package.json | 11 ++++++----- 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 common/package.json create mode 100644 common/tsconfig.json diff --git a/common/package.json b/common/package.json new file mode 100644 index 00000000..68e7a56b --- /dev/null +++ b/common/package.json @@ -0,0 +1,12 @@ +{ + "name": "dwengo-1-common", + "version": "0.1.1", + "description": "Common types and utilities for Dwengo-1", + "private": true, + "type": "module", + "scripts": { + "format": "prettier --write src/", + "format-check": "prettier --check src/", + "lint": "eslint . --fix" + } +} diff --git a/common/tsconfig.json b/common/tsconfig.json new file mode 100644 index 00000000..2dd3998d --- /dev/null +++ b/common/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.json", + "include": ["src/**/*.ts"], + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "resolveJsonModule": true + } +} diff --git a/package-lock.json b/package-lock.json index c54f2f5f..863bd035 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "workspaces": [ "backend", + "common", "frontend", "docs" ], @@ -81,6 +82,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "common": { + "name": "dwengo-1-common", + "version": "0.1.1" + }, "docs": { "name": "dwengo-1-docs", "version": "0.0.1", @@ -4011,6 +4016,10 @@ "resolved": "backend", "link": true }, + "node_modules/dwengo-1-common": { + "resolved": "common", + "link": true + }, "node_modules/dwengo-1-docs": { "resolved": "docs", "link": true diff --git a/package.json b/package.json index 7adeb3aa..56e3d01c 100644 --- a/package.json +++ b/package.json @@ -5,14 +5,15 @@ "private": true, "type": "module", "scripts": { - "build": "npm run build --ws", - "format": "npm run format --ws", - "format-check": "npm run format-check --ws", - "lint": "npm run lint --ws", - "test:unit": "npm run test:unit --ws" + "build": "npm run build --workspace=backend --workspace=frontend", + "format": "npm run format --workspace=backend --workspace=common --workspace=frontend", + "format-check": "npm run format-check --workspace=backend --workspace=common --workspace=frontend", + "lint": "npm run lint --workspace=backend --workspace=common --workspace=frontend", + "test:unit": "npm run test:unit --workspace=backend --workspace=frontend" }, "workspaces": [ "backend", + "common", "frontend", "docs" ], From 6c9c8d782dc6aa61a7a5c314530afce70522c7fc Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 18:40:19 +0200 Subject: [PATCH 02/34] refactor(common): AnswerDTO --- backend/src/interfaces/answer.ts | 19 +++---------------- common/src/interfaces/answer.d.ts | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 16 deletions(-) create mode 100644 common/src/interfaces/answer.d.ts diff --git a/backend/src/interfaces/answer.ts b/backend/src/interfaces/answer.ts index 493fd3c0..b62aa741 100644 --- a/backend/src/interfaces/answer.ts +++ b/backend/src/interfaces/answer.ts @@ -1,14 +1,7 @@ -import { mapToUserDTO, UserDTO } from './user.js'; -import { mapToQuestionDTO, mapToQuestionId, QuestionDTO, QuestionId } from './question.js'; +import { mapToUserDTO } from './user.js'; +import { mapToQuestionDTO, mapToQuestionId } from './question.js'; import { Answer } from '../entities/questions/answer.entity.js'; - -export interface AnswerDTO { - author: UserDTO; - toQuestion: QuestionDTO; - sequenceNumber: number; - timestamp: string; - content: string; -} +import { AnswerDTO, AnswerId } from 'dwengo-1-common/src/interfaces/answer'; /** * Convert a Question entity to a DTO format. @@ -23,12 +16,6 @@ export function mapToAnswerDTO(answer: Answer): AnswerDTO { }; } -export interface AnswerId { - author: string; - toQuestion: QuestionId; - sequenceNumber: number; -} - export function mapToAnswerId(answer: AnswerDTO): AnswerId { return { author: answer.author.username, diff --git a/common/src/interfaces/answer.d.ts b/common/src/interfaces/answer.d.ts new file mode 100644 index 00000000..96ed063b --- /dev/null +++ b/common/src/interfaces/answer.d.ts @@ -0,0 +1,16 @@ +import { UserDTO } from 'dwengo-1-backend/src/interfaces/user.js' +import { QuestionDTO } from 'dwengo-1-backend/src/interfaces/question.js' + +export interface AnswerDTO { + author: UserDTO; + toQuestion: QuestionDTO; + sequenceNumber: number; + timestamp: string; + content: string; +} + +export interface AnswerId { + author: string; + toQuestion: QuestionId; + sequenceNumber: number; +} From 4b1c343592be96f2649696543f8f598466e375a7 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 18:50:00 +0200 Subject: [PATCH 03/34] fix(backend): Build common in Docker --- backend/Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 7c63c4b8..c945a107 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -6,6 +6,7 @@ WORKDIR /app COPY package*.json ./ COPY backend/package.json ./backend/ +COPY common/package.json ./common/ RUN npm install --silent @@ -14,10 +15,11 @@ RUN npm install --silent # Root tsconfig.json COPY tsconfig.json ./ -WORKDIR /app/backend +COPY backend ./backend +COPY common ./common +COPY docs ./docs -COPY backend ./ -COPY docs /app/docs +WORKDIR /app/backend RUN npm run build From 757c89d8413e56ad80c4bcee38e6c38bc8cbcf98 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 19:03:13 +0200 Subject: [PATCH 04/34] refactor(common): Assignments --- backend/src/controllers/assignments.ts | 3 ++- backend/src/interfaces/assignment.ts | 12 +----------- backend/src/interfaces/group.ts | 3 ++- backend/src/services/assignments.ts | 3 ++- backend/src/services/students.ts | 2 +- common/src/interfaces/answer.d.ts | 4 ++-- common/src/interfaces/assignment.d.ts | 11 +++++++++++ 7 files changed, 21 insertions(+), 17 deletions(-) create mode 100644 common/src/interfaces/assignment.d.ts diff --git a/backend/src/controllers/assignments.ts b/backend/src/controllers/assignments.ts index 16dbb310..e2978363 100644 --- a/backend/src/controllers/assignments.ts +++ b/backend/src/controllers/assignments.ts @@ -1,6 +1,7 @@ import { Request, Response } from 'express'; import { createAssignment, getAllAssignments, getAssignment, getAssignmentsSubmissions } from '../services/assignments.js'; -import { AssignmentDTO } from '../interfaces/assignment.js'; + +import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; // Typescript is annoy with with parameter forwarding from class.ts interface AssignmentParams { diff --git a/backend/src/interfaces/assignment.ts b/backend/src/interfaces/assignment.ts index eefa8c96..c437f155 100644 --- a/backend/src/interfaces/assignment.ts +++ b/backend/src/interfaces/assignment.ts @@ -2,17 +2,7 @@ import { FALLBACK_LANG } from '../config.js'; import { Assignment } from '../entities/assignments/assignment.entity.js'; import { Class } from '../entities/classes/class.entity.js'; import { languageMap } from '../entities/content/language.js'; -import { GroupDTO } from './group.js'; - -export interface AssignmentDTO { - id: number; - class: string; // Id of class 'within' - title: string; - description: string; - learningPath: string; - language: string; - groups?: GroupDTO[] | string[]; // TODO -} +import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; export function mapToAssignmentDTOId(assignment: Assignment): AssignmentDTO { return { diff --git a/backend/src/interfaces/group.ts b/backend/src/interfaces/group.ts index a25c5b8e..93701dce 100644 --- a/backend/src/interfaces/group.ts +++ b/backend/src/interfaces/group.ts @@ -1,6 +1,7 @@ import { Group } from '../entities/assignments/group.entity.js'; -import { AssignmentDTO, mapToAssignmentDTO } from './assignment.js'; +import { mapToAssignmentDTO } from './assignment.js'; import { mapToStudentDTO, StudentDTO } from './student.js'; +import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; export interface GroupDTO { assignment: number | AssignmentDTO; diff --git a/backend/src/services/assignments.ts b/backend/src/services/assignments.ts index a21a96fa..0d8807c5 100644 --- a/backend/src/services/assignments.ts +++ b/backend/src/services/assignments.ts @@ -1,6 +1,7 @@ import { getAssignmentRepository, getClassRepository, getGroupRepository, getSubmissionRepository } from '../data/repositories.js'; -import { AssignmentDTO, mapToAssignment, mapToAssignmentDTO, mapToAssignmentDTOId } from '../interfaces/assignment.js'; +import { mapToAssignment, mapToAssignmentDTO, mapToAssignmentDTOId } from '../interfaces/assignment.js'; import { mapToSubmissionDTO, mapToSubmissionDTOId, SubmissionDTO, SubmissionDTOId } from '../interfaces/submission.js'; +import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; export async function getAllAssignments(classid: string, full: boolean): Promise { const classRepository = getClassRepository(); diff --git a/backend/src/services/students.ts b/backend/src/services/students.ts index 66327b6d..5382a67c 100644 --- a/backend/src/services/students.ts +++ b/backend/src/services/students.ts @@ -1,10 +1,10 @@ import { getClassRepository, getGroupRepository, getStudentRepository, getSubmissionRepository } from '../data/repositories.js'; -import { AssignmentDTO } from '../interfaces/assignment.js'; import { ClassDTO, mapToClassDTO } from '../interfaces/class.js'; import { GroupDTO, mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; import { mapToStudent, mapToStudentDTO, StudentDTO } from '../interfaces/student.js'; import { mapToSubmissionDTO, mapToSubmissionDTOId, SubmissionDTO, SubmissionDTOId } from '../interfaces/submission.js'; import { getAllAssignments } from './assignments.js'; +import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; export async function getAllStudents(full: boolean): Promise { const studentRepository = getStudentRepository(); diff --git a/common/src/interfaces/answer.d.ts b/common/src/interfaces/answer.d.ts index 96ed063b..88cc07be 100644 --- a/common/src/interfaces/answer.d.ts +++ b/common/src/interfaces/answer.d.ts @@ -1,5 +1,5 @@ -import { UserDTO } from 'dwengo-1-backend/src/interfaces/user.js' -import { QuestionDTO } from 'dwengo-1-backend/src/interfaces/question.js' +import { UserDTO } from 'dwengo-1-backend/src/interfaces/user.js'; +import { QuestionDTO } from 'dwengo-1-backend/src/interfaces/question.js'; export interface AnswerDTO { author: UserDTO; diff --git a/common/src/interfaces/assignment.d.ts b/common/src/interfaces/assignment.d.ts new file mode 100644 index 00000000..88bf10c6 --- /dev/null +++ b/common/src/interfaces/assignment.d.ts @@ -0,0 +1,11 @@ +import { GroupDTO } from 'dwengo-1-backend/src/interfaces/group.js'; + +export interface AssignmentDTO { + id: number; + class: string; // Id of class 'within' + title: string; + description: string; + learningPath: string; + language: string; + groups?: GroupDTO[] | string[]; // TODO +} From 24ed39d04e8cb129f5cf7307a1b502e8268b7815 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 19:06:14 +0200 Subject: [PATCH 05/34] refactor(common): Class --- backend/src/controllers/classes.ts | 3 ++- backend/src/interfaces/class.ts | 9 +-------- backend/src/interfaces/teacher-invitation.ts | 3 ++- backend/src/services/classes.ts | 3 ++- backend/src/services/students.ts | 3 ++- backend/src/services/teachers.ts | 3 ++- common/src/interfaces/class.d.ts | 7 +++++++ 7 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 common/src/interfaces/class.d.ts diff --git a/backend/src/controllers/classes.ts b/backend/src/controllers/classes.ts index 7526f7c4..40683c6a 100644 --- a/backend/src/controllers/classes.ts +++ b/backend/src/controllers/classes.ts @@ -1,6 +1,7 @@ import { Request, Response } from 'express'; import { createClass, getAllClasses, getClass, getClassStudents, getClassStudentsIds, getClassTeacherInvitations } from '../services/classes.js'; -import { ClassDTO } from '../interfaces/class.js'; + +import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; export async function getAllClassesHandler(req: Request, res: Response): Promise { const full = req.query.full === 'true'; diff --git a/backend/src/interfaces/class.ts b/backend/src/interfaces/class.ts index ea1d4901..c711b94b 100644 --- a/backend/src/interfaces/class.ts +++ b/backend/src/interfaces/class.ts @@ -2,14 +2,7 @@ import { Collection } from '@mikro-orm/core'; import { Class } from '../entities/classes/class.entity.js'; import { Student } from '../entities/users/student.entity.js'; import { Teacher } from '../entities/users/teacher.entity.js'; - -export interface ClassDTO { - id: string; - displayName: string; - teachers: string[]; - students: string[]; - joinRequests: string[]; -} +import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; export function mapToClassDTO(cls: Class): ClassDTO { return { diff --git a/backend/src/interfaces/teacher-invitation.ts b/backend/src/interfaces/teacher-invitation.ts index cddef566..a28aed5c 100644 --- a/backend/src/interfaces/teacher-invitation.ts +++ b/backend/src/interfaces/teacher-invitation.ts @@ -1,6 +1,7 @@ import { TeacherInvitation } from '../entities/classes/teacher-invitation.entity.js'; -import { ClassDTO, mapToClassDTO } from './class.js'; +import { mapToClassDTO } from './class.js'; import { mapToUserDTO, UserDTO } from './user.js'; +import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; export interface TeacherInvitationDTO { sender: string | UserDTO; diff --git a/backend/src/services/classes.ts b/backend/src/services/classes.ts index 5b1e3cfc..542f8f19 100644 --- a/backend/src/services/classes.ts +++ b/backend/src/services/classes.ts @@ -1,8 +1,9 @@ import { getClassRepository, getStudentRepository, getTeacherInvitationRepository, getTeacherRepository } from '../data/repositories.js'; -import { ClassDTO, mapToClassDTO } from '../interfaces/class.js'; +import { mapToClassDTO } from '../interfaces/class.js'; import { mapToStudentDTO, StudentDTO } from '../interfaces/student.js'; import { mapToTeacherInvitationDTO, mapToTeacherInvitationDTOIds, TeacherInvitationDTO } from '../interfaces/teacher-invitation.js'; import { getLogger } from '../logging/initalize.js'; +import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; const logger = getLogger(); diff --git a/backend/src/services/students.ts b/backend/src/services/students.ts index 5382a67c..931162ff 100644 --- a/backend/src/services/students.ts +++ b/backend/src/services/students.ts @@ -1,10 +1,11 @@ import { getClassRepository, getGroupRepository, getStudentRepository, getSubmissionRepository } from '../data/repositories.js'; -import { ClassDTO, mapToClassDTO } from '../interfaces/class.js'; +import { mapToClassDTO } from '../interfaces/class.js'; import { GroupDTO, mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; import { mapToStudent, mapToStudentDTO, StudentDTO } from '../interfaces/student.js'; import { mapToSubmissionDTO, mapToSubmissionDTOId, SubmissionDTO, SubmissionDTOId } from '../interfaces/submission.js'; import { getAllAssignments } from './assignments.js'; import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; +import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; export async function getAllStudents(full: boolean): Promise { const studentRepository = getStudentRepository(); diff --git a/backend/src/services/teachers.ts b/backend/src/services/teachers.ts index fced2b61..eca54214 100644 --- a/backend/src/services/teachers.ts +++ b/backend/src/services/teachers.ts @@ -1,9 +1,10 @@ import { getClassRepository, getLearningObjectRepository, getQuestionRepository, getTeacherRepository } from '../data/repositories.js'; -import { ClassDTO, mapToClassDTO } from '../interfaces/class.js'; +import { mapToClassDTO } from '../interfaces/class.js'; import { getClassStudents } from './classes.js'; import { StudentDTO } from '../interfaces/student.js'; import { mapToQuestionDTO, mapToQuestionId, QuestionDTO, QuestionId } from '../interfaces/question.js'; import { mapToTeacher, mapToTeacherDTO, TeacherDTO } from '../interfaces/teacher.js'; +import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; export async function getAllTeachers(full: boolean): Promise { const teacherRepository = getTeacherRepository(); diff --git a/common/src/interfaces/class.d.ts b/common/src/interfaces/class.d.ts new file mode 100644 index 00000000..c35c2dfc --- /dev/null +++ b/common/src/interfaces/class.d.ts @@ -0,0 +1,7 @@ +export interface ClassDTO { + id: string; + displayName: string; + teachers: string[]; + students: string[]; + joinRequests: string[]; +} From 1a0704c16fd748d2f6e0e50d08735fd9baff5228 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 19:09:23 +0200 Subject: [PATCH 06/34] refactor(common): Group --- backend/src/controllers/groups.ts | 3 ++- backend/src/interfaces/group.ts | 10 ++-------- backend/src/interfaces/submission.ts | 3 ++- backend/src/services/groups.ts | 3 ++- backend/src/services/students.ts | 3 ++- common/src/interfaces/assignment.d.ts | 2 +- common/src/interfaces/group.d.ts | 7 +++++++ 7 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 common/src/interfaces/group.d.ts diff --git a/backend/src/controllers/groups.ts b/backend/src/controllers/groups.ts index 38d5d5d0..c7da61d8 100644 --- a/backend/src/controllers/groups.ts +++ b/backend/src/controllers/groups.ts @@ -1,6 +1,7 @@ import { Request, Response } from 'express'; import { createGroup, getAllGroups, getGroup, getGroupSubmissions } from '../services/groups.js'; -import { GroupDTO } from '../interfaces/group.js'; + +import { GroupDTO } from 'dwengo-1-common/src/interfaces/group'; // Typescript is annoywith with parameter forwarding from class.ts interface GroupParams { diff --git a/backend/src/interfaces/group.ts b/backend/src/interfaces/group.ts index 93701dce..9f71e3f7 100644 --- a/backend/src/interfaces/group.ts +++ b/backend/src/interfaces/group.ts @@ -1,13 +1,7 @@ import { Group } from '../entities/assignments/group.entity.js'; import { mapToAssignmentDTO } from './assignment.js'; -import { mapToStudentDTO, StudentDTO } from './student.js'; -import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; - -export interface GroupDTO { - assignment: number | AssignmentDTO; - groupNumber: number; - members: string[] | StudentDTO[]; -} +import { mapToStudentDTO } from './student.js'; +import { GroupDTO } from 'dwengo-1-common/src/interfaces/group'; export function mapToGroupDTO(group: Group): GroupDTO { return { diff --git a/backend/src/interfaces/submission.ts b/backend/src/interfaces/submission.ts index 98cc4f22..95afee70 100644 --- a/backend/src/interfaces/submission.ts +++ b/backend/src/interfaces/submission.ts @@ -1,8 +1,9 @@ import { Submission } from '../entities/assignments/submission.entity.js'; import { Language } from '../entities/content/language.js'; -import { GroupDTO, mapToGroupDTO } from './group.js'; +import { mapToGroupDTO } from './group.js'; import { mapToStudent, mapToStudentDTO, StudentDTO } from './student.js'; import { LearningObjectIdentifier } from './learning-content.js'; +import { GroupDTO } from 'dwengo-1-common/src/interfaces/group'; export interface SubmissionDTO { learningObjectIdentifier: LearningObjectIdentifier; diff --git a/backend/src/services/groups.ts b/backend/src/services/groups.ts index 4a1cbbf0..df8f02b7 100644 --- a/backend/src/services/groups.ts +++ b/backend/src/services/groups.ts @@ -6,8 +6,9 @@ import { getSubmissionRepository, } from '../data/repositories.js'; import { Group } from '../entities/assignments/group.entity.js'; -import { GroupDTO, mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; +import { mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; import { mapToSubmissionDTO, mapToSubmissionDTOId, SubmissionDTO, SubmissionDTOId } from '../interfaces/submission.js'; +import { GroupDTO } from 'dwengo-1-common/src/interfaces/group'; export async function getGroup(classId: string, assignmentNumber: number, groupNumber: number, full: boolean): Promise { const classRepository = getClassRepository(); diff --git a/backend/src/services/students.ts b/backend/src/services/students.ts index 931162ff..b8ab4650 100644 --- a/backend/src/services/students.ts +++ b/backend/src/services/students.ts @@ -1,11 +1,12 @@ import { getClassRepository, getGroupRepository, getStudentRepository, getSubmissionRepository } from '../data/repositories.js'; import { mapToClassDTO } from '../interfaces/class.js'; -import { GroupDTO, mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; +import { mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; import { mapToStudent, mapToStudentDTO, StudentDTO } from '../interfaces/student.js'; import { mapToSubmissionDTO, mapToSubmissionDTOId, SubmissionDTO, SubmissionDTOId } from '../interfaces/submission.js'; import { getAllAssignments } from './assignments.js'; import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; +import { GroupDTO } from 'dwengo-1-common/src/interfaces/group'; export async function getAllStudents(full: boolean): Promise { const studentRepository = getStudentRepository(); diff --git a/common/src/interfaces/assignment.d.ts b/common/src/interfaces/assignment.d.ts index 88bf10c6..8ad1649b 100644 --- a/common/src/interfaces/assignment.d.ts +++ b/common/src/interfaces/assignment.d.ts @@ -1,4 +1,4 @@ -import { GroupDTO } from 'dwengo-1-backend/src/interfaces/group.js'; +import { GroupDTO } from './group'; export interface AssignmentDTO { id: number; diff --git a/common/src/interfaces/group.d.ts b/common/src/interfaces/group.d.ts new file mode 100644 index 00000000..45523461 --- /dev/null +++ b/common/src/interfaces/group.d.ts @@ -0,0 +1,7 @@ +import { AssignmentDTO } from './assignment'; + +export interface GroupDTO { + assignment: number | AssignmentDTO; + groupNumber: number; + members: string[] | StudentDTO[]; +} From 3b51b0f1f653a49fa20e801b689054e6b7fc03ac Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 21:41:14 +0200 Subject: [PATCH 07/34] refactor(common): User --- backend/src/interfaces/teacher-invitation.ts | 3 ++- backend/src/interfaces/user.ts | 14 +------------- common/src/interfaces/answer.d.ts | 2 +- common/src/interfaces/user.d.ts | 12 ++++++++++++ 4 files changed, 16 insertions(+), 15 deletions(-) create mode 100644 common/src/interfaces/user.d.ts diff --git a/backend/src/interfaces/teacher-invitation.ts b/backend/src/interfaces/teacher-invitation.ts index a28aed5c..8a792280 100644 --- a/backend/src/interfaces/teacher-invitation.ts +++ b/backend/src/interfaces/teacher-invitation.ts @@ -1,7 +1,8 @@ import { TeacherInvitation } from '../entities/classes/teacher-invitation.entity.js'; import { mapToClassDTO } from './class.js'; -import { mapToUserDTO, UserDTO } from './user.js'; +import { mapToUserDTO } from './user.js'; import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; +import { UserDTO } from 'dwengo-1-common/src/interfaces/user'; export interface TeacherInvitationDTO { sender: string | UserDTO; diff --git a/backend/src/interfaces/user.ts b/backend/src/interfaces/user.ts index 58f0dd5a..ecc9dd77 100644 --- a/backend/src/interfaces/user.ts +++ b/backend/src/interfaces/user.ts @@ -1,17 +1,5 @@ import { User } from '../entities/users/user.entity.js'; - -export interface UserDTO { - id?: string; - username: string; - firstName: string; - lastName: string; - endpoints?: { - self: string; - classes: string; - questions: string; - invitations: string; - }; -} +import { UserDTO } from 'dwengo-1-common/src/interfaces/user'; export function mapToUserDTO(user: User): UserDTO { return { diff --git a/common/src/interfaces/answer.d.ts b/common/src/interfaces/answer.d.ts index 88cc07be..b8fc9b55 100644 --- a/common/src/interfaces/answer.d.ts +++ b/common/src/interfaces/answer.d.ts @@ -1,5 +1,5 @@ -import { UserDTO } from 'dwengo-1-backend/src/interfaces/user.js'; import { QuestionDTO } from 'dwengo-1-backend/src/interfaces/question.js'; +import { UserDTO } from './user'; export interface AnswerDTO { author: UserDTO; diff --git a/common/src/interfaces/user.d.ts b/common/src/interfaces/user.d.ts new file mode 100644 index 00000000..e7bbe2ed --- /dev/null +++ b/common/src/interfaces/user.d.ts @@ -0,0 +1,12 @@ +export interface UserDTO { + id?: string; + username: string; + firstName: string; + lastName: string; + endpoints?: { + self: string; + classes: string; + questions: string; + invitations: string; + }; +} From 6ff29cb9493462618270353f5a983d8101dbb92d Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 21:43:17 +0200 Subject: [PATCH 08/34] refactor(common): Teacher --- backend/src/controllers/teachers.ts | 3 ++- backend/src/interfaces/teacher-invitation.ts | 9 +-------- backend/src/interfaces/teacher.ts | 14 +------------- backend/src/services/classes.ts | 3 ++- backend/src/services/teachers.ts | 3 ++- common/src/interfaces/teacher-invitation.d.ts | 8 ++++++++ common/src/interfaces/teacher.d.ts | 12 ++++++++++++ 7 files changed, 28 insertions(+), 24 deletions(-) create mode 100644 common/src/interfaces/teacher-invitation.d.ts create mode 100644 common/src/interfaces/teacher.d.ts diff --git a/backend/src/controllers/teachers.ts b/backend/src/controllers/teachers.ts index 7376abed..7f1beb54 100644 --- a/backend/src/controllers/teachers.ts +++ b/backend/src/controllers/teachers.ts @@ -8,7 +8,8 @@ import { getStudentsByTeacher, getTeacher, } from '../services/teachers.js'; -import { TeacherDTO } from '../interfaces/teacher.js'; + +import { TeacherDTO } from 'dwengo-1-common/src/interfaces/teacher'; export async function getAllTeachersHandler(req: Request, res: Response): Promise { const full = req.query.full === 'true'; diff --git a/backend/src/interfaces/teacher-invitation.ts b/backend/src/interfaces/teacher-invitation.ts index 8a792280..8df92fd1 100644 --- a/backend/src/interfaces/teacher-invitation.ts +++ b/backend/src/interfaces/teacher-invitation.ts @@ -1,14 +1,7 @@ import { TeacherInvitation } from '../entities/classes/teacher-invitation.entity.js'; import { mapToClassDTO } from './class.js'; import { mapToUserDTO } from './user.js'; -import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; -import { UserDTO } from 'dwengo-1-common/src/interfaces/user'; - -export interface TeacherInvitationDTO { - sender: string | UserDTO; - receiver: string | UserDTO; - class: string | ClassDTO; -} +import { TeacherInvitationDTO } from 'dwengo-1-common/src/interfaces/teacher-invitation'; export function mapToTeacherInvitationDTO(invitation: TeacherInvitation): TeacherInvitationDTO { return { diff --git a/backend/src/interfaces/teacher.ts b/backend/src/interfaces/teacher.ts index 31b4723f..a1ba33fd 100644 --- a/backend/src/interfaces/teacher.ts +++ b/backend/src/interfaces/teacher.ts @@ -1,18 +1,6 @@ import { Teacher } from '../entities/users/teacher.entity.js'; import { getTeacherRepository } from '../data/repositories.js'; - -export interface TeacherDTO { - id: string; - username: string; - firstName: string; - lastName: string; - endpoints?: { - classes: string; - questions: string; - invitations: string; - groups: string; - }; -} +import { TeacherDTO } from 'dwengo-1-common/src/interfaces/teacher'; export function mapToTeacherDTO(teacher: Teacher): TeacherDTO { return { diff --git a/backend/src/services/classes.ts b/backend/src/services/classes.ts index 542f8f19..ecc4b43e 100644 --- a/backend/src/services/classes.ts +++ b/backend/src/services/classes.ts @@ -1,9 +1,10 @@ import { getClassRepository, getStudentRepository, getTeacherInvitationRepository, getTeacherRepository } from '../data/repositories.js'; import { mapToClassDTO } from '../interfaces/class.js'; import { mapToStudentDTO, StudentDTO } from '../interfaces/student.js'; -import { mapToTeacherInvitationDTO, mapToTeacherInvitationDTOIds, TeacherInvitationDTO } from '../interfaces/teacher-invitation.js'; +import { mapToTeacherInvitationDTO, mapToTeacherInvitationDTOIds } from '../interfaces/teacher-invitation.js'; import { getLogger } from '../logging/initalize.js'; import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; +import { TeacherInvitationDTO } from 'dwengo-1-common/src/interfaces/teacher-invitation'; const logger = getLogger(); diff --git a/backend/src/services/teachers.ts b/backend/src/services/teachers.ts index eca54214..9589d0ba 100644 --- a/backend/src/services/teachers.ts +++ b/backend/src/services/teachers.ts @@ -3,8 +3,9 @@ import { mapToClassDTO } from '../interfaces/class.js'; import { getClassStudents } from './classes.js'; import { StudentDTO } from '../interfaces/student.js'; import { mapToQuestionDTO, mapToQuestionId, QuestionDTO, QuestionId } from '../interfaces/question.js'; -import { mapToTeacher, mapToTeacherDTO, TeacherDTO } from '../interfaces/teacher.js'; +import { mapToTeacher, mapToTeacherDTO } from '../interfaces/teacher.js'; import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; +import { TeacherDTO } from 'dwengo-1-common/src/interfaces/teacher'; export async function getAllTeachers(full: boolean): Promise { const teacherRepository = getTeacherRepository(); diff --git a/common/src/interfaces/teacher-invitation.d.ts b/common/src/interfaces/teacher-invitation.d.ts new file mode 100644 index 00000000..13709322 --- /dev/null +++ b/common/src/interfaces/teacher-invitation.d.ts @@ -0,0 +1,8 @@ +import { UserDTO } from './user'; +import { ClassDTO } from './class'; + +export interface TeacherInvitationDTO { + sender: string | UserDTO; + receiver: string | UserDTO; + class: string | ClassDTO; +} diff --git a/common/src/interfaces/teacher.d.ts b/common/src/interfaces/teacher.d.ts new file mode 100644 index 00000000..05bf74a0 --- /dev/null +++ b/common/src/interfaces/teacher.d.ts @@ -0,0 +1,12 @@ +export interface TeacherDTO { + id: string; + username: string; + firstName: string; + lastName: string; + endpoints?: { + classes: string; + questions: string; + invitations: string; + groups: string; + }; +} From bc8e8883737b16e483db24e183c0fd385bdbcea0 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 21:46:49 +0200 Subject: [PATCH 09/34] refactor(common): Submission --- backend/src/controllers/submissions.ts | 3 ++- backend/src/interfaces/submission.ts | 24 ++---------------------- backend/src/services/assignments.ts | 3 ++- backend/src/services/groups.ts | 3 ++- backend/src/services/students.ts | 3 ++- backend/src/services/submissions.ts | 3 ++- common/src/interfaces/submission.d.ts | 19 +++++++++++++++++++ 7 files changed, 31 insertions(+), 27 deletions(-) create mode 100644 common/src/interfaces/submission.d.ts diff --git a/backend/src/controllers/submissions.ts b/backend/src/controllers/submissions.ts index 512ac22e..9ef2df6e 100644 --- a/backend/src/controllers/submissions.ts +++ b/backend/src/controllers/submissions.ts @@ -1,7 +1,8 @@ import { Request, Response } from 'express'; import { createSubmission, deleteSubmission, getSubmission } from '../services/submissions.js'; import { Language, languageMap } from '../entities/content/language.js'; -import { SubmissionDTO } from '../interfaces/submission'; + +import { SubmissionDTO } from 'dwengo-1-common/src/interfaces/submission'; interface SubmissionParams { hruid: string; diff --git a/backend/src/interfaces/submission.ts b/backend/src/interfaces/submission.ts index 95afee70..9a506b27 100644 --- a/backend/src/interfaces/submission.ts +++ b/backend/src/interfaces/submission.ts @@ -1,27 +1,7 @@ import { Submission } from '../entities/assignments/submission.entity.js'; -import { Language } from '../entities/content/language.js'; import { mapToGroupDTO } from './group.js'; -import { mapToStudent, mapToStudentDTO, StudentDTO } from './student.js'; -import { LearningObjectIdentifier } from './learning-content.js'; -import { GroupDTO } from 'dwengo-1-common/src/interfaces/group'; - -export interface SubmissionDTO { - learningObjectIdentifier: LearningObjectIdentifier; - - submissionNumber?: number; - submitter: StudentDTO; - time?: Date; - group?: GroupDTO; - content: string; -} - -export interface SubmissionDTOId { - learningObjectHruid: string; - learningObjectLanguage: Language; - learningObjectVersion: number; - - submissionNumber?: number; -} +import { mapToStudent, mapToStudentDTO } from './student.js'; +import { SubmissionDTO, SubmissionDTOId } from 'dwengo-1-common/src/interfaces/submission'; export function mapToSubmissionDTO(submission: Submission): SubmissionDTO { return { diff --git a/backend/src/services/assignments.ts b/backend/src/services/assignments.ts index 0d8807c5..278098bd 100644 --- a/backend/src/services/assignments.ts +++ b/backend/src/services/assignments.ts @@ -1,7 +1,8 @@ import { getAssignmentRepository, getClassRepository, getGroupRepository, getSubmissionRepository } from '../data/repositories.js'; import { mapToAssignment, mapToAssignmentDTO, mapToAssignmentDTOId } from '../interfaces/assignment.js'; -import { mapToSubmissionDTO, mapToSubmissionDTOId, SubmissionDTO, SubmissionDTOId } from '../interfaces/submission.js'; +import { mapToSubmissionDTO, mapToSubmissionDTOId } from '../interfaces/submission.js'; import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; +import { SubmissionDTO, SubmissionDTOId } from 'dwengo-1-common/src/interfaces/submission'; export async function getAllAssignments(classid: string, full: boolean): Promise { const classRepository = getClassRepository(); diff --git a/backend/src/services/groups.ts b/backend/src/services/groups.ts index df8f02b7..42c51c20 100644 --- a/backend/src/services/groups.ts +++ b/backend/src/services/groups.ts @@ -7,8 +7,9 @@ import { } from '../data/repositories.js'; import { Group } from '../entities/assignments/group.entity.js'; import { mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; -import { mapToSubmissionDTO, mapToSubmissionDTOId, SubmissionDTO, SubmissionDTOId } from '../interfaces/submission.js'; +import { mapToSubmissionDTO, mapToSubmissionDTOId } from '../interfaces/submission.js'; import { GroupDTO } from 'dwengo-1-common/src/interfaces/group'; +import { SubmissionDTO, SubmissionDTOId } from 'dwengo-1-common/src/interfaces/submission'; export async function getGroup(classId: string, assignmentNumber: number, groupNumber: number, full: boolean): Promise { const classRepository = getClassRepository(); diff --git a/backend/src/services/students.ts b/backend/src/services/students.ts index b8ab4650..f8d92486 100644 --- a/backend/src/services/students.ts +++ b/backend/src/services/students.ts @@ -2,11 +2,12 @@ import { getClassRepository, getGroupRepository, getStudentRepository, getSubmis import { mapToClassDTO } from '../interfaces/class.js'; import { mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; import { mapToStudent, mapToStudentDTO, StudentDTO } from '../interfaces/student.js'; -import { mapToSubmissionDTO, mapToSubmissionDTOId, SubmissionDTO, SubmissionDTOId } from '../interfaces/submission.js'; +import { mapToSubmissionDTO, mapToSubmissionDTOId } from '../interfaces/submission.js'; import { getAllAssignments } from './assignments.js'; import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; import { GroupDTO } from 'dwengo-1-common/src/interfaces/group'; +import { SubmissionDTO, SubmissionDTOId } from 'dwengo-1-common/src/interfaces/submission'; export async function getAllStudents(full: boolean): Promise { const studentRepository = getStudentRepository(); diff --git a/backend/src/services/submissions.ts b/backend/src/services/submissions.ts index 0e1ad9ac..0fa9811d 100644 --- a/backend/src/services/submissions.ts +++ b/backend/src/services/submissions.ts @@ -1,7 +1,8 @@ import { getGroupRepository, getSubmissionRepository } from '../data/repositories.js'; import { Language } from '../entities/content/language.js'; import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; -import { mapToSubmission, mapToSubmissionDTO, SubmissionDTO } from '../interfaces/submission.js'; +import { mapToSubmission, mapToSubmissionDTO } from '../interfaces/submission.js'; +import { SubmissionDTO } from 'dwengo-1-common/src/interfaces/submission'; export async function getSubmission( learningObjectHruid: string, diff --git a/common/src/interfaces/submission.d.ts b/common/src/interfaces/submission.d.ts new file mode 100644 index 00000000..c4c2b35d --- /dev/null +++ b/common/src/interfaces/submission.d.ts @@ -0,0 +1,19 @@ +import { GroupDTO } from './group'; + +export interface SubmissionDTO { + learningObjectIdentifier: LearningObjectIdentifier; + + submissionNumber?: number; + submitter: StudentDTO; + time?: Date; + group?: GroupDTO; + content: string; +} + +export interface SubmissionDTOId { + learningObjectHruid: string; + learningObjectLanguage: Language; + learningObjectVersion: number; + + submissionNumber?: number; +} From d6b79dccede103b1a47d4456ec652f3cd983cc99 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 21:48:13 +0200 Subject: [PATCH 10/34] refactor(common): Student --- backend/src/controllers/students.ts | 3 ++- backend/src/interfaces/question.ts | 3 ++- backend/src/interfaces/student.ts | 14 +------------- backend/src/services/classes.ts | 3 ++- backend/src/services/students.ts | 3 ++- backend/src/services/teachers.ts | 2 +- common/src/interfaces/student.d.ts | 12 ++++++++++++ 7 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 common/src/interfaces/student.d.ts diff --git a/backend/src/controllers/students.ts b/backend/src/controllers/students.ts index 8ce5b11a..4e23ebc4 100644 --- a/backend/src/controllers/students.ts +++ b/backend/src/controllers/students.ts @@ -9,7 +9,8 @@ import { getStudentGroups, getStudentSubmissions, } from '../services/students.js'; -import { StudentDTO } from '../interfaces/student.js'; + +import { StudentDTO } from 'dwengo-1-common/src/interfaces/student'; // TODO: accept arguments (full, ...) // TODO: endpoints diff --git a/backend/src/interfaces/question.ts b/backend/src/interfaces/question.ts index 0da87eb7..93019dae 100644 --- a/backend/src/interfaces/question.ts +++ b/backend/src/interfaces/question.ts @@ -1,6 +1,7 @@ import { Question } from '../entities/questions/question.entity.js'; import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; -import { mapToStudentDTO, StudentDTO } from './student.js'; +import { mapToStudentDTO } from './student.js'; +import { StudentDTO } from 'dwengo-1-common/src/interfaces/student'; export interface QuestionDTO { learningObjectIdentifier: LearningObjectIdentifier; diff --git a/backend/src/interfaces/student.ts b/backend/src/interfaces/student.ts index ecce8f89..e1e4253f 100644 --- a/backend/src/interfaces/student.ts +++ b/backend/src/interfaces/student.ts @@ -1,18 +1,6 @@ import { Student } from '../entities/users/student.entity.js'; import { getStudentRepository } from '../data/repositories.js'; - -export interface StudentDTO { - id: string; - username: string; - firstName: string; - lastName: string; - endpoints?: { - classes: string; - questions: string; - invitations: string; - groups: string; - }; -} +import { StudentDTO } from 'dwengo-1-common/src/interfaces/student'; export function mapToStudentDTO(student: Student): StudentDTO { return { diff --git a/backend/src/services/classes.ts b/backend/src/services/classes.ts index ecc4b43e..c8d9f6ce 100644 --- a/backend/src/services/classes.ts +++ b/backend/src/services/classes.ts @@ -1,10 +1,11 @@ import { getClassRepository, getStudentRepository, getTeacherInvitationRepository, getTeacherRepository } from '../data/repositories.js'; import { mapToClassDTO } from '../interfaces/class.js'; -import { mapToStudentDTO, StudentDTO } from '../interfaces/student.js'; +import { mapToStudentDTO } from '../interfaces/student.js'; import { mapToTeacherInvitationDTO, mapToTeacherInvitationDTOIds } from '../interfaces/teacher-invitation.js'; import { getLogger } from '../logging/initalize.js'; import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; import { TeacherInvitationDTO } from 'dwengo-1-common/src/interfaces/teacher-invitation'; +import { StudentDTO } from 'dwengo-1-common/src/interfaces/student'; const logger = getLogger(); diff --git a/backend/src/services/students.ts b/backend/src/services/students.ts index f8d92486..9c14d749 100644 --- a/backend/src/services/students.ts +++ b/backend/src/services/students.ts @@ -1,13 +1,14 @@ import { getClassRepository, getGroupRepository, getStudentRepository, getSubmissionRepository } from '../data/repositories.js'; import { mapToClassDTO } from '../interfaces/class.js'; import { mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; -import { mapToStudent, mapToStudentDTO, StudentDTO } from '../interfaces/student.js'; +import { mapToStudent, mapToStudentDTO } from '../interfaces/student.js'; import { mapToSubmissionDTO, mapToSubmissionDTOId } from '../interfaces/submission.js'; import { getAllAssignments } from './assignments.js'; import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; import { GroupDTO } from 'dwengo-1-common/src/interfaces/group'; import { SubmissionDTO, SubmissionDTOId } from 'dwengo-1-common/src/interfaces/submission'; +import { StudentDTO } from 'dwengo-1-common/src/interfaces/student'; export async function getAllStudents(full: boolean): Promise { const studentRepository = getStudentRepository(); diff --git a/backend/src/services/teachers.ts b/backend/src/services/teachers.ts index 9589d0ba..3b2a5bbb 100644 --- a/backend/src/services/teachers.ts +++ b/backend/src/services/teachers.ts @@ -1,11 +1,11 @@ import { getClassRepository, getLearningObjectRepository, getQuestionRepository, getTeacherRepository } from '../data/repositories.js'; import { mapToClassDTO } from '../interfaces/class.js'; import { getClassStudents } from './classes.js'; -import { StudentDTO } from '../interfaces/student.js'; import { mapToQuestionDTO, mapToQuestionId, QuestionDTO, QuestionId } from '../interfaces/question.js'; import { mapToTeacher, mapToTeacherDTO } from '../interfaces/teacher.js'; import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; import { TeacherDTO } from 'dwengo-1-common/src/interfaces/teacher'; +import { StudentDTO } from 'dwengo-1-common/src/interfaces/student'; export async function getAllTeachers(full: boolean): Promise { const teacherRepository = getTeacherRepository(); diff --git a/common/src/interfaces/student.d.ts b/common/src/interfaces/student.d.ts new file mode 100644 index 00000000..cb13d3c2 --- /dev/null +++ b/common/src/interfaces/student.d.ts @@ -0,0 +1,12 @@ +export interface StudentDTO { + id: string; + username: string; + firstName: string; + lastName: string; + endpoints?: { + classes: string; + questions: string; + invitations: string; + groups: string; + }; +} From 70a31a292c72233a86e62d4abb5e6cae61b0874e Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 21:49:58 +0200 Subject: [PATCH 11/34] refactor(common): Question --- backend/src/controllers/questions.ts | 2 +- backend/src/interfaces/question.ts | 16 +--------------- backend/src/services/questions.ts | 3 ++- backend/src/services/teachers.ts | 3 ++- common/src/interfaces/answer.d.ts | 2 +- common/src/interfaces/question.d.ts | 14 ++++++++++++++ 6 files changed, 21 insertions(+), 19 deletions(-) create mode 100644 common/src/interfaces/question.d.ts diff --git a/backend/src/controllers/questions.ts b/backend/src/controllers/questions.ts index 00a51329..0f0604b2 100644 --- a/backend/src/controllers/questions.ts +++ b/backend/src/controllers/questions.ts @@ -1,9 +1,9 @@ import { Request, Response } from 'express'; import { createQuestion, deleteQuestion, getAllQuestions, getAnswersByQuestion, getQuestion } from '../services/questions.js'; -import { QuestionDTO, QuestionId } from '../interfaces/question.js'; import { FALLBACK_LANG, FALLBACK_SEQ_NUM } from '../config.js'; import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; import { Language } from '../entities/content/language.js'; +import { QuestionDTO, QuestionId } from 'dwengo-1-common/src/interfaces/question'; function getObjectId(req: Request, res: Response): LearningObjectIdentifier | null { const { hruid, version } = req.params; diff --git a/backend/src/interfaces/question.ts b/backend/src/interfaces/question.ts index 93019dae..86cd6523 100644 --- a/backend/src/interfaces/question.ts +++ b/backend/src/interfaces/question.ts @@ -1,15 +1,6 @@ import { Question } from '../entities/questions/question.entity.js'; -import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; import { mapToStudentDTO } from './student.js'; -import { StudentDTO } from 'dwengo-1-common/src/interfaces/student'; - -export interface QuestionDTO { - learningObjectIdentifier: LearningObjectIdentifier; - sequenceNumber?: number; - author: StudentDTO; - timestamp?: string; - content: string; -} +import { QuestionDTO, QuestionId } from 'dwengo-1-common/src/interfaces/question'; /** * Convert a Question entity to a DTO format. @@ -30,11 +21,6 @@ export function mapToQuestionDTO(question: Question): QuestionDTO { }; } -export interface QuestionId { - learningObjectIdentifier: LearningObjectIdentifier; - sequenceNumber: number; -} - export function mapToQuestionId(question: QuestionDTO): QuestionId { return { learningObjectIdentifier: question.learningObjectIdentifier, diff --git a/backend/src/services/questions.ts b/backend/src/services/questions.ts index 0e52440f..ed61902e 100644 --- a/backend/src/services/questions.ts +++ b/backend/src/services/questions.ts @@ -1,5 +1,5 @@ import { getAnswerRepository, getQuestionRepository } from '../data/repositories.js'; -import { mapToQuestionDTO, mapToQuestionId, QuestionDTO, QuestionId } from '../interfaces/question.js'; +import { mapToQuestionDTO, mapToQuestionId } from '../interfaces/question.js'; import { Question } from '../entities/questions/question.entity.js'; import { Answer } from '../entities/questions/answer.entity.js'; import { mapToAnswerDTO, mapToAnswerId } from '../interfaces/answer.js'; @@ -8,6 +8,7 @@ import { LearningObjectIdentifier } from '../entities/content/learning-object-id import { mapToUser } from '../interfaces/user.js'; import { Student } from '../entities/users/student.entity.js'; import { mapToStudent } from '../interfaces/student.js'; +import { QuestionDTO, QuestionId } from 'dwengo-1-common/src/interfaces/question'; export async function getAllQuestions(id: LearningObjectIdentifier, full: boolean): Promise { const questionRepository: QuestionRepository = getQuestionRepository(); diff --git a/backend/src/services/teachers.ts b/backend/src/services/teachers.ts index 3b2a5bbb..aa6ce2d8 100644 --- a/backend/src/services/teachers.ts +++ b/backend/src/services/teachers.ts @@ -1,11 +1,12 @@ import { getClassRepository, getLearningObjectRepository, getQuestionRepository, getTeacherRepository } from '../data/repositories.js'; import { mapToClassDTO } from '../interfaces/class.js'; import { getClassStudents } from './classes.js'; -import { mapToQuestionDTO, mapToQuestionId, QuestionDTO, QuestionId } from '../interfaces/question.js'; +import { mapToQuestionDTO, mapToQuestionId } from '../interfaces/question.js'; import { mapToTeacher, mapToTeacherDTO } from '../interfaces/teacher.js'; import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; import { TeacherDTO } from 'dwengo-1-common/src/interfaces/teacher'; import { StudentDTO } from 'dwengo-1-common/src/interfaces/student'; +import { QuestionDTO, QuestionId } from 'dwengo-1-common/src/interfaces/question'; export async function getAllTeachers(full: boolean): Promise { const teacherRepository = getTeacherRepository(); diff --git a/common/src/interfaces/answer.d.ts b/common/src/interfaces/answer.d.ts index b8fc9b55..d2faf87d 100644 --- a/common/src/interfaces/answer.d.ts +++ b/common/src/interfaces/answer.d.ts @@ -1,5 +1,5 @@ -import { QuestionDTO } from 'dwengo-1-backend/src/interfaces/question.js'; import { UserDTO } from './user'; +import { QuestionDTO } from './question'; export interface AnswerDTO { author: UserDTO; diff --git a/common/src/interfaces/question.d.ts b/common/src/interfaces/question.d.ts new file mode 100644 index 00000000..2b2a263c --- /dev/null +++ b/common/src/interfaces/question.d.ts @@ -0,0 +1,14 @@ +import { StudentDTO } from './student'; + +export interface QuestionDTO { + learningObjectIdentifier: LearningObjectIdentifier; + sequenceNumber?: number; + author: StudentDTO; + timestamp?: string; + content: string; +} + +export interface QuestionId { + learningObjectIdentifier: LearningObjectIdentifier; + sequenceNumber: number; +} From 5a908620989f462afd227728a2f12a33925994c4 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 21:55:34 +0200 Subject: [PATCH 12/34] refactor(common): Learning content --- backend/src/controllers/learning-objects.ts | 2 +- backend/src/services/learning-objects.ts | 8 +++++++- .../src/services/learning-objects/attachment-service.ts | 3 ++- .../learning-objects/database-learning-object-provider.ts | 2 +- .../dwengo-api-learning-object-provider.ts | 8 ++++---- .../services/learning-objects/learning-object-provider.ts | 2 +- .../services/learning-objects/learning-object-service.ts | 2 +- .../processing/markdown/dwengo-marked-renderer.ts | 2 +- .../learning-objects/processing/processing-service.ts | 2 +- .../learning-paths/database-learning-path-provider.ts | 8 +++++++- .../learning-paths/dwengo-api-learning-path-provider.ts | 2 +- .../src/services/learning-paths/learning-path-provider.ts | 2 +- .../src/services/learning-paths/learning-path-service.ts | 2 +- backend/src/util/links.ts | 2 +- .../database-learning-object-provider.test.ts | 2 +- .../learning-objects/learning-object-service.test.ts | 2 +- .../learning-path/database-learning-path-provider.test.ts | 3 ++- backend/tests/test-utils/expectations.ts | 2 +- .../src/interfaces/learning-content.d.ts | 2 +- 19 files changed, 36 insertions(+), 22 deletions(-) rename backend/src/interfaces/learning-content.ts => common/src/interfaces/learning-content.d.ts (97%) diff --git a/backend/src/controllers/learning-objects.ts b/backend/src/controllers/learning-objects.ts index 53eb1ded..71cac105 100644 --- a/backend/src/controllers/learning-objects.ts +++ b/backend/src/controllers/learning-objects.ts @@ -1,12 +1,12 @@ import { Request, Response } from 'express'; import { FALLBACK_LANG } from '../config.js'; -import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from '../interfaces/learning-content.js'; import learningObjectService from '../services/learning-objects/learning-object-service.js'; import { EnvVars, getEnvVar } from '../util/envvars.js'; import { Language } from '../entities/content/language.js'; import attachmentService from '../services/learning-objects/attachment-service.js'; import { NotFoundError } from '@mikro-orm/core'; import { BadRequestException } from '../exceptions/bad-request-exception.js'; +import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; function getLearningObjectIdentifierFromRequest(req: Request): LearningObjectIdentifier { if (!req.params.hruid) { diff --git a/backend/src/services/learning-objects.ts b/backend/src/services/learning-objects.ts index faa77cb4..d5f435e4 100644 --- a/backend/src/services/learning-objects.ts +++ b/backend/src/services/learning-objects.ts @@ -1,6 +1,12 @@ import { DWENGO_API_BASE } from '../config.js'; import { fetchWithLogging } from '../util/api-helper.js'; -import { FilteredLearningObject, LearningObjectMetadata, LearningObjectNode, LearningPathResponse } from '../interfaces/learning-content.js'; + +import { + FilteredLearningObject, + LearningObjectMetadata, + LearningObjectNode, + LearningPathResponse, +} from 'dwengo-1-common/src/interfaces/learning-content'; function filterData(data: LearningObjectMetadata, htmlUrl: string): FilteredLearningObject { return { diff --git a/backend/src/services/learning-objects/attachment-service.ts b/backend/src/services/learning-objects/attachment-service.ts index aacc7187..55dcc0e5 100644 --- a/backend/src/services/learning-objects/attachment-service.ts +++ b/backend/src/services/learning-objects/attachment-service.ts @@ -1,6 +1,7 @@ import { getAttachmentRepository } from '../../data/repositories.js'; import { Attachment } from '../../entities/content/attachment.entity.js'; -import { LearningObjectIdentifier } from '../../interfaces/learning-content.js'; + +import { LearningObjectIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; const attachmentService = { getAttachment(learningObjectId: LearningObjectIdentifier, attachmentName: string): Promise { diff --git a/backend/src/services/learning-objects/database-learning-object-provider.ts b/backend/src/services/learning-objects/database-learning-object-provider.ts index bab0b9b1..a0eb1850 100644 --- a/backend/src/services/learning-objects/database-learning-object-provider.ts +++ b/backend/src/services/learning-objects/database-learning-object-provider.ts @@ -1,5 +1,4 @@ import { LearningObjectProvider } from './learning-object-provider.js'; -import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from '../../interfaces/learning-content.js'; import { getLearningObjectRepository, getLearningPathRepository } from '../../data/repositories.js'; import { Language } from '../../entities/content/language.js'; import { LearningObject } from '../../entities/content/learning-object.entity.js'; @@ -8,6 +7,7 @@ import processingService from './processing/processing-service.js'; import { NotFoundError } from '@mikro-orm/core'; import learningObjectService from './learning-object-service.js'; import { getLogger, Logger } from '../../logging/initalize.js'; +import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; const logger: Logger = getLogger(); diff --git a/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts b/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts index dfee329d..1fd4ff69 100644 --- a/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts +++ b/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts @@ -1,5 +1,8 @@ import { DWENGO_API_BASE } from '../../config.js'; import { fetchWithLogging } from '../../util/api-helper.js'; +import dwengoApiLearningPathProvider from '../learning-paths/dwengo-api-learning-path-provider.js'; +import { LearningObjectProvider } from './learning-object-provider.js'; +import { getLogger, Logger } from '../../logging/initalize.js'; import { FilteredLearningObject, LearningObjectIdentifier, @@ -7,10 +10,7 @@ import { LearningObjectNode, LearningPathIdentifier, LearningPathResponse, -} from '../../interfaces/learning-content.js'; -import dwengoApiLearningPathProvider from '../learning-paths/dwengo-api-learning-path-provider.js'; -import { LearningObjectProvider } from './learning-object-provider.js'; -import { getLogger, Logger } from '../../logging/initalize.js'; +} from 'dwengo-1-common/src/interfaces/learning-content'; const logger: Logger = getLogger(); diff --git a/backend/src/services/learning-objects/learning-object-provider.ts b/backend/src/services/learning-objects/learning-object-provider.ts index 81b4d228..6ea7cbd1 100644 --- a/backend/src/services/learning-objects/learning-object-provider.ts +++ b/backend/src/services/learning-objects/learning-object-provider.ts @@ -1,4 +1,4 @@ -import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from '../../interfaces/learning-content.js'; +import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; export interface LearningObjectProvider { /** diff --git a/backend/src/services/learning-objects/learning-object-service.ts b/backend/src/services/learning-objects/learning-object-service.ts index 8289660b..983d7fc3 100644 --- a/backend/src/services/learning-objects/learning-object-service.ts +++ b/backend/src/services/learning-objects/learning-object-service.ts @@ -1,8 +1,8 @@ -import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from '../../interfaces/learning-content.js'; import dwengoApiLearningObjectProvider from './dwengo-api-learning-object-provider.js'; import { LearningObjectProvider } from './learning-object-provider.js'; import { EnvVars, getEnvVar } from '../../util/envvars.js'; import databaseLearningObjectProvider from './database-learning-object-provider.js'; +import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; function getProvider(id: LearningObjectIdentifier): LearningObjectProvider { if (id.hruid.startsWith(getEnvVar(EnvVars.UserContentPrefix))) { diff --git a/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts b/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts index d1c797be..3b9ad4e5 100644 --- a/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts +++ b/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts @@ -8,13 +8,13 @@ import InlineImageProcessor from '../image/inline-image-processor.js'; import * as marked from 'marked'; import { getUrlStringForLearningObjectHTML, isValidHttpUrl } from '../../../../util/links.js'; import { ProcessingError } from '../processing-error.js'; -import { LearningObjectIdentifier } from '../../../../interfaces/learning-content.js'; import { Language } from '../../../../entities/content/language.js'; import Image = marked.Tokens.Image; import Heading = marked.Tokens.Heading; import Link = marked.Tokens.Link; import RendererObject = marked.RendererObject; +import { LearningObjectIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; const prefixes = { learningObject: '@learning-object', diff --git a/backend/src/services/learning-objects/processing/processing-service.ts b/backend/src/services/learning-objects/processing/processing-service.ts index a6c662cc..ba83e83a 100644 --- a/backend/src/services/learning-objects/processing/processing-service.ts +++ b/backend/src/services/learning-objects/processing/processing-service.ts @@ -13,9 +13,9 @@ import GiftProcessor from './gift/gift-processor.js'; import { LearningObject } from '../../../entities/content/learning-object.entity.js'; import Processor from './processor.js'; import { DwengoContentType } from './content-type.js'; -import { LearningObjectIdentifier } from '../../../interfaces/learning-content.js'; import { Language } from '../../../entities/content/language.js'; import { replaceAsync } from '../../../util/async.js'; +import { LearningObjectIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; const EMBEDDED_LEARNING_OBJECT_PLACEHOLDER = //g; const LEARNING_OBJECT_DOES_NOT_EXIST = "
"; diff --git a/backend/src/services/learning-paths/database-learning-path-provider.ts b/backend/src/services/learning-paths/database-learning-path-provider.ts index bbcb6485..fe677fd1 100644 --- a/backend/src/services/learning-paths/database-learning-path-provider.ts +++ b/backend/src/services/learning-paths/database-learning-path-provider.ts @@ -1,5 +1,4 @@ import { LearningPathProvider } from './learning-path-provider.js'; -import { FilteredLearningObject, LearningObjectNode, LearningPath, LearningPathResponse, Transition } from '../../interfaces/learning-content.js'; import { LearningPath as LearningPathEntity } from '../../entities/content/learning-path.entity.js'; import { getLearningPathRepository } from '../../data/repositories.js'; import { Language } from '../../entities/content/language.js'; @@ -7,6 +6,13 @@ import learningObjectService from '../learning-objects/learning-object-service.j import { LearningPathNode } from '../../entities/content/learning-path-node.entity.js'; import { LearningPathTransition } from '../../entities/content/learning-path-transition.entity.js'; import { getLastSubmissionForCustomizationTarget, isTransitionPossible, PersonalizationTarget } from './learning-path-personalization-util.js'; +import { + FilteredLearningObject, + LearningObjectNode, + LearningPath, + LearningPathResponse, + Transition, +} from 'dwengo-1-common/src/interfaces/learning-content'; /** * Fetches the corresponding learning object for each of the nodes and creates a map that maps each node to its diff --git a/backend/src/services/learning-paths/dwengo-api-learning-path-provider.ts b/backend/src/services/learning-paths/dwengo-api-learning-path-provider.ts index a6093bb4..b7f03d35 100644 --- a/backend/src/services/learning-paths/dwengo-api-learning-path-provider.ts +++ b/backend/src/services/learning-paths/dwengo-api-learning-path-provider.ts @@ -1,8 +1,8 @@ import { fetchWithLogging } from '../../util/api-helper.js'; import { DWENGO_API_BASE } from '../../config.js'; -import { LearningPath, LearningPathResponse } from '../../interfaces/learning-content.js'; import { LearningPathProvider } from './learning-path-provider.js'; import { getLogger, Logger } from '../../logging/initalize.js'; +import { LearningPath, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; const logger: Logger = getLogger(); diff --git a/backend/src/services/learning-paths/learning-path-provider.ts b/backend/src/services/learning-paths/learning-path-provider.ts index 5e2a09df..a904296a 100644 --- a/backend/src/services/learning-paths/learning-path-provider.ts +++ b/backend/src/services/learning-paths/learning-path-provider.ts @@ -1,6 +1,6 @@ -import { LearningPath, LearningPathResponse } from '../../interfaces/learning-content.js'; import { Language } from '../../entities/content/language.js'; import { PersonalizationTarget } from './learning-path-personalization-util.js'; +import { LearningPath, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; /** * Generic interface for a service which provides access to learning paths from a data source. diff --git a/backend/src/services/learning-paths/learning-path-service.ts b/backend/src/services/learning-paths/learning-path-service.ts index 2fceb46c..c698e1bf 100644 --- a/backend/src/services/learning-paths/learning-path-service.ts +++ b/backend/src/services/learning-paths/learning-path-service.ts @@ -1,9 +1,9 @@ -import { LearningPath, LearningPathResponse } from '../../interfaces/learning-content.js'; import dwengoApiLearningPathProvider from './dwengo-api-learning-path-provider.js'; import databaseLearningPathProvider from './database-learning-path-provider.js'; import { EnvVars, getEnvVar } from '../../util/envvars.js'; import { Language } from '../../entities/content/language.js'; import { PersonalizationTarget } from './learning-path-personalization-util.js'; +import { LearningPath, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; const userContentPrefix = getEnvVar(EnvVars.UserContentPrefix); const allProviders = [dwengoApiLearningPathProvider, databaseLearningPathProvider]; diff --git a/backend/src/util/links.ts b/backend/src/util/links.ts index 73e27965..0107c9b0 100644 --- a/backend/src/util/links.ts +++ b/backend/src/util/links.ts @@ -1,4 +1,4 @@ -import { LearningObjectIdentifier } from '../interfaces/learning-content'; +import { LearningObjectIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; export function isValidHttpUrl(url: string): boolean { try { diff --git a/backend/tests/services/learning-objects/database-learning-object-provider.test.ts b/backend/tests/services/learning-objects/database-learning-object-provider.test.ts index 4750e4bd..a3317041 100644 --- a/backend/tests/services/learning-objects/database-learning-object-provider.test.ts +++ b/backend/tests/services/learning-objects/database-learning-object-provider.test.ts @@ -5,11 +5,11 @@ import example from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-w import { LearningObject } from '../../../src/entities/content/learning-object.entity'; import databaseLearningObjectProvider from '../../../src/services/learning-objects/database-learning-object-provider'; import { expectToBeCorrectFilteredLearningObject } from '../../test-utils/expectations'; -import { FilteredLearningObject } from '../../../src/interfaces/learning-content'; import { Language } from '../../../src/entities/content/language'; import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import learningPathExample from '../../test-assets/learning-paths/pn-werking-example'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; +import {FilteredLearningObject} from "dwengo-1-common/src/interfaces/learning-content"; async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { const learningObjectRepo = getLearningObjectRepository(); diff --git a/backend/tests/services/learning-objects/learning-object-service.test.ts b/backend/tests/services/learning-objects/learning-object-service.test.ts index c06cca39..481dc702 100644 --- a/backend/tests/services/learning-objects/learning-object-service.test.ts +++ b/backend/tests/services/learning-objects/learning-object-service.test.ts @@ -4,11 +4,11 @@ import { LearningObject } from '../../../src/entities/content/learning-object.en import { getLearningObjectRepository, getLearningPathRepository } from '../../../src/data/repositories'; import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import learningObjectService from '../../../src/services/learning-objects/learning-object-service'; -import { LearningObjectIdentifier, LearningPathIdentifier } from '../../../src/interfaces/learning-content'; import { Language } from '../../../src/entities/content/language'; import { EnvVars, getEnvVar } from '../../../src/util/envvars'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; import learningPathExample from '../../test-assets/learning-paths/pn-werking-example'; +import {LearningObjectIdentifier, LearningPathIdentifier} from "dwengo-1-common/src/interfaces/learning-content"; const EXPECTED_DWENGO_LEARNING_OBJECT_TITLE = 'Werken met notebooks'; const DWENGO_TEST_LEARNING_OBJECT_ID: LearningObjectIdentifier = { diff --git a/backend/tests/services/learning-path/database-learning-path-provider.test.ts b/backend/tests/services/learning-path/database-learning-path-provider.test.ts index 04782df3..3493cb35 100644 --- a/backend/tests/services/learning-path/database-learning-path-provider.test.ts +++ b/backend/tests/services/learning-path/database-learning-path-provider.test.ts @@ -19,7 +19,8 @@ import { createConditionTestLearningPathAndLearningObjects, } from '../../test-assets/learning-paths/test-conditions-example.js'; import { Student } from '../../../src/entities/users/student.entity.js'; -import { LearningObjectNode, LearningPathResponse } from '../../../src/interfaces/learning-content.js'; + +import {LearningObjectNode, LearningPathResponse} from "dwengo-1-common/src/interfaces/learning-content"; async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { const learningObjectRepo = getLearningObjectRepository(); diff --git a/backend/tests/test-utils/expectations.ts b/backend/tests/test-utils/expectations.ts index 0fe63811..0dd4399c 100644 --- a/backend/tests/test-utils/expectations.ts +++ b/backend/tests/test-utils/expectations.ts @@ -1,8 +1,8 @@ import { AssertionError } from 'node:assert'; import { LearningObject } from '../../src/entities/content/learning-object.entity'; -import { FilteredLearningObject, LearningPath } from '../../src/interfaces/learning-content'; import { LearningPath as LearningPathEntity } from '../../src/entities/content/learning-path.entity'; import { expect } from 'vitest'; +import {FilteredLearningObject, LearningPath} from "dwengo-1-common/src/interfaces/learning-content"; // Ignored properties because they belang for example to the class, not to the entity itself. const IGNORE_PROPERTIES = ['parent']; diff --git a/backend/src/interfaces/learning-content.ts b/common/src/interfaces/learning-content.d.ts similarity index 97% rename from backend/src/interfaces/learning-content.ts rename to common/src/interfaces/learning-content.d.ts index 51474917..5debdff6 100644 --- a/backend/src/interfaces/learning-content.ts +++ b/common/src/interfaces/learning-content.d.ts @@ -1,4 +1,4 @@ -import { Language } from '../entities/content/language'; +import { Language } from 'dwengo-1-backend/src/entities/content/language.js' export interface Transition { default: boolean; From bef6c6f75b2cf3bb0ffd069e1640f2a563cb371e Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 22:23:25 +0200 Subject: [PATCH 13/34] refactor(common): Language --- backend/src/controllers/learning-objects.ts | 2 +- backend/src/controllers/learning-paths.ts | 2 +- backend/src/controllers/questions.ts | 2 +- backend/src/controllers/submissions.ts | 2 +- backend/src/data/content/attachment-repository.ts | 2 +- .../src/data/content/learning-object-repository.ts | 1 - .../src/data/content/learning-path-repository.ts | 2 +- .../src/entities/assignments/assignment.entity.ts | 2 +- .../src/entities/assignments/submission.entity.ts | 2 +- .../entities/content/learning-object-identifier.ts | 2 +- .../src/entities/content/learning-object.entity.ts | 2 +- .../entities/content/learning-path-node.entity.ts | 2 +- .../src/entities/content/learning-path.entity.ts | 2 +- backend/src/entities/questions/question.entity.ts | 2 +- backend/src/interfaces/assignment.ts | 2 +- .../database-learning-object-provider.ts | 2 +- .../processing/markdown/dwengo-marked-renderer.ts | 2 +- .../processing/processing-service.ts | 2 +- .../database-learning-path-provider.ts | 2 +- .../learning-paths/learning-path-provider.ts | 2 +- .../learning-paths/learning-path-service.ts | 2 +- backend/src/services/submissions.ts | 4 ++-- backend/tests/data/assignments/submissions.test.ts | 2 +- backend/tests/data/content/attachments.test.ts | 2 +- .../tests/data/content/learning-objects.test.ts | 2 +- .../data/content/learning-path-repository.test.ts | 2 +- backend/tests/data/content/learning-paths.test.ts | 2 +- backend/tests/data/questions/answers.test.ts | 2 +- backend/tests/data/questions/questions.test.ts | 2 +- .../database-learning-object-provider.test.ts | 6 +++--- .../learning-object-service.test.ts | 14 ++++++++++---- .../database-learning-path-provider.test.ts | 10 +++++++--- .../learning-path/learning-path-service.test.ts | 2 +- .../dummy/dummy-learning-object-example.ts | 2 +- .../pn-werkingnotebooks-example.ts | 2 +- .../test-essay/test-essay-example.ts | 2 +- .../test-multiple-choice-example.ts | 2 +- .../learning-paths/learning-path-utils.ts | 2 +- .../learning-paths/pn-werking-example.ts | 2 +- .../learning-paths/test-conditions-example.ts | 2 +- backend/tests/test-utils/expectations.ts | 10 ++++++++-- .../assignments/assignments.testdata.ts | 2 +- .../test_assets/assignments/submission.testdata.ts | 2 +- .../content/learning-objects.testdata.ts | 2 +- .../test_assets/content/learning-paths.testdata.ts | 2 +- .../test_assets/questions/questions.testdata.ts | 2 +- common/src/interfaces/learning-content.d.ts | 2 +- .../content => common/src/util}/language.ts | 0 48 files changed, 71 insertions(+), 56 deletions(-) rename {backend/src/entities/content => common/src/util}/language.ts (100%) diff --git a/backend/src/controllers/learning-objects.ts b/backend/src/controllers/learning-objects.ts index 71cac105..706c02b9 100644 --- a/backend/src/controllers/learning-objects.ts +++ b/backend/src/controllers/learning-objects.ts @@ -2,11 +2,11 @@ import { Request, Response } from 'express'; import { FALLBACK_LANG } from '../config.js'; import learningObjectService from '../services/learning-objects/learning-object-service.js'; import { EnvVars, getEnvVar } from '../util/envvars.js'; -import { Language } from '../entities/content/language.js'; import attachmentService from '../services/learning-objects/attachment-service.js'; import { NotFoundError } from '@mikro-orm/core'; import { BadRequestException } from '../exceptions/bad-request-exception.js'; import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { Language } from 'dwengo-1-common/src/util/language.js'; function getLearningObjectIdentifierFromRequest(req: Request): LearningObjectIdentifier { if (!req.params.hruid) { diff --git a/backend/src/controllers/learning-paths.ts b/backend/src/controllers/learning-paths.ts index 04e44b59..23b77115 100644 --- a/backend/src/controllers/learning-paths.ts +++ b/backend/src/controllers/learning-paths.ts @@ -2,7 +2,6 @@ import { Request, Response } from 'express'; import { themes } from '../data/themes.js'; import { FALLBACK_LANG } from '../config.js'; import learningPathService from '../services/learning-paths/learning-path-service.js'; -import { Language } from '../entities/content/language.js'; import { PersonalizationTarget, personalizedForGroup, @@ -10,6 +9,7 @@ import { } from '../services/learning-paths/learning-path-personalization-util.js'; import { BadRequestException } from '../exceptions/bad-request-exception.js'; import { NotFoundException } from '../exceptions/not-found-exception.js'; +import { Language } from 'dwengo-1-common/src/util/language.js'; /** * Fetch learning paths based on query parameters. diff --git a/backend/src/controllers/questions.ts b/backend/src/controllers/questions.ts index 0f0604b2..2a31a124 100644 --- a/backend/src/controllers/questions.ts +++ b/backend/src/controllers/questions.ts @@ -2,8 +2,8 @@ import { Request, Response } from 'express'; import { createQuestion, deleteQuestion, getAllQuestions, getAnswersByQuestion, getQuestion } from '../services/questions.js'; import { FALLBACK_LANG, FALLBACK_SEQ_NUM } from '../config.js'; import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; -import { Language } from '../entities/content/language.js'; import { QuestionDTO, QuestionId } from 'dwengo-1-common/src/interfaces/question'; +import { Language } from 'dwengo-1-common/src/util/language.js'; function getObjectId(req: Request, res: Response): LearningObjectIdentifier | null { const { hruid, version } = req.params; diff --git a/backend/src/controllers/submissions.ts b/backend/src/controllers/submissions.ts index 9ef2df6e..d466a49d 100644 --- a/backend/src/controllers/submissions.ts +++ b/backend/src/controllers/submissions.ts @@ -1,8 +1,8 @@ import { Request, Response } from 'express'; import { createSubmission, deleteSubmission, getSubmission } from '../services/submissions.js'; -import { Language, languageMap } from '../entities/content/language.js'; import { SubmissionDTO } from 'dwengo-1-common/src/interfaces/submission'; +import { Language, languageMap } from 'dwengo-1-common/src/util/language.js'; interface SubmissionParams { hruid: string; diff --git a/backend/src/data/content/attachment-repository.ts b/backend/src/data/content/attachment-repository.ts index 95c5ab1c..d71a8d6b 100644 --- a/backend/src/data/content/attachment-repository.ts +++ b/backend/src/data/content/attachment-repository.ts @@ -1,7 +1,7 @@ import { DwengoEntityRepository } from '../dwengo-entity-repository.js'; import { Attachment } from '../../entities/content/attachment.entity.js'; -import { Language } from '../../entities/content/language'; import { LearningObjectIdentifier } from '../../entities/content/learning-object-identifier'; +import { Language } from 'dwengo-1-common/src/util/language.js'; export class AttachmentRepository extends DwengoEntityRepository { public findByLearningObjectIdAndName(learningObjectId: LearningObjectIdentifier, name: string): Promise { diff --git a/backend/src/data/content/learning-object-repository.ts b/backend/src/data/content/learning-object-repository.ts index 49b4c536..996a53bd 100644 --- a/backend/src/data/content/learning-object-repository.ts +++ b/backend/src/data/content/learning-object-repository.ts @@ -1,7 +1,6 @@ import { DwengoEntityRepository } from '../dwengo-entity-repository.js'; import { LearningObject } from '../../entities/content/learning-object.entity.js'; import { LearningObjectIdentifier } from '../../entities/content/learning-object-identifier.js'; -import { Language } from '../../entities/content/language.js'; import { Teacher } from '../../entities/users/teacher.entity.js'; export class LearningObjectRepository extends DwengoEntityRepository { diff --git a/backend/src/data/content/learning-path-repository.ts b/backend/src/data/content/learning-path-repository.ts index a2f9b47e..59e4e282 100644 --- a/backend/src/data/content/learning-path-repository.ts +++ b/backend/src/data/content/learning-path-repository.ts @@ -1,6 +1,6 @@ import { DwengoEntityRepository } from '../dwengo-entity-repository.js'; import { LearningPath } from '../../entities/content/learning-path.entity.js'; -import { Language } from '../../entities/content/language.js'; +import { Language } from 'dwengo-1-common/src/util/language.js'; export class LearningPathRepository extends DwengoEntityRepository { public findByHruidAndLanguage(hruid: string, language: Language): Promise { diff --git a/backend/src/entities/assignments/assignment.entity.ts b/backend/src/entities/assignments/assignment.entity.ts index daa71ed6..59b71d67 100644 --- a/backend/src/entities/assignments/assignment.entity.ts +++ b/backend/src/entities/assignments/assignment.entity.ts @@ -1,8 +1,8 @@ import { Entity, Enum, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'; import { Class } from '../classes/class.entity.js'; import { Group } from './group.entity.js'; -import { Language } from '../content/language.js'; import { AssignmentRepository } from '../../data/assignments/assignment-repository.js'; +import { Language } from 'dwengo-1-common/src/util/language.js'; @Entity({ repository: () => AssignmentRepository, diff --git a/backend/src/entities/assignments/submission.entity.ts b/backend/src/entities/assignments/submission.entity.ts index fbaa2791..333595b7 100644 --- a/backend/src/entities/assignments/submission.entity.ts +++ b/backend/src/entities/assignments/submission.entity.ts @@ -1,8 +1,8 @@ import { Student } from '../users/student.entity.js'; import { Group } from './group.entity.js'; import { Entity, Enum, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'; -import { Language } from '../content/language.js'; import { SubmissionRepository } from '../../data/assignments/submission-repository.js'; +import { Language } from 'dwengo-1-common/src/util/language.js'; @Entity({ repository: () => SubmissionRepository }) export class Submission { diff --git a/backend/src/entities/content/learning-object-identifier.ts b/backend/src/entities/content/learning-object-identifier.ts index 3c020bd7..afc9b7d5 100644 --- a/backend/src/entities/content/learning-object-identifier.ts +++ b/backend/src/entities/content/learning-object-identifier.ts @@ -1,4 +1,4 @@ -import { Language } from './language.js'; +import { Language } from 'dwengo-1-common/src/util/language'; export class LearningObjectIdentifier { constructor( diff --git a/backend/src/entities/content/learning-object.entity.ts b/backend/src/entities/content/learning-object.entity.ts index 9eda22ba..b0e941c0 100644 --- a/backend/src/entities/content/learning-object.entity.ts +++ b/backend/src/entities/content/learning-object.entity.ts @@ -1,10 +1,10 @@ import { Embeddable, Embedded, Entity, Enum, ManyToMany, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'; -import { Language } from './language.js'; import { Attachment } from './attachment.entity.js'; import { Teacher } from '../users/teacher.entity.js'; import { DwengoContentType } from '../../services/learning-objects/processing/content-type.js'; import { v4 } from 'uuid'; import { LearningObjectRepository } from '../../data/content/learning-object-repository.js'; +import { Language } from 'dwengo-1-common/src/util/language.js'; @Embeddable() export class EducationalGoal { diff --git a/backend/src/entities/content/learning-path-node.entity.ts b/backend/src/entities/content/learning-path-node.entity.ts index 03499270..129ff708 100644 --- a/backend/src/entities/content/learning-path-node.entity.ts +++ b/backend/src/entities/content/learning-path-node.entity.ts @@ -1,7 +1,7 @@ import { Entity, Enum, ManyToOne, OneToMany, PrimaryKey, Property, Rel } from '@mikro-orm/core'; -import { Language } from './language.js'; import { LearningPath } from './learning-path.entity.js'; import { LearningPathTransition } from './learning-path-transition.entity.js'; +import { Language } from 'dwengo-1-common/src/util/language.js'; @Entity() export class LearningPathNode { diff --git a/backend/src/entities/content/learning-path.entity.ts b/backend/src/entities/content/learning-path.entity.ts index 888cc0cf..f486d5b1 100644 --- a/backend/src/entities/content/learning-path.entity.ts +++ b/backend/src/entities/content/learning-path.entity.ts @@ -1,8 +1,8 @@ import { Entity, Enum, ManyToMany, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'; -import { Language } from './language.js'; import { Teacher } from '../users/teacher.entity.js'; import { LearningPathRepository } from '../../data/content/learning-path-repository.js'; import { LearningPathNode } from './learning-path-node.entity.js'; +import { Language } from 'dwengo-1-common/src/util/language.js'; @Entity({ repository: () => LearningPathRepository }) export class LearningPath { diff --git a/backend/src/entities/questions/question.entity.ts b/backend/src/entities/questions/question.entity.ts index 058ba6b3..8f2bca53 100644 --- a/backend/src/entities/questions/question.entity.ts +++ b/backend/src/entities/questions/question.entity.ts @@ -1,7 +1,7 @@ import { Entity, Enum, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'; -import { Language } from '../content/language.js'; import { Student } from '../users/student.entity.js'; import { QuestionRepository } from '../../data/questions/question-repository.js'; +import { Language } from 'dwengo-1-common/src/util/language.js'; @Entity({ repository: () => QuestionRepository }) export class Question { diff --git a/backend/src/interfaces/assignment.ts b/backend/src/interfaces/assignment.ts index c437f155..e5f2a53d 100644 --- a/backend/src/interfaces/assignment.ts +++ b/backend/src/interfaces/assignment.ts @@ -1,7 +1,7 @@ +import { languageMap } from 'dwengo-1-common/src/util/language.js'; import { FALLBACK_LANG } from '../config.js'; import { Assignment } from '../entities/assignments/assignment.entity.js'; import { Class } from '../entities/classes/class.entity.js'; -import { languageMap } from '../entities/content/language.js'; import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; export function mapToAssignmentDTOId(assignment: Assignment): AssignmentDTO { diff --git a/backend/src/services/learning-objects/database-learning-object-provider.ts b/backend/src/services/learning-objects/database-learning-object-provider.ts index a0eb1850..a4cf886d 100644 --- a/backend/src/services/learning-objects/database-learning-object-provider.ts +++ b/backend/src/services/learning-objects/database-learning-object-provider.ts @@ -1,6 +1,5 @@ import { LearningObjectProvider } from './learning-object-provider.js'; import { getLearningObjectRepository, getLearningPathRepository } from '../../data/repositories.js'; -import { Language } from '../../entities/content/language.js'; import { LearningObject } from '../../entities/content/learning-object.entity.js'; import { getUrlStringForLearningObject } from '../../util/links.js'; import processingService from './processing/processing-service.js'; @@ -8,6 +7,7 @@ import { NotFoundError } from '@mikro-orm/core'; import learningObjectService from './learning-object-service.js'; import { getLogger, Logger } from '../../logging/initalize.js'; import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { Language } from 'dwengo-1-common/src/util/language.js'; const logger: Logger = getLogger(); diff --git a/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts b/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts index 3b9ad4e5..c2d04bd5 100644 --- a/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts +++ b/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts @@ -8,13 +8,13 @@ import InlineImageProcessor from '../image/inline-image-processor.js'; import * as marked from 'marked'; import { getUrlStringForLearningObjectHTML, isValidHttpUrl } from '../../../../util/links.js'; import { ProcessingError } from '../processing-error.js'; -import { Language } from '../../../../entities/content/language.js'; import Image = marked.Tokens.Image; import Heading = marked.Tokens.Heading; import Link = marked.Tokens.Link; import RendererObject = marked.RendererObject; import { LearningObjectIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { Language } from 'dwengo-1-common/src/util/language.js'; const prefixes = { learningObject: '@learning-object', diff --git a/backend/src/services/learning-objects/processing/processing-service.ts b/backend/src/services/learning-objects/processing/processing-service.ts index ba83e83a..d206f788 100644 --- a/backend/src/services/learning-objects/processing/processing-service.ts +++ b/backend/src/services/learning-objects/processing/processing-service.ts @@ -13,9 +13,9 @@ import GiftProcessor from './gift/gift-processor.js'; import { LearningObject } from '../../../entities/content/learning-object.entity.js'; import Processor from './processor.js'; import { DwengoContentType } from './content-type.js'; -import { Language } from '../../../entities/content/language.js'; import { replaceAsync } from '../../../util/async.js'; import { LearningObjectIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { Language } from 'dwengo-1-common/src/util/language.js'; const EMBEDDED_LEARNING_OBJECT_PLACEHOLDER = //g; const LEARNING_OBJECT_DOES_NOT_EXIST = "
"; diff --git a/backend/src/services/learning-paths/database-learning-path-provider.ts b/backend/src/services/learning-paths/database-learning-path-provider.ts index fe677fd1..cef2eb90 100644 --- a/backend/src/services/learning-paths/database-learning-path-provider.ts +++ b/backend/src/services/learning-paths/database-learning-path-provider.ts @@ -1,7 +1,6 @@ import { LearningPathProvider } from './learning-path-provider.js'; import { LearningPath as LearningPathEntity } from '../../entities/content/learning-path.entity.js'; import { getLearningPathRepository } from '../../data/repositories.js'; -import { Language } from '../../entities/content/language.js'; import learningObjectService from '../learning-objects/learning-object-service.js'; import { LearningPathNode } from '../../entities/content/learning-path-node.entity.js'; import { LearningPathTransition } from '../../entities/content/learning-path-transition.entity.js'; @@ -13,6 +12,7 @@ import { LearningPathResponse, Transition, } from 'dwengo-1-common/src/interfaces/learning-content'; +import { Language } from 'dwengo-1-common/src/util/language.js'; /** * Fetches the corresponding learning object for each of the nodes and creates a map that maps each node to its diff --git a/backend/src/services/learning-paths/learning-path-provider.ts b/backend/src/services/learning-paths/learning-path-provider.ts index a904296a..99a05ab0 100644 --- a/backend/src/services/learning-paths/learning-path-provider.ts +++ b/backend/src/services/learning-paths/learning-path-provider.ts @@ -1,4 +1,4 @@ -import { Language } from '../../entities/content/language.js'; +import { Language } from 'dwengo-1-common/src/util/language.js'; import { PersonalizationTarget } from './learning-path-personalization-util.js'; import { LearningPath, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; diff --git a/backend/src/services/learning-paths/learning-path-service.ts b/backend/src/services/learning-paths/learning-path-service.ts index c698e1bf..a82880dd 100644 --- a/backend/src/services/learning-paths/learning-path-service.ts +++ b/backend/src/services/learning-paths/learning-path-service.ts @@ -1,9 +1,9 @@ import dwengoApiLearningPathProvider from './dwengo-api-learning-path-provider.js'; import databaseLearningPathProvider from './database-learning-path-provider.js'; import { EnvVars, getEnvVar } from '../../util/envvars.js'; -import { Language } from '../../entities/content/language.js'; import { PersonalizationTarget } from './learning-path-personalization-util.js'; import { LearningPath, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; +import { Language } from 'dwengo-1-common/src/util/language.js'; const userContentPrefix = getEnvVar(EnvVars.UserContentPrefix); const allProviders = [dwengoApiLearningPathProvider, databaseLearningPathProvider]; diff --git a/backend/src/services/submissions.ts b/backend/src/services/submissions.ts index 0fa9811d..f3bf38ce 100644 --- a/backend/src/services/submissions.ts +++ b/backend/src/services/submissions.ts @@ -1,5 +1,5 @@ -import { getGroupRepository, getSubmissionRepository } from '../data/repositories.js'; -import { Language } from '../entities/content/language.js'; +import { Language } from 'dwengo-1-common/src/util/language.js'; +import { getSubmissionRepository } from '../data/repositories.js'; import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; import { mapToSubmission, mapToSubmissionDTO } from '../interfaces/submission.js'; import { SubmissionDTO } from 'dwengo-1-common/src/interfaces/submission'; diff --git a/backend/tests/data/assignments/submissions.test.ts b/backend/tests/data/assignments/submissions.test.ts index cd212b77..d2595973 100644 --- a/backend/tests/data/assignments/submissions.test.ts +++ b/backend/tests/data/assignments/submissions.test.ts @@ -9,11 +9,11 @@ import { getSubmissionRepository, } from '../../../src/data/repositories'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier'; -import { Language } from '../../../src/entities/content/language'; import { StudentRepository } from '../../../src/data/users/student-repository'; import { GroupRepository } from '../../../src/data/assignments/group-repository'; import { AssignmentRepository } from '../../../src/data/assignments/assignment-repository'; import { ClassRepository } from '../../../src/data/classes/class-repository'; +import { Language } from 'dwengo-1-common/src/util/language'; describe('SubmissionRepository', () => { let submissionRepository: SubmissionRepository; diff --git a/backend/tests/data/content/attachments.test.ts b/backend/tests/data/content/attachments.test.ts index 94e132a9..42adc507 100644 --- a/backend/tests/data/content/attachments.test.ts +++ b/backend/tests/data/content/attachments.test.ts @@ -4,7 +4,7 @@ import { getAttachmentRepository, getLearningObjectRepository } from '../../../s import { AttachmentRepository } from '../../../src/data/content/attachment-repository.js'; import { LearningObjectRepository } from '../../../src/data/content/learning-object-repository.js'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier.js'; -import { Language } from '../../../src/entities/content/language.js'; +import { Language } from 'dwengo-1-common/src/util/language.js'; describe('AttachmentRepository', () => { let attachmentRepository: AttachmentRepository; diff --git a/backend/tests/data/content/learning-objects.test.ts b/backend/tests/data/content/learning-objects.test.ts index 712f75c9..c996f7cd 100644 --- a/backend/tests/data/content/learning-objects.test.ts +++ b/backend/tests/data/content/learning-objects.test.ts @@ -3,7 +3,7 @@ import { LearningObjectRepository } from '../../../src/data/content/learning-obj import { getLearningObjectRepository } from '../../../src/data/repositories'; import { setupTestApp } from '../../setup-tests'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from 'dwengo-1-common/src/util/language'; describe('LearningObjectRepository', () => { let learningObjectRepository: LearningObjectRepository; diff --git a/backend/tests/data/content/learning-path-repository.test.ts b/backend/tests/data/content/learning-path-repository.test.ts index 8dbff3c1..1b03b761 100644 --- a/backend/tests/data/content/learning-path-repository.test.ts +++ b/backend/tests/data/content/learning-path-repository.test.ts @@ -5,7 +5,7 @@ import { LearningPathRepository } from '../../../src/data/content/learning-path- import example from '../../test-assets/learning-paths/pn-werking-example.js'; import { LearningPath } from '../../../src/entities/content/learning-path.entity.js'; import { expectToBeCorrectEntity } from '../../test-utils/expectations.js'; -import { Language } from '../../../src/entities/content/language.js'; +import { Language } from 'dwengo-1-common/src/util/language'; function expectToHaveFoundPrecisely(expected: LearningPath, result: LearningPath[]): void { expect(result).toHaveProperty('length'); diff --git a/backend/tests/data/content/learning-paths.test.ts b/backend/tests/data/content/learning-paths.test.ts index 01fd20e5..37801e1a 100644 --- a/backend/tests/data/content/learning-paths.test.ts +++ b/backend/tests/data/content/learning-paths.test.ts @@ -2,7 +2,7 @@ import { beforeAll, describe, expect, it } from 'vitest'; import { getLearningPathRepository } from '../../../src/data/repositories'; import { LearningPathRepository } from '../../../src/data/content/learning-path-repository'; import { setupTestApp } from '../../setup-tests'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from 'dwengo-1-common/src/util/language'; describe('LearningPathRepository', () => { let learningPathRepository: LearningPathRepository; diff --git a/backend/tests/data/questions/answers.test.ts b/backend/tests/data/questions/answers.test.ts index bcc62cf6..1ac7612e 100644 --- a/backend/tests/data/questions/answers.test.ts +++ b/backend/tests/data/questions/answers.test.ts @@ -1,10 +1,10 @@ import { beforeAll, describe, expect, it } from 'vitest'; +import { Language } from 'dwengo-1-common/src/util/language'; import { setupTestApp } from '../../setup-tests'; import { AnswerRepository } from '../../../src/data/questions/answer-repository'; import { getAnswerRepository, getQuestionRepository, getTeacherRepository } from '../../../src/data/repositories'; import { QuestionRepository } from '../../../src/data/questions/question-repository'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier'; -import { Language } from '../../../src/entities/content/language'; import { TeacherRepository } from '../../../src/data/users/teacher-repository'; describe('AnswerRepository', () => { diff --git a/backend/tests/data/questions/questions.test.ts b/backend/tests/data/questions/questions.test.ts index 7b408df4..b3a43567 100644 --- a/backend/tests/data/questions/questions.test.ts +++ b/backend/tests/data/questions/questions.test.ts @@ -1,11 +1,11 @@ import { beforeAll, describe, expect, it } from 'vitest'; +import { Language } from 'dwengo-1-common/src/util/language'; import { setupTestApp } from '../../setup-tests'; import { QuestionRepository } from '../../../src/data/questions/question-repository'; import { getLearningObjectRepository, getQuestionRepository, getStudentRepository } from '../../../src/data/repositories'; import { StudentRepository } from '../../../src/data/users/student-repository'; import { LearningObjectRepository } from '../../../src/data/content/learning-object-repository'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier'; -import { Language } from '../../../src/entities/content/language'; describe('QuestionRepository', () => { let questionRepository: QuestionRepository; diff --git a/backend/tests/services/learning-objects/database-learning-object-provider.test.ts b/backend/tests/services/learning-objects/database-learning-object-provider.test.ts index a3317041..381bd4e2 100644 --- a/backend/tests/services/learning-objects/database-learning-object-provider.test.ts +++ b/backend/tests/services/learning-objects/database-learning-object-provider.test.ts @@ -1,15 +1,15 @@ import { beforeAll, describe, expect, it } from 'vitest'; +import { Language } from 'dwengo-1-common/src/util/language'; import { setupTestApp } from '../../setup-tests'; import { getLearningObjectRepository, getLearningPathRepository } from '../../../src/data/repositories'; import example from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; +import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import { LearningObject } from '../../../src/entities/content/learning-object.entity'; import databaseLearningObjectProvider from '../../../src/services/learning-objects/database-learning-object-provider'; import { expectToBeCorrectFilteredLearningObject } from '../../test-utils/expectations'; -import { Language } from '../../../src/entities/content/language'; -import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import learningPathExample from '../../test-assets/learning-paths/pn-werking-example'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; -import {FilteredLearningObject} from "dwengo-1-common/src/interfaces/learning-content"; +import { FilteredLearningObject } from 'dwengo-1-common/src/interfaces/learning-content'; async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { const learningObjectRepo = getLearningObjectRepository(); diff --git a/backend/tests/services/learning-objects/learning-object-service.test.ts b/backend/tests/services/learning-objects/learning-object-service.test.ts index 481dc702..9d2d87a6 100644 --- a/backend/tests/services/learning-objects/learning-object-service.test.ts +++ b/backend/tests/services/learning-objects/learning-object-service.test.ts @@ -1,14 +1,14 @@ import { beforeAll, describe, expect, it } from 'vitest'; +import { Language } from 'dwengo-1-common/src/util/language'; import { setupTestApp } from '../../setup-tests'; import { LearningObject } from '../../../src/entities/content/learning-object.entity'; import { getLearningObjectRepository, getLearningPathRepository } from '../../../src/data/repositories'; import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import learningObjectService from '../../../src/services/learning-objects/learning-object-service'; -import { Language } from '../../../src/entities/content/language'; import { EnvVars, getEnvVar } from '../../../src/util/envvars'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; import learningPathExample from '../../test-assets/learning-paths/pn-werking-example'; -import {LearningObjectIdentifier, LearningPathIdentifier} from "dwengo-1-common/src/interfaces/learning-content"; +import { LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; const EXPECTED_DWENGO_LEARNING_OBJECT_TITLE = 'Werken met notebooks'; const DWENGO_TEST_LEARNING_OBJECT_ID: LearningObjectIdentifier = { @@ -105,7 +105,10 @@ describe('LearningObjectService', () => { expect(new Set(result.map((it) => it.key))).toEqual(DWENGO_TEST_LEARNING_PATH_HRUIDS); }); it('returns an empty list when queried with a non-existing learning path id', async () => { - const result = await learningObjectService.getLearningObjectsFromPath({ hruid: 'non_existing', language: Language.Dutch }); + const result = await learningObjectService.getLearningObjectsFromPath({ + hruid: 'non_existing', + language: Language.Dutch, + }); expect(result).toEqual([]); }); }); @@ -120,7 +123,10 @@ describe('LearningObjectService', () => { expect(new Set(result)).toEqual(DWENGO_TEST_LEARNING_PATH_HRUIDS); }); it('returns an empty list when queried with a non-existing learning path id', async () => { - const result = await learningObjectService.getLearningObjectIdsFromPath({ hruid: 'non_existing', language: Language.Dutch }); + const result = await learningObjectService.getLearningObjectIdsFromPath({ + hruid: 'non_existing', + language: Language.Dutch, + }); expect(result).toEqual([]); }); }); diff --git a/backend/tests/services/learning-path/database-learning-path-provider.test.ts b/backend/tests/services/learning-path/database-learning-path-provider.test.ts index 3493cb35..80117520 100644 --- a/backend/tests/services/learning-path/database-learning-path-provider.test.ts +++ b/backend/tests/services/learning-path/database-learning-path-provider.test.ts @@ -1,4 +1,5 @@ import { beforeAll, describe, expect, it } from 'vitest'; +import { Language } from 'dwengo-1-common/src/util/language'; import { LearningObject } from '../../../src/entities/content/learning-object.entity.js'; import { setupTestApp } from '../../setup-tests.js'; import { LearningPath } from '../../../src/entities/content/learning-path.entity.js'; @@ -13,14 +14,13 @@ import learningPathExample from '../../test-assets/learning-paths/pn-werking-exa import databaseLearningPathProvider from '../../../src/services/learning-paths/database-learning-path-provider.js'; import { expectToBeCorrectLearningPath } from '../../test-utils/expectations.js'; import learningObjectService from '../../../src/services/learning-objects/learning-object-service.js'; -import { Language } from '../../../src/entities/content/language.js'; import { ConditionTestLearningPathAndLearningObjects, createConditionTestLearningPathAndLearningObjects, } from '../../test-assets/learning-paths/test-conditions-example.js'; import { Student } from '../../../src/entities/users/student.entity.js'; -import {LearningObjectNode, LearningPathResponse} from "dwengo-1-common/src/interfaces/learning-content"; +import { LearningObjectNode, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { const learningObjectRepo = getLearningObjectRepository(); @@ -105,7 +105,11 @@ function expectBranchingObjectNode( describe('DatabaseLearningPathProvider', () => { let example: { learningObject: LearningObject; learningPath: LearningPath }; - let persTestData: { learningContent: ConditionTestLearningPathAndLearningObjects; studentA: Student; studentB: Student }; + let persTestData: { + learningContent: ConditionTestLearningPathAndLearningObjects; + studentA: Student; + studentB: Student; + }; beforeAll(async () => { await setupTestApp(); diff --git a/backend/tests/services/learning-path/learning-path-service.test.ts b/backend/tests/services/learning-path/learning-path-service.test.ts index 2a8906df..b4fb2ccc 100644 --- a/backend/tests/services/learning-path/learning-path-service.test.ts +++ b/backend/tests/services/learning-path/learning-path-service.test.ts @@ -1,11 +1,11 @@ import { beforeAll, describe, expect, it } from 'vitest'; +import { Language } from 'dwengo-1-common/src/util/language'; import { setupTestApp } from '../../setup-tests'; import { LearningObject } from '../../../src/entities/content/learning-object.entity'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; import { getLearningObjectRepository, getLearningPathRepository } from '../../../src/data/repositories'; import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import learningPathExample from '../../test-assets/learning-paths/pn-werking-example'; -import { Language } from '../../../src/entities/content/language'; import learningPathService from '../../../src/services/learning-paths/learning-path-service'; async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { diff --git a/backend/tests/test-assets/learning-objects/dummy/dummy-learning-object-example.ts b/backend/tests/test-assets/learning-objects/dummy/dummy-learning-object-example.ts index 2f2e78ad..cacafc8e 100644 --- a/backend/tests/test-assets/learning-objects/dummy/dummy-learning-object-example.ts +++ b/backend/tests/test-assets/learning-objects/dummy/dummy-learning-object-example.ts @@ -1,6 +1,6 @@ import { LearningObjectExample } from '../learning-object-example'; +import { Language } from 'dwengo-1-common/src/util/language'; import { LearningObject } from '../../../../src/entities/content/learning-object.entity'; -import { Language } from '../../../../src/entities/content/language'; import { loadTestAsset } from '../../../test-utils/load-test-asset'; import { DwengoContentType } from '../../../../src/services/learning-objects/processing/content-type'; import { EnvVars, getEnvVar } from '../../../../src/util/envvars'; diff --git a/backend/tests/test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example.ts b/backend/tests/test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example.ts index 600a4305..bcc4fd5d 100644 --- a/backend/tests/test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example.ts +++ b/backend/tests/test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example.ts @@ -1,5 +1,5 @@ import { LearningObjectExample } from '../learning-object-example'; -import { Language } from '../../../../src/entities/content/language'; +import { Language } from 'dwengo-1-common/src/util/language'; import { DwengoContentType } from '../../../../src/services/learning-objects/processing/content-type'; import { loadTestAsset } from '../../../test-utils/load-test-asset'; import { EducationalGoal, LearningObject, ReturnValue } from '../../../../src/entities/content/learning-object.entity'; diff --git a/backend/tests/test-assets/learning-objects/test-essay/test-essay-example.ts b/backend/tests/test-assets/learning-objects/test-essay/test-essay-example.ts index d57c7a33..1a491682 100644 --- a/backend/tests/test-assets/learning-objects/test-essay/test-essay-example.ts +++ b/backend/tests/test-assets/learning-objects/test-essay/test-essay-example.ts @@ -1,8 +1,8 @@ import { LearningObjectExample } from '../learning-object-example'; +import { Language } from 'dwengo-1-common/src/util/language'; import { LearningObject } from '../../../../src/entities/content/learning-object.entity'; import { loadTestAsset } from '../../../test-utils/load-test-asset'; import { EnvVars, getEnvVar } from '../../../../src/util/envvars'; -import { Language } from '../../../../src/entities/content/language'; import { DwengoContentType } from '../../../../src/services/learning-objects/processing/content-type'; const example: LearningObjectExample = { diff --git a/backend/tests/test-assets/learning-objects/test-multiple-choice/test-multiple-choice-example.ts b/backend/tests/test-assets/learning-objects/test-multiple-choice/test-multiple-choice-example.ts index a634878a..cc25ebda 100644 --- a/backend/tests/test-assets/learning-objects/test-multiple-choice/test-multiple-choice-example.ts +++ b/backend/tests/test-assets/learning-objects/test-multiple-choice/test-multiple-choice-example.ts @@ -1,8 +1,8 @@ import { LearningObjectExample } from '../learning-object-example'; +import { Language } from 'dwengo-1-common/src/util/language'; import { LearningObject } from '../../../../src/entities/content/learning-object.entity'; import { loadTestAsset } from '../../../test-utils/load-test-asset'; import { EnvVars, getEnvVar } from '../../../../src/util/envvars'; -import { Language } from '../../../../src/entities/content/language'; import { DwengoContentType } from '../../../../src/services/learning-objects/processing/content-type'; const example: LearningObjectExample = { diff --git a/backend/tests/test-assets/learning-paths/learning-path-utils.ts b/backend/tests/test-assets/learning-paths/learning-path-utils.ts index c567de66..135e5c32 100644 --- a/backend/tests/test-assets/learning-paths/learning-path-utils.ts +++ b/backend/tests/test-assets/learning-paths/learning-path-utils.ts @@ -1,4 +1,4 @@ -import { Language } from '../../../src/entities/content/language'; +import { Language } from 'dwengo-1-common/src/util/language'; import { LearningPathTransition } from '../../../src/entities/content/learning-path-transition.entity'; import { LearningPathNode } from '../../../src/entities/content/learning-path-node.entity'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; diff --git a/backend/tests/test-assets/learning-paths/pn-werking-example.ts b/backend/tests/test-assets/learning-paths/pn-werking-example.ts index 810b4da5..99fa5c52 100644 --- a/backend/tests/test-assets/learning-paths/pn-werking-example.ts +++ b/backend/tests/test-assets/learning-paths/pn-werking-example.ts @@ -1,5 +1,5 @@ import { LearningPath } from '../../../src/entities/content/learning-path.entity'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from 'dwengo-1-common/src/util/language'; import { EnvVars, getEnvVar } from '../../../src/util/envvars'; import { createLearningPathNode, createLearningPathTransition } from './learning-path-utils'; import { LearningPathNode } from '../../../src/entities/content/learning-path-node.entity'; diff --git a/backend/tests/test-assets/learning-paths/test-conditions-example.ts b/backend/tests/test-assets/learning-paths/test-conditions-example.ts index 07857235..6a89451f 100644 --- a/backend/tests/test-assets/learning-paths/test-conditions-example.ts +++ b/backend/tests/test-assets/learning-paths/test-conditions-example.ts @@ -1,5 +1,5 @@ import { LearningPath } from '../../../src/entities/content/learning-path.entity'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from 'dwengo-1-common/src/util/language'; import testMultipleChoiceExample from '../learning-objects/test-multiple-choice/test-multiple-choice-example'; import { dummyLearningObject } from '../learning-objects/dummy/dummy-learning-object-example'; import { createLearningPathNode, createLearningPathTransition } from './learning-path-utils'; diff --git a/backend/tests/test-utils/expectations.ts b/backend/tests/test-utils/expectations.ts index 0dd4399c..25c52e2e 100644 --- a/backend/tests/test-utils/expectations.ts +++ b/backend/tests/test-utils/expectations.ts @@ -2,7 +2,7 @@ import { AssertionError } from 'node:assert'; import { LearningObject } from '../../src/entities/content/learning-object.entity'; import { LearningPath as LearningPathEntity } from '../../src/entities/content/learning-path.entity'; import { expect } from 'vitest'; -import {FilteredLearningObject, LearningPath} from "dwengo-1-common/src/interfaces/learning-content"; +import { FilteredLearningObject, LearningPath } from 'dwengo-1-common/src/interfaces/learning-content'; // Ignored properties because they belang for example to the class, not to the entity itself. const IGNORE_PROPERTIES = ['parent']; @@ -12,7 +12,13 @@ const IGNORE_PROPERTIES = ['parent']; * @param actual The actual entity retrieved from the database * @param expected The (previously added) entity we would expect to retrieve */ -export function expectToBeCorrectEntity(actual: { entity: T; name?: string }, expected: { entity: T; name?: string }): void { +export function expectToBeCorrectEntity( + actual: { entity: T; name?: string }, + expected: { + entity: T; + name?: string; + } +): void { if (!actual.name) { actual.name = 'actual'; } diff --git a/backend/tests/test_assets/assignments/assignments.testdata.ts b/backend/tests/test_assets/assignments/assignments.testdata.ts index 7f909de4..722821a0 100644 --- a/backend/tests/test_assets/assignments/assignments.testdata.ts +++ b/backend/tests/test_assets/assignments/assignments.testdata.ts @@ -1,7 +1,7 @@ import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { Language } from 'dwengo-1-common/src/util/language'; import { Assignment } from '../../../src/entities/assignments/assignment.entity'; import { Class } from '../../../src/entities/classes/class.entity'; -import { Language } from '../../../src/entities/content/language'; export function makeTestAssignemnts(em: EntityManager>, classes: Array): Array { const assignment01 = em.create(Assignment, { diff --git a/backend/tests/test_assets/assignments/submission.testdata.ts b/backend/tests/test_assets/assignments/submission.testdata.ts index 95dd65df..f51de224 100644 --- a/backend/tests/test_assets/assignments/submission.testdata.ts +++ b/backend/tests/test_assets/assignments/submission.testdata.ts @@ -1,6 +1,6 @@ import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { Language } from 'dwengo-1-common/src/util/language'; import { Submission } from '../../../src/entities/assignments/submission.entity'; -import { Language } from '../../../src/entities/content/language'; import { Student } from '../../../src/entities/users/student.entity'; import { Group } from '../../../src/entities/assignments/group.entity'; diff --git a/backend/tests/test_assets/content/learning-objects.testdata.ts b/backend/tests/test_assets/content/learning-objects.testdata.ts index 17ed4f01..760c99a2 100644 --- a/backend/tests/test_assets/content/learning-objects.testdata.ts +++ b/backend/tests/test_assets/content/learning-objects.testdata.ts @@ -1,6 +1,6 @@ import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { Language } from 'dwengo-1-common/src/util/language'; import { LearningObject, ReturnValue } from '../../../src/entities/content/learning-object.entity'; -import { Language } from '../../../src/entities/content/language'; import { DwengoContentType } from '../../../src/services/learning-objects/processing/content-type'; export function makeTestLearningObjects(em: EntityManager>): Array { diff --git a/backend/tests/test_assets/content/learning-paths.testdata.ts b/backend/tests/test_assets/content/learning-paths.testdata.ts index 10de885c..d7888928 100644 --- a/backend/tests/test_assets/content/learning-paths.testdata.ts +++ b/backend/tests/test_assets/content/learning-paths.testdata.ts @@ -1,6 +1,6 @@ import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { Language } from 'dwengo-1-common/src/util/language'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; -import { Language } from '../../../src/entities/content/language'; import { LearningPathTransition } from '../../../src/entities/content/learning-path-transition.entity'; import { LearningPathNode } from '../../../src/entities/content/learning-path-node.entity'; diff --git a/backend/tests/test_assets/questions/questions.testdata.ts b/backend/tests/test_assets/questions/questions.testdata.ts index cea43e18..fbc79a36 100644 --- a/backend/tests/test_assets/questions/questions.testdata.ts +++ b/backend/tests/test_assets/questions/questions.testdata.ts @@ -1,6 +1,6 @@ import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { Language } from 'dwengo-1-common/src/util/language'; import { Question } from '../../../src/entities/questions/question.entity'; -import { Language } from '../../../src/entities/content/language'; import { Student } from '../../../src/entities/users/student.entity'; export function makeTestQuestions(em: EntityManager>, students: Array): Array { diff --git a/common/src/interfaces/learning-content.d.ts b/common/src/interfaces/learning-content.d.ts index 5debdff6..bf0f84ff 100644 --- a/common/src/interfaces/learning-content.d.ts +++ b/common/src/interfaces/learning-content.d.ts @@ -1,4 +1,4 @@ -import { Language } from 'dwengo-1-backend/src/entities/content/language.js' +import { Language } from '../util/language'; export interface Transition { default: boolean; diff --git a/backend/src/entities/content/language.ts b/common/src/util/language.ts similarity index 100% rename from backend/src/entities/content/language.ts rename to common/src/util/language.ts From 358dcb07e034665fb649c775ceb7dcd024326bda Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 31 Mar 2025 22:42:20 +0200 Subject: [PATCH 14/34] fix(backend): Missende Language import --- backend/src/data/content/learning-object-repository.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/data/content/learning-object-repository.ts b/backend/src/data/content/learning-object-repository.ts index 996a53bd..c5790aef 100644 --- a/backend/src/data/content/learning-object-repository.ts +++ b/backend/src/data/content/learning-object-repository.ts @@ -2,6 +2,7 @@ import { DwengoEntityRepository } from '../dwengo-entity-repository.js'; import { LearningObject } from '../../entities/content/learning-object.entity.js'; import { LearningObjectIdentifier } from '../../entities/content/learning-object-identifier.js'; import { Teacher } from '../../entities/users/teacher.entity.js'; +import { Language } from 'dwengo-1-common/src/util/language.js'; export class LearningObjectRepository extends DwengoEntityRepository { public findByIdentifier(identifier: LearningObjectIdentifier): Promise { From 28668947077c697997029be23d07b49685108757 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Tue, 1 Apr 2025 21:09:19 +0200 Subject: [PATCH 15/34] fix: Missing modules (?) --- backend/Dockerfile | 25 +++++++------------------ backend/package.json | 1 + backend/tsconfig.json | 4 +++- common/package.json | 4 ++++ common/tsconfig.json | 4 +++- package-lock.json | 1 + package.json | 2 +- tsconfig.json | 8 +++++++- 8 files changed, 27 insertions(+), 22 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index c945a107..4226aa3a 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,6 +1,8 @@ -FROM node:22 AS build-stage +FROM node:22 -WORKDIR /app +WORKDIR /app/dwengo + +COPY ./backend/i18n ./i18n # Install dependencies @@ -19,22 +21,9 @@ COPY backend ./backend COPY common ./common COPY docs ./docs -WORKDIR /app/backend - -RUN npm run build - -FROM node:22 AS production-stage - -WORKDIR /app - -COPY package-lock.json backend/package.json ./ - -RUN npm install --silent --only=production - -COPY ./docs /docs -COPY ./backend/i18n /app/i18n -COPY --from=build-stage /app/backend/dist ./dist/ +RUN npm run build --workspace=common +RUN npm run build --workspace=backend EXPOSE 3000 -CMD ["node", "--env-file=.env", "dist/app.js"] +CMD ["node", "--env-file=/app/dwengo/backend/.env", "/app/dwengo/backend/dist/app.js"] diff --git a/backend/package.json b/backend/package.json index 4e3b890d..cf94d0b6 100644 --- a/backend/package.json +++ b/backend/package.json @@ -24,6 +24,7 @@ "cross": "^1.0.0", "cross-env": "^7.0.3", "dotenv": "^16.4.7", + "dwengo-1-common": "^0.1.1", "express": "^5.0.1", "express-jwt": "^8.5.1", "gift-pegjs": "^1.0.2", diff --git a/backend/tsconfig.json b/backend/tsconfig.json index 2dd3998d..a47827ba 100644 --- a/backend/tsconfig.json +++ b/backend/tsconfig.json @@ -4,6 +4,8 @@ "compilerOptions": { "rootDir": "./src", "outDir": "./dist", - "resolveJsonModule": true + "resolveJsonModule": true, + "sourceMap": true, + "composite": true } } diff --git a/common/package.json b/common/package.json index 68e7a56b..db8adfd0 100644 --- a/common/package.json +++ b/common/package.json @@ -5,8 +5,12 @@ "private": true, "type": "module", "scripts": { + "build": "tsc --project tsconfig.json", "format": "prettier --write src/", "format-check": "prettier --check src/", "lint": "eslint . --fix" + }, + "exports": { + "./src/*": "./dist/*" } } diff --git a/common/tsconfig.json b/common/tsconfig.json index 2dd3998d..a47827ba 100644 --- a/common/tsconfig.json +++ b/common/tsconfig.json @@ -4,6 +4,8 @@ "compilerOptions": { "rootDir": "./src", "outDir": "./dist", - "resolveJsonModule": true + "resolveJsonModule": true, + "sourceMap": true, + "composite": true } } diff --git a/package-lock.json b/package-lock.json index 863bd035..c41f2760 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,7 @@ "cross": "^1.0.0", "cross-env": "^7.0.3", "dotenv": "^16.4.7", + "dwengo-1-common": "^0.1.1", "express": "^5.0.1", "express-jwt": "^8.5.1", "gift-pegjs": "^1.0.2", diff --git a/package.json b/package.json index 56e3d01c..c7eeccc3 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "private": true, "type": "module", "scripts": { - "build": "npm run build --workspace=backend --workspace=frontend", + "build": "npm run build --workspaces --if-present", "format": "npm run format --workspace=backend --workspace=common --workspace=frontend", "format-check": "npm run format-check --workspace=backend --workspace=common --workspace=frontend", "lint": "npm run lint --workspace=backend --workspace=common --workspace=frontend", diff --git a/tsconfig.json b/tsconfig.json index b41449cf..11be2711 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -121,5 +121,11 @@ "skipLibCheck": true, /* Skip type checking all .d.ts files. */ "resolveJsonModule": true - } + }, + "files": [], + "references": [ + { "path": "backend" }, + { "path": "common" }, + { "path": "frontend" } + ] } From d24eb9832ba02374ad165145f35f0c40fa680b39 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 2 Apr 2025 00:16:42 +0200 Subject: [PATCH 16/34] Revert "fix(backend): Missende Language import" This reverts commit 358dcb07e034665fb649c775ceb7dcd024326bda. --- backend/src/data/content/learning-object-repository.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/data/content/learning-object-repository.ts b/backend/src/data/content/learning-object-repository.ts index 774bf0f3..2bdb6991 100644 --- a/backend/src/data/content/learning-object-repository.ts +++ b/backend/src/data/content/learning-object-repository.ts @@ -2,7 +2,6 @@ import { DwengoEntityRepository } from '../dwengo-entity-repository.js'; import { LearningObject } from '../../entities/content/learning-object.entity.js'; import { LearningObjectIdentifier } from '../../entities/content/learning-object-identifier.js'; import { Teacher } from '../../entities/users/teacher.entity.js'; -import { Language } from 'dwengo-1-common/src/util/language.js'; export class LearningObjectRepository extends DwengoEntityRepository { public async findByIdentifier(identifier: LearningObjectIdentifier): Promise { From 61f3afd9ae1ac81ca73312ae9add7eec48e850a0 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 2 Apr 2025 00:22:05 +0200 Subject: [PATCH 17/34] Revert "refactor(common): Language" This reverts commit bef6c6f75b2cf3bb0ffd069e1640f2a563cb371e. --- backend/src/controllers/learning-objects.ts | 2 +- backend/src/controllers/learning-paths.ts | 2 +- backend/src/controllers/questions.ts | 2 +- backend/src/controllers/submissions.ts | 2 +- backend/src/data/content/attachment-repository.ts | 2 +- backend/src/data/content/learning-object-repository.ts | 1 + backend/src/data/content/learning-path-repository.ts | 2 +- backend/src/entities/assignments/assignment.entity.ts | 2 +- backend/src/entities/assignments/submission.entity.ts | 2 +- .../util => backend/src/entities/content}/language.ts | 0 .../src/entities/content/learning-object-identifier.ts | 2 +- backend/src/entities/content/learning-object.entity.ts | 2 +- .../src/entities/content/learning-path-node.entity.ts | 2 +- backend/src/entities/content/learning-path.entity.ts | 2 +- backend/src/entities/questions/question.entity.ts | 2 +- backend/src/interfaces/assignment.ts | 2 +- .../database-learning-object-provider.ts | 2 +- .../processing/markdown/dwengo-marked-renderer.ts | 2 +- .../learning-objects/processing/processing-service.ts | 2 +- .../learning-paths/database-learning-path-provider.ts | 2 +- .../services/learning-paths/learning-path-provider.ts | 2 +- .../services/learning-paths/learning-path-service.ts | 2 +- backend/src/services/submissions.ts | 4 ++-- backend/tests/data/assignments/submissions.test.ts | 2 +- backend/tests/data/content/attachments.test.ts | 2 +- backend/tests/data/content/learning-objects.test.ts | 2 +- .../data/content/learning-path-repository.test.ts | 2 +- backend/tests/data/content/learning-paths.test.ts | 2 +- backend/tests/data/questions/answers.test.ts | 2 +- backend/tests/data/questions/questions.test.ts | 2 +- .../database-learning-object-provider.test.ts | 6 +++--- .../learning-objects/learning-object-service.test.ts | 8 ++++---- .../database-learning-path-provider.test.ts | 10 +++------- .../learning-path/learning-path-service.test.ts | 2 +- .../dummy/dummy-learning-object-example.ts | 2 +- .../pn-werkingnotebooks/pn-werkingnotebooks-example.ts | 2 +- .../learning-objects/test-essay/test-essay-example.ts | 2 +- .../test-multiple-choice-example.ts | 2 +- .../test-assets/learning-paths/learning-path-utils.ts | 2 +- .../test-assets/learning-paths/pn-werking-example.ts | 2 +- .../learning-paths/test-conditions-example.ts | 2 +- backend/tests/test-utils/expectations.ts | 10 ++-------- .../test_assets/assignments/assignments.testdata.ts | 2 +- .../test_assets/assignments/submission.testdata.ts | 2 +- .../test_assets/content/learning-objects.testdata.ts | 2 +- .../test_assets/content/learning-paths.testdata.ts | 2 +- .../tests/test_assets/questions/questions.testdata.ts | 2 +- common/src/interfaces/learning-content.d.ts | 2 +- 48 files changed, 56 insertions(+), 65 deletions(-) rename {common/src/util => backend/src/entities/content}/language.ts (100%) diff --git a/backend/src/controllers/learning-objects.ts b/backend/src/controllers/learning-objects.ts index 653b4c69..710999ce 100644 --- a/backend/src/controllers/learning-objects.ts +++ b/backend/src/controllers/learning-objects.ts @@ -2,11 +2,11 @@ import { Request, Response } from 'express'; import { FALLBACK_LANG } from '../config.js'; import learningObjectService from '../services/learning-objects/learning-object-service.js'; import { envVars, getEnvVar } from '../util/envVars.js'; +import { Language } from '../entities/content/language.js'; import attachmentService from '../services/learning-objects/attachment-service.js'; import { NotFoundError } from '@mikro-orm/core'; import { BadRequestException } from '../exceptions/bad-request-exception.js'; import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; -import { Language } from 'dwengo-1-common/src/util/language.js'; function getLearningObjectIdentifierFromRequest(req: Request): LearningObjectIdentifier { if (!req.params.hruid) { diff --git a/backend/src/controllers/learning-paths.ts b/backend/src/controllers/learning-paths.ts index 23b77115..04e44b59 100644 --- a/backend/src/controllers/learning-paths.ts +++ b/backend/src/controllers/learning-paths.ts @@ -2,6 +2,7 @@ import { Request, Response } from 'express'; import { themes } from '../data/themes.js'; import { FALLBACK_LANG } from '../config.js'; import learningPathService from '../services/learning-paths/learning-path-service.js'; +import { Language } from '../entities/content/language.js'; import { PersonalizationTarget, personalizedForGroup, @@ -9,7 +10,6 @@ import { } from '../services/learning-paths/learning-path-personalization-util.js'; import { BadRequestException } from '../exceptions/bad-request-exception.js'; import { NotFoundException } from '../exceptions/not-found-exception.js'; -import { Language } from 'dwengo-1-common/src/util/language.js'; /** * Fetch learning paths based on query parameters. diff --git a/backend/src/controllers/questions.ts b/backend/src/controllers/questions.ts index bfaeb24a..089931f3 100644 --- a/backend/src/controllers/questions.ts +++ b/backend/src/controllers/questions.ts @@ -2,8 +2,8 @@ import { Request, Response } from 'express'; import { createQuestion, deleteQuestion, getAllQuestions, getAnswersByQuestion, getQuestion } from '../services/questions.js'; import { FALLBACK_LANG, FALLBACK_SEQ_NUM } from '../config.js'; import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; +import { Language } from '../entities/content/language.js'; import { QuestionDTO, QuestionId } from 'dwengo-1-common/src/interfaces/question'; -import { Language } from 'dwengo-1-common/src/util/language.js'; function getObjectId(req: Request, res: Response): LearningObjectIdentifier | null { const { hruid, version } = req.params; diff --git a/backend/src/controllers/submissions.ts b/backend/src/controllers/submissions.ts index 88107831..df0f6e48 100644 --- a/backend/src/controllers/submissions.ts +++ b/backend/src/controllers/submissions.ts @@ -1,8 +1,8 @@ import { Request, Response } from 'express'; import { createSubmission, deleteSubmission, getSubmission } from '../services/submissions.js'; +import { Language, languageMap } from '../entities/content/language.js'; import { SubmissionDTO } from 'dwengo-1-common/src/interfaces/submission'; -import { Language, languageMap } from 'dwengo-1-common/src/util/language.js'; interface SubmissionParams { hruid: string; diff --git a/backend/src/data/content/attachment-repository.ts b/backend/src/data/content/attachment-repository.ts index 36e6807e..73baa943 100644 --- a/backend/src/data/content/attachment-repository.ts +++ b/backend/src/data/content/attachment-repository.ts @@ -1,7 +1,7 @@ import { DwengoEntityRepository } from '../dwengo-entity-repository.js'; import { Attachment } from '../../entities/content/attachment.entity.js'; +import { Language } from '../../entities/content/language'; import { LearningObjectIdentifier } from '../../entities/content/learning-object-identifier'; -import { Language } from 'dwengo-1-common/src/util/language.js'; export class AttachmentRepository extends DwengoEntityRepository { public async findByLearningObjectIdAndName(learningObjectId: LearningObjectIdentifier, name: string): Promise { diff --git a/backend/src/data/content/learning-object-repository.ts b/backend/src/data/content/learning-object-repository.ts index 2bdb6991..4684c6cc 100644 --- a/backend/src/data/content/learning-object-repository.ts +++ b/backend/src/data/content/learning-object-repository.ts @@ -1,6 +1,7 @@ import { DwengoEntityRepository } from '../dwengo-entity-repository.js'; import { LearningObject } from '../../entities/content/learning-object.entity.js'; import { LearningObjectIdentifier } from '../../entities/content/learning-object-identifier.js'; +import { Language } from '../../entities/content/language.js'; import { Teacher } from '../../entities/users/teacher.entity.js'; export class LearningObjectRepository extends DwengoEntityRepository { diff --git a/backend/src/data/content/learning-path-repository.ts b/backend/src/data/content/learning-path-repository.ts index 7047e47b..e34508ec 100644 --- a/backend/src/data/content/learning-path-repository.ts +++ b/backend/src/data/content/learning-path-repository.ts @@ -1,6 +1,6 @@ import { DwengoEntityRepository } from '../dwengo-entity-repository.js'; import { LearningPath } from '../../entities/content/learning-path.entity.js'; -import { Language } from 'dwengo-1-common/src/util/language.js'; +import { Language } from '../../entities/content/language.js'; export class LearningPathRepository extends DwengoEntityRepository { public async findByHruidAndLanguage(hruid: string, language: Language): Promise { diff --git a/backend/src/entities/assignments/assignment.entity.ts b/backend/src/entities/assignments/assignment.entity.ts index 59b71d67..daa71ed6 100644 --- a/backend/src/entities/assignments/assignment.entity.ts +++ b/backend/src/entities/assignments/assignment.entity.ts @@ -1,8 +1,8 @@ import { Entity, Enum, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'; import { Class } from '../classes/class.entity.js'; import { Group } from './group.entity.js'; +import { Language } from '../content/language.js'; import { AssignmentRepository } from '../../data/assignments/assignment-repository.js'; -import { Language } from 'dwengo-1-common/src/util/language.js'; @Entity({ repository: () => AssignmentRepository, diff --git a/backend/src/entities/assignments/submission.entity.ts b/backend/src/entities/assignments/submission.entity.ts index b86da578..e4330e0d 100644 --- a/backend/src/entities/assignments/submission.entity.ts +++ b/backend/src/entities/assignments/submission.entity.ts @@ -1,8 +1,8 @@ import { Student } from '../users/student.entity.js'; import { Group } from './group.entity.js'; import { Entity, Enum, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'; +import { Language } from '../content/language.js'; import { SubmissionRepository } from '../../data/assignments/submission-repository.js'; -import { Language } from 'dwengo-1-common/src/util/language.js'; @Entity({ repository: () => SubmissionRepository }) export class Submission { diff --git a/common/src/util/language.ts b/backend/src/entities/content/language.ts similarity index 100% rename from common/src/util/language.ts rename to backend/src/entities/content/language.ts diff --git a/backend/src/entities/content/learning-object-identifier.ts b/backend/src/entities/content/learning-object-identifier.ts index 68f6980a..9234afa7 100644 --- a/backend/src/entities/content/learning-object-identifier.ts +++ b/backend/src/entities/content/learning-object-identifier.ts @@ -1,4 +1,4 @@ -import { Language } from 'dwengo-1-common/src/util/language'; +import { Language } from './language.js'; export class LearningObjectIdentifier { constructor( diff --git a/backend/src/entities/content/learning-object.entity.ts b/backend/src/entities/content/learning-object.entity.ts index d74d64b4..db009e7a 100644 --- a/backend/src/entities/content/learning-object.entity.ts +++ b/backend/src/entities/content/learning-object.entity.ts @@ -1,11 +1,11 @@ import { Embedded, Entity, Enum, ManyToMany, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'; -import { Language } from 'dwengo-1-common/src/util/language.js'; import { Attachment } from './attachment.entity.js'; import { Teacher } from '../users/teacher.entity.js'; import { DwengoContentType } from '../../services/learning-objects/processing/content-type.js'; import { v4 } from 'uuid'; import { LearningObjectRepository } from '../../data/content/learning-object-repository.js'; import { EducationalGoal } from './educational-goal.entity.js'; +import { Language } from './language.js'; import { ReturnValue } from './return-value.entity.js'; @Entity({ repository: () => LearningObjectRepository }) diff --git a/backend/src/entities/content/learning-path-node.entity.ts b/backend/src/entities/content/learning-path-node.entity.ts index 129ff708..03499270 100644 --- a/backend/src/entities/content/learning-path-node.entity.ts +++ b/backend/src/entities/content/learning-path-node.entity.ts @@ -1,7 +1,7 @@ import { Entity, Enum, ManyToOne, OneToMany, PrimaryKey, Property, Rel } from '@mikro-orm/core'; +import { Language } from './language.js'; import { LearningPath } from './learning-path.entity.js'; import { LearningPathTransition } from './learning-path-transition.entity.js'; -import { Language } from 'dwengo-1-common/src/util/language.js'; @Entity() export class LearningPathNode { diff --git a/backend/src/entities/content/learning-path.entity.ts b/backend/src/entities/content/learning-path.entity.ts index f486d5b1..888cc0cf 100644 --- a/backend/src/entities/content/learning-path.entity.ts +++ b/backend/src/entities/content/learning-path.entity.ts @@ -1,8 +1,8 @@ import { Entity, Enum, ManyToMany, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'; +import { Language } from './language.js'; import { Teacher } from '../users/teacher.entity.js'; import { LearningPathRepository } from '../../data/content/learning-path-repository.js'; import { LearningPathNode } from './learning-path-node.entity.js'; -import { Language } from 'dwengo-1-common/src/util/language.js'; @Entity({ repository: () => LearningPathRepository }) export class LearningPath { diff --git a/backend/src/entities/questions/question.entity.ts b/backend/src/entities/questions/question.entity.ts index 4de3e676..09e3cd46 100644 --- a/backend/src/entities/questions/question.entity.ts +++ b/backend/src/entities/questions/question.entity.ts @@ -1,7 +1,7 @@ import { Entity, Enum, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'; +import { Language } from '../content/language.js'; import { Student } from '../users/student.entity.js'; import { QuestionRepository } from '../../data/questions/question-repository.js'; -import { Language } from 'dwengo-1-common/src/util/language.js'; @Entity({ repository: () => QuestionRepository }) export class Question { diff --git a/backend/src/interfaces/assignment.ts b/backend/src/interfaces/assignment.ts index bdd5b932..84cbd0cf 100644 --- a/backend/src/interfaces/assignment.ts +++ b/backend/src/interfaces/assignment.ts @@ -1,8 +1,8 @@ -import { languageMap } from 'dwengo-1-common/src/util/language.js'; import { FALLBACK_LANG } from '../config.js'; import { Assignment } from '../entities/assignments/assignment.entity.js'; import { Class } from '../entities/classes/class.entity.js'; import { getLogger } from '../logging/initalize.js'; +import { languageMap } from '../entities/content/language.js'; import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; export function mapToAssignmentDTOId(assignment: Assignment): AssignmentDTO { diff --git a/backend/src/services/learning-objects/database-learning-object-provider.ts b/backend/src/services/learning-objects/database-learning-object-provider.ts index cf1d7090..5624fc19 100644 --- a/backend/src/services/learning-objects/database-learning-object-provider.ts +++ b/backend/src/services/learning-objects/database-learning-object-provider.ts @@ -1,5 +1,6 @@ import { LearningObjectProvider } from './learning-object-provider.js'; import { getLearningObjectRepository, getLearningPathRepository } from '../../data/repositories.js'; +import { Language } from '../../entities/content/language.js'; import { LearningObject } from '../../entities/content/learning-object.entity.js'; import { getUrlStringForLearningObject } from '../../util/links.js'; import processingService from './processing/processing-service.js'; @@ -7,7 +8,6 @@ import { NotFoundError } from '@mikro-orm/core'; import learningObjectService from './learning-object-service.js'; import { getLogger, Logger } from '../../logging/initalize.js'; import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; -import { Language } from 'dwengo-1-common/src/util/language.js'; const logger: Logger = getLogger(); diff --git a/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts b/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts index c2d04bd5..3b9ad4e5 100644 --- a/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts +++ b/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts @@ -8,13 +8,13 @@ import InlineImageProcessor from '../image/inline-image-processor.js'; import * as marked from 'marked'; import { getUrlStringForLearningObjectHTML, isValidHttpUrl } from '../../../../util/links.js'; import { ProcessingError } from '../processing-error.js'; +import { Language } from '../../../../entities/content/language.js'; import Image = marked.Tokens.Image; import Heading = marked.Tokens.Heading; import Link = marked.Tokens.Link; import RendererObject = marked.RendererObject; import { LearningObjectIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; -import { Language } from 'dwengo-1-common/src/util/language.js'; const prefixes = { learningObject: '@learning-object', diff --git a/backend/src/services/learning-objects/processing/processing-service.ts b/backend/src/services/learning-objects/processing/processing-service.ts index 0b647727..d0d43061 100644 --- a/backend/src/services/learning-objects/processing/processing-service.ts +++ b/backend/src/services/learning-objects/processing/processing-service.ts @@ -13,9 +13,9 @@ import GiftProcessor from './gift/gift-processor.js'; import { LearningObject } from '../../../entities/content/learning-object.entity.js'; import Processor from './processor.js'; import { DwengoContentType } from './content-type.js'; +import { Language } from '../../../entities/content/language.js'; import { replaceAsync } from '../../../util/async.js'; import { LearningObjectIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; -import { Language } from 'dwengo-1-common/src/util/language.js'; const EMBEDDED_LEARNING_OBJECT_PLACEHOLDER = //g; const LEARNING_OBJECT_DOES_NOT_EXIST = "
"; diff --git a/backend/src/services/learning-paths/database-learning-path-provider.ts b/backend/src/services/learning-paths/database-learning-path-provider.ts index 3c3e80cb..d0fcf630 100644 --- a/backend/src/services/learning-paths/database-learning-path-provider.ts +++ b/backend/src/services/learning-paths/database-learning-path-provider.ts @@ -1,6 +1,7 @@ import { LearningPathProvider } from './learning-path-provider.js'; import { LearningPath as LearningPathEntity } from '../../entities/content/learning-path.entity.js'; import { getLearningPathRepository } from '../../data/repositories.js'; +import { Language } from '../../entities/content/language.js'; import learningObjectService from '../learning-objects/learning-object-service.js'; import { LearningPathNode } from '../../entities/content/learning-path-node.entity.js'; import { LearningPathTransition } from '../../entities/content/learning-path-transition.entity.js'; @@ -12,7 +13,6 @@ import { LearningPathResponse, Transition, } from 'dwengo-1-common/src/interfaces/learning-content'; -import { Language } from 'dwengo-1-common/src/util/language.js'; /** * Fetches the corresponding learning object for each of the nodes and creates a map that maps each node to its diff --git a/backend/src/services/learning-paths/learning-path-provider.ts b/backend/src/services/learning-paths/learning-path-provider.ts index 99a05ab0..a904296a 100644 --- a/backend/src/services/learning-paths/learning-path-provider.ts +++ b/backend/src/services/learning-paths/learning-path-provider.ts @@ -1,4 +1,4 @@ -import { Language } from 'dwengo-1-common/src/util/language.js'; +import { Language } from '../../entities/content/language.js'; import { PersonalizationTarget } from './learning-path-personalization-util.js'; import { LearningPath, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; diff --git a/backend/src/services/learning-paths/learning-path-service.ts b/backend/src/services/learning-paths/learning-path-service.ts index d9cdc7bb..bebfe8a9 100644 --- a/backend/src/services/learning-paths/learning-path-service.ts +++ b/backend/src/services/learning-paths/learning-path-service.ts @@ -1,9 +1,9 @@ import dwengoApiLearningPathProvider from './dwengo-api-learning-path-provider.js'; import databaseLearningPathProvider from './database-learning-path-provider.js'; import { envVars, getEnvVar } from '../../util/envVars.js'; +import { Language } from '../../entities/content/language.js'; import { PersonalizationTarget } from './learning-path-personalization-util.js'; import { LearningPath, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; -import { Language } from 'dwengo-1-common/src/util/language.js'; const userContentPrefix = getEnvVar(envVars.UserContentPrefix); const allProviders = [dwengoApiLearningPathProvider, databaseLearningPathProvider]; diff --git a/backend/src/services/submissions.ts b/backend/src/services/submissions.ts index 15371d69..e5c040b6 100644 --- a/backend/src/services/submissions.ts +++ b/backend/src/services/submissions.ts @@ -1,5 +1,5 @@ -import { Language } from 'dwengo-1-common/src/util/language.js'; -import { getSubmissionRepository } from '../data/repositories.js'; +import { getGroupRepository, getSubmissionRepository } from '../data/repositories.js'; +import { Language } from '../entities/content/language.js'; import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; import { mapToSubmission, mapToSubmissionDTO } from '../interfaces/submission.js'; import { SubmissionDTO } from 'dwengo-1-common/src/interfaces/submission'; diff --git a/backend/tests/data/assignments/submissions.test.ts b/backend/tests/data/assignments/submissions.test.ts index d2595973..cd212b77 100644 --- a/backend/tests/data/assignments/submissions.test.ts +++ b/backend/tests/data/assignments/submissions.test.ts @@ -9,11 +9,11 @@ import { getSubmissionRepository, } from '../../../src/data/repositories'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier'; +import { Language } from '../../../src/entities/content/language'; import { StudentRepository } from '../../../src/data/users/student-repository'; import { GroupRepository } from '../../../src/data/assignments/group-repository'; import { AssignmentRepository } from '../../../src/data/assignments/assignment-repository'; import { ClassRepository } from '../../../src/data/classes/class-repository'; -import { Language } from 'dwengo-1-common/src/util/language'; describe('SubmissionRepository', () => { let submissionRepository: SubmissionRepository; diff --git a/backend/tests/data/content/attachments.test.ts b/backend/tests/data/content/attachments.test.ts index 42adc507..94e132a9 100644 --- a/backend/tests/data/content/attachments.test.ts +++ b/backend/tests/data/content/attachments.test.ts @@ -4,7 +4,7 @@ import { getAttachmentRepository, getLearningObjectRepository } from '../../../s import { AttachmentRepository } from '../../../src/data/content/attachment-repository.js'; import { LearningObjectRepository } from '../../../src/data/content/learning-object-repository.js'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier.js'; -import { Language } from 'dwengo-1-common/src/util/language.js'; +import { Language } from '../../../src/entities/content/language.js'; describe('AttachmentRepository', () => { let attachmentRepository: AttachmentRepository; diff --git a/backend/tests/data/content/learning-objects.test.ts b/backend/tests/data/content/learning-objects.test.ts index c996f7cd..712f75c9 100644 --- a/backend/tests/data/content/learning-objects.test.ts +++ b/backend/tests/data/content/learning-objects.test.ts @@ -3,7 +3,7 @@ import { LearningObjectRepository } from '../../../src/data/content/learning-obj import { getLearningObjectRepository } from '../../../src/data/repositories'; import { setupTestApp } from '../../setup-tests'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier'; -import { Language } from 'dwengo-1-common/src/util/language'; +import { Language } from '../../../src/entities/content/language'; describe('LearningObjectRepository', () => { let learningObjectRepository: LearningObjectRepository; diff --git a/backend/tests/data/content/learning-path-repository.test.ts b/backend/tests/data/content/learning-path-repository.test.ts index 67c0c7d7..4424fced 100644 --- a/backend/tests/data/content/learning-path-repository.test.ts +++ b/backend/tests/data/content/learning-path-repository.test.ts @@ -5,7 +5,7 @@ import { LearningPathRepository } from '../../../src/data/content/learning-path- import example from '../../test-assets/learning-paths/pn-werking-example.js'; import { LearningPath } from '../../../src/entities/content/learning-path.entity.js'; import { expectToBeCorrectEntity } from '../../test-utils/expectations.js'; -import { Language } from 'dwengo-1-common/src/util/language'; +import { Language } from '../../../src/entities/content/language.js'; function expectToHaveFoundPrecisely(expected: LearningPath, result: LearningPath[]): void { expect(result).toHaveProperty('length'); diff --git a/backend/tests/data/content/learning-paths.test.ts b/backend/tests/data/content/learning-paths.test.ts index 37801e1a..01fd20e5 100644 --- a/backend/tests/data/content/learning-paths.test.ts +++ b/backend/tests/data/content/learning-paths.test.ts @@ -2,7 +2,7 @@ import { beforeAll, describe, expect, it } from 'vitest'; import { getLearningPathRepository } from '../../../src/data/repositories'; import { LearningPathRepository } from '../../../src/data/content/learning-path-repository'; import { setupTestApp } from '../../setup-tests'; -import { Language } from 'dwengo-1-common/src/util/language'; +import { Language } from '../../../src/entities/content/language'; describe('LearningPathRepository', () => { let learningPathRepository: LearningPathRepository; diff --git a/backend/tests/data/questions/answers.test.ts b/backend/tests/data/questions/answers.test.ts index 4ce179fe..59917c3f 100644 --- a/backend/tests/data/questions/answers.test.ts +++ b/backend/tests/data/questions/answers.test.ts @@ -1,10 +1,10 @@ import { beforeAll, describe, expect, it } from 'vitest'; -import { Language } from 'dwengo-1-common/src/util/language'; import { setupTestApp } from '../../setup-tests'; import { AnswerRepository } from '../../../src/data/questions/answer-repository'; import { getAnswerRepository, getQuestionRepository, getTeacherRepository } from '../../../src/data/repositories'; import { QuestionRepository } from '../../../src/data/questions/question-repository'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier'; +import { Language } from '../../../src/entities/content/language'; import { TeacherRepository } from '../../../src/data/users/teacher-repository'; describe('AnswerRepository', () => { diff --git a/backend/tests/data/questions/questions.test.ts b/backend/tests/data/questions/questions.test.ts index 3645cf8e..c1d2b483 100644 --- a/backend/tests/data/questions/questions.test.ts +++ b/backend/tests/data/questions/questions.test.ts @@ -1,10 +1,10 @@ import { beforeAll, describe, expect, it } from 'vitest'; -import { Language } from 'dwengo-1-common/src/util/language'; import { setupTestApp } from '../../setup-tests'; import { QuestionRepository } from '../../../src/data/questions/question-repository'; import { getQuestionRepository, getStudentRepository } from '../../../src/data/repositories'; import { StudentRepository } from '../../../src/data/users/student-repository'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier'; +import { Language } from '../../../src/entities/content/language'; describe('QuestionRepository', () => { let questionRepository: QuestionRepository; diff --git a/backend/tests/services/learning-objects/database-learning-object-provider.test.ts b/backend/tests/services/learning-objects/database-learning-object-provider.test.ts index c54711eb..03248c55 100644 --- a/backend/tests/services/learning-objects/database-learning-object-provider.test.ts +++ b/backend/tests/services/learning-objects/database-learning-object-provider.test.ts @@ -1,15 +1,15 @@ import { beforeAll, describe, expect, it } from 'vitest'; -import { Language } from 'dwengo-1-common/src/util/language'; import { setupTestApp } from '../../setup-tests'; import { getLearningObjectRepository, getLearningPathRepository } from '../../../src/data/repositories'; import example from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; -import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import { LearningObject } from '../../../src/entities/content/learning-object.entity'; import databaseLearningObjectProvider from '../../../src/services/learning-objects/database-learning-object-provider'; import { expectToBeCorrectFilteredLearningObject } from '../../test-utils/expectations'; +import { Language } from '../../../src/entities/content/language'; +import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import learningPathExample from '../../test-assets/learning-paths/pn-werking-example'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; -import { FilteredLearningObject } from 'dwengo-1-common/src/interfaces/learning-content'; +import {FilteredLearningObject} from "dwengo-1-common/src/interfaces/learning-content"; async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { const learningObjectRepo = getLearningObjectRepository(); diff --git a/backend/tests/services/learning-objects/learning-object-service.test.ts b/backend/tests/services/learning-objects/learning-object-service.test.ts index 7f69c84f..abcae538 100644 --- a/backend/tests/services/learning-objects/learning-object-service.test.ts +++ b/backend/tests/services/learning-objects/learning-object-service.test.ts @@ -1,10 +1,10 @@ import { beforeAll, describe, expect, it } from 'vitest'; -import { Language } from 'dwengo-1-common/src/util/language'; import { setupTestApp } from '../../setup-tests'; import { LearningObject } from '../../../src/entities/content/learning-object.entity'; import { getLearningObjectRepository, getLearningPathRepository } from '../../../src/data/repositories'; import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import learningObjectService from '../../../src/services/learning-objects/learning-object-service'; +import { Language } from '../../../src/entities/content/language'; import { envVars, getEnvVar } from '../../../src/util/envVars'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; import learningPathExample from '../../test-assets/learning-paths/pn-werking-example'; @@ -73,18 +73,18 @@ describe('LearningObjectService', () => { }); it( 'returns the same HTML as the Dwengo API when queried with the identifier of a learning object that does ' + - 'not start with the user content prefix', + 'not start with the user content prefix', async () => { const result = await learningObjectService.getLearningObjectHTML(DWENGO_TEST_LEARNING_OBJECT_ID); expect(result).not.toBeNull(); const responseFromDwengoApi = await fetch( getEnvVar(envVars.LearningContentRepoApiBaseUrl) + - `/learningObject/getRaw?hruid=${DWENGO_TEST_LEARNING_OBJECT_ID.hruid}&language=${DWENGO_TEST_LEARNING_OBJECT_ID.language}&version=${DWENGO_TEST_LEARNING_OBJECT_ID.version}` + `/learningObject/getRaw?hruid=${DWENGO_TEST_LEARNING_OBJECT_ID.hruid}&language=${DWENGO_TEST_LEARNING_OBJECT_ID.language}&version=${DWENGO_TEST_LEARNING_OBJECT_ID.version}`, ); const responseHtml = await responseFromDwengoApi.text(); expect(result).toEqual(responseHtml); - } + }, ); it('returns null when queried with a non-existing identifier', async () => { const result = await learningObjectService.getLearningObjectHTML({ diff --git a/backend/tests/services/learning-path/database-learning-path-provider.test.ts b/backend/tests/services/learning-path/database-learning-path-provider.test.ts index 807104c1..30e07a5a 100644 --- a/backend/tests/services/learning-path/database-learning-path-provider.test.ts +++ b/backend/tests/services/learning-path/database-learning-path-provider.test.ts @@ -1,5 +1,4 @@ import { beforeAll, describe, expect, it } from 'vitest'; -import { Language } from 'dwengo-1-common/src/util/language'; import { LearningObject } from '../../../src/entities/content/learning-object.entity.js'; import { setupTestApp } from '../../setup-tests.js'; import { LearningPath } from '../../../src/entities/content/learning-path.entity.js'; @@ -14,13 +13,14 @@ import learningPathExample from '../../test-assets/learning-paths/pn-werking-exa import databaseLearningPathProvider from '../../../src/services/learning-paths/database-learning-path-provider.js'; import { expectToBeCorrectLearningPath } from '../../test-utils/expectations.js'; import learningObjectService from '../../../src/services/learning-objects/learning-object-service.js'; +import { Language } from '../../../src/entities/content/language.js'; import { ConditionTestLearningPathAndLearningObjects, createConditionTestLearningPathAndLearningObjects, } from '../../test-assets/learning-paths/test-conditions-example.js'; import { Student } from '../../../src/entities/users/student.entity.js'; -import { LearningObjectNode, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; +import {LearningObjectNode, LearningPathResponse} from "dwengo-1-common/src/interfaces/learning-content"; async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { const learningObjectRepo = getLearningObjectRepository(); @@ -103,11 +103,7 @@ function expectBranchingObjectNode( describe('DatabaseLearningPathProvider', () => { let example: { learningObject: LearningObject; learningPath: LearningPath }; - let persTestData: { - learningContent: ConditionTestLearningPathAndLearningObjects; - studentA: Student; - studentB: Student; - }; + let persTestData: { learningContent: ConditionTestLearningPathAndLearningObjects; studentA: Student; studentB: Student }; beforeAll(async () => { await setupTestApp(); diff --git a/backend/tests/services/learning-path/learning-path-service.test.ts b/backend/tests/services/learning-path/learning-path-service.test.ts index dd91d39c..7a45dc43 100644 --- a/backend/tests/services/learning-path/learning-path-service.test.ts +++ b/backend/tests/services/learning-path/learning-path-service.test.ts @@ -1,11 +1,11 @@ import { beforeAll, describe, expect, it } from 'vitest'; -import { Language } from 'dwengo-1-common/src/util/language'; import { setupTestApp } from '../../setup-tests'; import { LearningObject } from '../../../src/entities/content/learning-object.entity'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; import { getLearningObjectRepository, getLearningPathRepository } from '../../../src/data/repositories'; import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import learningPathExample from '../../test-assets/learning-paths/pn-werking-example'; +import { Language } from '../../../src/entities/content/language'; import learningPathService from '../../../src/services/learning-paths/learning-path-service'; async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { diff --git a/backend/tests/test-assets/learning-objects/dummy/dummy-learning-object-example.ts b/backend/tests/test-assets/learning-objects/dummy/dummy-learning-object-example.ts index dfddd53f..f810d57a 100644 --- a/backend/tests/test-assets/learning-objects/dummy/dummy-learning-object-example.ts +++ b/backend/tests/test-assets/learning-objects/dummy/dummy-learning-object-example.ts @@ -1,6 +1,6 @@ import { LearningObjectExample } from '../learning-object-example'; -import { Language } from 'dwengo-1-common/src/util/language'; import { LearningObject } from '../../../../src/entities/content/learning-object.entity'; +import { Language } from '../../../../src/entities/content/language'; import { loadTestAsset } from '../../../test-utils/load-test-asset'; import { DwengoContentType } from '../../../../src/services/learning-objects/processing/content-type'; import { envVars, getEnvVar } from '../../../../src/util/envVars'; diff --git a/backend/tests/test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example.ts b/backend/tests/test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example.ts index 481b020e..835a0ed0 100644 --- a/backend/tests/test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example.ts +++ b/backend/tests/test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example.ts @@ -1,5 +1,5 @@ import { LearningObjectExample } from '../learning-object-example'; -import { Language } from 'dwengo-1-common/src/util/language'; +import { Language } from '../../../../src/entities/content/language'; import { DwengoContentType } from '../../../../src/services/learning-objects/processing/content-type'; import { loadTestAsset } from '../../../test-utils/load-test-asset'; import { LearningObject } from '../../../../src/entities/content/learning-object.entity'; diff --git a/backend/tests/test-assets/learning-objects/test-essay/test-essay-example.ts b/backend/tests/test-assets/learning-objects/test-essay/test-essay-example.ts index 9499a586..943a10c7 100644 --- a/backend/tests/test-assets/learning-objects/test-essay/test-essay-example.ts +++ b/backend/tests/test-assets/learning-objects/test-essay/test-essay-example.ts @@ -1,8 +1,8 @@ import { LearningObjectExample } from '../learning-object-example'; -import { Language } from 'dwengo-1-common/src/util/language'; import { LearningObject } from '../../../../src/entities/content/learning-object.entity'; import { loadTestAsset } from '../../../test-utils/load-test-asset'; import { envVars, getEnvVar } from '../../../../src/util/envVars'; +import { Language } from '../../../../src/entities/content/language'; import { DwengoContentType } from '../../../../src/services/learning-objects/processing/content-type'; const example: LearningObjectExample = { diff --git a/backend/tests/test-assets/learning-objects/test-multiple-choice/test-multiple-choice-example.ts b/backend/tests/test-assets/learning-objects/test-multiple-choice/test-multiple-choice-example.ts index a1888dfa..276a41bb 100644 --- a/backend/tests/test-assets/learning-objects/test-multiple-choice/test-multiple-choice-example.ts +++ b/backend/tests/test-assets/learning-objects/test-multiple-choice/test-multiple-choice-example.ts @@ -1,8 +1,8 @@ import { LearningObjectExample } from '../learning-object-example'; -import { Language } from 'dwengo-1-common/src/util/language'; import { LearningObject } from '../../../../src/entities/content/learning-object.entity'; import { loadTestAsset } from '../../../test-utils/load-test-asset'; import { envVars, getEnvVar } from '../../../../src/util/envVars'; +import { Language } from '../../../../src/entities/content/language'; import { DwengoContentType } from '../../../../src/services/learning-objects/processing/content-type'; const example: LearningObjectExample = { diff --git a/backend/tests/test-assets/learning-paths/learning-path-utils.ts b/backend/tests/test-assets/learning-paths/learning-path-utils.ts index 6195bf4c..eb786fe1 100644 --- a/backend/tests/test-assets/learning-paths/learning-path-utils.ts +++ b/backend/tests/test-assets/learning-paths/learning-path-utils.ts @@ -1,4 +1,4 @@ -import { Language } from 'dwengo-1-common/src/util/language'; +import { Language } from '../../../src/entities/content/language'; import { LearningPathTransition } from '../../../src/entities/content/learning-path-transition.entity'; import { LearningPathNode } from '../../../src/entities/content/learning-path-node.entity'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; diff --git a/backend/tests/test-assets/learning-paths/pn-werking-example.ts b/backend/tests/test-assets/learning-paths/pn-werking-example.ts index 02ec7a85..06a29007 100644 --- a/backend/tests/test-assets/learning-paths/pn-werking-example.ts +++ b/backend/tests/test-assets/learning-paths/pn-werking-example.ts @@ -1,5 +1,5 @@ import { LearningPath } from '../../../src/entities/content/learning-path.entity'; -import { Language } from 'dwengo-1-common/src/util/language'; +import { Language } from '../../../src/entities/content/language'; import { envVars, getEnvVar } from '../../../src/util/envVars'; import { createLearningPathNode, createLearningPathTransition } from './learning-path-utils'; import { LearningPathNode } from '../../../src/entities/content/learning-path-node.entity'; diff --git a/backend/tests/test-assets/learning-paths/test-conditions-example.ts b/backend/tests/test-assets/learning-paths/test-conditions-example.ts index 8f3b31dd..b5e38c24 100644 --- a/backend/tests/test-assets/learning-paths/test-conditions-example.ts +++ b/backend/tests/test-assets/learning-paths/test-conditions-example.ts @@ -1,5 +1,5 @@ import { LearningPath } from '../../../src/entities/content/learning-path.entity'; -import { Language } from 'dwengo-1-common/src/util/language'; +import { Language } from '../../../src/entities/content/language'; import testMultipleChoiceExample from '../learning-objects/test-multiple-choice/test-multiple-choice-example'; import { dummyLearningObject } from '../learning-objects/dummy/dummy-learning-object-example'; import { createLearningPathNode, createLearningPathTransition } from './learning-path-utils'; diff --git a/backend/tests/test-utils/expectations.ts b/backend/tests/test-utils/expectations.ts index 2c2e5e9b..ef845975 100644 --- a/backend/tests/test-utils/expectations.ts +++ b/backend/tests/test-utils/expectations.ts @@ -2,7 +2,7 @@ import { AssertionError } from 'node:assert'; import { LearningObject } from '../../src/entities/content/learning-object.entity'; import { LearningPath as LearningPathEntity } from '../../src/entities/content/learning-path.entity'; import { expect } from 'vitest'; -import { FilteredLearningObject, LearningPath } from 'dwengo-1-common/src/interfaces/learning-content'; +import {FilteredLearningObject, LearningPath} from "dwengo-1-common/src/interfaces/learning-content"; // Ignored properties because they belang for example to the class, not to the entity itself. const IGNORE_PROPERTIES = ['parent']; @@ -12,13 +12,7 @@ const IGNORE_PROPERTIES = ['parent']; * @param actual The actual entity retrieved from the database * @param expected The (previously added) entity we would expect to retrieve */ -export function expectToBeCorrectEntity( - actual: { entity: T; name?: string }, - expected: { - entity: T; - name?: string; - } -): void { +export function expectToBeCorrectEntity(actual: { entity: T; name?: string }, expected: { entity: T; name?: string }): void { if (!actual.name) { actual.name = 'actual'; } diff --git a/backend/tests/test_assets/assignments/assignments.testdata.ts b/backend/tests/test_assets/assignments/assignments.testdata.ts index f1d2fdb4..8753b0ce 100644 --- a/backend/tests/test_assets/assignments/assignments.testdata.ts +++ b/backend/tests/test_assets/assignments/assignments.testdata.ts @@ -1,7 +1,7 @@ import { EntityManager } from '@mikro-orm/core'; -import { Language } from 'dwengo-1-common/src/util/language'; import { Assignment } from '../../../src/entities/assignments/assignment.entity'; import { Class } from '../../../src/entities/classes/class.entity'; +import { Language } from '../../../src/entities/content/language'; export function makeTestAssignemnts(em: EntityManager, classes: Class[]): Assignment[] { const assignment01 = em.create(Assignment, { diff --git a/backend/tests/test_assets/assignments/submission.testdata.ts b/backend/tests/test_assets/assignments/submission.testdata.ts index 434aa79a..4fca5f9b 100644 --- a/backend/tests/test_assets/assignments/submission.testdata.ts +++ b/backend/tests/test_assets/assignments/submission.testdata.ts @@ -1,6 +1,6 @@ import { EntityManager } from '@mikro-orm/core'; -import { Language } from 'dwengo-1-common/src/util/language'; import { Submission } from '../../../src/entities/assignments/submission.entity'; +import { Language } from '../../../src/entities/content/language'; import { Student } from '../../../src/entities/users/student.entity'; import { Group } from '../../../src/entities/assignments/group.entity'; diff --git a/backend/tests/test_assets/content/learning-objects.testdata.ts b/backend/tests/test_assets/content/learning-objects.testdata.ts index e4044102..bbca8830 100644 --- a/backend/tests/test_assets/content/learning-objects.testdata.ts +++ b/backend/tests/test_assets/content/learning-objects.testdata.ts @@ -1,6 +1,6 @@ import { EntityManager } from '@mikro-orm/core'; -import { Language } from 'dwengo-1-common/src/util/language'; import { LearningObject } from '../../../src/entities/content/learning-object.entity'; +import { Language } from '../../../src/entities/content/language'; import { DwengoContentType } from '../../../src/services/learning-objects/processing/content-type'; import { ReturnValue } from '../../../src/entities/content/return-value.entity'; diff --git a/backend/tests/test_assets/content/learning-paths.testdata.ts b/backend/tests/test_assets/content/learning-paths.testdata.ts index 98ade777..e41773cc 100644 --- a/backend/tests/test_assets/content/learning-paths.testdata.ts +++ b/backend/tests/test_assets/content/learning-paths.testdata.ts @@ -1,6 +1,6 @@ import { EntityManager } from '@mikro-orm/core'; -import { Language } from 'dwengo-1-common/src/util/language'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; +import { Language } from '../../../src/entities/content/language'; import { LearningPathTransition } from '../../../src/entities/content/learning-path-transition.entity'; import { LearningPathNode } from '../../../src/entities/content/learning-path-node.entity'; diff --git a/backend/tests/test_assets/questions/questions.testdata.ts b/backend/tests/test_assets/questions/questions.testdata.ts index 2e994676..8604cf07 100644 --- a/backend/tests/test_assets/questions/questions.testdata.ts +++ b/backend/tests/test_assets/questions/questions.testdata.ts @@ -1,6 +1,6 @@ import { EntityManager } from '@mikro-orm/core'; -import { Language } from 'dwengo-1-common/src/util/language'; import { Question } from '../../../src/entities/questions/question.entity'; +import { Language } from '../../../src/entities/content/language'; import { Student } from '../../../src/entities/users/student.entity'; export function makeTestQuestions(em: EntityManager, students: Student[]): Question[] { diff --git a/common/src/interfaces/learning-content.d.ts b/common/src/interfaces/learning-content.d.ts index 02e49648..7db61a85 100644 --- a/common/src/interfaces/learning-content.d.ts +++ b/common/src/interfaces/learning-content.d.ts @@ -1,4 +1,4 @@ -import { Language } from '../util/language'; +import { Language } from 'dwengo-1-backend/src/entities/content/language.js' export interface Transition { default: boolean; From 04b35a61f99b4afc87df237a88540795cf34749e Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 2 Apr 2025 00:29:38 +0200 Subject: [PATCH 18/34] fix: tsconfig --- .../learning-objects/database-learning-object-provider.ts | 7 +++++-- backend/src/services/submissions.ts | 2 +- tsconfig.json | 8 +------- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/backend/src/services/learning-objects/database-learning-object-provider.ts b/backend/src/services/learning-objects/database-learning-object-provider.ts index 5624fc19..d0099e1f 100644 --- a/backend/src/services/learning-objects/database-learning-object-provider.ts +++ b/backend/src/services/learning-objects/database-learning-object-provider.ts @@ -1,13 +1,16 @@ import { LearningObjectProvider } from './learning-object-provider.js'; import { getLearningObjectRepository, getLearningPathRepository } from '../../data/repositories.js'; -import { Language } from '../../entities/content/language.js'; import { LearningObject } from '../../entities/content/learning-object.entity.js'; import { getUrlStringForLearningObject } from '../../util/links.js'; import processingService from './processing/processing-service.js'; import { NotFoundError } from '@mikro-orm/core'; import learningObjectService from './learning-object-service.js'; import { getLogger, Logger } from '../../logging/initalize.js'; -import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { + FilteredLearningObject, + LearningObjectIdentifier, + LearningPathIdentifier, +} from 'dwengo-1-common/src/interfaces/learning-content'; const logger: Logger = getLogger(); diff --git a/backend/src/services/submissions.ts b/backend/src/services/submissions.ts index e5c040b6..314b9d65 100644 --- a/backend/src/services/submissions.ts +++ b/backend/src/services/submissions.ts @@ -1,4 +1,4 @@ -import { getGroupRepository, getSubmissionRepository } from '../data/repositories.js'; +import { getSubmissionRepository } from '../data/repositories.js'; import { Language } from '../entities/content/language.js'; import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; import { mapToSubmission, mapToSubmissionDTO } from '../interfaces/submission.js'; diff --git a/tsconfig.json b/tsconfig.json index 11be2711..b41449cf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -121,11 +121,5 @@ "skipLibCheck": true, /* Skip type checking all .d.ts files. */ "resolveJsonModule": true - }, - "files": [], - "references": [ - { "path": "backend" }, - { "path": "common" }, - { "path": "frontend" } - ] + } } From b6e07d28dfc32bfbcec1021f99eab228b2ce72bf Mon Sep 17 00:00:00 2001 From: Lint Action Date: Tue, 1 Apr 2025 22:40:33 +0000 Subject: [PATCH 19/34] style: fix linting issues met Prettier --- .../learning-objects/database-learning-object-provider.ts | 6 +----- .../database-learning-object-provider.test.ts | 2 +- .../learning-objects/learning-object-service.test.ts | 6 +++--- .../learning-path/database-learning-path-provider.test.ts | 2 +- backend/tests/test-utils/expectations.ts | 2 +- common/src/interfaces/learning-content.d.ts | 2 +- 6 files changed, 8 insertions(+), 12 deletions(-) diff --git a/backend/src/services/learning-objects/database-learning-object-provider.ts b/backend/src/services/learning-objects/database-learning-object-provider.ts index d0099e1f..0639782c 100644 --- a/backend/src/services/learning-objects/database-learning-object-provider.ts +++ b/backend/src/services/learning-objects/database-learning-object-provider.ts @@ -6,11 +6,7 @@ import processingService from './processing/processing-service.js'; import { NotFoundError } from '@mikro-orm/core'; import learningObjectService from './learning-object-service.js'; import { getLogger, Logger } from '../../logging/initalize.js'; -import { - FilteredLearningObject, - LearningObjectIdentifier, - LearningPathIdentifier, -} from 'dwengo-1-common/src/interfaces/learning-content'; +import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; const logger: Logger = getLogger(); diff --git a/backend/tests/services/learning-objects/database-learning-object-provider.test.ts b/backend/tests/services/learning-objects/database-learning-object-provider.test.ts index 03248c55..e87c158b 100644 --- a/backend/tests/services/learning-objects/database-learning-object-provider.test.ts +++ b/backend/tests/services/learning-objects/database-learning-object-provider.test.ts @@ -9,7 +9,7 @@ import { Language } from '../../../src/entities/content/language'; import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import learningPathExample from '../../test-assets/learning-paths/pn-werking-example'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; -import {FilteredLearningObject} from "dwengo-1-common/src/interfaces/learning-content"; +import { FilteredLearningObject } from 'dwengo-1-common/src/interfaces/learning-content'; async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { const learningObjectRepo = getLearningObjectRepository(); diff --git a/backend/tests/services/learning-objects/learning-object-service.test.ts b/backend/tests/services/learning-objects/learning-object-service.test.ts index abcae538..2e96c4fc 100644 --- a/backend/tests/services/learning-objects/learning-object-service.test.ts +++ b/backend/tests/services/learning-objects/learning-object-service.test.ts @@ -73,18 +73,18 @@ describe('LearningObjectService', () => { }); it( 'returns the same HTML as the Dwengo API when queried with the identifier of a learning object that does ' + - 'not start with the user content prefix', + 'not start with the user content prefix', async () => { const result = await learningObjectService.getLearningObjectHTML(DWENGO_TEST_LEARNING_OBJECT_ID); expect(result).not.toBeNull(); const responseFromDwengoApi = await fetch( getEnvVar(envVars.LearningContentRepoApiBaseUrl) + - `/learningObject/getRaw?hruid=${DWENGO_TEST_LEARNING_OBJECT_ID.hruid}&language=${DWENGO_TEST_LEARNING_OBJECT_ID.language}&version=${DWENGO_TEST_LEARNING_OBJECT_ID.version}`, + `/learningObject/getRaw?hruid=${DWENGO_TEST_LEARNING_OBJECT_ID.hruid}&language=${DWENGO_TEST_LEARNING_OBJECT_ID.language}&version=${DWENGO_TEST_LEARNING_OBJECT_ID.version}` ); const responseHtml = await responseFromDwengoApi.text(); expect(result).toEqual(responseHtml); - }, + } ); it('returns null when queried with a non-existing identifier', async () => { const result = await learningObjectService.getLearningObjectHTML({ diff --git a/backend/tests/services/learning-path/database-learning-path-provider.test.ts b/backend/tests/services/learning-path/database-learning-path-provider.test.ts index 30e07a5a..7b1f2bf8 100644 --- a/backend/tests/services/learning-path/database-learning-path-provider.test.ts +++ b/backend/tests/services/learning-path/database-learning-path-provider.test.ts @@ -20,7 +20,7 @@ import { } from '../../test-assets/learning-paths/test-conditions-example.js'; import { Student } from '../../../src/entities/users/student.entity.js'; -import {LearningObjectNode, LearningPathResponse} from "dwengo-1-common/src/interfaces/learning-content"; +import { LearningObjectNode, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { const learningObjectRepo = getLearningObjectRepository(); diff --git a/backend/tests/test-utils/expectations.ts b/backend/tests/test-utils/expectations.ts index ef845975..374bf6a7 100644 --- a/backend/tests/test-utils/expectations.ts +++ b/backend/tests/test-utils/expectations.ts @@ -2,7 +2,7 @@ import { AssertionError } from 'node:assert'; import { LearningObject } from '../../src/entities/content/learning-object.entity'; import { LearningPath as LearningPathEntity } from '../../src/entities/content/learning-path.entity'; import { expect } from 'vitest'; -import {FilteredLearningObject, LearningPath} from "dwengo-1-common/src/interfaces/learning-content"; +import { FilteredLearningObject, LearningPath } from 'dwengo-1-common/src/interfaces/learning-content'; // Ignored properties because they belang for example to the class, not to the entity itself. const IGNORE_PROPERTIES = ['parent']; diff --git a/common/src/interfaces/learning-content.d.ts b/common/src/interfaces/learning-content.d.ts index 7db61a85..610b1385 100644 --- a/common/src/interfaces/learning-content.d.ts +++ b/common/src/interfaces/learning-content.d.ts @@ -1,4 +1,4 @@ -import { Language } from 'dwengo-1-backend/src/entities/content/language.js' +import { Language } from 'dwengo-1-backend/src/entities/content/language.js'; export interface Transition { default: boolean; From 9470a4ddf906c88b676ae1a18bff9f2b3255613e Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 2 Apr 2025 17:32:14 +0200 Subject: [PATCH 20/34] fix: Shared pkgs importeren --- backend/config.js | 7 ------- backend/package.json | 7 ++++--- backend/src/controllers/assignments.ts | 3 +-- backend/src/controllers/classes.ts | 3 +-- backend/src/controllers/groups.ts | 3 +-- backend/src/controllers/learning-objects.ts | 4 ++-- backend/src/controllers/learning-paths.ts | 2 +- backend/src/controllers/questions.ts | 4 ++-- backend/src/controllers/students.ts | 2 +- backend/src/controllers/submissions.ts | 5 ++--- backend/src/controllers/teachers.ts | 3 +-- .../src/data/content/attachment-repository.ts | 2 +- .../data/content/learning-object-repository.ts | 2 +- .../src/data/content/learning-path-repository.ts | 2 +- .../entities/assignments/assignment.entity.ts | 2 +- .../entities/assignments/submission.entity.ts | 2 +- .../content/learning-object-identifier.ts | 2 +- .../entities/content/learning-object.entity.ts | 2 +- .../content/learning-path-node.entity.ts | 2 +- .../src/entities/content/learning-path.entity.ts | 2 +- .../src/entities/questions/question.entity.ts | 2 +- backend/src/interfaces/answer.ts | 2 +- backend/src/interfaces/assignment.ts | 4 ++-- backend/src/interfaces/class.ts | 2 +- backend/src/interfaces/group.ts | 2 +- backend/src/interfaces/question.ts | 2 +- backend/src/interfaces/student.ts | 2 +- backend/src/interfaces/submission.ts | 2 +- backend/src/interfaces/teacher-invitation.ts | 2 +- backend/src/interfaces/teacher.ts | 2 +- backend/src/interfaces/user.ts | 2 +- backend/src/services/assignments.ts | 4 ++-- backend/src/services/classes.ts | 6 +++--- backend/src/services/groups.ts | 4 ++-- backend/src/services/learning-objects.ts | 2 +- .../learning-objects/attachment-service.ts | 2 +- .../database-learning-object-provider.ts | 2 +- .../dwengo-api-learning-object-provider.ts | 2 +- .../learning-objects/learning-object-provider.ts | 2 +- .../learning-objects/learning-object-service.ts | 6 +++++- .../markdown/dwengo-marked-renderer.ts | 5 ++--- .../processing/processing-service.ts | 4 ++-- .../database-learning-path-provider.ts | 4 ++-- .../dwengo-api-learning-path-provider.ts | 2 +- .../learning-paths/learning-path-provider.ts | 4 ++-- .../learning-paths/learning-path-service.ts | 4 ++-- backend/src/services/questions.ts | 4 ++-- backend/src/services/students.ts | 10 +++++----- backend/src/services/submissions.ts | 4 ++-- backend/src/services/teachers.ts | 8 ++++---- backend/src/util/links.ts | 2 +- .../tests/data/assignments/submissions.test.ts | 2 +- backend/tests/data/content/attachments.test.ts | 2 +- .../tests/data/content/learning-objects.test.ts | 2 +- .../content/learning-path-repository.test.ts | 2 +- .../tests/data/content/learning-paths.test.ts | 2 +- backend/tests/data/questions/answers.test.ts | 2 +- backend/tests/data/questions/questions.test.ts | 2 +- .../database-learning-object-provider.test.ts | 4 ++-- .../learning-object-service.test.ts | 4 ++-- .../database-learning-path-provider.test.ts | 4 ++-- .../learning-path/learning-path-service.test.ts | 2 +- .../dummy/dummy-learning-object-example.ts | 2 +- .../pn-werkingnotebooks-example.ts | 2 +- .../test-essay/test-essay-example.ts | 2 +- .../test-multiple-choice-example.ts | 2 +- .../learning-paths/learning-path-utils.ts | 2 +- .../learning-paths/pn-werking-example.ts | 2 +- .../learning-paths/test-conditions-example.ts | 2 +- backend/tests/test-utils/expectations.ts | 2 +- .../assignments/assignments.testdata.ts | 2 +- .../assignments/submission.testdata.ts | 2 +- .../content/learning-objects.testdata.ts | 2 +- .../content/learning-paths.testdata.ts | 2 +- .../test_assets/questions/questions.testdata.ts | 2 +- backend/tsconfig.json | 10 ++++++---- common/package.json | 9 ++++++--- common/src/interfaces/{answer.d.ts => answer.ts} | 2 +- .../{assignment.d.ts => assignment.ts} | 0 common/src/interfaces/{class.d.ts => class.ts} | 0 common/src/interfaces/{group.d.ts => group.ts} | 1 + ...learning-content.d.ts => learning-content.ts} | 2 +- .../interfaces/{question.d.ts => question.ts} | 1 + .../src/interfaces/{student.d.ts => student.ts} | 0 .../{submission.d.ts => submission.ts} | 3 +++ ...her-invitation.d.ts => teacher-invitation.ts} | 0 .../src/interfaces/{teacher.d.ts => teacher.ts} | 0 common/src/interfaces/{user.d.ts => user.ts} | 0 .../content => common/src/util}/language.ts | 0 common/tsconfig.json | 5 +---- frontend/tsconfig.json | 1 + package-lock.json | 16 ++++++++++------ package.json | 7 +++++-- tsconfig.build.json | 11 +++++++++++ tsconfig.json | 14 +++++++------- 95 files changed, 160 insertions(+), 142 deletions(-) delete mode 100644 backend/config.js rename common/src/interfaces/{answer.d.ts => answer.ts} (84%) rename common/src/interfaces/{assignment.d.ts => assignment.ts} (100%) rename common/src/interfaces/{class.d.ts => class.ts} (100%) rename common/src/interfaces/{group.d.ts => group.ts} (81%) rename common/src/interfaces/{learning-content.d.ts => learning-content.ts} (96%) rename common/src/interfaces/{question.d.ts => question.ts} (84%) rename common/src/interfaces/{student.d.ts => student.ts} (100%) rename common/src/interfaces/{submission.d.ts => submission.ts} (74%) rename common/src/interfaces/{teacher-invitation.d.ts => teacher-invitation.ts} (100%) rename common/src/interfaces/{teacher.d.ts => teacher.ts} (100%) rename common/src/interfaces/{user.d.ts => user.ts} (100%) rename {backend/src/entities/content => common/src/util}/language.ts (100%) create mode 100644 tsconfig.build.json diff --git a/backend/config.js b/backend/config.js deleted file mode 100644 index be42027c..00000000 --- a/backend/config.js +++ /dev/null @@ -1,7 +0,0 @@ -// Can be placed in dotenv but found it redundant -// Import dotenv from "dotenv"; -// Load .env file -// Dotenv.config(); -export const DWENGO_API_BASE = 'https://dwengo.org/backend/api'; -export const FALLBACK_LANG = 'nl'; -export const FALLBACK_SEQ_NUM = 1; diff --git a/backend/package.json b/backend/package.json index c09ac285..4ccf9814 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,12 +1,13 @@ { - "name": "dwengo-1-backend", + "name": "@dwengo-1/backend", "version": "0.1.1", "description": "Backend for Dwengo-1", "private": true, "type": "module", + "main": "dist/app.js", "scripts": { - "build": "cross-env NODE_ENV=production tsc --project tsconfig.json", - "dev": "cross-env NODE_ENV=development tsx watch --env-file=.env.development.local src/app.ts", + "build": "cross-env NODE_ENV=production tsc --build", + "dev": "cross-env NODE_ENV=development tsc --build --watch --env-file=.env.development.local", "start": "cross-env NODE_ENV=production node --env-file=.env dist/app.js", "format": "prettier --write src/", "format-check": "prettier --check src/", diff --git a/backend/src/controllers/assignments.ts b/backend/src/controllers/assignments.ts index 21bd568c..1520fc10 100644 --- a/backend/src/controllers/assignments.ts +++ b/backend/src/controllers/assignments.ts @@ -1,7 +1,6 @@ import { Request, Response } from 'express'; import { createAssignment, getAllAssignments, getAssignment, getAssignmentsSubmissions } from '../services/assignments.js'; - -import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; +import { AssignmentDTO } from '@dwengo-1/common/interfaces/assignment'; // Typescript is annoying with parameter forwarding from class.ts interface AssignmentParams { diff --git a/backend/src/controllers/classes.ts b/backend/src/controllers/classes.ts index 40683c6a..a041bf22 100644 --- a/backend/src/controllers/classes.ts +++ b/backend/src/controllers/classes.ts @@ -1,7 +1,6 @@ import { Request, Response } from 'express'; import { createClass, getAllClasses, getClass, getClassStudents, getClassStudentsIds, getClassTeacherInvitations } from '../services/classes.js'; - -import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; +import { ClassDTO } from '@dwengo-1/common/interfaces/class'; export async function getAllClassesHandler(req: Request, res: Response): Promise { const full = req.query.full === 'true'; diff --git a/backend/src/controllers/groups.ts b/backend/src/controllers/groups.ts index 6258cb20..989066a6 100644 --- a/backend/src/controllers/groups.ts +++ b/backend/src/controllers/groups.ts @@ -1,7 +1,6 @@ import { Request, Response } from 'express'; import { createGroup, getAllGroups, getGroup, getGroupSubmissions } from '../services/groups.js'; - -import { GroupDTO } from 'dwengo-1-common/src/interfaces/group'; +import { GroupDTO } from '@dwengo-1/common/interfaces/group'; // Typescript is annoywith with parameter forwarding from class.ts interface GroupParams { diff --git a/backend/src/controllers/learning-objects.ts b/backend/src/controllers/learning-objects.ts index 710999ce..eb8865a8 100644 --- a/backend/src/controllers/learning-objects.ts +++ b/backend/src/controllers/learning-objects.ts @@ -2,11 +2,11 @@ import { Request, Response } from 'express'; import { FALLBACK_LANG } from '../config.js'; import learningObjectService from '../services/learning-objects/learning-object-service.js'; import { envVars, getEnvVar } from '../util/envVars.js'; -import { Language } from '../entities/content/language.js'; +import { Language } from '@dwengo-1/common/util/language'; import attachmentService from '../services/learning-objects/attachment-service.js'; import { NotFoundError } from '@mikro-orm/core'; import { BadRequestException } from '../exceptions/bad-request-exception.js'; -import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from '@dwengo-1/common/interfaces/learning-content'; function getLearningObjectIdentifierFromRequest(req: Request): LearningObjectIdentifier { if (!req.params.hruid) { diff --git a/backend/src/controllers/learning-paths.ts b/backend/src/controllers/learning-paths.ts index 04e44b59..0097d568 100644 --- a/backend/src/controllers/learning-paths.ts +++ b/backend/src/controllers/learning-paths.ts @@ -2,7 +2,7 @@ import { Request, Response } from 'express'; import { themes } from '../data/themes.js'; import { FALLBACK_LANG } from '../config.js'; import learningPathService from '../services/learning-paths/learning-path-service.js'; -import { Language } from '../entities/content/language.js'; +import { Language } from '@dwengo-1/common/util/language'; import { PersonalizationTarget, personalizedForGroup, diff --git a/backend/src/controllers/questions.ts b/backend/src/controllers/questions.ts index 089931f3..b5b764ac 100644 --- a/backend/src/controllers/questions.ts +++ b/backend/src/controllers/questions.ts @@ -2,8 +2,8 @@ import { Request, Response } from 'express'; import { createQuestion, deleteQuestion, getAllQuestions, getAnswersByQuestion, getQuestion } from '../services/questions.js'; import { FALLBACK_LANG, FALLBACK_SEQ_NUM } from '../config.js'; import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; -import { Language } from '../entities/content/language.js'; -import { QuestionDTO, QuestionId } from 'dwengo-1-common/src/interfaces/question'; +import { QuestionDTO, QuestionId } from '@dwengo-1/common/interfaces/question'; +import { Language } from '@dwengo-1/common/util/language'; function getObjectId(req: Request, res: Response): LearningObjectIdentifier | null { const { hruid, version } = req.params; diff --git a/backend/src/controllers/students.ts b/backend/src/controllers/students.ts index 047940b1..54aae143 100644 --- a/backend/src/controllers/students.ts +++ b/backend/src/controllers/students.ts @@ -10,7 +10,7 @@ import { getStudentSubmissions, } from '../services/students.js'; -import { StudentDTO } from 'dwengo-1-common/src/interfaces/student'; +import { StudentDTO } from '@dwengo-1/common/interfaces/student'; // TODO: accept arguments (full, ...) // TODO: endpoints diff --git a/backend/src/controllers/submissions.ts b/backend/src/controllers/submissions.ts index df0f6e48..239eb6d7 100644 --- a/backend/src/controllers/submissions.ts +++ b/backend/src/controllers/submissions.ts @@ -1,8 +1,7 @@ import { Request, Response } from 'express'; import { createSubmission, deleteSubmission, getSubmission } from '../services/submissions.js'; -import { Language, languageMap } from '../entities/content/language.js'; - -import { SubmissionDTO } from 'dwengo-1-common/src/interfaces/submission'; +import { SubmissionDTO } from '@dwengo-1/common/interfaces/submission'; +import { Language, languageMap } from '@dwengo-1/common/util/language'; interface SubmissionParams { hruid: string; diff --git a/backend/src/controllers/teachers.ts b/backend/src/controllers/teachers.ts index 347e2b53..c3894bd6 100644 --- a/backend/src/controllers/teachers.ts +++ b/backend/src/controllers/teachers.ts @@ -8,8 +8,7 @@ import { getStudentsByTeacher, getTeacher, } from '../services/teachers.js'; - -import { TeacherDTO } from 'dwengo-1-common/src/interfaces/teacher'; +import { TeacherDTO } from '@dwengo-1/common/interfaces/teacher'; export async function getAllTeachersHandler(req: Request, res: Response): Promise { const full = req.query.full === 'true'; diff --git a/backend/src/data/content/attachment-repository.ts b/backend/src/data/content/attachment-repository.ts index 73baa943..69178b1c 100644 --- a/backend/src/data/content/attachment-repository.ts +++ b/backend/src/data/content/attachment-repository.ts @@ -1,6 +1,6 @@ import { DwengoEntityRepository } from '../dwengo-entity-repository.js'; import { Attachment } from '../../entities/content/attachment.entity.js'; -import { Language } from '../../entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import { LearningObjectIdentifier } from '../../entities/content/learning-object-identifier'; export class AttachmentRepository extends DwengoEntityRepository { diff --git a/backend/src/data/content/learning-object-repository.ts b/backend/src/data/content/learning-object-repository.ts index 4684c6cc..889a1594 100644 --- a/backend/src/data/content/learning-object-repository.ts +++ b/backend/src/data/content/learning-object-repository.ts @@ -1,7 +1,7 @@ import { DwengoEntityRepository } from '../dwengo-entity-repository.js'; import { LearningObject } from '../../entities/content/learning-object.entity.js'; import { LearningObjectIdentifier } from '../../entities/content/learning-object-identifier.js'; -import { Language } from '../../entities/content/language.js'; +import { Language } from '@dwengo-1/common/util/language'; import { Teacher } from '../../entities/users/teacher.entity.js'; export class LearningObjectRepository extends DwengoEntityRepository { diff --git a/backend/src/data/content/learning-path-repository.ts b/backend/src/data/content/learning-path-repository.ts index e34508ec..87035f21 100644 --- a/backend/src/data/content/learning-path-repository.ts +++ b/backend/src/data/content/learning-path-repository.ts @@ -1,6 +1,6 @@ import { DwengoEntityRepository } from '../dwengo-entity-repository.js'; import { LearningPath } from '../../entities/content/learning-path.entity.js'; -import { Language } from '../../entities/content/language.js'; +import { Language } from '@dwengo-1/common/util/language'; export class LearningPathRepository extends DwengoEntityRepository { public async findByHruidAndLanguage(hruid: string, language: Language): Promise { diff --git a/backend/src/entities/assignments/assignment.entity.ts b/backend/src/entities/assignments/assignment.entity.ts index daa71ed6..36b24344 100644 --- a/backend/src/entities/assignments/assignment.entity.ts +++ b/backend/src/entities/assignments/assignment.entity.ts @@ -1,7 +1,7 @@ import { Entity, Enum, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'; import { Class } from '../classes/class.entity.js'; import { Group } from './group.entity.js'; -import { Language } from '../content/language.js'; +import { Language } from '@dwengo-1/common/util/language'; import { AssignmentRepository } from '../../data/assignments/assignment-repository.js'; @Entity({ diff --git a/backend/src/entities/assignments/submission.entity.ts b/backend/src/entities/assignments/submission.entity.ts index e4330e0d..80b9a8fb 100644 --- a/backend/src/entities/assignments/submission.entity.ts +++ b/backend/src/entities/assignments/submission.entity.ts @@ -1,8 +1,8 @@ import { Student } from '../users/student.entity.js'; import { Group } from './group.entity.js'; import { Entity, Enum, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'; -import { Language } from '../content/language.js'; import { SubmissionRepository } from '../../data/assignments/submission-repository.js'; +import { Language } from '@dwengo-1/common/util/language'; @Entity({ repository: () => SubmissionRepository }) export class Submission { diff --git a/backend/src/entities/content/learning-object-identifier.ts b/backend/src/entities/content/learning-object-identifier.ts index 9234afa7..b7802ddd 100644 --- a/backend/src/entities/content/learning-object-identifier.ts +++ b/backend/src/entities/content/learning-object-identifier.ts @@ -1,4 +1,4 @@ -import { Language } from './language.js'; +import { Language } from "@dwengo-1/common/util/language"; export class LearningObjectIdentifier { constructor( diff --git a/backend/src/entities/content/learning-object.entity.ts b/backend/src/entities/content/learning-object.entity.ts index db009e7a..ff858fe6 100644 --- a/backend/src/entities/content/learning-object.entity.ts +++ b/backend/src/entities/content/learning-object.entity.ts @@ -5,8 +5,8 @@ import { DwengoContentType } from '../../services/learning-objects/processing/co import { v4 } from 'uuid'; import { LearningObjectRepository } from '../../data/content/learning-object-repository.js'; import { EducationalGoal } from './educational-goal.entity.js'; -import { Language } from './language.js'; import { ReturnValue } from './return-value.entity.js'; +import { Language } from '@dwengo-1/common/util/language'; @Entity({ repository: () => LearningObjectRepository }) export class LearningObject { diff --git a/backend/src/entities/content/learning-path-node.entity.ts b/backend/src/entities/content/learning-path-node.entity.ts index 03499270..3016c367 100644 --- a/backend/src/entities/content/learning-path-node.entity.ts +++ b/backend/src/entities/content/learning-path-node.entity.ts @@ -1,7 +1,7 @@ import { Entity, Enum, ManyToOne, OneToMany, PrimaryKey, Property, Rel } from '@mikro-orm/core'; -import { Language } from './language.js'; import { LearningPath } from './learning-path.entity.js'; import { LearningPathTransition } from './learning-path-transition.entity.js'; +import { Language } from '@dwengo-1/common/util/language'; @Entity() export class LearningPathNode { diff --git a/backend/src/entities/content/learning-path.entity.ts b/backend/src/entities/content/learning-path.entity.ts index 888cc0cf..203af86d 100644 --- a/backend/src/entities/content/learning-path.entity.ts +++ b/backend/src/entities/content/learning-path.entity.ts @@ -1,8 +1,8 @@ import { Entity, Enum, ManyToMany, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'; -import { Language } from './language.js'; import { Teacher } from '../users/teacher.entity.js'; import { LearningPathRepository } from '../../data/content/learning-path-repository.js'; import { LearningPathNode } from './learning-path-node.entity.js'; +import { Language } from '@dwengo-1/common/util/language'; @Entity({ repository: () => LearningPathRepository }) export class LearningPath { diff --git a/backend/src/entities/questions/question.entity.ts b/backend/src/entities/questions/question.entity.ts index 09e3cd46..5e691f70 100644 --- a/backend/src/entities/questions/question.entity.ts +++ b/backend/src/entities/questions/question.entity.ts @@ -1,7 +1,7 @@ import { Entity, Enum, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'; -import { Language } from '../content/language.js'; import { Student } from '../users/student.entity.js'; import { QuestionRepository } from '../../data/questions/question-repository.js'; +import { Language } from '@dwengo-1/common/util/language'; @Entity({ repository: () => QuestionRepository }) export class Question { diff --git a/backend/src/interfaces/answer.ts b/backend/src/interfaces/answer.ts index b62aa741..5599839f 100644 --- a/backend/src/interfaces/answer.ts +++ b/backend/src/interfaces/answer.ts @@ -1,7 +1,7 @@ import { mapToUserDTO } from './user.js'; import { mapToQuestionDTO, mapToQuestionId } from './question.js'; import { Answer } from '../entities/questions/answer.entity.js'; -import { AnswerDTO, AnswerId } from 'dwengo-1-common/src/interfaces/answer'; +import { AnswerDTO, AnswerId } from '@dwengo-1/common/interfaces/answer'; /** * Convert a Question entity to a DTO format. diff --git a/backend/src/interfaces/assignment.ts b/backend/src/interfaces/assignment.ts index 84cbd0cf..d48a9083 100644 --- a/backend/src/interfaces/assignment.ts +++ b/backend/src/interfaces/assignment.ts @@ -1,9 +1,9 @@ +import { languageMap } from '@dwengo-1/common/util/language'; import { FALLBACK_LANG } from '../config.js'; import { Assignment } from '../entities/assignments/assignment.entity.js'; import { Class } from '../entities/classes/class.entity.js'; import { getLogger } from '../logging/initalize.js'; -import { languageMap } from '../entities/content/language.js'; -import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; +import { AssignmentDTO } from '@dwengo-1/common/interfaces/assignment'; export function mapToAssignmentDTOId(assignment: Assignment): AssignmentDTO { return { diff --git a/backend/src/interfaces/class.ts b/backend/src/interfaces/class.ts index c711b94b..7b07fcf2 100644 --- a/backend/src/interfaces/class.ts +++ b/backend/src/interfaces/class.ts @@ -2,7 +2,7 @@ import { Collection } from '@mikro-orm/core'; import { Class } from '../entities/classes/class.entity.js'; import { Student } from '../entities/users/student.entity.js'; import { Teacher } from '../entities/users/teacher.entity.js'; -import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; +import { ClassDTO } from '@dwengo-1/common/interfaces/class'; export function mapToClassDTO(cls: Class): ClassDTO { return { diff --git a/backend/src/interfaces/group.ts b/backend/src/interfaces/group.ts index 9f71e3f7..1a169b2b 100644 --- a/backend/src/interfaces/group.ts +++ b/backend/src/interfaces/group.ts @@ -1,7 +1,7 @@ import { Group } from '../entities/assignments/group.entity.js'; import { mapToAssignmentDTO } from './assignment.js'; import { mapToStudentDTO } from './student.js'; -import { GroupDTO } from 'dwengo-1-common/src/interfaces/group'; +import { GroupDTO } from '@dwengo-1/common/interfaces/group'; export function mapToGroupDTO(group: Group): GroupDTO { return { diff --git a/backend/src/interfaces/question.ts b/backend/src/interfaces/question.ts index 86cd6523..57778bac 100644 --- a/backend/src/interfaces/question.ts +++ b/backend/src/interfaces/question.ts @@ -1,6 +1,6 @@ import { Question } from '../entities/questions/question.entity.js'; import { mapToStudentDTO } from './student.js'; -import { QuestionDTO, QuestionId } from 'dwengo-1-common/src/interfaces/question'; +import { QuestionDTO, QuestionId } from '@dwengo-1/common/interfaces/question'; /** * Convert a Question entity to a DTO format. diff --git a/backend/src/interfaces/student.ts b/backend/src/interfaces/student.ts index e1e4253f..06e173a1 100644 --- a/backend/src/interfaces/student.ts +++ b/backend/src/interfaces/student.ts @@ -1,6 +1,6 @@ import { Student } from '../entities/users/student.entity.js'; import { getStudentRepository } from '../data/repositories.js'; -import { StudentDTO } from 'dwengo-1-common/src/interfaces/student'; +import { StudentDTO } from '@dwengo-1/common/interfaces/student'; export function mapToStudentDTO(student: Student): StudentDTO { return { diff --git a/backend/src/interfaces/submission.ts b/backend/src/interfaces/submission.ts index 9a506b27..b4ed4a2b 100644 --- a/backend/src/interfaces/submission.ts +++ b/backend/src/interfaces/submission.ts @@ -1,7 +1,7 @@ import { Submission } from '../entities/assignments/submission.entity.js'; import { mapToGroupDTO } from './group.js'; import { mapToStudent, mapToStudentDTO } from './student.js'; -import { SubmissionDTO, SubmissionDTOId } from 'dwengo-1-common/src/interfaces/submission'; +import { SubmissionDTO, SubmissionDTOId } from '@dwengo-1/common/interfaces/submission'; export function mapToSubmissionDTO(submission: Submission): SubmissionDTO { return { diff --git a/backend/src/interfaces/teacher-invitation.ts b/backend/src/interfaces/teacher-invitation.ts index 8df92fd1..d9cb9915 100644 --- a/backend/src/interfaces/teacher-invitation.ts +++ b/backend/src/interfaces/teacher-invitation.ts @@ -1,7 +1,7 @@ import { TeacherInvitation } from '../entities/classes/teacher-invitation.entity.js'; import { mapToClassDTO } from './class.js'; import { mapToUserDTO } from './user.js'; -import { TeacherInvitationDTO } from 'dwengo-1-common/src/interfaces/teacher-invitation'; +import { TeacherInvitationDTO } from '@dwengo-1/common/interfaces/teacher-invitation'; export function mapToTeacherInvitationDTO(invitation: TeacherInvitation): TeacherInvitationDTO { return { diff --git a/backend/src/interfaces/teacher.ts b/backend/src/interfaces/teacher.ts index a1ba33fd..f7e1745f 100644 --- a/backend/src/interfaces/teacher.ts +++ b/backend/src/interfaces/teacher.ts @@ -1,6 +1,6 @@ import { Teacher } from '../entities/users/teacher.entity.js'; import { getTeacherRepository } from '../data/repositories.js'; -import { TeacherDTO } from 'dwengo-1-common/src/interfaces/teacher'; +import { TeacherDTO } from '@dwengo-1/common/interfaces/teacher'; export function mapToTeacherDTO(teacher: Teacher): TeacherDTO { return { diff --git a/backend/src/interfaces/user.ts b/backend/src/interfaces/user.ts index ecc9dd77..f4413b5e 100644 --- a/backend/src/interfaces/user.ts +++ b/backend/src/interfaces/user.ts @@ -1,5 +1,5 @@ import { User } from '../entities/users/user.entity.js'; -import { UserDTO } from 'dwengo-1-common/src/interfaces/user'; +import { UserDTO } from '@dwengo-1/common/interfaces/user'; export function mapToUserDTO(user: User): UserDTO { return { diff --git a/backend/src/services/assignments.ts b/backend/src/services/assignments.ts index 62ea31e6..e86b69b2 100644 --- a/backend/src/services/assignments.ts +++ b/backend/src/services/assignments.ts @@ -1,8 +1,8 @@ import { getAssignmentRepository, getClassRepository, getGroupRepository, getSubmissionRepository } from '../data/repositories.js'; import { mapToAssignment, mapToAssignmentDTO, mapToAssignmentDTOId } from '../interfaces/assignment.js'; import { mapToSubmissionDTO, mapToSubmissionDTOId } from '../interfaces/submission.js'; -import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; -import { SubmissionDTO, SubmissionDTOId } from 'dwengo-1-common/src/interfaces/submission'; +import { AssignmentDTO } from '@dwengo-1/common/interfaces/assignment'; +import { SubmissionDTO, SubmissionDTOId } from '@dwengo-1/common/interfaces/submission'; import { getLogger } from '../logging/initalize.js'; export async function getAllAssignments(classid: string, full: boolean): Promise { diff --git a/backend/src/services/classes.ts b/backend/src/services/classes.ts index 26dce897..fccbbee0 100644 --- a/backend/src/services/classes.ts +++ b/backend/src/services/classes.ts @@ -3,9 +3,9 @@ import { mapToClassDTO } from '../interfaces/class.js'; import { mapToStudentDTO } from '../interfaces/student.js'; import { mapToTeacherInvitationDTO, mapToTeacherInvitationDTOIds } from '../interfaces/teacher-invitation.js'; import { getLogger } from '../logging/initalize.js'; -import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; -import { TeacherInvitationDTO } from 'dwengo-1-common/src/interfaces/teacher-invitation'; -import { StudentDTO } from 'dwengo-1-common/src/interfaces/student'; +import { ClassDTO } from '@dwengo-1/common/interfaces/class'; +import { TeacherInvitationDTO } from '@dwengo-1/common/interfaces/teacher-invitation'; +import { StudentDTO } from '@dwengo-1/common/interfaces/student'; const logger = getLogger(); diff --git a/backend/src/services/groups.ts b/backend/src/services/groups.ts index 5d35de55..346c1ee1 100644 --- a/backend/src/services/groups.ts +++ b/backend/src/services/groups.ts @@ -8,8 +8,8 @@ import { import { Group } from '../entities/assignments/group.entity.js'; import { mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; import { mapToSubmissionDTO, mapToSubmissionDTOId } from '../interfaces/submission.js'; -import { GroupDTO } from 'dwengo-1-common/src/interfaces/group'; -import { SubmissionDTO, SubmissionDTOId } from 'dwengo-1-common/src/interfaces/submission'; +import { GroupDTO } from '@dwengo-1/common/interfaces/group'; +import { SubmissionDTO, SubmissionDTOId } from '@dwengo-1/common/interfaces/submission'; import { getLogger } from '../logging/initalize.js'; export async function getGroup(classId: string, assignmentNumber: number, groupNumber: number, full: boolean): Promise { diff --git a/backend/src/services/learning-objects.ts b/backend/src/services/learning-objects.ts index 6dfd2704..436c4a08 100644 --- a/backend/src/services/learning-objects.ts +++ b/backend/src/services/learning-objects.ts @@ -6,7 +6,7 @@ import { LearningObjectMetadata, LearningObjectNode, LearningPathResponse, -} from 'dwengo-1-common/src/interfaces/learning-content'; +} from '@dwengo-1/common/interfaces/learning-content'; import { getLogger } from '../logging/initalize.js'; function filterData(data: LearningObjectMetadata, htmlUrl: string): FilteredLearningObject { diff --git a/backend/src/services/learning-objects/attachment-service.ts b/backend/src/services/learning-objects/attachment-service.ts index 2acf90a0..46fc5e03 100644 --- a/backend/src/services/learning-objects/attachment-service.ts +++ b/backend/src/services/learning-objects/attachment-service.ts @@ -1,7 +1,7 @@ import { getAttachmentRepository } from '../../data/repositories.js'; import { Attachment } from '../../entities/content/attachment.entity.js'; -import { LearningObjectIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { LearningObjectIdentifier } from '@dwengo-1/common/interfaces/learning-content'; const attachmentService = { async getAttachment(learningObjectId: LearningObjectIdentifier, attachmentName: string): Promise { diff --git a/backend/src/services/learning-objects/database-learning-object-provider.ts b/backend/src/services/learning-objects/database-learning-object-provider.ts index 0639782c..361153f5 100644 --- a/backend/src/services/learning-objects/database-learning-object-provider.ts +++ b/backend/src/services/learning-objects/database-learning-object-provider.ts @@ -6,7 +6,7 @@ import processingService from './processing/processing-service.js'; import { NotFoundError } from '@mikro-orm/core'; import learningObjectService from './learning-object-service.js'; import { getLogger, Logger } from '../../logging/initalize.js'; -import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from '@dwengo-1/common/interfaces/learning-content'; const logger: Logger = getLogger(); diff --git a/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts b/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts index 35d9f899..77cde59d 100644 --- a/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts +++ b/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts @@ -10,7 +10,7 @@ import { LearningObjectNode, LearningPathIdentifier, LearningPathResponse, -} from 'dwengo-1-common/src/interfaces/learning-content'; +} from '@dwengo-1/common/interfaces/learning-content'; const logger: Logger = getLogger(); diff --git a/backend/src/services/learning-objects/learning-object-provider.ts b/backend/src/services/learning-objects/learning-object-provider.ts index 6ea7cbd1..a0fcb552 100644 --- a/backend/src/services/learning-objects/learning-object-provider.ts +++ b/backend/src/services/learning-objects/learning-object-provider.ts @@ -1,4 +1,4 @@ -import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from '@dwengo-1/common/interfaces/learning-content'; export interface LearningObjectProvider { /** diff --git a/backend/src/services/learning-objects/learning-object-service.ts b/backend/src/services/learning-objects/learning-object-service.ts index 7a4dd828..69004ae1 100644 --- a/backend/src/services/learning-objects/learning-object-service.ts +++ b/backend/src/services/learning-objects/learning-object-service.ts @@ -2,7 +2,11 @@ import dwengoApiLearningObjectProvider from './dwengo-api-learning-object-provid import { LearningObjectProvider } from './learning-object-provider.js'; import { envVars, getEnvVar } from '../../util/envVars.js'; import databaseLearningObjectProvider from './database-learning-object-provider.js'; -import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { + FilteredLearningObject, + LearningObjectIdentifier, + LearningPathIdentifier, +} from '@dwengo-1/common/interfaces/learning-content'; function getProvider(id: LearningObjectIdentifier): LearningObjectProvider { if (id.hruid.startsWith(getEnvVar(envVars.UserContentPrefix))) { diff --git a/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts b/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts index 3b9ad4e5..87ba13b7 100644 --- a/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts +++ b/backend/src/services/learning-objects/processing/markdown/dwengo-marked-renderer.ts @@ -8,13 +8,12 @@ import InlineImageProcessor from '../image/inline-image-processor.js'; import * as marked from 'marked'; import { getUrlStringForLearningObjectHTML, isValidHttpUrl } from '../../../../util/links.js'; import { ProcessingError } from '../processing-error.js'; -import { Language } from '../../../../entities/content/language.js'; - import Image = marked.Tokens.Image; import Heading = marked.Tokens.Heading; import Link = marked.Tokens.Link; import RendererObject = marked.RendererObject; -import { LearningObjectIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { LearningObjectIdentifier } from '@dwengo-1/common/interfaces/learning-content'; +import { Language } from '@dwengo-1/common/util/language'; const prefixes = { learningObject: '@learning-object', diff --git a/backend/src/services/learning-objects/processing/processing-service.ts b/backend/src/services/learning-objects/processing/processing-service.ts index d0d43061..e9147e31 100644 --- a/backend/src/services/learning-objects/processing/processing-service.ts +++ b/backend/src/services/learning-objects/processing/processing-service.ts @@ -13,9 +13,9 @@ import GiftProcessor from './gift/gift-processor.js'; import { LearningObject } from '../../../entities/content/learning-object.entity.js'; import Processor from './processor.js'; import { DwengoContentType } from './content-type.js'; -import { Language } from '../../../entities/content/language.js'; import { replaceAsync } from '../../../util/async.js'; -import { LearningObjectIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { LearningObjectIdentifier } from '@dwengo-1/common/interfaces/learning-content'; +import { Language } from '@dwengo-1/common/util/language'; const EMBEDDED_LEARNING_OBJECT_PLACEHOLDER = //g; const LEARNING_OBJECT_DOES_NOT_EXIST = "
"; diff --git a/backend/src/services/learning-paths/database-learning-path-provider.ts b/backend/src/services/learning-paths/database-learning-path-provider.ts index d0fcf630..ba312b08 100644 --- a/backend/src/services/learning-paths/database-learning-path-provider.ts +++ b/backend/src/services/learning-paths/database-learning-path-provider.ts @@ -1,7 +1,6 @@ import { LearningPathProvider } from './learning-path-provider.js'; import { LearningPath as LearningPathEntity } from '../../entities/content/learning-path.entity.js'; import { getLearningPathRepository } from '../../data/repositories.js'; -import { Language } from '../../entities/content/language.js'; import learningObjectService from '../learning-objects/learning-object-service.js'; import { LearningPathNode } from '../../entities/content/learning-path-node.entity.js'; import { LearningPathTransition } from '../../entities/content/learning-path-transition.entity.js'; @@ -12,7 +11,8 @@ import { LearningPath, LearningPathResponse, Transition, -} from 'dwengo-1-common/src/interfaces/learning-content'; +} from '@dwengo-1/common/interfaces/learning-content'; +import { Language } from '@dwengo-1/common/util/language'; /** * Fetches the corresponding learning object for each of the nodes and creates a map that maps each node to its diff --git a/backend/src/services/learning-paths/dwengo-api-learning-path-provider.ts b/backend/src/services/learning-paths/dwengo-api-learning-path-provider.ts index b7f03d35..110cd570 100644 --- a/backend/src/services/learning-paths/dwengo-api-learning-path-provider.ts +++ b/backend/src/services/learning-paths/dwengo-api-learning-path-provider.ts @@ -2,7 +2,7 @@ import { fetchWithLogging } from '../../util/api-helper.js'; import { DWENGO_API_BASE } from '../../config.js'; import { LearningPathProvider } from './learning-path-provider.js'; import { getLogger, Logger } from '../../logging/initalize.js'; -import { LearningPath, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; +import { LearningPath, LearningPathResponse } from '@dwengo-1/common/interfaces/learning-content'; const logger: Logger = getLogger(); diff --git a/backend/src/services/learning-paths/learning-path-provider.ts b/backend/src/services/learning-paths/learning-path-provider.ts index a904296a..3bf734e7 100644 --- a/backend/src/services/learning-paths/learning-path-provider.ts +++ b/backend/src/services/learning-paths/learning-path-provider.ts @@ -1,6 +1,6 @@ -import { Language } from '../../entities/content/language.js'; +import { LearningPath, LearningPathResponse } from '@dwengo-1/common/interfaces/learning-content'; import { PersonalizationTarget } from './learning-path-personalization-util.js'; -import { LearningPath, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; +import { Language } from '@dwengo-1/common/util/language'; /** * Generic interface for a service which provides access to learning paths from a data source. diff --git a/backend/src/services/learning-paths/learning-path-service.ts b/backend/src/services/learning-paths/learning-path-service.ts index bebfe8a9..0e4d2c5e 100644 --- a/backend/src/services/learning-paths/learning-path-service.ts +++ b/backend/src/services/learning-paths/learning-path-service.ts @@ -1,9 +1,9 @@ import dwengoApiLearningPathProvider from './dwengo-api-learning-path-provider.js'; import databaseLearningPathProvider from './database-learning-path-provider.js'; import { envVars, getEnvVar } from '../../util/envVars.js'; -import { Language } from '../../entities/content/language.js'; import { PersonalizationTarget } from './learning-path-personalization-util.js'; -import { LearningPath, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; +import { LearningPath, LearningPathResponse } from '@dwengo-1/common/interfaces/learning-content'; +import { Language } from '@dwengo-1/common/util/language'; const userContentPrefix = getEnvVar(envVars.UserContentPrefix); const allProviders = [dwengoApiLearningPathProvider, databaseLearningPathProvider]; diff --git a/backend/src/services/questions.ts b/backend/src/services/questions.ts index b9d9f42e..3c0c4820 100644 --- a/backend/src/services/questions.ts +++ b/backend/src/services/questions.ts @@ -6,8 +6,8 @@ import { mapToAnswerDTO, mapToAnswerId } from '../interfaces/answer.js'; import { QuestionRepository } from '../data/questions/question-repository.js'; import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; import { mapToStudent } from '../interfaces/student.js'; -import { QuestionDTO, QuestionId } from 'dwengo-1-common/src/interfaces/question'; -import { AnswerDTO, AnswerId } from 'dwengo-1-common/src/interfaces/answer'; +import { QuestionDTO, QuestionId } from '@dwengo-1/common/interfaces/question'; +import { AnswerDTO, AnswerId } from '@dwengo-1/common/interfaces/answer'; export async function getAllQuestions(id: LearningObjectIdentifier, full: boolean): Promise { const questionRepository: QuestionRepository = getQuestionRepository(); diff --git a/backend/src/services/students.ts b/backend/src/services/students.ts index 671f77bc..968b556b 100644 --- a/backend/src/services/students.ts +++ b/backend/src/services/students.ts @@ -4,11 +4,11 @@ import { mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; import { mapToStudent, mapToStudentDTO } from '../interfaces/student.js'; import { mapToSubmissionDTO, mapToSubmissionDTOId } from '../interfaces/submission.js'; import { getAllAssignments } from './assignments.js'; -import { AssignmentDTO } from 'dwengo-1-common/src/interfaces/assignment'; -import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; -import { GroupDTO } from 'dwengo-1-common/src/interfaces/group'; -import { SubmissionDTO, SubmissionDTOId } from 'dwengo-1-common/src/interfaces/submission'; -import { StudentDTO } from 'dwengo-1-common/src/interfaces/student'; +import { AssignmentDTO } from '@dwengo-1/common/interfaces/assignment'; +import { ClassDTO } from '@dwengo-1/common/interfaces/class'; +import { GroupDTO } from '@dwengo-1/common/interfaces/group'; +import { SubmissionDTO, SubmissionDTOId } from '@dwengo-1/common/interfaces/submission'; +import { StudentDTO } from '@dwengo-1/common/interfaces/student'; import { getLogger } from '../logging/initalize.js'; export async function getAllStudents(full: boolean): Promise { diff --git a/backend/src/services/submissions.ts b/backend/src/services/submissions.ts index 314b9d65..1d8a7874 100644 --- a/backend/src/services/submissions.ts +++ b/backend/src/services/submissions.ts @@ -1,8 +1,8 @@ import { getSubmissionRepository } from '../data/repositories.js'; -import { Language } from '../entities/content/language.js'; import { LearningObjectIdentifier } from '../entities/content/learning-object-identifier.js'; import { mapToSubmission, mapToSubmissionDTO } from '../interfaces/submission.js'; -import { SubmissionDTO } from 'dwengo-1-common/src/interfaces/submission'; +import { SubmissionDTO } from '@dwengo-1/common/interfaces/submission'; +import { Language } from '@dwengo-1/common/util/language'; export async function getSubmission( learningObjectHruid: string, diff --git a/backend/src/services/teachers.ts b/backend/src/services/teachers.ts index 55c92cac..3986462b 100644 --- a/backend/src/services/teachers.ts +++ b/backend/src/services/teachers.ts @@ -3,10 +3,10 @@ import { mapToClassDTO } from '../interfaces/class.js'; import { getClassStudents } from './classes.js'; import { mapToQuestionDTO, mapToQuestionId } from '../interfaces/question.js'; import { mapToTeacher, mapToTeacherDTO } from '../interfaces/teacher.js'; -import { ClassDTO } from 'dwengo-1-common/src/interfaces/class'; -import { TeacherDTO } from 'dwengo-1-common/src/interfaces/teacher'; -import { StudentDTO } from 'dwengo-1-common/src/interfaces/student'; -import { QuestionDTO, QuestionId } from 'dwengo-1-common/src/interfaces/question'; +import { ClassDTO } from '@dwengo-1/common/interfaces/class'; +import { TeacherDTO } from '@dwengo-1/common/interfaces/teacher'; +import { StudentDTO } from '@dwengo-1/common/interfaces/student'; +import { QuestionDTO, QuestionId } from '@dwengo-1/common/interfaces/question'; import { getLogger } from '../logging/initalize.js'; export async function getAllTeachers(full: boolean): Promise { diff --git a/backend/src/util/links.ts b/backend/src/util/links.ts index bd14bfba..41cd6cac 100644 --- a/backend/src/util/links.ts +++ b/backend/src/util/links.ts @@ -1,4 +1,4 @@ -import { LearningObjectIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { LearningObjectIdentifier } from "@dwengo-1/common/interfaces/learning-content"; export function isValidHttpUrl(url: string): boolean { try { diff --git a/backend/tests/data/assignments/submissions.test.ts b/backend/tests/data/assignments/submissions.test.ts index cd212b77..85e1bc11 100644 --- a/backend/tests/data/assignments/submissions.test.ts +++ b/backend/tests/data/assignments/submissions.test.ts @@ -9,7 +9,7 @@ import { getSubmissionRepository, } from '../../../src/data/repositories'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import { StudentRepository } from '../../../src/data/users/student-repository'; import { GroupRepository } from '../../../src/data/assignments/group-repository'; import { AssignmentRepository } from '../../../src/data/assignments/assignment-repository'; diff --git a/backend/tests/data/content/attachments.test.ts b/backend/tests/data/content/attachments.test.ts index 94e132a9..4e65954e 100644 --- a/backend/tests/data/content/attachments.test.ts +++ b/backend/tests/data/content/attachments.test.ts @@ -4,7 +4,7 @@ import { getAttachmentRepository, getLearningObjectRepository } from '../../../s import { AttachmentRepository } from '../../../src/data/content/attachment-repository.js'; import { LearningObjectRepository } from '../../../src/data/content/learning-object-repository.js'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier.js'; -import { Language } from '../../../src/entities/content/language.js'; +import { Language } from '@dwengo-1/common/util/language'; describe('AttachmentRepository', () => { let attachmentRepository: AttachmentRepository; diff --git a/backend/tests/data/content/learning-objects.test.ts b/backend/tests/data/content/learning-objects.test.ts index 712f75c9..3c9d5dde 100644 --- a/backend/tests/data/content/learning-objects.test.ts +++ b/backend/tests/data/content/learning-objects.test.ts @@ -3,7 +3,7 @@ import { LearningObjectRepository } from '../../../src/data/content/learning-obj import { getLearningObjectRepository } from '../../../src/data/repositories'; import { setupTestApp } from '../../setup-tests'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; describe('LearningObjectRepository', () => { let learningObjectRepository: LearningObjectRepository; diff --git a/backend/tests/data/content/learning-path-repository.test.ts b/backend/tests/data/content/learning-path-repository.test.ts index 4424fced..bdf5377e 100644 --- a/backend/tests/data/content/learning-path-repository.test.ts +++ b/backend/tests/data/content/learning-path-repository.test.ts @@ -5,7 +5,7 @@ import { LearningPathRepository } from '../../../src/data/content/learning-path- import example from '../../test-assets/learning-paths/pn-werking-example.js'; import { LearningPath } from '../../../src/entities/content/learning-path.entity.js'; import { expectToBeCorrectEntity } from '../../test-utils/expectations.js'; -import { Language } from '../../../src/entities/content/language.js'; +import { Language } from '@dwengo-1/common/util/language'; function expectToHaveFoundPrecisely(expected: LearningPath, result: LearningPath[]): void { expect(result).toHaveProperty('length'); diff --git a/backend/tests/data/content/learning-paths.test.ts b/backend/tests/data/content/learning-paths.test.ts index 01fd20e5..683e1d40 100644 --- a/backend/tests/data/content/learning-paths.test.ts +++ b/backend/tests/data/content/learning-paths.test.ts @@ -2,7 +2,7 @@ import { beforeAll, describe, expect, it } from 'vitest'; import { getLearningPathRepository } from '../../../src/data/repositories'; import { LearningPathRepository } from '../../../src/data/content/learning-path-repository'; import { setupTestApp } from '../../setup-tests'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; describe('LearningPathRepository', () => { let learningPathRepository: LearningPathRepository; diff --git a/backend/tests/data/questions/answers.test.ts b/backend/tests/data/questions/answers.test.ts index 59917c3f..80cd3034 100644 --- a/backend/tests/data/questions/answers.test.ts +++ b/backend/tests/data/questions/answers.test.ts @@ -4,7 +4,7 @@ import { AnswerRepository } from '../../../src/data/questions/answer-repository' import { getAnswerRepository, getQuestionRepository, getTeacherRepository } from '../../../src/data/repositories'; import { QuestionRepository } from '../../../src/data/questions/question-repository'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import { TeacherRepository } from '../../../src/data/users/teacher-repository'; describe('AnswerRepository', () => { diff --git a/backend/tests/data/questions/questions.test.ts b/backend/tests/data/questions/questions.test.ts index c1d2b483..055a9d79 100644 --- a/backend/tests/data/questions/questions.test.ts +++ b/backend/tests/data/questions/questions.test.ts @@ -4,7 +4,7 @@ import { QuestionRepository } from '../../../src/data/questions/question-reposit import { getQuestionRepository, getStudentRepository } from '../../../src/data/repositories'; import { StudentRepository } from '../../../src/data/users/student-repository'; import { LearningObjectIdentifier } from '../../../src/entities/content/learning-object-identifier'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; describe('QuestionRepository', () => { let questionRepository: QuestionRepository; diff --git a/backend/tests/services/learning-objects/database-learning-object-provider.test.ts b/backend/tests/services/learning-objects/database-learning-object-provider.test.ts index e87c158b..0ab531bc 100644 --- a/backend/tests/services/learning-objects/database-learning-object-provider.test.ts +++ b/backend/tests/services/learning-objects/database-learning-object-provider.test.ts @@ -5,11 +5,11 @@ import example from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-w import { LearningObject } from '../../../src/entities/content/learning-object.entity'; import databaseLearningObjectProvider from '../../../src/services/learning-objects/database-learning-object-provider'; import { expectToBeCorrectFilteredLearningObject } from '../../test-utils/expectations'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import learningPathExample from '../../test-assets/learning-paths/pn-werking-example'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; -import { FilteredLearningObject } from 'dwengo-1-common/src/interfaces/learning-content'; +import { FilteredLearningObject } from '@dwengo-1/common/interfaces/learning-content'; async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { const learningObjectRepo = getLearningObjectRepository(); diff --git a/backend/tests/services/learning-objects/learning-object-service.test.ts b/backend/tests/services/learning-objects/learning-object-service.test.ts index 2e96c4fc..eb683018 100644 --- a/backend/tests/services/learning-objects/learning-object-service.test.ts +++ b/backend/tests/services/learning-objects/learning-object-service.test.ts @@ -4,11 +4,11 @@ import { LearningObject } from '../../../src/entities/content/learning-object.en import { getLearningObjectRepository, getLearningPathRepository } from '../../../src/data/repositories'; import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import learningObjectService from '../../../src/services/learning-objects/learning-object-service'; -import { Language } from '../../../src/entities/content/language'; import { envVars, getEnvVar } from '../../../src/util/envVars'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; import learningPathExample from '../../test-assets/learning-paths/pn-werking-example'; -import { LearningObjectIdentifier, LearningPathIdentifier } from 'dwengo-1-common/src/interfaces/learning-content'; +import { LearningObjectIdentifier, LearningPathIdentifier } from '@dwengo-1/common/interfaces/learning-content'; +import { Language } from '@dwengo-1/common/util/language'; const EXPECTED_DWENGO_LEARNING_OBJECT_TITLE = 'Werken met notebooks'; const DWENGO_TEST_LEARNING_OBJECT_ID: LearningObjectIdentifier = { diff --git a/backend/tests/services/learning-path/database-learning-path-provider.test.ts b/backend/tests/services/learning-path/database-learning-path-provider.test.ts index 7b1f2bf8..b8a733e7 100644 --- a/backend/tests/services/learning-path/database-learning-path-provider.test.ts +++ b/backend/tests/services/learning-path/database-learning-path-provider.test.ts @@ -13,14 +13,14 @@ import learningPathExample from '../../test-assets/learning-paths/pn-werking-exa import databaseLearningPathProvider from '../../../src/services/learning-paths/database-learning-path-provider.js'; import { expectToBeCorrectLearningPath } from '../../test-utils/expectations.js'; import learningObjectService from '../../../src/services/learning-objects/learning-object-service.js'; -import { Language } from '../../../src/entities/content/language.js'; +import { Language } from '@dwengo-1/common/util/language'; import { ConditionTestLearningPathAndLearningObjects, createConditionTestLearningPathAndLearningObjects, } from '../../test-assets/learning-paths/test-conditions-example.js'; import { Student } from '../../../src/entities/users/student.entity.js'; -import { LearningObjectNode, LearningPathResponse } from 'dwengo-1-common/src/interfaces/learning-content'; +import { LearningObjectNode, LearningPathResponse } from '@dwengo-1/common/interfaces/learning-content'; async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { const learningObjectRepo = getLearningObjectRepository(); diff --git a/backend/tests/services/learning-path/learning-path-service.test.ts b/backend/tests/services/learning-path/learning-path-service.test.ts index 7a45dc43..934c677b 100644 --- a/backend/tests/services/learning-path/learning-path-service.test.ts +++ b/backend/tests/services/learning-path/learning-path-service.test.ts @@ -5,8 +5,8 @@ import { LearningPath } from '../../../src/entities/content/learning-path.entity import { getLearningObjectRepository, getLearningPathRepository } from '../../../src/data/repositories'; import learningObjectExample from '../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example'; import learningPathExample from '../../test-assets/learning-paths/pn-werking-example'; -import { Language } from '../../../src/entities/content/language'; import learningPathService from '../../../src/services/learning-paths/learning-path-service'; +import { Language } from '@dwengo-1/common/util/language'; async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { const learningObjectRepo = getLearningObjectRepository(); diff --git a/backend/tests/test-assets/learning-objects/dummy/dummy-learning-object-example.ts b/backend/tests/test-assets/learning-objects/dummy/dummy-learning-object-example.ts index f810d57a..6889c93b 100644 --- a/backend/tests/test-assets/learning-objects/dummy/dummy-learning-object-example.ts +++ b/backend/tests/test-assets/learning-objects/dummy/dummy-learning-object-example.ts @@ -1,6 +1,6 @@ import { LearningObjectExample } from '../learning-object-example'; import { LearningObject } from '../../../../src/entities/content/learning-object.entity'; -import { Language } from '../../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import { loadTestAsset } from '../../../test-utils/load-test-asset'; import { DwengoContentType } from '../../../../src/services/learning-objects/processing/content-type'; import { envVars, getEnvVar } from '../../../../src/util/envVars'; diff --git a/backend/tests/test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example.ts b/backend/tests/test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example.ts index 835a0ed0..ab0c8640 100644 --- a/backend/tests/test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example.ts +++ b/backend/tests/test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example.ts @@ -1,5 +1,5 @@ import { LearningObjectExample } from '../learning-object-example'; -import { Language } from '../../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import { DwengoContentType } from '../../../../src/services/learning-objects/processing/content-type'; import { loadTestAsset } from '../../../test-utils/load-test-asset'; import { LearningObject } from '../../../../src/entities/content/learning-object.entity'; diff --git a/backend/tests/test-assets/learning-objects/test-essay/test-essay-example.ts b/backend/tests/test-assets/learning-objects/test-essay/test-essay-example.ts index 943a10c7..5a444fc0 100644 --- a/backend/tests/test-assets/learning-objects/test-essay/test-essay-example.ts +++ b/backend/tests/test-assets/learning-objects/test-essay/test-essay-example.ts @@ -2,7 +2,7 @@ import { LearningObjectExample } from '../learning-object-example'; import { LearningObject } from '../../../../src/entities/content/learning-object.entity'; import { loadTestAsset } from '../../../test-utils/load-test-asset'; import { envVars, getEnvVar } from '../../../../src/util/envVars'; -import { Language } from '../../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import { DwengoContentType } from '../../../../src/services/learning-objects/processing/content-type'; const example: LearningObjectExample = { diff --git a/backend/tests/test-assets/learning-objects/test-multiple-choice/test-multiple-choice-example.ts b/backend/tests/test-assets/learning-objects/test-multiple-choice/test-multiple-choice-example.ts index 276a41bb..129665ae 100644 --- a/backend/tests/test-assets/learning-objects/test-multiple-choice/test-multiple-choice-example.ts +++ b/backend/tests/test-assets/learning-objects/test-multiple-choice/test-multiple-choice-example.ts @@ -2,8 +2,8 @@ import { LearningObjectExample } from '../learning-object-example'; import { LearningObject } from '../../../../src/entities/content/learning-object.entity'; import { loadTestAsset } from '../../../test-utils/load-test-asset'; import { envVars, getEnvVar } from '../../../../src/util/envVars'; -import { Language } from '../../../../src/entities/content/language'; import { DwengoContentType } from '../../../../src/services/learning-objects/processing/content-type'; +import { Language } from '@dwengo-1/common/util/language'; const example: LearningObjectExample = { createLearningObject: () => { diff --git a/backend/tests/test-assets/learning-paths/learning-path-utils.ts b/backend/tests/test-assets/learning-paths/learning-path-utils.ts index eb786fe1..177d905f 100644 --- a/backend/tests/test-assets/learning-paths/learning-path-utils.ts +++ b/backend/tests/test-assets/learning-paths/learning-path-utils.ts @@ -1,4 +1,4 @@ -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import { LearningPathTransition } from '../../../src/entities/content/learning-path-transition.entity'; import { LearningPathNode } from '../../../src/entities/content/learning-path-node.entity'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; diff --git a/backend/tests/test-assets/learning-paths/pn-werking-example.ts b/backend/tests/test-assets/learning-paths/pn-werking-example.ts index 06a29007..1ac1c40d 100644 --- a/backend/tests/test-assets/learning-paths/pn-werking-example.ts +++ b/backend/tests/test-assets/learning-paths/pn-werking-example.ts @@ -1,5 +1,5 @@ import { LearningPath } from '../../../src/entities/content/learning-path.entity'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import { envVars, getEnvVar } from '../../../src/util/envVars'; import { createLearningPathNode, createLearningPathTransition } from './learning-path-utils'; import { LearningPathNode } from '../../../src/entities/content/learning-path-node.entity'; diff --git a/backend/tests/test-assets/learning-paths/test-conditions-example.ts b/backend/tests/test-assets/learning-paths/test-conditions-example.ts index b5e38c24..0fb7ead5 100644 --- a/backend/tests/test-assets/learning-paths/test-conditions-example.ts +++ b/backend/tests/test-assets/learning-paths/test-conditions-example.ts @@ -1,5 +1,5 @@ import { LearningPath } from '../../../src/entities/content/learning-path.entity'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import testMultipleChoiceExample from '../learning-objects/test-multiple-choice/test-multiple-choice-example'; import { dummyLearningObject } from '../learning-objects/dummy/dummy-learning-object-example'; import { createLearningPathNode, createLearningPathTransition } from './learning-path-utils'; diff --git a/backend/tests/test-utils/expectations.ts b/backend/tests/test-utils/expectations.ts index 374bf6a7..b6462702 100644 --- a/backend/tests/test-utils/expectations.ts +++ b/backend/tests/test-utils/expectations.ts @@ -2,7 +2,7 @@ import { AssertionError } from 'node:assert'; import { LearningObject } from '../../src/entities/content/learning-object.entity'; import { LearningPath as LearningPathEntity } from '../../src/entities/content/learning-path.entity'; import { expect } from 'vitest'; -import { FilteredLearningObject, LearningPath } from 'dwengo-1-common/src/interfaces/learning-content'; +import { FilteredLearningObject, LearningPath } from '@dwengo-1/common/interfaces/learning-content'; // Ignored properties because they belang for example to the class, not to the entity itself. const IGNORE_PROPERTIES = ['parent']; diff --git a/backend/tests/test_assets/assignments/assignments.testdata.ts b/backend/tests/test_assets/assignments/assignments.testdata.ts index 8753b0ce..b0da638f 100644 --- a/backend/tests/test_assets/assignments/assignments.testdata.ts +++ b/backend/tests/test_assets/assignments/assignments.testdata.ts @@ -1,7 +1,7 @@ import { EntityManager } from '@mikro-orm/core'; import { Assignment } from '../../../src/entities/assignments/assignment.entity'; import { Class } from '../../../src/entities/classes/class.entity'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; export function makeTestAssignemnts(em: EntityManager, classes: Class[]): Assignment[] { const assignment01 = em.create(Assignment, { diff --git a/backend/tests/test_assets/assignments/submission.testdata.ts b/backend/tests/test_assets/assignments/submission.testdata.ts index 4fca5f9b..f454b133 100644 --- a/backend/tests/test_assets/assignments/submission.testdata.ts +++ b/backend/tests/test_assets/assignments/submission.testdata.ts @@ -1,6 +1,6 @@ import { EntityManager } from '@mikro-orm/core'; import { Submission } from '../../../src/entities/assignments/submission.entity'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import { Student } from '../../../src/entities/users/student.entity'; import { Group } from '../../../src/entities/assignments/group.entity'; diff --git a/backend/tests/test_assets/content/learning-objects.testdata.ts b/backend/tests/test_assets/content/learning-objects.testdata.ts index bbca8830..6e28dc16 100644 --- a/backend/tests/test_assets/content/learning-objects.testdata.ts +++ b/backend/tests/test_assets/content/learning-objects.testdata.ts @@ -1,6 +1,6 @@ import { EntityManager } from '@mikro-orm/core'; import { LearningObject } from '../../../src/entities/content/learning-object.entity'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import { DwengoContentType } from '../../../src/services/learning-objects/processing/content-type'; import { ReturnValue } from '../../../src/entities/content/return-value.entity'; diff --git a/backend/tests/test_assets/content/learning-paths.testdata.ts b/backend/tests/test_assets/content/learning-paths.testdata.ts index e41773cc..72581f42 100644 --- a/backend/tests/test_assets/content/learning-paths.testdata.ts +++ b/backend/tests/test_assets/content/learning-paths.testdata.ts @@ -1,6 +1,6 @@ import { EntityManager } from '@mikro-orm/core'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import { LearningPathTransition } from '../../../src/entities/content/learning-path-transition.entity'; import { LearningPathNode } from '../../../src/entities/content/learning-path-node.entity'; diff --git a/backend/tests/test_assets/questions/questions.testdata.ts b/backend/tests/test_assets/questions/questions.testdata.ts index 8604cf07..dff742bb 100644 --- a/backend/tests/test_assets/questions/questions.testdata.ts +++ b/backend/tests/test_assets/questions/questions.testdata.ts @@ -1,6 +1,6 @@ import { EntityManager } from '@mikro-orm/core'; import { Question } from '../../../src/entities/questions/question.entity'; -import { Language } from '../../../src/entities/content/language'; +import { Language } from '@dwengo-1/common/util/language'; import { Student } from '../../../src/entities/users/student.entity'; export function makeTestQuestions(em: EntityManager, students: Student[]): Question[] { diff --git a/backend/tsconfig.json b/backend/tsconfig.json index a47827ba..14f53f22 100644 --- a/backend/tsconfig.json +++ b/backend/tsconfig.json @@ -4,8 +4,10 @@ "compilerOptions": { "rootDir": "./src", "outDir": "./dist", - "resolveJsonModule": true, - "sourceMap": true, - "composite": true - } + }, + "references": [ + { + "path": "../common" + } + ] } diff --git a/common/package.json b/common/package.json index db8adfd0..c549e085 100644 --- a/common/package.json +++ b/common/package.json @@ -1,16 +1,19 @@ { - "name": "dwengo-1-common", + "name": "@dwengo-1/common", "version": "0.1.1", "description": "Common types and utilities for Dwengo-1", "private": true, "type": "module", + "files": [ "./dist" ], "scripts": { - "build": "tsc --project tsconfig.json", + "build": "tsc --build", + "clean": "tsc --build --clean", + "watch": "tsc --build --watch", "format": "prettier --write src/", "format-check": "prettier --check src/", "lint": "eslint . --fix" }, "exports": { - "./src/*": "./dist/*" + "./*": "./dist/*.js" } } diff --git a/common/src/interfaces/answer.d.ts b/common/src/interfaces/answer.ts similarity index 84% rename from common/src/interfaces/answer.d.ts rename to common/src/interfaces/answer.ts index d2faf87d..e9280f8a 100644 --- a/common/src/interfaces/answer.d.ts +++ b/common/src/interfaces/answer.ts @@ -1,5 +1,5 @@ import { UserDTO } from './user'; -import { QuestionDTO } from './question'; +import { QuestionDTO, QuestionId } from './question'; export interface AnswerDTO { author: UserDTO; diff --git a/common/src/interfaces/assignment.d.ts b/common/src/interfaces/assignment.ts similarity index 100% rename from common/src/interfaces/assignment.d.ts rename to common/src/interfaces/assignment.ts diff --git a/common/src/interfaces/class.d.ts b/common/src/interfaces/class.ts similarity index 100% rename from common/src/interfaces/class.d.ts rename to common/src/interfaces/class.ts diff --git a/common/src/interfaces/group.d.ts b/common/src/interfaces/group.ts similarity index 81% rename from common/src/interfaces/group.d.ts rename to common/src/interfaces/group.ts index 45523461..ca95770a 100644 --- a/common/src/interfaces/group.d.ts +++ b/common/src/interfaces/group.ts @@ -1,4 +1,5 @@ import { AssignmentDTO } from './assignment'; +import { StudentDTO } from './student'; export interface GroupDTO { assignment: number | AssignmentDTO; diff --git a/common/src/interfaces/learning-content.d.ts b/common/src/interfaces/learning-content.ts similarity index 96% rename from common/src/interfaces/learning-content.d.ts rename to common/src/interfaces/learning-content.ts index 610b1385..a8ddc171 100644 --- a/common/src/interfaces/learning-content.d.ts +++ b/common/src/interfaces/learning-content.ts @@ -1,4 +1,4 @@ -import { Language } from 'dwengo-1-backend/src/entities/content/language.js'; +import { Language } from "../util/language"; export interface Transition { default: boolean; diff --git a/common/src/interfaces/question.d.ts b/common/src/interfaces/question.ts similarity index 84% rename from common/src/interfaces/question.d.ts rename to common/src/interfaces/question.ts index 2b2a263c..b80ff0af 100644 --- a/common/src/interfaces/question.d.ts +++ b/common/src/interfaces/question.ts @@ -1,3 +1,4 @@ +import { LearningObjectIdentifier } from './learning-content'; import { StudentDTO } from './student'; export interface QuestionDTO { diff --git a/common/src/interfaces/student.d.ts b/common/src/interfaces/student.ts similarity index 100% rename from common/src/interfaces/student.d.ts rename to common/src/interfaces/student.ts diff --git a/common/src/interfaces/submission.d.ts b/common/src/interfaces/submission.ts similarity index 74% rename from common/src/interfaces/submission.d.ts rename to common/src/interfaces/submission.ts index c4c2b35d..6b250616 100644 --- a/common/src/interfaces/submission.d.ts +++ b/common/src/interfaces/submission.ts @@ -1,4 +1,7 @@ import { GroupDTO } from './group'; +import { LearningObjectIdentifier } from './learning-content'; +import { StudentDTO } from './student'; +import { Language } from '../util/language'; export interface SubmissionDTO { learningObjectIdentifier: LearningObjectIdentifier; diff --git a/common/src/interfaces/teacher-invitation.d.ts b/common/src/interfaces/teacher-invitation.ts similarity index 100% rename from common/src/interfaces/teacher-invitation.d.ts rename to common/src/interfaces/teacher-invitation.ts diff --git a/common/src/interfaces/teacher.d.ts b/common/src/interfaces/teacher.ts similarity index 100% rename from common/src/interfaces/teacher.d.ts rename to common/src/interfaces/teacher.ts diff --git a/common/src/interfaces/user.d.ts b/common/src/interfaces/user.ts similarity index 100% rename from common/src/interfaces/user.d.ts rename to common/src/interfaces/user.ts diff --git a/backend/src/entities/content/language.ts b/common/src/util/language.ts similarity index 100% rename from backend/src/entities/content/language.ts rename to common/src/util/language.ts diff --git a/common/tsconfig.json b/common/tsconfig.json index a47827ba..86267d25 100644 --- a/common/tsconfig.json +++ b/common/tsconfig.json @@ -3,9 +3,6 @@ "include": ["src/**/*.ts"], "compilerOptions": { "rootDir": "./src", - "outDir": "./dist", - "resolveJsonModule": true, - "sourceMap": true, - "composite": true + "outDir": "./dist" } } diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index e0d34b13..baf5577b 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -12,6 +12,7 @@ } ], "compilerOptions": { + "composite": true, "resolveJsonModule": true } } diff --git a/package-lock.json b/package-lock.json index 52338b8a..79ebf319 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ } }, "backend": { - "name": "dwengo-1-backend", + "name": "@dwengo-1/backend", "version": "0.1.1", "dependencies": { "@mikro-orm/core": "6.4.9", @@ -86,7 +86,7 @@ } }, "common": { - "name": "dwengo-1-common", + "name": "@dwengo-1/common", "version": "0.1.1" }, "docs": { @@ -849,6 +849,14 @@ "kuler": "^2.0.0" } }, + "node_modules/@dwengo-1/backend": { + "resolved": "backend", + "link": true + }, + "node_modules/@dwengo-1/common": { + "resolved": "common", + "link": true + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", @@ -4921,10 +4929,6 @@ "node": ">= 0.4" } }, - "node_modules/dwengo-1-backend": { - "resolved": "backend", - "link": true - }, "node_modules/dwengo-1-common": { "resolved": "common", "link": true diff --git a/package.json b/package.json index c7eeccc3..588629e7 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,14 @@ { - "name": "dwengo-1-monorepo", + "name": "dwengo-1", "version": "0.1.1", "description": "Monorepo for Dwengo-1", "private": true, "type": "module", "scripts": { - "build": "npm run build --workspaces --if-present", + "prebuild": "npm run clean", + "build": "tsc --build tsconfig.build.json", + "clean": "tsc --build tsconfig.build.json --clean", + "watch": "tsc --build tsconfig.build.json --watch", "format": "npm run format --workspace=backend --workspace=common --workspace=frontend", "format-check": "npm run format-check --workspace=backend --workspace=common --workspace=frontend", "lint": "npm run lint --workspace=backend --workspace=common --workspace=frontend", diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000..e283237e --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./common" + }, + { + "path": "./backend" + } + ] +} diff --git a/tsconfig.json b/tsconfig.json index b41449cf..5e1fd98c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ /* Projects */ // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ @@ -25,7 +25,7 @@ // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - "moduleDetection": "force", + // "moduleDetection": "force", /* Control what method is used to detect module-format JS files. */ /* Modules */ @@ -33,7 +33,7 @@ /* Specify what module code is generated. */ // "rootDir": "./src", /* Specify the root folder within your source files. */ - "moduleResolution": "node", + "moduleResolution": "bundler", /* Specify how TypeScript looks up a file from a given module specifier. */ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ @@ -53,16 +53,16 @@ // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ /* JavaScript Support */ - "allowJs": true, + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + "declarationMap": true, /* Create sourcemaps for d.ts files. */ // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + "sourceMap": true, /* Create source map files for emitted JavaScript files. */ // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ // "noEmit": true, /* Disable emitting files from a compilation. */ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ From f07a1ec8677f781d7a764433e0a5bd73fb5e56c0 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 2 Apr 2025 17:35:46 +0200 Subject: [PATCH 21/34] refactor(backend): ClassJoinRequestStatus -> common --- backend/src/entities/classes/class-join-request.entity.ts | 7 +------ .../test_assets/classes/class-join-requests.testdata.ts | 2 +- common/src/util/class-join-request.ts | 5 +++++ 3 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 common/src/util/class-join-request.ts diff --git a/backend/src/entities/classes/class-join-request.entity.ts b/backend/src/entities/classes/class-join-request.entity.ts index fdf13aa9..907c0199 100644 --- a/backend/src/entities/classes/class-join-request.entity.ts +++ b/backend/src/entities/classes/class-join-request.entity.ts @@ -2,12 +2,7 @@ import { Entity, Enum, ManyToOne } from '@mikro-orm/core'; import { Student } from '../users/student.entity.js'; import { Class } from './class.entity.js'; import { ClassJoinRequestRepository } from '../../data/classes/class-join-request-repository.js'; - -export enum ClassJoinRequestStatus { - Open = 'open', - Accepted = 'accepted', - Declined = 'declined', -} +import { ClassJoinRequestStatus } from '@dwengo-1/common/util/class-join-request'; @Entity({ repository: () => ClassJoinRequestRepository, diff --git a/backend/tests/test_assets/classes/class-join-requests.testdata.ts b/backend/tests/test_assets/classes/class-join-requests.testdata.ts index 632fd392..becee15c 100644 --- a/backend/tests/test_assets/classes/class-join-requests.testdata.ts +++ b/backend/tests/test_assets/classes/class-join-requests.testdata.ts @@ -1,5 +1,5 @@ import { EntityManager } from '@mikro-orm/core'; -import { ClassJoinRequest, ClassJoinRequestStatus } from '../../../src/entities/classes/class-join-request.entity'; +import { ClassJoinRequest } from '../../../src/entities/classes/class-join-request.entity'; import { Student } from '../../../src/entities/users/student.entity'; import { Class } from '../../../src/entities/classes/class.entity'; diff --git a/common/src/util/class-join-request.ts b/common/src/util/class-join-request.ts new file mode 100644 index 00000000..5f9410f0 --- /dev/null +++ b/common/src/util/class-join-request.ts @@ -0,0 +1,5 @@ +export enum ClassJoinRequestStatus { + Open = 'open', + Accepted = 'accepted', + Declined = 'declined', +} From 5d312d8c291a33f20b0911ea207381c49738bfc2 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 2 Apr 2025 17:38:37 +0200 Subject: [PATCH 22/34] fix(backend): Missende import --- .../tests/test_assets/classes/class-join-requests.testdata.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/tests/test_assets/classes/class-join-requests.testdata.ts b/backend/tests/test_assets/classes/class-join-requests.testdata.ts index becee15c..32337b19 100644 --- a/backend/tests/test_assets/classes/class-join-requests.testdata.ts +++ b/backend/tests/test_assets/classes/class-join-requests.testdata.ts @@ -2,6 +2,7 @@ import { EntityManager } from '@mikro-orm/core'; import { ClassJoinRequest } from '../../../src/entities/classes/class-join-request.entity'; import { Student } from '../../../src/entities/users/student.entity'; import { Class } from '../../../src/entities/classes/class.entity'; +import { ClassJoinRequestStatus } from '@dwengo-1/common/util/class-join-request'; export function makeTestClassJoinRequests(em: EntityManager, students: Student[], classes: Class[]): ClassJoinRequest[] { const classJoinRequest01 = em.create(ClassJoinRequest, { From e55b96bc08640755cc2245990d6590cd9c5860e1 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 2 Apr 2025 18:14:10 +0200 Subject: [PATCH 23/34] fix: npm commandos --- backend/package.json | 2 +- frontend/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/package.json b/backend/package.json index 4ccf9814..b2076cf3 100644 --- a/backend/package.json +++ b/backend/package.json @@ -7,7 +7,7 @@ "main": "dist/app.js", "scripts": { "build": "cross-env NODE_ENV=production tsc --build", - "dev": "cross-env NODE_ENV=development tsc --build --watch --env-file=.env.development.local", + "dev": "cross-env NODE_ENV=development tsx watch --env-file=.env.development.local src/app.ts", "start": "cross-env NODE_ENV=production node --env-file=.env dist/app.js", "format": "prettier --write src/", "format-check": "prettier --check src/", diff --git a/frontend/package.json b/frontend/package.json index e6ce1426..30126445 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -11,7 +11,7 @@ "type-check": "vue-tsc --build", "format": "prettier --write src/", "format-check": "prettier --check src/", - "lint": "eslint . --fix", + "lint": "eslint ./{src,tests} --fix", "test:unit": "vitest --run", "test:e2e": "playwright test" }, From f537830b15098d1483aca6deae5b1dfa73780289 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 2 Apr 2025 18:19:41 +0200 Subject: [PATCH 24/34] fix(backend): Zet Docker terug --- backend/Dockerfile | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 4226aa3a..f09a89eb 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,13 +1,12 @@ -FROM node:22 +FROM node:22 AS build-stage WORKDIR /app/dwengo -COPY ./backend/i18n ./i18n - # Install dependencies COPY package*.json ./ COPY backend/package.json ./backend/ +# Backend depends on common COPY common/package.json ./common/ RUN npm install --silent @@ -15,14 +14,37 @@ RUN npm install --silent # Build the backend # Root tsconfig.json -COPY tsconfig.json ./ +COPY tsconfig.json tsconfig.build.json ./ COPY backend ./backend COPY common ./common COPY docs ./docs -RUN npm run build --workspace=common -RUN npm run build --workspace=backend +RUN npm run build + +FROM node:22 AS production-stage + +WORKDIR /app/dwengo + +# Copy static files + +COPY ./backend/i18n ./i18n + +# Copy built files + +COPY --from=build-stage /app/dwengo/common/dist ./common/dist +COPY --from=build-stage /app/dwengo/backend/dist ./backend/dist + +COPY package*.json ./ +COPY backend/package.json ./backend/ +# Backend depends on common +COPY common/package.json ./common/ + +RUN npm install --silent --only=production + +COPY ./docs ./docs +COPY ./backend/i18n ./backend/i18n +COPY ./backend/.env ./backend/.env EXPOSE 3000 From 2dbadc7eab10472efb55019e7875d01d69e319b4 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 2 Apr 2025 18:20:09 +0200 Subject: [PATCH 25/34] refactor(backend): Linting --- .../dwengo-api-learning-object-provider.ts | 11 ++++++----- backend/src/services/questions.ts | 14 ++++++++++++-- .../database-learning-object-provider.test.ts | 4 ++-- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts b/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts index 77cde59d..ffa57814 100644 --- a/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts +++ b/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts @@ -66,12 +66,13 @@ async function fetchLearningObjects(learningPathId: LearningPathIdentifier, full } const objects = await Promise.all( - nodes.map(async (node) => - dwengoApiLearningObjectProvider.getLearningObjectById({ + nodes.map(async (node) => { + const learningObjectId: LearningObjectIdentifier = { hruid: node.learningobject_hruid, - language: learningPathId.language, - }) - ) + language: learningPathId.language + }; + return dwengoApiLearningObjectProvider.getLearningObjectById(learningObjectId); + }) ); return objects.filter((obj): obj is FilteredLearningObject => obj !== null); } catch (error) { diff --git a/backend/src/services/questions.ts b/backend/src/services/questions.ts index 3c0c4820..6609a813 100644 --- a/backend/src/services/questions.ts +++ b/backend/src/services/questions.ts @@ -75,9 +75,14 @@ export async function createQuestion(questionDTO: QuestionDTO): Promise { it('should return the learning object when it is queried by its id', async () => { const result: FilteredLearningObject | null = await databaseLearningObjectProvider.getLearningObjectById(exampleLearningObject); expect(result).toBeTruthy(); - expectToBeCorrectFilteredLearningObject(result!, exampleLearningObject); + expectToBeCorrectFilteredLearningObject(result, exampleLearningObject); }); it('should return the learning object when it is queried by only hruid and language (but not version)', async () => { @@ -46,7 +46,7 @@ describe('DatabaseLearningObjectProvider', () => { language: exampleLearningObject.language, }); expect(result).toBeTruthy(); - expectToBeCorrectFilteredLearningObject(result!, exampleLearningObject); + expectToBeCorrectFilteredLearningObject(result, exampleLearningObject); }); it('should return null when queried with an id that does not exist', async () => { From c549f51c496d33bae1ccd1433da35b263f13b3ce Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 2 Apr 2025 19:38:36 +0200 Subject: [PATCH 26/34] fix: Actions --- backend/package.json | 1 + eslint.config.ts | 2 +- frontend/eslint.config.ts | 2 +- frontend/package.json | 2 +- package.json | 1 + 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/package.json b/backend/package.json index b2076cf3..83db321f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -12,6 +12,7 @@ "format": "prettier --write src/", "format-check": "prettier --check src/", "lint": "eslint . --fix", + "pretest:unit": "npm run build", "test:unit": "vitest --run" }, "dependencies": { diff --git a/eslint.config.ts b/eslint.config.ts index 61a99fda..831b213f 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -17,7 +17,7 @@ export default [ includeIgnoreFile(gitignorePath), { ignores: ['**/dist/**', '**/.node_modules/**', '**/coverage/**', '**/.github/**'], - files: ['**/*.ts', '**/*.cts', '**.*.mts', '**/*.ts'], + files: ['**/*.ts', '**/*.cts', '**.*.mts'], }, { languageOptions: { diff --git a/frontend/eslint.config.ts b/frontend/eslint.config.ts index e9359af7..9ca1a08b 100644 --- a/frontend/eslint.config.ts +++ b/frontend/eslint.config.ts @@ -21,7 +21,7 @@ const vueConfig = defineConfigWithVueTs( { name: "app/files-to-ignore", - ignores: ["**/dist/**", "**/dist-ssr/**", "**/coverage/**"], + ignores: ["**/dist/**", "**/dist-ssr/**", "**/coverage/**", "prettier.config.js"], }, pluginVue.configs["flat/essential"], diff --git a/frontend/package.json b/frontend/package.json index 30126445..e6ce1426 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -11,7 +11,7 @@ "type-check": "vue-tsc --build", "format": "prettier --write src/", "format-check": "prettier --check src/", - "lint": "eslint ./{src,tests} --fix", + "lint": "eslint . --fix", "test:unit": "vitest --run", "test:e2e": "playwright test" }, diff --git a/package.json b/package.json index 588629e7..64cfd665 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "format": "npm run format --workspace=backend --workspace=common --workspace=frontend", "format-check": "npm run format-check --workspace=backend --workspace=common --workspace=frontend", "lint": "npm run lint --workspace=backend --workspace=common --workspace=frontend", + "pretest:unit": "npm run build", "test:unit": "npm run test:unit --workspace=backend --workspace=frontend" }, "workspaces": [ From f2d165aa601d04f6f6c651f6e21bff4352787880 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 2 Apr 2025 19:49:40 +0200 Subject: [PATCH 27/34] ci: Merge testing actions --- .github/workflows/testing.yml | 56 +++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 .github/workflows/testing.yml diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml new file mode 100644 index 00000000..78253d2b --- /dev/null +++ b/.github/workflows/testing.yml @@ -0,0 +1,56 @@ +name: Combined Testing + +on: + push: + branches: [ "dev" ] + pull_request: + branches: [ "dev" ] + types: ["synchronize", "ready_for_review", "opened", "reopened"] + +jobs: + backend-test: + name: Run backend unit tests + if: "! github.event.pull_request.draft" + runs-on: [self-hosted, Linux, X64] + strategy: + matrix: + node-version: [22.x] + steps: + - uses: actions/checkout@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run test:unit -w backend + paths: + - 'backend/src/**.[jt]s' + - 'backend/tests/**.[jt]s' + - 'backend/vitest.config.ts' + + frontend-test: + name: Run frontend unit tests + if: "! github.event.pull_request.draft" + runs-on: [self-hosted, Linux, X64] + strategy: + matrix: + node-version: [22.x] + steps: + - uses: actions/checkout@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run test:unit -w frontend + paths: + - 'frontend/src/**.[jt]s' + - 'frontend/src/**.vue' + - 'frontend/src/**.css' + - 'frontend/tests/**.[jt]s' + - 'frontend/tests/**.vue' + - 'frontend/tests/**.css' + - 'frontend/vitest.config.ts' + - 'frontend/playwright.config.ts' From 80dc3acca7791ee449dda7c33bb2271519abdea4 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 2 Apr 2025 20:03:08 +0200 Subject: [PATCH 28/34] Revert "ci: Merge testing actions" This reverts commit f2d165aa601d04f6f6c651f6e21bff4352787880. --- .github/workflows/testing.yml | 56 ----------------------------------- 1 file changed, 56 deletions(-) delete mode 100644 .github/workflows/testing.yml diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml deleted file mode 100644 index 78253d2b..00000000 --- a/.github/workflows/testing.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: Combined Testing - -on: - push: - branches: [ "dev" ] - pull_request: - branches: [ "dev" ] - types: ["synchronize", "ready_for_review", "opened", "reopened"] - -jobs: - backend-test: - name: Run backend unit tests - if: "! github.event.pull_request.draft" - runs-on: [self-hosted, Linux, X64] - strategy: - matrix: - node-version: [22.x] - steps: - - uses: actions/checkout@v4 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - cache: 'npm' - - run: npm ci - - run: npm run test:unit -w backend - paths: - - 'backend/src/**.[jt]s' - - 'backend/tests/**.[jt]s' - - 'backend/vitest.config.ts' - - frontend-test: - name: Run frontend unit tests - if: "! github.event.pull_request.draft" - runs-on: [self-hosted, Linux, X64] - strategy: - matrix: - node-version: [22.x] - steps: - - uses: actions/checkout@v4 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - cache: 'npm' - - run: npm ci - - run: npm run test:unit -w frontend - paths: - - 'frontend/src/**.[jt]s' - - 'frontend/src/**.vue' - - 'frontend/src/**.css' - - 'frontend/tests/**.[jt]s' - - 'frontend/tests/**.vue' - - 'frontend/tests/**.css' - - 'frontend/vitest.config.ts' - - 'frontend/playwright.config.ts' From 7e46ce9c5fb73c72d219105ade6a3cfc482a21c7 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Wed, 2 Apr 2025 20:31:40 +0200 Subject: [PATCH 29/34] fix: Linting op Actions --- .github/workflows/lint-action.yml | 4 ++-- .gitignore | 2 +- .../learning-path/learning-path-service.test.ts | 2 +- eslint.config.ts | 13 +++++++++++-- package-lock.json | 4 ++-- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/.github/workflows/lint-action.yml b/.github/workflows/lint-action.yml index 32823417..7fd77d28 100644 --- a/.github/workflows/lint-action.yml +++ b/.github/workflows/lint-action.yml @@ -43,6 +43,6 @@ jobs: with: auto_fix: true eslint: true - eslint_args: '--config eslint.config.ts' + eslint_args: "--config eslint.config.ts --ignore-pattern '**/prettier.config.js'" prettier: true - commit_message: 'style: fix linting issues met ${linter}' \ No newline at end of file + commit_message: 'style: fix linting issues met ${linter}' diff --git a/.gitignore b/.gitignore index d28e7d73..d3905d1f 100644 --- a/.gitignore +++ b/.gitignore @@ -737,4 +737,4 @@ flycheck_*.el # network security /network-security.data - +docs/.venv diff --git a/backend/tests/services/learning-path/learning-path-service.test.ts b/backend/tests/services/learning-path/learning-path-service.test.ts index 934c677b..4feb3627 100644 --- a/backend/tests/services/learning-path/learning-path-service.test.ts +++ b/backend/tests/services/learning-path/learning-path-service.test.ts @@ -48,7 +48,7 @@ describe('LearningPathService', () => { expect(result.data?.length).toBe(1); // Should include all the nodes, even those pointing to foreign learning objects. - expect([...result.data![0].nodes.map((it) => it.learningobject_hruid)].sort()).toEqual( + expect([...result.data![0].nodes.map((it) => it.learningobject_hruid)].sort((a, b) => a - b)).toEqual( example.learningPath.nodes.map((it) => it.learningObjectHruid).sort() ); }); diff --git a/eslint.config.ts b/eslint.config.ts index 831b213f..12943414 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -16,7 +16,16 @@ export default [ prettierConfig, includeIgnoreFile(gitignorePath), { - ignores: ['**/dist/**', '**/.node_modules/**', '**/coverage/**', '**/.github/**'], + ignores: [ + '**/dist/**', + '**/.node_modules/**', + '**/coverage/**', + '**/.github/**', + '**/prettier.config.js', + 'docs/.venv/**', + 'prettier.config.js', + 'frontend/prettier.config.js' + ], files: ['**/*.ts', '**/*.cts', '**.*.mts'], }, { @@ -205,6 +214,6 @@ export default [ 'no-multi-assign': 'error', 'no-nested-ternary': 'error', 'no-object-constructor': 'error', - }, + } }, ]; diff --git a/package-lock.json b/package-lock.json index 79ebf319..27d261cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "dwengo-1-monorepo", + "name": "dwengo-1", "version": "0.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "dwengo-1-monorepo", + "name": "dwengo-1", "version": "0.1.1", "license": "MIT", "workspaces": [ From 0bdee56dc391ba33c2ea11b96f2203d6f53e2757 Mon Sep 17 00:00:00 2001 From: Lint Action Date: Wed, 2 Apr 2025 18:32:29 +0000 Subject: [PATCH 30/34] style: fix linting issues met Prettier --- .../src/entities/content/learning-object-identifier.ts | 2 +- .../dwengo-api-learning-object-provider.ts | 2 +- .../services/learning-objects/learning-object-service.ts | 6 +----- backend/src/services/questions.ts | 8 ++++---- backend/src/util/links.ts | 2 +- backend/tsconfig.json | 2 +- common/package.json | 4 +++- common/src/interfaces/learning-content.ts | 2 +- eslint.config.ts | 4 ++-- tsconfig.json | 8 ++++---- 10 files changed, 19 insertions(+), 21 deletions(-) diff --git a/backend/src/entities/content/learning-object-identifier.ts b/backend/src/entities/content/learning-object-identifier.ts index b7802ddd..09a9c057 100644 --- a/backend/src/entities/content/learning-object-identifier.ts +++ b/backend/src/entities/content/learning-object-identifier.ts @@ -1,4 +1,4 @@ -import { Language } from "@dwengo-1/common/util/language"; +import { Language } from '@dwengo-1/common/util/language'; export class LearningObjectIdentifier { constructor( diff --git a/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts b/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts index ffa57814..d67b69ae 100644 --- a/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts +++ b/backend/src/services/learning-objects/dwengo-api-learning-object-provider.ts @@ -69,7 +69,7 @@ async function fetchLearningObjects(learningPathId: LearningPathIdentifier, full nodes.map(async (node) => { const learningObjectId: LearningObjectIdentifier = { hruid: node.learningobject_hruid, - language: learningPathId.language + language: learningPathId.language, }; return dwengoApiLearningObjectProvider.getLearningObjectById(learningObjectId); }) diff --git a/backend/src/services/learning-objects/learning-object-service.ts b/backend/src/services/learning-objects/learning-object-service.ts index 69004ae1..5a06f0f2 100644 --- a/backend/src/services/learning-objects/learning-object-service.ts +++ b/backend/src/services/learning-objects/learning-object-service.ts @@ -2,11 +2,7 @@ import dwengoApiLearningObjectProvider from './dwengo-api-learning-object-provid import { LearningObjectProvider } from './learning-object-provider.js'; import { envVars, getEnvVar } from '../../util/envVars.js'; import databaseLearningObjectProvider from './database-learning-object-provider.js'; -import { - FilteredLearningObject, - LearningObjectIdentifier, - LearningPathIdentifier, -} from '@dwengo-1/common/interfaces/learning-content'; +import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from '@dwengo-1/common/interfaces/learning-content'; function getProvider(id: LearningObjectIdentifier): LearningObjectProvider { if (id.hruid.startsWith(getEnvVar(envVars.UserContentPrefix))) { diff --git a/backend/src/services/questions.ts b/backend/src/services/questions.ts index 6609a813..f92efae0 100644 --- a/backend/src/services/questions.ts +++ b/backend/src/services/questions.ts @@ -78,7 +78,7 @@ export async function createQuestion(questionDTO: QuestionDTO): Promise Date: Thu, 3 Apr 2025 05:35:57 +0000 Subject: [PATCH 31/34] style: fix linting issues met Prettier --- backend/src/controllers/learning-objects.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/backend/src/controllers/learning-objects.ts b/backend/src/controllers/learning-objects.ts index 2a64edd7..a2510631 100644 --- a/backend/src/controllers/learning-objects.ts +++ b/backend/src/controllers/learning-objects.ts @@ -6,11 +6,7 @@ import attachmentService from '../services/learning-objects/attachment-service.j import { BadRequestException } from '../exceptions/bad-request-exception.js'; import { NotFoundException } from '../exceptions/not-found-exception.js'; import { envVars, getEnvVar } from '../util/envVars.js'; -import { - FilteredLearningObject, - LearningObjectIdentifier, - LearningPathIdentifier, -} from '@dwengo-1/common/interfaces/learning-content'; +import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from '@dwengo-1/common/interfaces/learning-content'; function getLearningObjectIdentifierFromRequest(req: Request): LearningObjectIdentifier { if (!req.params.hruid) { From 6d7d29ce3c9c442d9fee728a4db5ef25269f9f82 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Thu, 3 Apr 2025 07:43:59 +0200 Subject: [PATCH 32/34] fix(backend): Restore sort --- .../tests/services/learning-path/learning-path-service.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/tests/services/learning-path/learning-path-service.test.ts b/backend/tests/services/learning-path/learning-path-service.test.ts index 4feb3627..934c677b 100644 --- a/backend/tests/services/learning-path/learning-path-service.test.ts +++ b/backend/tests/services/learning-path/learning-path-service.test.ts @@ -48,7 +48,7 @@ describe('LearningPathService', () => { expect(result.data?.length).toBe(1); // Should include all the nodes, even those pointing to foreign learning objects. - expect([...result.data![0].nodes.map((it) => it.learningobject_hruid)].sort((a, b) => a - b)).toEqual( + expect([...result.data![0].nodes.map((it) => it.learningobject_hruid)].sort()).toEqual( example.learningPath.nodes.map((it) => it.learningObjectHruid).sort() ); }); From ced27c148bee43ca2dd32aba4060450ea79062bb Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Thu, 3 Apr 2025 07:53:05 +0200 Subject: [PATCH 33/34] fixup! fix(backend): Restore sort --- .../services/learning-path/learning-path-service.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/tests/services/learning-path/learning-path-service.test.ts b/backend/tests/services/learning-path/learning-path-service.test.ts index 934c677b..972a7fa1 100644 --- a/backend/tests/services/learning-path/learning-path-service.test.ts +++ b/backend/tests/services/learning-path/learning-path-service.test.ts @@ -48,8 +48,8 @@ describe('LearningPathService', () => { expect(result.data?.length).toBe(1); // Should include all the nodes, even those pointing to foreign learning objects. - expect([...result.data![0].nodes.map((it) => it.learningobject_hruid)].sort()).toEqual( - example.learningPath.nodes.map((it) => it.learningObjectHruid).sort() + expect([...result.data![0].nodes.map((it) => it.learningobject_hruid)].sort((a, b) => a.localeCompare(b))).toEqual( + example.learningPath.nodes.map((it) => it.learningObjectHruid).sort((a, b) => a.localeCompare(b)) ); }); }); From 782fc2be194e89743fc2c083e8c8b01a92601c2a Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Thu, 3 Apr 2025 10:53:45 +0200 Subject: [PATCH 34/34] fix: Cleanup Co-authored-by: Adriaan Jacquet --- .../learning-objects/learning-object-service.test.ts | 4 ++-- common/src/interfaces/student.ts | 6 ------ common/src/interfaces/teacher.ts | 6 ------ common/src/interfaces/user.ts | 6 ------ 4 files changed, 2 insertions(+), 20 deletions(-) diff --git a/backend/tests/services/learning-objects/learning-object-service.test.ts b/backend/tests/services/learning-objects/learning-object-service.test.ts index eb683018..a0fea849 100644 --- a/backend/tests/services/learning-objects/learning-object-service.test.ts +++ b/backend/tests/services/learning-objects/learning-object-service.test.ts @@ -109,7 +109,7 @@ describe('LearningObjectService', () => { hruid: 'non_existing', language: Language.Dutch, }); - expect(result).toEqual([]); + expect(result).toStrictEqual([]); }); }); @@ -127,7 +127,7 @@ describe('LearningObjectService', () => { hruid: 'non_existing', language: Language.Dutch, }); - expect(result).toEqual([]); + expect(result).toStrictEqual([]); }); }); }); diff --git a/common/src/interfaces/student.ts b/common/src/interfaces/student.ts index cb13d3c2..7ec628b4 100644 --- a/common/src/interfaces/student.ts +++ b/common/src/interfaces/student.ts @@ -3,10 +3,4 @@ export interface StudentDTO { username: string; firstName: string; lastName: string; - endpoints?: { - classes: string; - questions: string; - invitations: string; - groups: string; - }; } diff --git a/common/src/interfaces/teacher.ts b/common/src/interfaces/teacher.ts index 05bf74a0..53195c33 100644 --- a/common/src/interfaces/teacher.ts +++ b/common/src/interfaces/teacher.ts @@ -3,10 +3,4 @@ export interface TeacherDTO { username: string; firstName: string; lastName: string; - endpoints?: { - classes: string; - questions: string; - invitations: string; - groups: string; - }; } diff --git a/common/src/interfaces/user.ts b/common/src/interfaces/user.ts index e7bbe2ed..66bca296 100644 --- a/common/src/interfaces/user.ts +++ b/common/src/interfaces/user.ts @@ -3,10 +3,4 @@ export interface UserDTO { username: string; firstName: string; lastName: string; - endpoints?: { - self: string; - classes: string; - questions: string; - invitations: string; - }; }