diff --git a/backend/src/app.ts b/backend/src/app.ts index 652c27d1..5769e360 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -22,7 +22,6 @@ const logger: Logger = getLogger(); const app: Express = express(); const port: string | number = getNumericEnvVar(EnvVars.Port); - app.use(express.json()); app.use(responseTime(responseTimeLogger)); diff --git a/backend/src/config.ts b/backend/src/config.ts index 831670a9..b972a1bd 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -7,6 +7,6 @@ export const DWENGO_API_BASE: string = 'https://dwengo.org/backend/api'; // Logging export const LOG_LEVEL: string = - 'development' === process.env.NODE_ENV ? 'debug' : 'info'; + 'development' === process.env.NODE_ENV ? 'debug' : 'info'; export const LOKI_HOST: string = - process.env.LOKI_HOST || 'http://localhost:3102'; + process.env.LOKI_HOST || 'http://localhost:3102'; diff --git a/backend/src/controllers/learningPaths.ts b/backend/src/controllers/learningPaths.ts index 86878bfd..247877e7 100644 --- a/backend/src/controllers/learningPaths.ts +++ b/backend/src/controllers/learningPaths.ts @@ -57,7 +57,10 @@ export async function getLearningPaths( ); res.json(learningPaths.data); } catch (error) { - getLogger().error('❌ Unexpected error fetching learning paths:', error); + getLogger().error( + '❌ Unexpected error fetching learning paths:', + error + ); res.status(500).json({ error: 'Internal server error' }); } } diff --git a/backend/src/entities/assignments/assignment.entity.ts b/backend/src/entities/assignments/assignment.entity.ts index 7909b107..89952c64 100644 --- a/backend/src/entities/assignments/assignment.entity.ts +++ b/backend/src/entities/assignments/assignment.entity.ts @@ -12,7 +12,12 @@ import { Language } from '../content/language.js'; @Entity() export class Assignment { - @ManyToOne({ entity: () => {return Class}, primary: true }) + @ManyToOne({ + entity: () => { + return Class; + }, + primary: true, + }) within!: Class; @PrimaryKey({ type: 'number' }) @@ -27,9 +32,18 @@ export class Assignment { @Property({ type: 'string' }) learningPathHruid!: string; - @Enum({ items: () => {return Language} }) + @Enum({ + items: () => { + return Language; + }, + }) learningPathLanguage!: Language; - @OneToMany({ entity: () => {return Group}, mappedBy: 'assignment' }) + @OneToMany({ + entity: () => { + return Group; + }, + mappedBy: 'assignment', + }) groups!: Group[]; } diff --git a/backend/src/entities/assignments/group.entity.ts b/backend/src/entities/assignments/group.entity.ts index a68eb5a0..5b224087 100644 --- a/backend/src/entities/assignments/group.entity.ts +++ b/backend/src/entities/assignments/group.entity.ts @@ -4,12 +4,21 @@ import { Student } from '../users/student.entity.js'; @Entity() export class Group { - @ManyToOne({ entity: () => {return Assignment}, primary: true }) + @ManyToOne({ + entity: () => { + return Assignment; + }, + primary: true, + }) assignment!: Assignment; @PrimaryKey({ type: 'integer' }) groupNumber!: number; - @ManyToMany({ entity: () => {return Student} }) + @ManyToMany({ + entity: () => { + return Student; + }, + }) members!: Student[]; } diff --git a/backend/src/entities/assignments/submission.entity.ts b/backend/src/entities/assignments/submission.entity.ts index bd0936a1..1bc28add 100644 --- a/backend/src/entities/assignments/submission.entity.ts +++ b/backend/src/entities/assignments/submission.entity.ts @@ -8,7 +8,12 @@ export class Submission { @PrimaryKey({ type: 'string' }) learningObjectHruid!: string; - @Enum({ items: () => {return Language}, primary: true }) + @Enum({ + items: () => { + return Language; + }, + primary: true, + }) learningObjectLanguage!: Language; @PrimaryKey({ type: 'string' }) @@ -17,13 +22,22 @@ export class Submission { @PrimaryKey({ type: 'integer' }) submissionNumber!: number; - @ManyToOne({ entity: () => {return Student} }) + @ManyToOne({ + entity: () => { + return Student; + }, + }) submitter!: Student; @Property({ type: 'datetime' }) submissionTime!: Date; - @ManyToOne({ entity: () => {return Group}, nullable: true }) + @ManyToOne({ + entity: () => { + return Group; + }, + nullable: true, + }) onBehalfOf?: Group; @Property({ type: 'json' }) diff --git a/backend/src/entities/classes/class-join-request.entity.ts b/backend/src/entities/classes/class-join-request.entity.ts index 86a30e3e..0ae38cd1 100644 --- a/backend/src/entities/classes/class-join-request.entity.ts +++ b/backend/src/entities/classes/class-join-request.entity.ts @@ -4,13 +4,25 @@ import { Class } from './class.entity.js'; @Entity() export class ClassJoinRequest { - @ManyToOne({ entity: () => {return Student}, primary: true }) + @ManyToOne({ + entity: () => { + return Student; + }, + primary: true, + }) requester!: Student; - @ManyToOne({ entity: () => {return Class}, primary: true }) + @ManyToOne({ + entity: () => { + return Class; + }, + primary: true, + }) class!: Class; - @Enum(() => {return ClassJoinRequestStatus}) + @Enum(() => { + return ClassJoinRequestStatus; + }) status!: ClassJoinRequestStatus; } diff --git a/backend/src/entities/classes/class.entity.ts b/backend/src/entities/classes/class.entity.ts index 2ad98c84..ecc11748 100644 --- a/backend/src/entities/classes/class.entity.ts +++ b/backend/src/entities/classes/class.entity.ts @@ -17,9 +17,13 @@ export class Class { @Property({ type: 'string' }) displayName!: string; - @ManyToMany(() => {return Teacher}) + @ManyToMany(() => { + return Teacher; + }) teachers!: Collection; - @ManyToMany(() => {return Student}) + @ManyToMany(() => { + return Student; + }) students!: Collection; } diff --git a/backend/src/entities/classes/teacher-invitation.entity.ts b/backend/src/entities/classes/teacher-invitation.entity.ts index feba8fc3..98d2bdd4 100644 --- a/backend/src/entities/classes/teacher-invitation.entity.ts +++ b/backend/src/entities/classes/teacher-invitation.entity.ts @@ -7,12 +7,27 @@ import { Class } from './class.entity.js'; */ @Entity() export class TeacherInvitation { - @ManyToOne({ entity: () => {return Teacher}, primary: true }) + @ManyToOne({ + entity: () => { + return Teacher; + }, + primary: true, + }) sender!: Teacher; - @ManyToOne({ entity: () => {return Teacher}, primary: true }) + @ManyToOne({ + entity: () => { + return Teacher; + }, + primary: true, + }) receiver!: Teacher; - @ManyToOne({ entity: () => {return Class}, primary: true }) + @ManyToOne({ + entity: () => { + return Class; + }, + primary: true, + }) class!: Class; } diff --git a/backend/src/entities/content/attachment.entity.ts b/backend/src/entities/content/attachment.entity.ts index 2ead7262..7a9dd946 100644 --- a/backend/src/entities/content/attachment.entity.ts +++ b/backend/src/entities/content/attachment.entity.ts @@ -3,7 +3,12 @@ import { LearningObject } from './learning-object.entity.js'; @Entity() export class Attachment { - @ManyToOne({ entity: () => {return LearningObject}, primary: true }) + @ManyToOne({ + entity: () => { + return LearningObject; + }, + primary: true, + }) learningObject!: LearningObject; @PrimaryKey({ type: 'integer' }) diff --git a/backend/src/entities/content/learning-object.entity.ts b/backend/src/entities/content/learning-object.entity.ts index c5bfe08f..bf499e8a 100644 --- a/backend/src/entities/content/learning-object.entity.ts +++ b/backend/src/entities/content/learning-object.entity.ts @@ -17,13 +17,22 @@ export class LearningObject { @PrimaryKey({ type: 'string' }) hruid!: string; - @Enum({ items: () => {return Language}, primary: true }) + @Enum({ + items: () => { + return Language; + }, + primary: true, + }) language!: Language; @PrimaryKey({ type: 'string' }) version: string = '1'; - @ManyToMany({ entity: () => {return Teacher} }) + @ManyToMany({ + entity: () => { + return Teacher; + }, + }) admins!: Teacher[]; @Property({ type: 'string' }) @@ -47,7 +56,12 @@ export class LearningObject { @Property({ type: 'array' }) skosConcepts!: string[]; - @Embedded({ entity: () => {return EducationalGoal}, array: true }) + @Embedded({ + entity: () => { + return EducationalGoal; + }, + array: true, + }) educationalGoals: EducationalGoal[] = []; @Property({ type: 'string' }) @@ -62,7 +76,11 @@ export class LearningObject { @Property({ type: 'integer' }) estimatedTime!: number; - @Embedded({ entity: () => {return ReturnValue} }) + @Embedded({ + entity: () => { + return ReturnValue; + }, + }) returnValue!: ReturnValue; @Property({ type: 'bool' }) @@ -71,7 +89,12 @@ export class LearningObject { @Property({ type: 'string', nullable: true }) contentLocation?: string; - @OneToMany({ entity: () => {return Attachment}, mappedBy: 'learningObject' }) + @OneToMany({ + entity: () => { + return Attachment; + }, + mappedBy: 'learningObject', + }) attachments: Attachment[] = []; @Property({ type: 'blob' }) diff --git a/backend/src/entities/content/learning-path.entity.ts b/backend/src/entities/content/learning-path.entity.ts index f758dace..28d3cadd 100644 --- a/backend/src/entities/content/learning-path.entity.ts +++ b/backend/src/entities/content/learning-path.entity.ts @@ -16,10 +16,19 @@ export class LearningPath { @PrimaryKey({ type: 'string' }) hruid!: string; - @Enum({ items: () => {return Language}, primary: true }) + @Enum({ + items: () => { + return Language; + }, + primary: true, + }) language!: Language; - @ManyToMany({ entity: () => {return Teacher} }) + @ManyToMany({ + entity: () => { + return Teacher; + }, + }) admins!: Teacher[]; @Property({ type: 'string' }) @@ -31,7 +40,12 @@ export class LearningPath { @Property({ type: 'blob' }) image!: string; - @Embedded({ entity: () => {return LearningPathNode}, array: true }) + @Embedded({ + entity: () => { + return LearningPathNode; + }, + array: true, + }) nodes: LearningPathNode[] = []; } @@ -40,7 +54,11 @@ export class LearningPathNode { @Property({ type: 'string' }) learningObjectHruid!: string; - @Enum({ items: () => {return Language} }) + @Enum({ + items: () => { + return Language; + }, + }) language!: Language; @Property({ type: 'string' }) @@ -52,7 +70,12 @@ export class LearningPathNode { @Property({ type: 'bool' }) startNode!: boolean; - @Embedded({ entity: () => {return LearningPathTransition}, array: true }) + @Embedded({ + entity: () => { + return LearningPathTransition; + }, + array: true, + }) transitions!: LearningPathTransition[]; } @@ -61,6 +84,10 @@ export class LearningPathTransition { @Property({ type: 'string' }) condition!: string; - @OneToOne({ entity: () => {return LearningPathNode} }) + @OneToOne({ + entity: () => { + return LearningPathNode; + }, + }) next!: LearningPathNode; } diff --git a/backend/src/entities/questions/answer.entity.ts b/backend/src/entities/questions/answer.entity.ts index 2690d50d..34558612 100644 --- a/backend/src/entities/questions/answer.entity.ts +++ b/backend/src/entities/questions/answer.entity.ts @@ -4,10 +4,20 @@ import { Teacher } from '../users/teacher.entity'; @Entity() export class Answer { - @ManyToOne({ entity: () => {return Teacher}, primary: true }) + @ManyToOne({ + entity: () => { + return Teacher; + }, + primary: true, + }) author!: Teacher; - @ManyToOne({ entity: () => {return Question}, primary: true }) + @ManyToOne({ + entity: () => { + return Question; + }, + primary: true, + }) toQuestion!: Question; @PrimaryKey({ type: 'integer' }) diff --git a/backend/src/entities/questions/question.entity.ts b/backend/src/entities/questions/question.entity.ts index 5830c816..444d2179 100644 --- a/backend/src/entities/questions/question.entity.ts +++ b/backend/src/entities/questions/question.entity.ts @@ -7,7 +7,12 @@ export class Question { @PrimaryKey({ type: 'string' }) learningObjectHruid!: string; - @Enum({ items: () => {return Language}, primary: true }) + @Enum({ + items: () => { + return Language; + }, + primary: true, + }) learningObjectLanguage!: Language; @PrimaryKey({ type: 'string' }) @@ -16,7 +21,11 @@ export class Question { @PrimaryKey({ type: 'integer' }) sequenceNumber!: number; - @ManyToOne({ entity: () => {return Student} }) + @ManyToOne({ + entity: () => { + return Student; + }, + }) author!: Student; @Property({ type: 'datetime' }) diff --git a/backend/src/entities/users/student.entity.ts b/backend/src/entities/users/student.entity.ts index ccfa7dfc..c5632e84 100644 --- a/backend/src/entities/users/student.entity.ts +++ b/backend/src/entities/users/student.entity.ts @@ -4,12 +4,20 @@ import { Class } from '../classes/class.entity.js'; import { Group } from '../assignments/group.entity.js'; import { StudentRepository } from '../../data/users/student-repository.js'; -@Entity({ repository: () => {return StudentRepository} }) +@Entity({ + repository: () => { + return StudentRepository; + }, +}) export class Student extends User { - @ManyToMany(() => {return Class}) + @ManyToMany(() => { + return Class; + }) classes!: Collection; - @ManyToMany(() => {return Group}) + @ManyToMany(() => { + return Group; + }) groups!: Collection; constructor( diff --git a/backend/src/entities/users/teacher.entity.ts b/backend/src/entities/users/teacher.entity.ts index eaaa8327..9f11a3b0 100644 --- a/backend/src/entities/users/teacher.entity.ts +++ b/backend/src/entities/users/teacher.entity.ts @@ -4,6 +4,8 @@ import { Class } from '../classes/class.entity.js'; @Entity() export class Teacher extends User { - @ManyToMany(() => {return Class}) + @ManyToMany(() => { + return Class; + }) classes!: Collection; } diff --git a/backend/src/routes/assignment.ts b/backend/src/routes/assignment.ts index eb49144f..4ae5756d 100644 --- a/backend/src/routes/assignment.ts +++ b/backend/src/routes/assignment.ts @@ -1,13 +1,10 @@ -import express from 'express' +import express from 'express'; const router = express.Router(); // Root endpoint used to search objects router.get('/', (req, res) => { res.json({ - assignments: [ - '0', - '1', - ] + assignments: ['0', '1'], }); }); @@ -17,7 +14,7 @@ router.get('/:id', (req, res) => { id: req.params.id, title: 'Dit is een test assignment', description: 'Een korte beschrijving', - groups: [ '0' ], + groups: ['0'], learningPath: '0', class: '0', links: { @@ -25,30 +22,24 @@ router.get('/:id', (req, res) => { submissions: `${req.baseUrl}/${req.params.id}`, }, }); -}) +}); router.get('/:id/submissions', (req, res) => { res.json({ - submissions: [ - '0' - ], + submissions: ['0'], }); }); router.get('/:id/groups', (req, res) => { res.json({ - groups: [ - '0' - ], + groups: ['0'], }); }); router.get('/:id/questions', (req, res) => { res.json({ - questions: [ - '0' - ], + questions: ['0'], }); }); -export default router \ No newline at end of file +export default router; diff --git a/backend/src/routes/class.ts b/backend/src/routes/class.ts index fa7a2310..6f8f324e 100644 --- a/backend/src/routes/class.ts +++ b/backend/src/routes/class.ts @@ -1,13 +1,10 @@ -import express from 'express' +import express from 'express'; const router = express.Router(); // Root endpoint used to search objects router.get('/', (req, res) => { res.json({ - classes: [ - '0', - '1', - ] + classes: ['0', '1'], }); }); @@ -16,40 +13,34 @@ router.get('/:id', (req, res) => { res.json({ id: req.params.id, displayName: 'Klas 4B', - teachers: [ '0' ], - students: [ '0' ], - joinRequests: [ '0' ], + teachers: ['0'], + students: ['0'], + joinRequests: ['0'], links: { self: `${req.baseUrl}/${req.params.id}`, classes: `${req.baseUrl}/${req.params.id}/invitations`, questions: `${req.baseUrl}/${req.params.id}/assignments`, students: `${req.baseUrl}/${req.params.id}/students`, - } + }, }); -}) +}); router.get('/:id/invitations', (req, res) => { res.json({ - invitations: [ - '0' - ], + invitations: ['0'], }); -}) +}); router.get('/:id/assignments', (req, res) => { res.json({ - assignments: [ - '0' - ], + assignments: ['0'], }); -}) +}); router.get('/:id/students', (req, res) => { res.json({ - students: [ - '0' - ], + students: ['0'], }); -}) +}); -export default router \ No newline at end of file +export default router; diff --git a/backend/src/routes/group.ts b/backend/src/routes/group.ts index e951a8a7..303f5215 100644 --- a/backend/src/routes/group.ts +++ b/backend/src/routes/group.ts @@ -1,13 +1,10 @@ -import express from 'express' +import express from 'express'; const router = express.Router(); // Root endpoint used to search objects router.get('/', (req, res) => { res.json({ - groups: [ - '0', - '1', - ] + groups: ['0', '1'], }); }); @@ -16,19 +13,19 @@ router.get('/:id', (req, res) => { res.json({ id: req.params.id, assignment: '0', - students: [ '0' ], - submissions: [ '0' ], + students: ['0'], + submissions: ['0'], // Reference to other endpoint // Should be less hardcoded - questions: `/group/${req.params.id}/question`, + questions: `/group/${req.params.id}/question`, }); -}) +}); // The list of questions a group has made router.get('/:id/question', (req, res) => { res.json({ - questions: [ '0' ], + questions: ['0'], }); -}) +}); -export default router \ No newline at end of file +export default router; diff --git a/backend/src/routes/login.ts b/backend/src/routes/login.ts index bc2ed3d8..33d5e6c3 100644 --- a/backend/src/routes/login.ts +++ b/backend/src/routes/login.ts @@ -1,4 +1,4 @@ -import express from 'express' +import express from 'express'; const router = express.Router(); // Returns login paths for IDP @@ -9,6 +9,6 @@ router.get('/', (req, res) => { leerkracht: '/login-leerkracht', leerling: '/login-leerling', }); -}) +}); -export default router \ No newline at end of file +export default router; diff --git a/backend/src/routes/question.ts b/backend/src/routes/question.ts index 040f742d..f683d998 100644 --- a/backend/src/routes/question.ts +++ b/backend/src/routes/question.ts @@ -1,13 +1,10 @@ -import express from 'express' +import express from 'express'; const router = express.Router(); // Root endpoint used to search objects router.get('/', (req, res) => { res.json({ - questions: [ - '0', - '1', - ] + questions: ['0', '1'], }); }); @@ -18,21 +15,20 @@ router.get('/:id', (req, res) => { student: '0', group: '0', time: new Date(2025, 1, 1), - content: 'Zijn alle gehele getallen groter dan 2 gelijk aan de som van 2 priemgetallen????', + content: + 'Zijn alle gehele getallen groter dan 2 gelijk aan de som van 2 priemgetallen????', learningObject: '0', links: { self: `${req.baseUrl}/${req.params.id}`, answers: `${req.baseUrl}/${req.params.id}/answers`, - } + }, }); -}) +}); router.get('/:id/answers', (req, res) => { res.json({ - answers: [ - '0' - ], - }) -}) + answers: ['0'], + }); +}); -export default router \ No newline at end of file +export default router; diff --git a/backend/src/routes/student.ts b/backend/src/routes/student.ts index bc3f588b..9cb0cdee 100644 --- a/backend/src/routes/student.ts +++ b/backend/src/routes/student.ts @@ -1,13 +1,10 @@ -import express from 'express' +import express from 'express'; const router = express.Router(); // Root endpoint used to search objects router.get('/', (req, res) => { res.json({ - students: [ - '0', - '1', - ] + students: ['0', '1'], }); }); @@ -30,30 +27,29 @@ router.get('/:id', (req, res) => { // The list of classes a student is in router.get('/:id/classes', (req, res) => { res.json({ - classes: [ '0' ], + classes: ['0'], }); -}) +}); // The list of submissions a student has made router.get('/:id/submissions', (req, res) => { res.json({ - submissions: [ '0' ], + submissions: ['0'], }); -}) +}); - // The list of assignments a student has router.get('/:id/assignments', (req, res) => { res.json({ - assignments: [ '0' ], + assignments: ['0'], }); -}) - +}); + // The list of groups a student is in router.get('/:id/groups', (req, res) => { res.json({ - groups: [ '0' ], + groups: ['0'], }); -}) +}); -export default router \ No newline at end of file +export default router; diff --git a/backend/src/routes/submission.ts b/backend/src/routes/submission.ts index 98acc842..cb4d3e85 100644 --- a/backend/src/routes/submission.ts +++ b/backend/src/routes/submission.ts @@ -1,13 +1,10 @@ -import express from 'express' +import express from 'express'; const router = express.Router(); // Root endpoint used to search objects router.get('/', (req, res) => { res.json({ - submissions: [ - '0', - '1', - ] + submissions: ['0', '1'], }); }); @@ -21,6 +18,6 @@ router.get('/:id', (req, res) => { content: 'Wortel 2 is rationeel', learningObject: '0', }); -}) +}); -export default router \ No newline at end of file +export default router; diff --git a/backend/src/routes/teacher.ts b/backend/src/routes/teacher.ts index f9de3aa5..a7c60bc9 100644 --- a/backend/src/routes/teacher.ts +++ b/backend/src/routes/teacher.ts @@ -1,13 +1,10 @@ -import express from 'express' +import express from 'express'; const router = express.Router(); // Root endpoint used to search objects router.get('/', (req, res) => { res.json({ - teachers: [ - '0', - '1', - ] + teachers: ['0', '1'], }); }); @@ -25,34 +22,27 @@ router.get('/:id', (req, res) => { invitations: `${req.baseUrl}/${req.params.id}/invitations`, }, }); -}) +}); // The questions students asked a teacher router.get('/:id/questions', (req, res) => { res.json({ - questions: [ - '0' - ], + questions: ['0'], }); }); // Invitations to other classes a teacher received router.get('/:id/invitations', (req, res) => { res.json({ - invitations: [ - '0' - ], + invitations: ['0'], }); }); // A list with ids of classes a teacher is in router.get('/:id/classes', (req, res) => { res.json({ - classes: [ - '0' - ], + classes: ['0'], }); }); - -export default router \ No newline at end of file +export default router; diff --git a/backend/src/services/learningPaths.ts b/backend/src/services/learningPaths.ts index 58703215..6baf74c7 100644 --- a/backend/src/services/learningPaths.ts +++ b/backend/src/services/learningPaths.ts @@ -1,6 +1,9 @@ import { fetchWithLogging } from '../util/apiHelper.js'; import { DWENGO_API_BASE } from '../config.js'; -import { LearningPath, LearningPathResponse } from '../interfaces/learningPath.js'; +import { + LearningPath, + LearningPathResponse, +} from '../interfaces/learningPath.js'; import { getLogger, Logger } from '../logging/initalize.js'; const logger: Logger = getLogger();