import os import json from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse, Response from fastapi.templating import Jinja2Templates class DynamicController: def __init__(self, data_dir: str): """Initialize the dynamic controller.""" self.router = APIRouter() self.templates = Jinja2Templates(directory="templates") self.data_dir = data_dir self.data = self._load_mock_data() self._add_dynamic_routes() def _load_mock_data(self): """Load mock data from a JSON file.""" with open("generated_data.json") as file: return json.load(file) def _add_dynamic_routes(self): """Scan data directory and create dynamic routes.""" for root, dirs, files in os.walk(self.data_dir): for directory in dirs: route_path = f"/{directory}" # Create route based on directory name directory_path = os.path.join(root, directory) # Register route dynamically self.router.add_api_route( route_path, self._serve_dynamic_template(directory, directory_path), methods=["GET"], response_class=HTMLResponse, ) def _serve_dynamic_template(self, route_name: str, directory_path: str): """Closure to serve templates for each route.""" async def route_handler(request: Request): # Look for index.html or render fallback content index_html = os.path.join(directory_path, "index.html") if os.path.exists(index_html): with open(index_html, "r", encoding="utf-8") as file: content = file.read() # Find the author for this route from preloaded data for category in self.data.get("categories", []): if category["path"] == route_name: author_name = category["author"] break # Pass required data to the template return self.templates.TemplateResponse( "category.html", { "request": request, "page_title": route_name.capitalize(), "content": content, "author": author_name, "data": self.data, # Pass additional data if needed }, ) # Fallback: Return a 404 if no content is found return Response(f"No content found for {route_name}", status_code=404) return route_handler