From f347ec247dadf2f934342ef552984b79a9e790d4 Mon Sep 17 00:00:00 2001 From: Lint Action Date: Thu, 6 Mar 2025 13:37:42 +0000 Subject: [PATCH] style: fix linting issues met Prettier --- backend/src/config.ts | 6 +- backend/src/controllers/learningObjects.ts | 21 ++---- backend/src/controllers/learningPaths.ts | 30 ++------- backend/src/controllers/themes.ts | 11 ++-- .../data/assignments/assignment-repository.ts | 5 +- .../src/data/assignments/group-repository.ts | 14 +--- .../data/assignments/submission-repository.ts | 20 ++---- .../classes/teacher-invitation-repository.ts | 14 +--- .../src/data/content/attachment-repository.ts | 5 +- .../content/learning-object-repository.ts | 4 +- .../data/content/learning-path-repository.ts | 5 +- backend/src/data/dwengo-entity-repository.ts | 4 +- .../src/data/questions/answer-repository.ts | 11 +--- .../src/data/questions/question-repository.ts | 15 +---- backend/src/data/repositories.ts | 11 +--- backend/src/data/themes.ts | 36 ++--------- .../entities/assignments/assignment.entity.ts | 9 +-- backend/src/entities/classes/class.entity.ts | 8 +-- .../content/learning-object.entity.ts | 11 +--- .../entities/content/learning-path.entity.ts | 11 +--- backend/src/logging/initalize.ts | 11 +--- backend/src/logging/mikroOrmLogger.ts | 34 +++------- backend/src/orm.ts | 4 +- backend/src/routes/learningObjects.ts | 5 +- backend/src/routes/question.ts | 3 +- backend/src/services/learningObjects.ts | 64 ++++--------------- backend/src/services/learningPaths.ts | 28 ++------ backend/src/util/apiHelper.ts | 15 +---- backend/src/util/envvars.ts | 4 +- backend/src/util/translationHelper.ts | 11 +--- backend/tests/data/users.test.ts | 10 +-- eslint.config.ts | 7 +- frontend/eslint.config.ts | 4 +- 33 files changed, 90 insertions(+), 361 deletions(-) diff --git a/backend/src/config.ts b/backend/src/config.ts index b972a1bd..ad8cf0be 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -6,7 +6,5 @@ export const DWENGO_API_BASE: string = 'https://dwengo.org/backend/api'; // Logging -export const LOG_LEVEL: string = - 'development' === process.env.NODE_ENV ? 'debug' : 'info'; -export const LOKI_HOST: string = - process.env.LOKI_HOST || 'http://localhost:3102'; +export const LOG_LEVEL: string = 'development' === process.env.NODE_ENV ? 'debug' : 'info'; +export const LOKI_HOST: string = process.env.LOKI_HOST || 'http://localhost:3102'; diff --git a/backend/src/controllers/learningObjects.ts b/backend/src/controllers/learningObjects.ts index 6fde1208..0d41044b 100644 --- a/backend/src/controllers/learningObjects.ts +++ b/backend/src/controllers/learningObjects.ts @@ -1,17 +1,10 @@ import { Request, Response } from 'express'; -import { - getLearningObjectById, - getLearningObjectIdsFromPath, - getLearningObjectsFromPath, -} from '../services/learningObjects.js'; +import { getLearningObjectById, getLearningObjectIdsFromPath, getLearningObjectsFromPath } from '../services/learningObjects.js'; import { FALLBACK_LANG } from '../config.js'; import { FilteredLearningObject } from '../interfaces/learningPath.js'; import { getLogger } from '../logging/initalize.js'; -export async function getAllLearningObjects( - req: Request, - res: Response -): Promise { +export async function getAllLearningObjects(req: Request, res: Response): Promise { try { const hruid = req.query.hruid as string; const full = req.query.full === 'true'; @@ -26,10 +19,7 @@ export async function getAllLearningObjects( if (full) { learningObjects = await getLearningObjectsFromPath(hruid, language); } else { - learningObjects = await getLearningObjectIdsFromPath( - hruid, - language - ); + learningObjects = await getLearningObjectIdsFromPath(hruid, language); } res.json(learningObjects); @@ -39,10 +29,7 @@ export async function getAllLearningObjects( } } -export async function getLearningObject( - req: Request, - res: Response -): Promise { +export async function getLearningObject(req: Request, res: Response): Promise { try { const { hruid } = req.params; const language = (req.query.language as string) || FALLBACK_LANG; diff --git a/backend/src/controllers/learningPaths.ts b/backend/src/controllers/learningPaths.ts index acf76f60..50299d0f 100644 --- a/backend/src/controllers/learningPaths.ts +++ b/backend/src/controllers/learningPaths.ts @@ -1,18 +1,12 @@ import { Request, Response } from 'express'; import { themes } from '../data/themes.js'; import { FALLBACK_LANG } from '../config.js'; -import { - fetchLearningPaths, - searchLearningPaths, -} from '../services/learningPaths.js'; +import { fetchLearningPaths, searchLearningPaths } from '../services/learningPaths.js'; import { getLogger } from '../logging/initalize.js'; /** * Fetch learning paths based on query parameters. */ -export async function getLearningPaths( - req: Request, - res: Response -): Promise { +export async function getLearningPaths(req: Request, res: Response): Promise { try { const hruids = req.query.hruid; const themeKey = req.query.theme as string; @@ -22,9 +16,7 @@ export async function getLearningPaths( let hruidList; if (hruids) { - hruidList = Array.isArray(hruids) - ? hruids.map(String) - : [String(hruids)]; + hruidList = Array.isArray(hruids) ? hruids.map(String) : [String(hruids)]; } else if (themeKey) { const theme = themes.find((t) => t.title === themeKey); if (theme) { @@ -36,27 +28,17 @@ export async function getLearningPaths( return; } } else if (searchQuery) { - const searchResults = await searchLearningPaths( - searchQuery, - language - ); + const searchResults = await searchLearningPaths(searchQuery, language); res.json(searchResults); return; } else { hruidList = themes.flatMap((theme) => theme.hruids); } - const learningPaths = await fetchLearningPaths( - hruidList, - language, - `HRUIDs: ${hruidList.join(', ')}` - ); + const learningPaths = await fetchLearningPaths(hruidList, language, `HRUIDs: ${hruidList.join(', ')}`); 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/controllers/themes.ts b/backend/src/controllers/themes.ts index 62fd1e79..fe1eb818 100644 --- a/backend/src/controllers/themes.ts +++ b/backend/src/controllers/themes.ts @@ -12,12 +12,11 @@ export function getThemes(req: Request, res: Response) { const language = (req.query.language as string)?.toLowerCase() || 'nl'; const translations = loadTranslations(language); const themeList = themes.map((theme) => ({ - key: theme.title, - title: - translations.curricula_page[theme.title]?.title || theme.title, - description: translations.curricula_page[theme.title]?.description, - image: `https://dwengo.org/images/curricula/logo_${theme.title}.png`, - })); + key: theme.title, + title: translations.curricula_page[theme.title]?.title || theme.title, + description: translations.curricula_page[theme.title]?.description, + image: `https://dwengo.org/images/curricula/logo_${theme.title}.png`, + })); res.json(themeList); } diff --git a/backend/src/data/assignments/assignment-repository.ts b/backend/src/data/assignments/assignment-repository.ts index c55bee00..c3c457d3 100644 --- a/backend/src/data/assignments/assignment-repository.ts +++ b/backend/src/data/assignments/assignment-repository.ts @@ -3,10 +3,7 @@ import { Assignment } from '../../entities/assignments/assignment.entity.js'; import { Class } from '../../entities/classes/class.entity.js'; export class AssignmentRepository extends DwengoEntityRepository { - public findByClassAndId( - within: Class, - id: number - ): Promise { + public findByClassAndId(within: Class, id: number): Promise { return this.findOne({ within: within, id: id }); } public findAllAssignmentsInClass(within: Class): Promise { diff --git a/backend/src/data/assignments/group-repository.ts b/backend/src/data/assignments/group-repository.ts index ff8ca507..df92eaae 100644 --- a/backend/src/data/assignments/group-repository.ts +++ b/backend/src/data/assignments/group-repository.ts @@ -3,24 +3,16 @@ import { Group } from '../../entities/assignments/group.entity.js'; import { Assignment } from '../../entities/assignments/assignment.entity.js'; export class GroupRepository extends DwengoEntityRepository { - public findByAssignmentAndGroupNumber( - assignment: Assignment, - groupNumber: number - ): Promise { + public findByAssignmentAndGroupNumber(assignment: Assignment, groupNumber: number): Promise { return this.findOne({ assignment: assignment, groupNumber: groupNumber, }); } - public findAllGroupsForAssignment( - assignment: Assignment - ): Promise { + public findAllGroupsForAssignment(assignment: Assignment): Promise { return this.findAll({ where: { assignment: assignment } }); } - public deleteByAssignmentAndGroupNumber( - assignment: Assignment, - groupNumber: number - ) { + public deleteByAssignmentAndGroupNumber(assignment: Assignment, groupNumber: number) { return this.deleteWhere({ assignment: assignment, groupNumber: groupNumber, diff --git a/backend/src/data/assignments/submission-repository.ts b/backend/src/data/assignments/submission-repository.ts index 5332d050..faa9fef1 100644 --- a/backend/src/data/assignments/submission-repository.ts +++ b/backend/src/data/assignments/submission-repository.ts @@ -5,10 +5,7 @@ import { LearningObjectIdentifier } from '../../entities/content/learning-object import { Student } from '../../entities/users/student.entity.js'; export class SubmissionRepository extends DwengoEntityRepository { - public findSubmissionByLearningObjectAndSubmissionNumber( - loId: LearningObjectIdentifier, - submissionNumber: number - ): Promise { + public findSubmissionByLearningObjectAndSubmissionNumber(loId: LearningObjectIdentifier, submissionNumber: number): Promise { return this.findOne({ learningObjectHruid: loId.hruid, learningObjectLanguage: loId.language, @@ -17,10 +14,7 @@ export class SubmissionRepository extends DwengoEntityRepository { }); } - public findMostRecentSubmissionForStudent( - loId: LearningObjectIdentifier, - submitter: Student - ): Promise { + public findMostRecentSubmissionForStudent(loId: LearningObjectIdentifier, submitter: Student): Promise { return this.findOne( { learningObjectHruid: loId.hruid, @@ -32,10 +26,7 @@ export class SubmissionRepository extends DwengoEntityRepository { ); } - public findMostRecentSubmissionForGroup( - loId: LearningObjectIdentifier, - group: Group - ): Promise { + public findMostRecentSubmissionForGroup(loId: LearningObjectIdentifier, group: Group): Promise { return this.findOne( { learningObjectHruid: loId.hruid, @@ -47,10 +38,7 @@ export class SubmissionRepository extends DwengoEntityRepository { ); } - public deleteSubmissionByLearningObjectAndSubmissionNumber( - loId: LearningObjectIdentifier, - submissionNumber: number - ): Promise { + public deleteSubmissionByLearningObjectAndSubmissionNumber(loId: LearningObjectIdentifier, submissionNumber: number): Promise { return this.deleteWhere({ learningObjectHruid: loId.hruid, learningObjectLanguage: loId.language, diff --git a/backend/src/data/classes/teacher-invitation-repository.ts b/backend/src/data/classes/teacher-invitation-repository.ts index ae2713c8..6b94deec 100644 --- a/backend/src/data/classes/teacher-invitation-repository.ts +++ b/backend/src/data/classes/teacher-invitation-repository.ts @@ -4,24 +4,16 @@ import { TeacherInvitation } from '../../entities/classes/teacher-invitation.ent import { Teacher } from '../../entities/users/teacher.entity.js'; export class TeacherInvitationRepository extends DwengoEntityRepository { - public findAllInvitationsForClass( - clazz: Class - ): Promise { + public findAllInvitationsForClass(clazz: Class): Promise { return this.findAll({ where: { class: clazz } }); } public findAllInvitationsBy(sender: Teacher): Promise { return this.findAll({ where: { sender: sender } }); } - public findAllInvitationsFor( - receiver: Teacher - ): Promise { + public findAllInvitationsFor(receiver: Teacher): Promise { return this.findAll({ where: { receiver: receiver } }); } - public deleteBy( - clazz: Class, - sender: Teacher, - receiver: Teacher - ): Promise { + public deleteBy(clazz: Class, sender: Teacher, receiver: Teacher): Promise { return this.deleteWhere({ sender: sender, receiver: receiver, diff --git a/backend/src/data/content/attachment-repository.ts b/backend/src/data/content/attachment-repository.ts index 3268be90..bec874c9 100644 --- a/backend/src/data/content/attachment-repository.ts +++ b/backend/src/data/content/attachment-repository.ts @@ -3,10 +3,7 @@ import { Attachment } from '../../entities/content/attachment.entity.js'; import { LearningObject } from '../../entities/content/learning-object.entity.js'; export class AttachmentRepository extends DwengoEntityRepository { - public findByLearningObjectAndNumber( - learningObject: LearningObject, - sequenceNumber: number - ) { + public findByLearningObjectAndNumber(learningObject: LearningObject, sequenceNumber: number) { return this.findOne({ learningObject: learningObject, sequenceNumber: sequenceNumber, diff --git a/backend/src/data/content/learning-object-repository.ts b/backend/src/data/content/learning-object-repository.ts index 5d30b956..a0d74184 100644 --- a/backend/src/data/content/learning-object-repository.ts +++ b/backend/src/data/content/learning-object-repository.ts @@ -3,9 +3,7 @@ import { LearningObject } from '../../entities/content/learning-object.entity.js import { LearningObjectIdentifier } from '../../entities/content/learning-object-identifier.js'; export class LearningObjectRepository extends DwengoEntityRepository { - public findByIdentifier( - identifier: LearningObjectIdentifier - ): Promise { + public findByIdentifier(identifier: LearningObjectIdentifier): Promise { return this.findOne({ hruid: identifier.hruid, language: identifier.language, diff --git a/backend/src/data/content/learning-path-repository.ts b/backend/src/data/content/learning-path-repository.ts index 3ffb1e7f..ab1f1b46 100644 --- a/backend/src/data/content/learning-path-repository.ts +++ b/backend/src/data/content/learning-path-repository.ts @@ -3,10 +3,7 @@ import { LearningPath } from '../../entities/content/learning-path.entity.js'; import { Language } from '../../entities/content/language.js'; export class LearningPathRepository extends DwengoEntityRepository { - public findByHruidAndLanguage( - hruid: string, - language: Language - ): Promise { + public findByHruidAndLanguage(hruid: string, language: Language): Promise { return this.findOne({ hruid: hruid, language: language }); } // This repository is read-only for now since creating own learning object is an extension feature. diff --git a/backend/src/data/dwengo-entity-repository.ts b/backend/src/data/dwengo-entity-repository.ts index e29d9ede..6538d6f5 100644 --- a/backend/src/data/dwengo-entity-repository.ts +++ b/backend/src/data/dwengo-entity-repository.ts @@ -1,8 +1,6 @@ import { EntityRepository, FilterQuery } from '@mikro-orm/core'; -export abstract class DwengoEntityRepository< - T extends object, -> extends EntityRepository { +export abstract class DwengoEntityRepository extends EntityRepository { public async save(entity: T) { const em = this.getEntityManager(); em.persist(entity); diff --git a/backend/src/data/questions/answer-repository.ts b/backend/src/data/questions/answer-repository.ts index 6c45211c..bab34a65 100644 --- a/backend/src/data/questions/answer-repository.ts +++ b/backend/src/data/questions/answer-repository.ts @@ -4,11 +4,7 @@ import { Question } from '../../entities/questions/question.entity.js'; import { Teacher } from '../../entities/users/teacher.entity.js'; export class AnswerRepository extends DwengoEntityRepository { - public createAnswer(answer: { - toQuestion: Question; - author: Teacher; - content: string; - }): Promise { + public createAnswer(answer: { toQuestion: Question; author: Teacher; content: string }): Promise { const answerEntity = new Answer(); answerEntity.toQuestion = answer.toQuestion; answerEntity.author = answer.author; @@ -21,10 +17,7 @@ export class AnswerRepository extends DwengoEntityRepository { orderBy: { sequenceNumber: 'ASC' }, }); } - public removeAnswerByQuestionAndSequenceNumber( - question: Question, - sequenceNumber: number - ): Promise { + public removeAnswerByQuestionAndSequenceNumber(question: Question, sequenceNumber: number): Promise { return this.deleteWhere({ toQuestion: question, sequenceNumber: sequenceNumber, diff --git a/backend/src/data/questions/question-repository.ts b/backend/src/data/questions/question-repository.ts index 8852a9ba..d41cc490 100644 --- a/backend/src/data/questions/question-repository.ts +++ b/backend/src/data/questions/question-repository.ts @@ -4,11 +4,7 @@ import { LearningObjectIdentifier } from '../../entities/content/learning-object import { Student } from '../../entities/users/student.entity.js'; export class QuestionRepository extends DwengoEntityRepository { - public createQuestion(question: { - loId: LearningObjectIdentifier; - author: Student; - content: string; - }): Promise { + public createQuestion(question: { loId: LearningObjectIdentifier; author: Student; content: string }): Promise { const questionEntity = new Question(); questionEntity.learningObjectHruid = question.loId.hruid; questionEntity.learningObjectLanguage = question.loId.language; @@ -17,9 +13,7 @@ export class QuestionRepository extends DwengoEntityRepository { questionEntity.content = question.content; return this.insert(questionEntity); } - public findAllQuestionsAboutLearningObject( - loId: LearningObjectIdentifier - ): Promise { + public findAllQuestionsAboutLearningObject(loId: LearningObjectIdentifier): Promise { return this.findAll({ where: { learningObjectHruid: loId.hruid, @@ -31,10 +25,7 @@ export class QuestionRepository extends DwengoEntityRepository { }, }); } - public removeQuestionByLearningObjectAndSequenceNumber( - loId: LearningObjectIdentifier, - sequenceNumber: number - ): Promise { + public removeQuestionByLearningObjectAndSequenceNumber(loId: LearningObjectIdentifier, sequenceNumber: number): Promise { return this.deleteWhere({ learningObjectHruid: loId.hruid, learningObjectLanguage: loId.language, diff --git a/backend/src/data/repositories.ts b/backend/src/data/repositories.ts index 8f5e90cb..6d67a693 100644 --- a/backend/src/data/repositories.ts +++ b/backend/src/data/repositories.ts @@ -1,9 +1,4 @@ -import { - AnyEntity, - EntityManager, - EntityName, - EntityRepository, -} from '@mikro-orm/core'; +import { AnyEntity, EntityManager, EntityName, EntityRepository } from '@mikro-orm/core'; import { forkEntityManager } from '../orm.js'; import { StudentRepository } from './users/student-repository.js'; import { Student } from '../entities/users/student.entity.js'; @@ -43,9 +38,7 @@ export function transactional(f: () => Promise) { entityManager?.transactional(f); } -function repositoryGetter>( - entity: EntityName, -): () => R { +function repositoryGetter>(entity: EntityName): () => R { let cachedRepo: R | undefined; return (): R => { if (!cachedRepo) { diff --git a/backend/src/data/themes.ts b/backend/src/data/themes.ts index dd79400c..b0fc930c 100644 --- a/backend/src/data/themes.ts +++ b/backend/src/data/themes.ts @@ -23,13 +23,7 @@ export const themes: Theme[] = [ }, { title: 'art', - hruids: [ - 'pn_werking', - 'un_artificiele_intelligentie', - 'art1', - 'art2', - 'art3', - ], + hruids: ['pn_werking', 'un_artificiele_intelligentie', 'art1', 'art2', 'art3'], }, { title: 'socialrobot', @@ -37,12 +31,7 @@ export const themes: Theme[] = [ }, { title: 'agriculture', - hruids: [ - 'pn_werking', - 'un_artificiele_intelligentie', - 'agri_landbouw', - 'agri_lopendeband', - ], + hruids: ['pn_werking', 'un_artificiele_intelligentie', 'agri_landbouw', 'agri_lopendeband'], }, { title: 'wegostem', @@ -83,16 +72,7 @@ export const themes: Theme[] = [ }, { title: 'python_programming', - hruids: [ - 'pn_werking', - 'pn_datatypes', - 'pn_operatoren', - 'pn_structuren', - 'pn_functies', - 'art2', - 'stem_insectbooks', - 'un_algoenprog', - ], + hruids: ['pn_werking', 'pn_datatypes', 'pn_operatoren', 'pn_structuren', 'pn_functies', 'art2', 'stem_insectbooks', 'un_algoenprog'], }, { title: 'stem', @@ -110,15 +90,7 @@ export const themes: Theme[] = [ }, { title: 'care', - hruids: [ - 'pn_werking', - 'un_artificiele_intelligentie', - 'aiz1_zorg', - 'aiz2_grafen', - 'aiz3_unplugged', - 'aiz4_eindtermen', - 'aiz5_triage', - ], + hruids: ['pn_werking', 'un_artificiele_intelligentie', 'aiz1_zorg', 'aiz2_grafen', 'aiz3_unplugged', 'aiz4_eindtermen', 'aiz5_triage'], }, { title: 'chatbot', diff --git a/backend/src/entities/assignments/assignment.entity.ts b/backend/src/entities/assignments/assignment.entity.ts index e883632b..d1a04c5d 100644 --- a/backend/src/entities/assignments/assignment.entity.ts +++ b/backend/src/entities/assignments/assignment.entity.ts @@ -1,11 +1,4 @@ -import { - Entity, - Enum, - ManyToOne, - OneToMany, - PrimaryKey, - Property, -} from '@mikro-orm/core'; +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'; diff --git a/backend/src/entities/classes/class.entity.ts b/backend/src/entities/classes/class.entity.ts index 1f5835d2..88d2660c 100644 --- a/backend/src/entities/classes/class.entity.ts +++ b/backend/src/entities/classes/class.entity.ts @@ -1,10 +1,4 @@ -import { - Collection, - Entity, - ManyToMany, - PrimaryKey, - Property, -} from '@mikro-orm/core'; +import { Collection, Entity, ManyToMany, PrimaryKey, Property } from '@mikro-orm/core'; import { v4 } from 'uuid'; import { Teacher } from '../users/teacher.entity.js'; import { Student } from '../users/student.entity.js'; diff --git a/backend/src/entities/content/learning-object.entity.ts b/backend/src/entities/content/learning-object.entity.ts index 71f8e69d..2b7d7684 100644 --- a/backend/src/entities/content/learning-object.entity.ts +++ b/backend/src/entities/content/learning-object.entity.ts @@ -1,13 +1,4 @@ -import { - Embeddable, - Embedded, - Entity, - Enum, - ManyToMany, - OneToMany, - PrimaryKey, - Property, -} from '@mikro-orm/core'; +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'; diff --git a/backend/src/entities/content/learning-path.entity.ts b/backend/src/entities/content/learning-path.entity.ts index 4048daa6..8dead69d 100644 --- a/backend/src/entities/content/learning-path.entity.ts +++ b/backend/src/entities/content/learning-path.entity.ts @@ -1,13 +1,4 @@ -import { - Embeddable, - Embedded, - Entity, - Enum, - ManyToMany, - OneToOne, - PrimaryKey, - Property, -} from '@mikro-orm/core'; +import { Embeddable, Embedded, Entity, Enum, ManyToMany, OneToOne, PrimaryKey, Property } from '@mikro-orm/core'; import { Language } from './language.js'; import { Teacher } from '../users/teacher.entity.js'; diff --git a/backend/src/logging/initalize.ts b/backend/src/logging/initalize.ts index 18166408..1ff761c9 100644 --- a/backend/src/logging/initalize.ts +++ b/backend/src/logging/initalize.ts @@ -1,9 +1,4 @@ -import { - createLogger, - format, - Logger as WinstonLogger, - transports, -} from 'winston'; +import { createLogger, format, Logger as WinstonLogger, transports } from 'winston'; import LokiTransport from 'winston-loki'; import { LokiLabels } from 'loki-logger-ts'; import { LOG_LEVEL, LOKI_HOST } from '../config.js'; @@ -48,9 +43,7 @@ function initializeLogger(): Logger { transports: [lokiTransport, consoleTransport], }); - logger.debug( - `Logger initialized with level ${LOG_LEVEL}, Loki host ${LOKI_HOST}` - ); + logger.debug(`Logger initialized with level ${LOG_LEVEL}, Loki host ${LOKI_HOST}`); return logger; } diff --git a/backend/src/logging/mikroOrmLogger.ts b/backend/src/logging/mikroOrmLogger.ts index e8bc1fad..25bbac13 100644 --- a/backend/src/logging/mikroOrmLogger.ts +++ b/backend/src/logging/mikroOrmLogger.ts @@ -12,42 +12,28 @@ export class MikroOrmLogger extends DefaultLogger { switch (namespace) { case 'query': - this.logger.debug( - this.createMessage(namespace, message, context) - ); + this.logger.debug(this.createMessage(namespace, message, context)); break; case 'query-params': // TODO Which log level should this be? - this.logger.info( - this.createMessage(namespace, message, context) - ); + this.logger.info(this.createMessage(namespace, message, context)); break; case 'schema': - this.logger.info( - this.createMessage(namespace, message, context) - ); + this.logger.info(this.createMessage(namespace, message, context)); break; case 'discovery': - this.logger.debug( - this.createMessage(namespace, message, context) - ); + this.logger.debug(this.createMessage(namespace, message, context)); break; case 'info': - this.logger.info( - this.createMessage(namespace, message, context) - ); + this.logger.info(this.createMessage(namespace, message, context)); break; case 'deprecated': - this.logger.warn( - this.createMessage(namespace, message, context) - ); + this.logger.warn(this.createMessage(namespace, message, context)); break; default: switch (context?.level) { case 'info': - this.logger.info( - this.createMessage(namespace, message, context) - ); + this.logger.info(this.createMessage(namespace, message, context)); break; case 'warning': this.logger.warn(message); @@ -62,11 +48,7 @@ export class MikroOrmLogger extends DefaultLogger { } } - private createMessage( - namespace: LoggerNamespace, - messageArg: string, - context?: LogContext - ) { + private createMessage(namespace: LoggerNamespace, messageArg: string, context?: LogContext) { const labels: LokiLabels = { service: 'ORM', }; diff --git a/backend/src/orm.ts b/backend/src/orm.ts index 88decd92..93feea7a 100644 --- a/backend/src/orm.ts +++ b/backend/src/orm.ts @@ -28,9 +28,7 @@ export async function initORM(testingMode: boolean = false) { } export function forkEntityManager(): EntityManager { if (!orm) { - throw Error( - 'Accessing the Entity Manager before the ORM is fully initialized.' - ); + throw Error('Accessing the Entity Manager before the ORM is fully initialized.'); } return orm.em.fork(); } diff --git a/backend/src/routes/learningObjects.ts b/backend/src/routes/learningObjects.ts index 416602b5..681baa2f 100644 --- a/backend/src/routes/learningObjects.ts +++ b/backend/src/routes/learningObjects.ts @@ -1,8 +1,5 @@ import express from 'express'; -import { - getAllLearningObjects, - getLearningObject, -} from '../controllers/learningObjects.js'; +import { getAllLearningObjects, getLearningObject } from '../controllers/learningObjects.js'; const router = express.Router(); diff --git a/backend/src/routes/question.ts b/backend/src/routes/question.ts index f683d998..2e5db624 100644 --- a/backend/src/routes/question.ts +++ b/backend/src/routes/question.ts @@ -15,8 +15,7 @@ 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}`, diff --git a/backend/src/services/learningObjects.ts b/backend/src/services/learningObjects.ts index 4bfed3dc..5ea9f3aa 100644 --- a/backend/src/services/learningObjects.ts +++ b/backend/src/services/learningObjects.ts @@ -1,20 +1,12 @@ import { DWENGO_API_BASE } from '../config.js'; import { fetchWithLogging } from '../util/apiHelper.js'; -import { - FilteredLearningObject, - LearningObjectMetadata, - LearningObjectNode, - LearningPathResponse, -} from '../interfaces/learningPath.js'; +import { FilteredLearningObject, LearningObjectMetadata, LearningObjectNode, LearningPathResponse } from '../interfaces/learningPath.js'; import { fetchLearningPaths } from './learningPaths.js'; import { getLogger, Logger } from '../logging/initalize.js'; const logger: Logger = getLogger(); -function filterData( - data: LearningObjectMetadata, - htmlUrl: string -): FilteredLearningObject { +function filterData(data: LearningObjectMetadata, htmlUrl: string): FilteredLearningObject { return { key: data.hruid, // Hruid learningObject (not path) _id: data._id, @@ -41,10 +33,7 @@ function filterData( /** * Fetches a single learning object by its HRUID */ -export async function getLearningObjectById( - hruid: string, - language: string -): Promise { +export async function getLearningObjectById(hruid: string, language: string): Promise { const metadataUrl = `${DWENGO_API_BASE}/learningObject/getMetadata?hruid=${hruid}&language=${language}`; const metadata = await fetchWithLogging( metadataUrl, @@ -63,26 +52,12 @@ export async function getLearningObjectById( /** * Generic function to fetch learning objects (full data or just HRUIDs) */ -async function fetchLearningObjects( - hruid: string, - full: boolean, - language: string -): Promise { +async function fetchLearningObjects(hruid: string, full: boolean, language: string): Promise { try { - const learningPathResponse: LearningPathResponse = - await fetchLearningPaths( - [hruid], - language, - `Learning path for HRUID "${hruid}"` - ); + const learningPathResponse: LearningPathResponse = await fetchLearningPaths([hruid], language, `Learning path for HRUID "${hruid}"`); - if ( - !learningPathResponse.success || - !learningPathResponse.data?.length - ) { - logger.warn( - `⚠️ WARNING: Learning path "${hruid}" exists but contains no learning objects.` - ); + if (!learningPathResponse.success || !learningPathResponse.data?.length) { + logger.warn(`⚠️ WARNING: Learning path "${hruid}" exists but contains no learning objects.`); return []; } @@ -92,12 +67,9 @@ async function fetchLearningObjects( return nodes.map((node) => node.learningobject_hruid); } - return await Promise.all( - nodes.map(async (node) => getLearningObjectById( - node.learningobject_hruid, - language - )) - ).then((objects) => objects.filter((obj): obj is FilteredLearningObject => obj !== null)); + return await Promise.all(nodes.map(async (node) => getLearningObjectById(node.learningobject_hruid, language))).then((objects) => + objects.filter((obj): obj is FilteredLearningObject => obj !== null) + ); } catch (error) { logger.error('❌ Error fetching learning objects:', error); return []; @@ -107,23 +79,13 @@ async function fetchLearningObjects( /** * Fetch full learning object data (metadata) */ -export async function getLearningObjectsFromPath( - hruid: string, - language: string -): Promise { - return (await fetchLearningObjects( - hruid, - true, - language - )) as FilteredLearningObject[]; +export async function getLearningObjectsFromPath(hruid: string, language: string): Promise { + return (await fetchLearningObjects(hruid, true, language)) as FilteredLearningObject[]; } /** * Fetch only learning object HRUIDs */ -export async function getLearningObjectIdsFromPath( - hruid: string, - language: string -): Promise { +export async function getLearningObjectIdsFromPath(hruid: string, language: string): Promise { return (await fetchLearningObjects(hruid, false, language)) as string[]; } diff --git a/backend/src/services/learningPaths.ts b/backend/src/services/learningPaths.ts index 52b168ee..7a32cd7b 100644 --- a/backend/src/services/learningPaths.ts +++ b/backend/src/services/learningPaths.ts @@ -1,18 +1,11 @@ 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(); -export async function fetchLearningPaths( - hruids: string[], - language: string, - source: string -): Promise { +export async function fetchLearningPaths(hruids: string[], language: string, source: string): Promise { if (hruids.length === 0) { return { success: false, @@ -25,11 +18,7 @@ export async function fetchLearningPaths( const apiUrl = `${DWENGO_API_BASE}/learningPath/getPathsFromIdList`; const params = { pathIdList: JSON.stringify({ hruids }), language }; - const learningPaths = await fetchWithLogging( - apiUrl, - `Learning paths for ${source}`, - params - ); + const learningPaths = await fetchWithLogging(apiUrl, `Learning paths for ${source}`, params); if (!learningPaths || learningPaths.length === 0) { logger.warn(`⚠️ WARNING: No learning paths found for ${source}.`); @@ -48,17 +37,10 @@ export async function fetchLearningPaths( }; } -export async function searchLearningPaths( - query: string, - language: string -): Promise { +export async function searchLearningPaths(query: string, language: string): Promise { const apiUrl = `${DWENGO_API_BASE}/learningPath/search`; const params = { all: query, language }; - const searchResults = await fetchWithLogging( - apiUrl, - `Search learning paths with query "${query}"`, - params - ); + const searchResults = await fetchWithLogging(apiUrl, `Search learning paths with query "${query}"`, params); return searchResults ?? []; } diff --git a/backend/src/util/apiHelper.ts b/backend/src/util/apiHelper.ts index 83c3e975..b8c1b943 100644 --- a/backend/src/util/apiHelper.ts +++ b/backend/src/util/apiHelper.ts @@ -12,11 +12,7 @@ const logger: Logger = getLogger(); * @param params * @returns The response data if successful, or null if an error occurs. */ -export async function fetchWithLogging( - url: string, - description: string, - params?: Record -): Promise { +export async function fetchWithLogging(url: string, description: string, params?: Record): Promise { try { const config: AxiosRequestConfig = params ? { params } : {}; @@ -25,19 +21,14 @@ export async function fetchWithLogging( } catch (error: any) { if (error.response) { if (error.response.status === 404) { - logger.debug( - `❌ ERROR: ${description} not found (404) at "${url}".` - ); + logger.debug(`❌ ERROR: ${description} not found (404) at "${url}".`); } else { logger.debug( `❌ ERROR: Failed to fetch ${description}. Status: ${error.response.status} - ${error.response.statusText} (URL: "${url}")` ); } } else { - logger.debug( - `❌ ERROR: Network or unexpected error when fetching ${description}:`, - error.message - ); + logger.debug(`❌ ERROR: Network or unexpected error when fetching ${description}:`, error.message); } return null; } diff --git a/backend/src/util/envvars.ts b/backend/src/util/envvars.ts index 5a06ac22..6d10e296 100644 --- a/backend/src/util/envvars.ts +++ b/backend/src/util/envvars.ts @@ -36,9 +36,7 @@ export function getNumericEnvVar(envVar: EnvVar): number { const valueString = getEnvVar(envVar); const value = parseInt(valueString); if (isNaN(value)) { - throw new Error( - `Invalid value for environment variable ${envVar.key}: ${valueString}. Expected a number.` - ); + throw new Error(`Invalid value for environment variable ${envVar.key}: ${valueString}. Expected a number.`); } else { return value; } diff --git a/backend/src/util/translationHelper.ts b/backend/src/util/translationHelper.ts index 815a685a..d0a83b02 100644 --- a/backend/src/util/translationHelper.ts +++ b/backend/src/util/translationHelper.ts @@ -12,15 +12,8 @@ export function loadTranslations(language: string): T { const yamlFile = fs.readFileSync(filePath, 'utf8'); return yaml.load(yamlFile) as T; } catch (error) { - logger.warn( - `Cannot load translation for ${language}, fallen back to dutch`, - error - ); - const fallbackPath = path.join( - process.cwd(), - '_i18n', - `${FALLBACK_LANG}.yml` - ); + logger.warn(`Cannot load translation for ${language}, fallen back to dutch`, error); + const fallbackPath = path.join(process.cwd(), '_i18n', `${FALLBACK_LANG}.yml`); return yaml.load(fs.readFileSync(fallbackPath, 'utf8')) as T; } } diff --git a/backend/tests/data/users.test.ts b/backend/tests/data/users.test.ts index 887748a2..87149050 100644 --- a/backend/tests/data/users.test.ts +++ b/backend/tests/data/users.test.ts @@ -16,12 +16,9 @@ describe('StudentRepository', () => { }); it('should return the queried student after he was added', async () => { - await studentRepository.insert( - new Student(username, firstName, lastName) - ); + await studentRepository.insert(new Student(username, firstName, lastName)); - const retrievedStudent = - await studentRepository.findByUsername(username); + const retrievedStudent = await studentRepository.findByUsername(username); expect(retrievedStudent).toBeTruthy(); expect(retrievedStudent?.firstName).toBe(firstName); expect(retrievedStudent?.lastName).toBe(lastName); @@ -30,8 +27,7 @@ describe('StudentRepository', () => { it('should no longer return the queried student after he was removed again', async () => { await studentRepository.deleteByUsername(username); - const retrievedStudent = - await studentRepository.findByUsername(username); + const retrievedStudent = await studentRepository.findByUsername(username); expect(retrievedStudent).toBeNull(); }); }); diff --git a/eslint.config.ts b/eslint.config.ts index 0ec7d58a..6a59a583 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -16,12 +16,7 @@ export default [ prettierConfig, includeIgnoreFile(gitignorePath), { - ignores: [ - '**/dist/**', - '**/.node_modules/**', - '**/coverage/**', - '**/.github/**', - ], + ignores: ['**/dist/**', '**/.node_modules/**', '**/coverage/**', '**/.github/**'], files: ['**/*.ts', '**/*.cts', '**.*.mts', '**/*.ts'], }, { diff --git a/frontend/eslint.config.ts b/frontend/eslint.config.ts index 76822361..e9359af7 100644 --- a/frontend/eslint.config.ts +++ b/frontend/eslint.config.ts @@ -15,8 +15,8 @@ const vueConfig = defineConfigWithVueTs( name: "app/files-to-lint", files: ["**/*.{ts,mts,tsx,vue}"], rules: { - 'no-useless-assignment': 'off' // Depend on `no-unused-vars` to catch this - } + "no-useless-assignment": "off", // Depend on `no-unused-vars` to catch this + }, }, {