fix: lint + format
This commit is contained in:
		
							parent
							
								
									ac778981e2
								
							
						
					
					
						commit
						acfffda82d
					
				
					 8 changed files with 162 additions and 118 deletions
				
			
		|  | @ -1,9 +1,8 @@ | |||
| import express, { Express, Response } from 'express'; | ||||
| import initORM from './orm.js'; | ||||
| import themeRoutes from './routes/themes.js'; | ||||
| import learningPathRoutes from './routes/learningPaths.js' | ||||
| import learningObjectRoutes from './routes/learningObjects.js' | ||||
| 
 | ||||
| import learningPathRoutes from './routes/learningPaths.js'; | ||||
| import learningObjectRoutes from './routes/learningObjects.js'; | ||||
| 
 | ||||
| const app: Express = express(); | ||||
| const port: string | number = process.env.PORT || 3000; | ||||
|  |  | |||
|  | @ -1,9 +1,8 @@ | |||
| // Can be placed in dotenv but found it redundant
 | ||||
| 
 | ||||
| // import dotenv from "dotenv";
 | ||||
| // Import dotenv from "dotenv";
 | ||||
| 
 | ||||
| // Load .env file
 | ||||
| // dotenv.config();
 | ||||
| 
 | ||||
| export const DWENGO_API_BASE = "https://dwengo.org/backend/api"; | ||||
| // Dotenv.config();
 | ||||
| 
 | ||||
| export const DWENGO_API_BASE = 'https://dwengo.org/backend/api'; | ||||
|  |  | |||
|  | @ -1,20 +1,28 @@ | |||
| import { Request, Response } from "express"; | ||||
| import { getLearningObjectsFromPath } from "../services/learningObjects.js"; | ||||
| import { Request, Response } from 'express'; | ||||
| import { getLearningObjectsFromPath } from '../services/learningObjects.js'; | ||||
| 
 | ||||
