diff --git a/backend/src/controllers/learningPaths.ts b/backend/src/controllers/learningPaths.ts index c819b072..8868d7de 100644 --- a/backend/src/controllers/learningPaths.ts +++ b/backend/src/controllers/learningPaths.ts @@ -1,113 +1,44 @@ import { Request, Response } from 'express'; import { themes } from '../data/themes.js'; -import { DWENGO_API_BASE, FALLBACK_LANG } from '../config.js'; -import { fetchWithLogging } from '../util/apiHelper.js'; -import { fetchLearningPaths } from '../services/learningPaths.js'; -import { LearningPath } from '../interfaces/learningPath'; - +import { FALLBACK_LANG } from '../config.js'; +import { fetchLearningPaths, searchLearningPaths } from '../services/learningPaths.js'; /** - * Fetch learning paths based on HRUIDs or return all if no HRUIDs are provided. - * - If `hruids` are given -> fetch specific learning paths. - * - If `hruids` is missing -> return all available learning paths. + * Fetch learning paths based on query parameters. */ export async function getLearningPaths( req: Request, res: Response -): Promise { +): Promise { try { - const hruids = req.query.hruids; // Can be string or array + const hruids = req.query.hruid; + const themeKey = (req.query.theme as string); + const searchQuery = (req.query.search as string); const language = (req.query.language as string) || FALLBACK_LANG; - let hruidList: string[]; + 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) { + hruidList = theme.hruids; + } else { + res.status(404).json({ error: `Theme "${themeKey}" not found.` }); + return; + } + } else if (searchQuery) { + const searchResults = await searchLearningPaths(searchQuery, language); + res.json(searchResults); + return; } else { - // If no hruids are provided, fetch ALL learning paths - hruidList = themes.flatMap((theme) => { - return theme.hruids; - }); + hruidList = themes.flatMap((theme) => theme.hruids); } - const learningPaths = await fetchLearningPaths( - hruidList, - language, - `HRUIDs: ${hruidList.join(', ')}` - ); - - res.json(learningPaths); + const learningPaths = await fetchLearningPaths(hruidList, language, `HRUIDs: ${hruidList.join(', ')}`); + res.json(learningPaths.data); } catch (error) { console.error('❌ Unexpected error fetching learning paths:', error); res.status(500).json({ error: 'Internal server error' }); } } - -/** - * Fetch all learning paths for a specific theme. - */ -export async function getLearningPathsByTheme( - req: Request, - res: Response -): Promise { - try { - const themeKey = req.params.theme; - const language = (req.query.language as string) || FALLBACK_LANG; - - const theme = themes.find((t) => { - return t.title === themeKey; - }); - if (!theme) { - console.error(`⚠️ WARNING: Theme "${themeKey}" not found.`); - res.status(404).json({ error: 'Theme not found' }); - return; - } - - const response = await fetchLearningPaths( - theme.hruids, - language, - `theme "${themeKey}"` - ); - res.json({ - theme: themeKey, - hruids: theme.hruids, - ...response, - }); - } catch (error) { - console.error( - '❌ Unexpected error fetching learning paths by theme:', - error - ); - } -} - -/** - * Search learning paths by query. - */ -export async function searchLearningPaths( - req: Request, - res: Response -): Promise { - try { - const query = req.query.query as string; - const language = (req.query.language as string) || FALLBACK_LANG; - - if (!query) { - res.status(400).json({ error: 'Missing search query' }); - return; - } - - const apiUrl = `${DWENGO_API_BASE}/learningPath/search`; - const params = { all: query, language }; - - const searchResults = await fetchWithLogging( - apiUrl, - `Search learning paths with query "${query}"`, - params - ); - res.json(searchResults ?? []); - } catch (error) { - console.error('❌ Unexpected error searching learning paths:', error); - } -} diff --git a/backend/src/services/learningPaths.ts b/backend/src/services/learningPaths.ts index 734207db..d8ad90a2 100644 --- a/backend/src/services/learningPaths.ts +++ b/backend/src/services/learningPaths.ts @@ -44,3 +44,15 @@ export async function fetchLearningPaths( data: learningPaths, }; } + + +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); + return searchResults ?? []; +}