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; | ||||
|  |  | |||
		Reference in a new issue
	
	 Gabriellvl
						Gabriellvl