| export async function getAllLearningObjects(req: Request, res: Response): Promise<void> { | ||||
| export async function getAllLearningObjects( | ||||
|     req: Request, | ||||
|     res: Response | ||||
| ): Promise<void> { | ||||
|     try { | ||||
|         const { hruid } = req.params; | ||||
|         const language = req.query.language as string || "nl"; // Default to Dutch;
 | ||||
|         const language = (req.query.language as string) || 'nl'; // Default to Dutch;
 | ||||
| 
 | ||||
|         if (!language) { | ||||
|             res.status(400).json({ error: "Language query parameter is required." }); | ||||
|             res.status(400).json({ | ||||
|                 error: 'Language query parameter is required.', | ||||
|             }); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         const learningObjects = await getLearningObjectsFromPath(hruid, language); | ||||
|         const learningObjects = await getLearningObjectsFromPath( | ||||
|             hruid, | ||||
|             language | ||||
|         ); | ||||
|         res.json(learningObjects); | ||||
|     } catch (error) { | ||||
|         console.error("Error fetching learning objects:", error); | ||||
|         res.status(500).json({ error: "Internal server error" }); | ||||
|         console.error('Error fetching learning objects:', error); | ||||
|         res.status(500).json({ error: 'Internal server error' }); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,19 +1,24 @@ | |||
| import { Request, Response } from "express"; | ||||
| import axios from "axios"; | ||||
| import { themes } from "../data/themes.js"; | ||||
| import { DWENGO_API_BASE } from "../config/config.js"; | ||||
| import { Request, Response } from 'express'; | ||||
| import axios from 'axios'; | ||||
| import { themes } from '../data/themes.js'; | ||||
| import { DWENGO_API_BASE } from '../config/config.js'; | ||||
| 
 | ||||
| /** | ||||
|  * Fetch learning paths for a given list of HRUIDs. | ||||
|  * This function sends a request to the Dwengo API with the provided HRUIDs. | ||||
|  */ | ||||
| export async function getLearningPathsFromIds(req: Request, res: Response): Promise<void> { | ||||
| export async function getLearningPathsFromIds( | ||||
|     req: Request, | ||||
|     res: Response | ||||
| ): Promise<void> { | ||||
|     try { | ||||
|         const { hruids } = req.query; | ||||
|         const language = (req.query.language as string) || "nl"; // Default to Dutch
 | ||||
|         const language = (req.query.language as string) || 'nl'; // Default to Dutch
 | ||||
| 
 | ||||
|         if (!hruids) { | ||||
|             res.status(400).json({ error: "Missing required parameter: hruids" }); | ||||
|             res.status(400).json({ | ||||
|                 error: 'Missing required parameter: hruids', | ||||
|             }); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|  | @ -21,17 +26,20 @@ export async function getLearningPathsFromIds(req: Request, res: Response): Prom | |||
|         const hruidList = Array.isArray(hruids) ? hruids : [hruids]; | ||||
| 
 | ||||
|         // Request learning paths from Dwengo API
 | ||||
|         const response = await axios.get(`${DWENGO_API_BASE}/learningPath/getPathsFromIdList`, { | ||||
|             params: { | ||||
|                 pathIdList: JSON.stringify({ hruids: hruidList }), | ||||
|                 language | ||||
|         const response = await axios.get( | ||||
|             `${DWENGO_API_BASE}/learningPath/getPathsFromIdList`, | ||||
|             { | ||||
|                 params: { | ||||
|                     pathIdList: JSON.stringify({ hruids: hruidList }), | ||||
|                     language, | ||||
|                 }, | ||||
|             } | ||||
|         }); | ||||
|         ); | ||||
| 
 | ||||
|         res.json(response.data); | ||||
|     } catch (error) { | ||||
|         console.error("Error fetching learning paths:", error); | ||||
|         res.status(500).json({ error: "Internal server error" }); | ||||
|         console.error('Error fetching learning paths:', error); | ||||
|         res.status(500).json({ error: 'Internal server error' }); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -40,16 +48,21 @@ export async function getLearningPathsFromIds(req: Request, res: Response): Prom | |||
|  * First retrieves the HRUIDs associated with the theme, | ||||
|  * then fetches the corresponding learning paths from the Dwengo API. | ||||
|  */ | ||||
| export async function getLearningPathsByTheme(req: Request, res: Response): Promise<void> { | ||||
| export async function getLearningPathsByTheme( | ||||
|     req: Request, | ||||
|     res: Response | ||||
| ): Promise<void> { | ||||
|     try { | ||||
|         const themeKey = req.params.theme; | ||||
|         const language = (req.query.language as string) || "nl"; // Default to Dutch
 | ||||
|         const language = (req.query.language as string) || 'nl'; // Default to Dutch
 | ||||
| 
 | ||||
|         // Find the theme by its title
 | ||||
|         const theme = themes.find((t) => t.title === themeKey); | ||||
|         const theme = themes.find((t) => { | ||||
|             return t.title === themeKey; | ||||
|         }); | ||||
| 
 | ||||
|         if (!theme) { | ||||
|             res.status(404).json({ error: "Theme not found" }); | ||||
|             res.status(404).json({ error: 'Theme not found' }); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|  | @ -57,69 +70,85 @@ export async function getLearningPathsByTheme(req: Request, res: Response): Prom | |||
|         const hruidList = theme.hruids; | ||||
| 
 | ||||
|         // Request learning paths from Dwengo API using the extracted HRUIDs
 | ||||
|         const response = await axios.get(`${DWENGO_API_BASE}/learningPath/getPathsFromIdList`, { | ||||
|             params: { | ||||
|                 pathIdList: JSON.stringify({ hruids: hruidList }), | ||||
|                 language | ||||
|         const response = await axios.get( | ||||
|             `${DWENGO_API_BASE}/learningPath/getPathsFromIdList`, | ||||
|             { | ||||
|                 params: { | ||||
|                     pathIdList: JSON.stringify({ hruids: hruidList }), | ||||
|                     language, | ||||
|                 }, | ||||
|             } | ||||
|         }); | ||||
|         ); | ||||
| 
 | ||||
|         res.json({ | ||||
|             theme: themeKey, | ||||
|             hruids: hruidList, | ||||
|             learningPaths: response.data | ||||
|             learningPaths: response.data, | ||||
|         }); | ||||
| 
 | ||||
|     } catch (error) { | ||||
|         console.error("Error fetching learning paths for theme:", error); | ||||
|         res.status(500).json({ error: "Internal server error" }); | ||||
|         console.error('Error fetching learning paths for theme:', error); | ||||
|         res.status(500).json({ error: 'Internal server error' }); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| export async function searchLearningPaths(req: Request, res: Response): Promise<void> { | ||||
| export async function searchLearningPaths( | ||||
|     req: Request, | ||||
|     res: Response | ||||
| ): Promise<void> { | ||||
|     try { | ||||
|         const query = req.query.query as string; | ||||
|         const language = (req.query.language as string) || "nl"; | ||||
|         const language = (req.query.language as string) || 'nl'; | ||||
| 
 | ||||
|         if (!query) { | ||||
|             res.status(400).json({ error: "Missing search query" }); | ||||
|             res.status(400).json({ error: 'Missing search query' }); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         const response = await axios.get(`${DWENGO_API_BASE}/learningPath/search`, { | ||||
|             params: { all: query, language } | ||||
|         }); | ||||
|         const response = await axios.get( | ||||
|             `${DWENGO_API_BASE}/learningPath/search`, | ||||
|             { | ||||
|                 params: { all: query, language }, | ||||
|             } | ||||
|         ); | ||||
| 
 | ||||
|         res.json(response.data); | ||||
|     } catch (error) { | ||||
|         console.error("Error searching learning paths:", error); | ||||
|         res.status(500).json({ error: "Internal server error" }); | ||||
|         console.error('Error searching learning paths:', error); | ||||
|         res.status(500).json({ error: 'Internal server error' }); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| export async function getAllLearningPaths(req: Request, res: Response): Promise<void> { | ||||
| export async function getAllLearningPaths( | ||||
|     req: Request, | ||||
|     res: Response | ||||
| ): Promise<void> { | ||||
|     try { | ||||
|         const language = (req.query.language as string) || "nl"; // Default to Dutch
 | ||||
|         const language = (req.query.language as string) || 'nl'; // Default to Dutch
 | ||||
| 
 | ||||
|         // Collect all HRUIDs from all themes
 | ||||
|         const allHruids: string[] = themes.flatMap(theme => theme.hruids); | ||||
|         const allHruids: string[] = themes.flatMap((theme) => { | ||||
|             return theme.hruids; | ||||
|         }); | ||||
| 
 | ||||
|         if (allHruids.length === 0) { | ||||
|             res.status(404).json({ error: "No HRUIDs found in themes" }); | ||||
|             res.status(404).json({ error: 'No HRUIDs found in themes' }); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         // Call the Dwengo API with all HRUIDs combined
 | ||||
|         const response = await axios.get(`${DWENGO_API_BASE}/learningPath/getPathsFromIdList`, { | ||||
|             params: { | ||||
|                 pathIdList: JSON.stringify({ hruids: allHruids }), | ||||
|                 language | ||||
|         const response = await axios.get( | ||||
|             `${DWENGO_API_BASE}/learningPath/getPathsFromIdList`, | ||||
|             { | ||||
|                 params: { | ||||
|                     pathIdList: JSON.stringify({ hruids: allHruids }), | ||||
|                     language, | ||||
|                 }, | ||||
|             } | ||||
|         }); | ||||
|         ); | ||||
| 
 | ||||
|         res.json(response.data); | ||||
|     } catch (error) { | ||||
|         console.error("Error fetching all learning paths:", error); | ||||
|         res.status(500).json({ error: "Internal server error" }); | ||||
|         console.error('Error fetching all learning paths:', error); | ||||
|         res.status(500).json({ error: 'Internal server error' }); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,11 +1,11 @@ | |||
| import express from "express"; | ||||
| import { getAllLearningObjects } from "../controllers/learningObjects.js"; | ||||
| import express from 'express'; | ||||
| import { getAllLearningObjects } from '../controllers/learningObjects.js'; | ||||
| 
 | ||||
| const router = express.Router(); | ||||
| 
 | ||||
| // arg: hruid learningPath
 | ||||
| // query: language
 | ||||
| // Arg: hruid learningPath
 | ||||
| // Query: language
 | ||||
| // Route to fetch list of learning objects based on hruid of learning path
 | ||||
| router.get("/:hruid", getAllLearningObjects); | ||||
| router.get('/:hruid', getAllLearningObjects); | ||||
| 
 | ||||
| export default router; | ||||
|  |  | |||
|  | @ -1,23 +1,28 @@ | |||
| import express from "express"; | ||||
| import { getLearningPathsFromIds, getLearningPathsByTheme, getAllLearningPaths, searchLearningPaths } from "../controllers/learningPaths.js"; | ||||
| import express from 'express'; | ||||
| import { | ||||
|     getLearningPathsFromIds, | ||||
|     getLearningPathsByTheme, | ||||
|     getAllLearningPaths, | ||||
|     searchLearningPaths, | ||||
| } from '../controllers/learningPaths.js'; | ||||
| 
 | ||||
| const router = express.Router(); | ||||
| 
 | ||||
| // query: language
 | ||||
| // Query: language
 | ||||
| // Route to fetch learning paths based on a list of HRUIDs
 | ||||
| router.get("/", getLearningPathsFromIds); | ||||
| router.get('/', getLearningPathsFromIds); | ||||
| 
 | ||||
| // query: language
 | ||||
| // Query: language
 | ||||
| // Route to fetch all possible learning paths
 | ||||
| router.get("/all", getAllLearningPaths); | ||||
| router.get('/all', getAllLearningPaths); | ||||
| 
 | ||||
| // query: language
 | ||||
| // Query: language
 | ||||
| // Route to fetch learning paths based on a searchterm
 | ||||
| router.get("/search", searchLearningPaths); | ||||
| router.get('/search', searchLearningPaths); | ||||
| 
 | ||||
| // arg: theme id
 | ||||
| // query: language
 | ||||
| // Arg: theme id
 | ||||
| // Query: language
 | ||||
| // Route to fetch learning paths based on a theme
 | ||||
| router.get("/theme/:theme", getLearningPathsByTheme); | ||||
| router.get('/theme/:theme', getLearningPathsByTheme); | ||||
| 
 | ||||
| export default router; | ||||
|  |  | |||
|  | @ -3,11 +3,11 @@ import { getThemes, getThemeByTitle } from '../controllers/themes.js'; | |||
| 
 | ||||
| const router = express.Router(); | ||||
| 
 | ||||
| // query: language
 | ||||
| // Query: language
 | ||||
| //  Route to fetch list of {key, title, description, image} themes in their respective language
 | ||||
| router.get('/', getThemes); | ||||
| 
 | ||||
| // arg: theme (key)
 | ||||
| // Arg: theme (key)
 | ||||
| //  Route to fetch list of hruids based on theme
 | ||||
| router.get('/:theme', getThemeByTitle); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| import axios from "axios"; | ||||
| import { DWENGO_API_BASE } from "../config/config.js"; | ||||
| import axios from 'axios'; | ||||
| import { DWENGO_API_BASE } from '../config/config.js'; | ||||
| 
 | ||||
| interface LearningObjectNode { | ||||
|     _id: string; | ||||
|  | @ -8,15 +8,47 @@ interface LearningObjectNode { | |||
|     language: string; | ||||
| } | ||||
| 
 | ||||
| function filterLearningObjectMetadata(data: any, htmlUrl: string) { | ||||
|     return { | ||||
|         key: data.hruid, | ||||
|         // Hruid learningObject (not path)
 | ||||
|         _id: data._id, | ||||
|         uuid: data.uuid, | ||||
|         version: data.version, | ||||
| 
 | ||||
| export async function getLearningObjectsFromPath(hruid: string, language: string) { | ||||
|         title: data.title, | ||||
|         html_url: htmlUrl, | ||||
|         // Html content object
 | ||||
|         language: data.language, | ||||
|         difficulty: data.difficulty, | ||||
|         estimated_time: data.estimated_time, | ||||
|         available: data.available, | ||||
|         teacher_exclusive: data.teacher_exclusive, | ||||
|         educational_goals: data.educational_goals, | ||||
|         // List with learningObjects
 | ||||
|         keywords: data.keywords, | ||||
|         // For search
 | ||||
|         description: data.description, | ||||
|         // For search (not an actual description)
 | ||||
|         target_ages: data.target_ages, | ||||
| 
 | ||||
|         // Skos concepts needed ??
 | ||||
|         // Content type needed ??
 | ||||
|         // Content location ??
 | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| export async function getLearningObjectsFromPath( | ||||
|     hruid: string, | ||||
|     language: string | ||||
| ) { | ||||
|     try { | ||||
|         const learningPathUrl = `${DWENGO_API_BASE}/learningPath/${hruid}/${language}`; | ||||
|         const learningPathResponse = await axios.get(learningPathUrl); | ||||
|         const nodes = learningPathResponse.data.nodes; | ||||
| 
 | ||||
|         if (!nodes || nodes.length === 0) { | ||||
|             throw new Error("No learning objects found in this learning path."); | ||||
|             throw new Error('No learning objects found in this learning path.'); | ||||
|         } | ||||
| 
 | ||||
|         return await Promise.all( | ||||
|  | @ -24,44 +56,16 @@ export async function getLearningObjectsFromPath(hruid: string, language: string | |||
|                 const metadataUrl = `${DWENGO_API_BASE}/learningObject/getMetadata?hruid=${node.learningobject_hruid}&version=${node.version}&language=${language}`; | ||||
|                 const metadataResponse = await axios.get(metadataUrl); | ||||
| 
 | ||||
|                 const html_url = `${DWENGO_API_BASE}/learningObject/getRaw?hruid=${node.learningobject_hruid}&version=${node.version}&language=${language}`; | ||||
|                 const htmlUrl = `${DWENGO_API_BASE}/learningObject/getRaw?hruid=${node.learningobject_hruid}&version=${node.version}&language=${language}`; | ||||
| 
 | ||||
|                 return filterLearningObjectMetadata(metadataResponse.data, html_url); | ||||
|                 return filterLearningObjectMetadata( | ||||
|                     metadataResponse.data, | ||||
|                     htmlUrl | ||||
|                 ); | ||||
|             }) | ||||
|         ); | ||||
| 
 | ||||
|     } catch (error) { | ||||
|         console.error("Error fetching learning objects:", error); | ||||
|         throw new Error("Failed to fetch learning objects."); | ||||
|         console.error('Error fetching learning objects:', error); | ||||
|         throw new Error('Failed to fetch learning objects.'); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| function filterLearningObjectMetadata(data: any, html_url: String) { | ||||
|     return { | ||||
|         key: data.hruid, | ||||
|                 // hruid learningObject (not path)
 | ||||
|         _id: data._id, | ||||
|         uuid: data.uuid, | ||||
|         version: data.version, | ||||
| 
 | ||||
|         title: data.title, | ||||
|         html_url, | ||||
|             // html content object
 | ||||
|         language: data.language, | ||||
|         difficulty: data.difficulty, | ||||
|         estimated_time: data.estimated_time, | ||||
|         available: data.available, | ||||
|         teacher_exclusive: data.teacher_exclusive, | ||||
|         educational_goals: data.educational_goals, | ||||
|                 // list with learningObjects
 | ||||
|         keywords: data.keywords, | ||||
|                 // for search
 | ||||
|         description: data.description, | ||||
|                 // for search (not an actual description)
 | ||||
|         target_ages: data.target_ages, | ||||
| 
 | ||||
|         // skos concepts needed ??
 | ||||
|         // content type needed ??
 | ||||
|         // content location ??
 | ||||
|     }; | ||||
| } | ||||
|  |  | |||
		Reference in a new issue
	
	 Gabriellvl
						Gabriellvl