fix: splits route file door controller
This commit is contained in:
parent
6525e34f77
commit
9edc11aed1
2 changed files with 182 additions and 176 deletions
178
backend/src/controllers/themes.ts
Normal file
178
backend/src/controllers/themes.ts
Normal file
|
@ -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" });
|
||||
}
|
||||
};
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue