diff --git a/backend/src/app.ts b/backend/src/app.ts index fd792460..90a6f45b 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -1,7 +1,6 @@ import express, { Express, Response } from 'express'; import initORM from './orm.js'; -import themeRoutes from "./routes/themes.js"; - +import themeRoutes from './routes/themes.js'; const app: Express = express(); const port: string | number = process.env.PORT || 3000; @@ -13,8 +12,7 @@ app.get('/', (_, res: Response) => { }); }); -app.use("/theme", themeRoutes); - +app.use('/theme', themeRoutes); async function startServer() { await initORM(); diff --git a/backend/src/controllers/themes.ts b/backend/src/controllers/themes.ts index 27419989..442eb982 100644 --- a/backend/src/controllers/themes.ts +++ b/backend/src/controllers/themes.ts @@ -1,8 +1,8 @@ -import fs from "fs"; -import path from "path"; -import yaml from "js-yaml"; -import { Request, Response } from "express"; -import { themes } from "../data/themes.js"; +import fs from 'fs'; +import path from 'path'; +import yaml from 'js-yaml'; +import { Request, Response } from 'express'; +import { themes } from '../data/themes.js'; interface Translations { curricula_page: { @@ -15,44 +15,51 @@ interface Translations { */ function loadTranslations(language: string): Translations { try { - const filePath = path.join(process.cwd(), "_i18n", `${language}.yml`); - const yamlFile = fs.readFileSync(filePath, "utf8"); + const filePath = path.join(process.cwd(), '_i18n', `${language}.yml`); + const yamlFile = fs.readFileSync(filePath, 'utf8'); return yaml.load(yamlFile) as Translations; } catch (error) { - console.error(`Kan vertaling niet laden voor ${language}, fallback naar Nederlands`); + console.error( + `Kan vertaling niet laden voor ${language}, fallback naar Nederlands` + ); console.error(error); - const fallbackPath = path.join(process.cwd(), "_i18n", "nl.yml"); - return yaml.load(fs.readFileSync(fallbackPath, "utf8")) as Translations; + const fallbackPath = path.join(process.cwd(), '_i18n', 'nl.yml'); + return yaml.load(fs.readFileSync(fallbackPath, 'utf8')) as Translations; } } /** * GET /themes → Haalt de lijst met thema's op inclusief vertalingen */ -export function getThemes(req: Request, res: Response){ - const language = (req.query.language as string)?.toLowerCase() || "nl"; +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) => {return { - 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` - }}); + const themeList = themes.map((theme) => { + return { + 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); -}; +} /** * GET /themes/:theme → Geeft de HRUIDs terug voor een specifiek thema */ export function getThemeByTitle(req: Request, res: Response) { const themeKey = req.params.theme; - const theme = themes.find((t) => {return t.title === themeKey}); + const theme = themes.find((t) => { + return t.title === themeKey; + }); if (theme) { res.json(theme.hruids); } else { - res.status(404).json({ error: "Thema niet gevonden" }); + res.status(404).json({ error: 'Thema niet gevonden' }); } -}; +} diff --git a/backend/src/data/themes.ts b/backend/src/data/themes.ts index 5a7e3d76..dd79400c 100644 --- a/backend/src/data/themes.ts +++ b/backend/src/data/themes.ts @@ -5,116 +5,192 @@ export interface Theme { export const themes: Theme[] = [ { - title: "kiks", + title: 'kiks', hruids: [ - "pn_werking", "un_artificiele_intelligentie", "pn_klimaatverandering", - "kiks1_microscopie", "kiks2_practicum", "pn_digitalebeelden", - "kiks3_dl_basis", "kiks4_dl_gevorderd", "kiks5_classificatie", - "kiks6_regressie", "kiks7_ethiek", "kiks8_eindtermen" - ] + 'pn_werking', + 'un_artificiele_intelligentie', + 'pn_klimaatverandering', + 'kiks1_microscopie', + 'kiks2_practicum', + 'pn_digitalebeelden', + 'kiks3_dl_basis', + 'kiks4_dl_gevorderd', + 'kiks5_classificatie', + 'kiks6_regressie', + 'kiks7_ethiek', + 'kiks8_eindtermen', + ], }, { - title: "art", + title: 'art', hruids: [ - "pn_werking", "un_artificiele_intelligentie", "art1", "art2", "art3" - ] + 'pn_werking', + 'un_artificiele_intelligentie', + 'art1', + 'art2', + 'art3', + ], }, { - title: "socialrobot", - hruids: [ - "sr0_lkr", "sr0_lln", "sr1", "sr2", "sr3", "sr4" - ] + title: 'socialrobot', + hruids: ['sr0_lkr', 'sr0_lln', 'sr1', 'sr2', 'sr3', 'sr4'], }, { - title: "agriculture", + title: 'agriculture', hruids: [ - "pn_werking", "un_artificiele_intelligentie", "agri_landbouw", "agri_lopendeband" - ] + 'pn_werking', + 'un_artificiele_intelligentie', + 'agri_landbouw', + 'agri_lopendeband', + ], }, { - title: "wegostem", - hruids: [ - "wegostem" - ] + title: 'wegostem', + hruids: ['wegostem'], }, { - title: "computational_thinking", + title: 'computational_thinking', hruids: [ - "ct1_concepten", "ct2_concreet", "ct3_voorbeelden", "ct6_cases", - "ct9_impact", "ct10_bebras", "ct8_eindtermen", "ct7_historiek", - "ct5_kijkwijzer", "ct4_evaluatiekader" - ] + 'ct1_concepten', + 'ct2_concreet', + 'ct3_voorbeelden', + 'ct6_cases', + 'ct9_impact', + 'ct10_bebras', + 'ct8_eindtermen', + 'ct7_historiek', + 'ct5_kijkwijzer', + 'ct4_evaluatiekader', + ], }, { - title: "math_with_python", + title: 'math_with_python', hruids: [ - "pn_werking", "maths_pythagoras", "maths_spreidingsdiagrammen", - "maths_rechten", "maths_lineaireregressie", "maths_epidemie", - "pn_digitalebeelden", "maths_logica", "maths_parameters", - "maths_parabolen", "pn_regressie", "maths7_grafen", "maths8_statistiek" - ] + 'pn_werking', + 'maths_pythagoras', + 'maths_spreidingsdiagrammen', + 'maths_rechten', + 'maths_lineaireregressie', + 'maths_epidemie', + 'pn_digitalebeelden', + 'maths_logica', + 'maths_parameters', + 'maths_parabolen', + 'pn_regressie', + 'maths7_grafen', + 'maths8_statistiek', + ], }, { - title: "python_programming", + title: 'python_programming', hruids: [ - "pn_werking", "pn_datatypes", "pn_operatoren", "pn_structuren", - "pn_functies", "art2", "stem_insectbooks", "un_algoenprog" - ] + 'pn_werking', + 'pn_datatypes', + 'pn_operatoren', + 'pn_structuren', + 'pn_functies', + 'art2', + 'stem_insectbooks', + 'un_algoenprog', + ], }, { - title: "stem", + title: 'stem', hruids: [ - "pn_werking", "maths_spreidingsdiagrammen", "pn_digitalebeelden", - "maths_epidemie", "stem_ipadres", "pn_klimaatverandering", - "stem_rechten", "stem_lineaireregressie", "stem_insectbooks" - ] + 'pn_werking', + 'maths_spreidingsdiagrammen', + 'pn_digitalebeelden', + 'maths_epidemie', + 'stem_ipadres', + 'pn_klimaatverandering', + 'stem_rechten', + 'stem_lineaireregressie', + 'stem_insectbooks', + ], }, { - title: "care", + title: 'care', hruids: [ - "pn_werking", "un_artificiele_intelligentie", "aiz1_zorg", "aiz2_grafen", - "aiz3_unplugged", "aiz4_eindtermen", "aiz5_triage" - ] + 'pn_werking', + 'un_artificiele_intelligentie', + 'aiz1_zorg', + 'aiz2_grafen', + 'aiz3_unplugged', + 'aiz4_eindtermen', + 'aiz5_triage', + ], }, { - title: "chatbot", + title: 'chatbot', hruids: [ - "pn_werking", "un_artificiele_intelligentie", "cb5_chatbotunplugged", - "cb1_chatbot", "cb2_sentimentanalyse", "cb3_vervoegmachine", - "cb4_eindtermen", "cb6" - ] + 'pn_werking', + 'un_artificiele_intelligentie', + 'cb5_chatbotunplugged', + 'cb1_chatbot', + 'cb2_sentimentanalyse', + 'cb3_vervoegmachine', + 'cb4_eindtermen', + 'cb6', + ], }, { - title: "physical_computing", + title: 'physical_computing', hruids: [ - "pc_starttodwenguino", "pc_rijdenderobot", "pc_theremin", - "pc_leerlijn_introductie", "pc_leerlijn_invoer_verwerking_uitvoer", - "pc_leerlijn_basisprincipes_digitale_elektronica", - "pc_leerlijn_grafisch_naar_tekstueel", "pc_leerlijn_basis_programmeren", - "pc_leerlijn_van_µc_naar_plc", "pc_leerlijn_fiches_dwenguino", - "pc_leerlijn_seriele_monitor", "pc_leerlijn_bus_protocollen", - "pc_leerlijn_wifi", "pc_leerlijn_fiches_arduino", - "pc_leerlijn_project_lijnvolger", "pc_leerlijn_project_bluetooth", - "pc_leerlijn_hddclock", "pc_leerlijn_fysica_valbeweging", - "pc_leerlijn_luchtkwaliteit", "pc_leerlijn_weerstation", - "pc_leerlijn_g0", "pc_leerlijn_g1", "pc_leerlijn_g3", "pc_leerlijn_g4", - "pc_leerlijn_g5" - ] + 'pc_starttodwenguino', + 'pc_rijdenderobot', + 'pc_theremin', + 'pc_leerlijn_introductie', + 'pc_leerlijn_invoer_verwerking_uitvoer', + 'pc_leerlijn_basisprincipes_digitale_elektronica', + 'pc_leerlijn_grafisch_naar_tekstueel', + 'pc_leerlijn_basis_programmeren', + 'pc_leerlijn_van_µc_naar_plc', + 'pc_leerlijn_fiches_dwenguino', + 'pc_leerlijn_seriele_monitor', + 'pc_leerlijn_bus_protocollen', + 'pc_leerlijn_wifi', + 'pc_leerlijn_fiches_arduino', + 'pc_leerlijn_project_lijnvolger', + 'pc_leerlijn_project_bluetooth', + 'pc_leerlijn_hddclock', + 'pc_leerlijn_fysica_valbeweging', + 'pc_leerlijn_luchtkwaliteit', + 'pc_leerlijn_weerstation', + 'pc_leerlijn_g0', + 'pc_leerlijn_g1', + 'pc_leerlijn_g3', + 'pc_leerlijn_g4', + 'pc_leerlijn_g5', + ], }, { - title: "algorithms", + title: 'algorithms', hruids: [ - "art2", "anm1", "anm2", "anm3", "anm4", "anm11", "anm12", "anm13", - "anm14", "anm15", "anm16", "anm17", "maths_epidemie", "stem_insectbooks" - ] + 'art2', + 'anm1', + 'anm2', + 'anm3', + 'anm4', + 'anm11', + 'anm12', + 'anm13', + 'anm14', + 'anm15', + 'anm16', + 'anm17', + 'maths_epidemie', + 'stem_insectbooks', + ], }, { - title: "basics_ai", + title: 'basics_ai', hruids: [ - "un_artificiele_intelligentie", "org-dwengo-waisda-taal-murder-mistery", - "art1", "org-dwengo-waisda-beelden-emoties-herkennen", - "org-dwengo-waisda-beelden-unplugged-fax-lp", - "org-dwengo-waisda-beelden-teachable-machine" - ] - } + 'un_artificiele_intelligentie', + 'org-dwengo-waisda-taal-murder-mistery', + 'art1', + 'org-dwengo-waisda-beelden-emoties-herkennen', + 'org-dwengo-waisda-beelden-unplugged-fax-lp', + 'org-dwengo-waisda-beelden-teachable-machine', + ], + }, ]; diff --git a/backend/src/routes/themes.ts b/backend/src/routes/themes.ts index 6245349c..3185640e 100644 --- a/backend/src/routes/themes.ts +++ b/backend/src/routes/themes.ts @@ -1,9 +1,9 @@ -import express from "express"; -import { getThemes, getThemeByTitle } from "../controllers/themes.js"; +import express from 'express'; +import { getThemes, getThemeByTitle } from '../controllers/themes.js'; const router = express.Router(); -router.get("/", getThemes); -router.get("/:theme", getThemeByTitle); +router.get('/', getThemes); +router.get('/:theme', getThemeByTitle); export default router;