From 9edc11aed17e9de768f7b7c9f9433724765a6751 Mon Sep 17 00:00:00 2001 From: Gabriellvl Date: Wed, 26 Feb 2025 18:33:34 +0100 Subject: [PATCH] fix: splits route file door controller --- backend/src/controllers/themes.ts | 178 +++++++++++++++++++++++++++++ backend/src/routes/themes.ts | 180 +----------------------------- 2 files changed, 182 insertions(+), 176 deletions(-) create mode 100644 backend/src/controllers/themes.ts diff --git a/backend/src/controllers/themes.ts b/backend/src/controllers/themes.ts new file mode 100644 index 00000000..b76474b2 --- /dev/null +++ b/backend/src/controllers/themes.ts @@ -0,0 +1,178 @@ +import fs from "fs"; +import path from "path"; +import yaml from "js-yaml"; +import { Request, Response } from "express"; + +interface Theme { + title: string; + hruids: string[]; +} + +interface Translations { + curricula_page: { + [key: string]: { title: string; description?: string }; // Optioneel veld description + }; +} + +const themes: Theme[] = [ + { + 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" + ] + }, + { + title: "art", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "art1", "art2", "art3" + ] + }, + { + title: "socialrobot", + hruids: [ + "sr0_lkr", "sr0_lln", "sr1", "sr2", "sr3", "sr4" + ] + }, + { + title: "agriculture", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "agri_landbouw", "agri_lopendeband" + ] + }, + { + title: "wegostem", + hruids: [ + "wegostem" + ] + }, + { + title: "computational_thinking", + hruids: [ + "ct1_concepten", "ct2_concreet", "ct3_voorbeelden", "ct6_cases", + "ct9_impact", "ct10_bebras", "ct8_eindtermen", "ct7_historiek", + "ct5_kijkwijzer", "ct4_evaluatiekader" + ] + }, + { + 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" + ] + }, + { + title: "python_programming", + hruids: [ + "pn_werking", "pn_datatypes", "pn_operatoren", "pn_structuren", + "pn_functies", "art2", "stem_insectbooks", "un_algoenprog" + ] + }, + { + title: "stem", + hruids: [ + "pn_werking", "maths_spreidingsdiagrammen", "pn_digitalebeelden", + "maths_epidemie", "stem_ipadres", "pn_klimaatverandering", + "stem_rechten", "stem_lineaireregressie", "stem_insectbooks" + ] + }, + { + title: "care", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "aiz1_zorg", "aiz2_grafen", + "aiz3_unplugged", "aiz4_eindtermen", "aiz5_triage" + ] + }, + { + title: "chatbot", + hruids: [ + "pn_werking", "un_artificiele_intelligentie", "cb5_chatbotunplugged", + "cb1_chatbot", "cb2_sentimentanalyse", "cb3_vervoegmachine", + "cb4_eindtermen", "cb6" + ] + }, + { + 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" + ] + }, + { + title: "algorithms", + hruids: [ + "art2", "anm1", "anm2", "anm3", "anm4", "anm11", "anm12", "anm13", + "anm14", "anm15", "anm16", "anm17", "maths_epidemie", "stem_insectbooks" + ] + }, + { + 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" + ] + } +]; + +/** + * Laadt de vertalingen uit een YAML-bestand + */ +function loadTranslations(language: string): Translations { + try { + 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(error); + 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"; + 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` + }}); + + 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}); + + if (theme) { + res.json(theme.hruids); + } else { + res.status(404).json({ error: "Thema niet gevonden" }); + } +}; diff --git a/backend/src/routes/themes.ts b/backend/src/routes/themes.ts index c673ff26..6245349c 100644 --- a/backend/src/routes/themes.ts +++ b/backend/src/routes/themes.ts @@ -1,181 +1,9 @@ -import express, { Request, Response } from "express"; -import fs from "fs"; -import yaml from "js-yaml"; -import path from "path"; +import express from "express"; +import { getThemes, getThemeByTitle } from "../controllers/themes.js"; const router = express.Router(); -const themes = [ - { - 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" - ] - }, - { - title: "art", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "art1", "art2", "art3" - ] - }, - { - title: "socialrobot", - hruids: [ - "sr0_lkr", "sr0_lln", "sr1", "sr2", "sr3", "sr4" - ] - }, - { - title: "agriculture", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "agri_landbouw", "agri_lopendeband" - ] - }, - { - title: "wegostem", - hruids: [ - "wegostem" - ] - }, - { - title: "computational_thinking", - hruids: [ - "ct1_concepten", "ct2_concreet", "ct3_voorbeelden", "ct6_cases", - "ct9_impact", "ct10_bebras", "ct8_eindtermen", "ct7_historiek", - "ct5_kijkwijzer", "ct4_evaluatiekader" - ] - }, - { - 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" - ] - }, - { - title: "python_programming", - hruids: [ - "pn_werking", "pn_datatypes", "pn_operatoren", "pn_structuren", - "pn_functies", "art2", "stem_insectbooks", "un_algoenprog" - ] - }, - { - title: "stem", - hruids: [ - "pn_werking", "maths_spreidingsdiagrammen", "pn_digitalebeelden", - "maths_epidemie", "stem_ipadres", "pn_klimaatverandering", - "stem_rechten", "stem_lineaireregressie", "stem_insectbooks" - ] - }, - { - title: "care", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "aiz1_zorg", "aiz2_grafen", - "aiz3_unplugged", "aiz4_eindtermen", "aiz5_triage" - ] - }, - { - title: "chatbot", - hruids: [ - "pn_werking", "un_artificiele_intelligentie", "cb5_chatbotunplugged", - "cb1_chatbot", "cb2_sentimentanalyse", "cb3_vervoegmachine", - "cb4_eindtermen", "cb6" - ] - }, - { - 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" - ] - }, - { - title: "algorithms", - hruids: [ - "art2", "anm1", "anm2", "anm3", "anm4", "anm11", "anm12", "anm13", - "anm14", "anm15", "anm16", "anm17", "maths_epidemie", "stem_insectbooks" - ] - }, - { - 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" - ] - } -]; - - - -// Define interfaces for type safety -interface Theme { - title: string; - hruids: string[]; -} - -interface Translations { - curricula_page: { - [key: string]: { title: string; description?: string }; // Description is nu optioneel - }; -} - - -// Function to load translations from YAML files -function loadTranslations(language: string): Translations { - try { - 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("error", error); - const fallbackPath = path.join(process.cwd(), "_i18n", "nl.yml"); - return yaml.load(fs.readFileSync(fallbackPath, "utf8")) as Translations; - } -}; - -// **GET /themes** → Returns a list of all themes as { theme: "key", translation: "Title in requested language" } -router.get("", (req: Request, res: Response) => { - const language = (req.query.language as string)?.toLowerCase() || "nl"; // Default: Nederlands - const translations = loadTranslations(language); - - const themeList = (themes as Theme[]).map((theme) => {return { - key: theme.title, // The original key - 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** → Returns hruids for a theme -router.get("/:theme", (req: Request, res: Response) => { - const themeKey = req.params.theme; // This is the `title` in themes_hruids.json - - // Find the theme in the JSON list - const theme = (themes as Theme[]).find((t) => {return t.title === themeKey}); - - if (theme) { - res.json(theme.hruids); - } else { - res.status(404).json({ error: "Thema niet gevonden" }); - } -}); +router.get("/", getThemes); +router.get("/:theme", getThemeByTitle); export default router;