diff --git a/app/controllers/category_controller.py b/app/controllers/category_controller.py index d69c0ef..0573fff 100644 --- a/app/controllers/category_controller.py +++ b/app/controllers/category_controller.py @@ -3,6 +3,7 @@ import json from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates +from fastapi.responses import JSONResponse class CategoryController: @@ -22,6 +23,10 @@ class CategoryController: methods=["GET"], response_class=HTMLResponse, ) + self.router.add_api_route( + "/categories", self.list_categories, methods = ["GET"], response_class = JSONResponse + ) + def _load_data(self, data_file): """Load JSON data from a file.""" with open(data_file, "r", encoding="utf-8") as file: @@ -53,3 +58,11 @@ class CategoryController: }, ) return HTMLResponse("Kategori ikke fundet", status_code=404) + + async def list_categories(self, request: Request): + """Return a list of all categories with their name and path.""" + categories = [ + { "name": category["name"], "path": category["path"] } + for category in self.data.get( "categories", [] ) + ] + return JSONResponse( content = categories ) \ No newline at end of file diff --git a/app/controllers/dynamic_controller.py b/app/controllers/dynamic_controller.py index 6512a24..6c3db7a 100644 --- a/app/controllers/dynamic_controller.py +++ b/app/controllers/dynamic_controller.py @@ -61,5 +61,4 @@ class DynamicController: # Fallback: Return a 404 if no content is found return Response(f"No content found for {route_name}", status_code=404) - return route_handler diff --git a/app/controllers/route_to_web.py b/app/controllers/route_to_web.py new file mode 100644 index 0000000..0412f48 --- /dev/null +++ b/app/controllers/route_to_web.py @@ -0,0 +1,89 @@ +import json +import random + +from fastapi import APIRouter, Request, FastAPI +from fastapi.templating import Jinja2Templates +from app.controllers.category_controller import CategoryController + +class RouteToWeb: + def __init__(self, app: FastAPI): + """Initialize the controller.""" + self.router = APIRouter() + self.templates = Jinja2Templates(directory="templates") + self.app = app + self.category_controller = CategoryController() + self._add_routes() + self._add_global_middleware() + + def _add_routes(self): + """Add routes to the router.""" + @self.router.get("/route-list", tags=["system"]) + async def route_list(request: Request): + """Render route list with categories.""" + routes = [ + {"path": route.path, "name": route.name or "Unnamed"} + for route in self.app.routes + ] + categories = request.state.categories + return self.templates.TemplateResponse( + "route_list.html", + {"request": request, "routes": routes, "categories": categories, "page_title": "Route og Kategori Liste"}, + ) + + + + def _add_global_middleware(self): + """Middleware to add categories and next category globally to all requests.""" + + @self.app.middleware( "http" ) + async def add_categories_to_request(request: Request, call_next): + def generate_dynamic_description(category_name: str) -> str: + """Generate a dynamic and engaging link text for a category.""" + templates = [ + "Dyk ned i kategorien {category} og bliv inspireret!", + "Opdag alt, hvad du behøver at vide i kategorien {category}.", + "Udforsk {category}-kategorien og find noget nyt og spændende.", + "Lad dig fordybe i kategorien {category} – der er meget at se!", + "Find din næste læseoplevelse i {category}-kategorien.", + "Gå på opdagelse i kategorien {category} og bliv klogere.", + "Der venter spændende indhold i {category}-kategorien – klik her!", + "Vil du vide mere? Hele kategorien {category} er kun ét klik væk.", + "Læs videre i kategorien {category} og få ny inspiration.", + "Fordyb dig i {category}-kategorien og opdag nyt indhold.", + "Spring ind i {category}-kategorien og gå på opdagelse!", + "Find masser af viden og gode læseoplevelser i {category}-kategorien.", + "Udforsk hele kategorien {category} og bliv beriget med ny viden.", + "Der er mere at læse i {category}-kategorien – gå ikke glip af det!", + "Tag et dybere kig i kategorien {category} og bliv inspireret!" + ] + template = random.choice( templates ) + return template.format( category = category_name.lower() ) + """Inject categories and next category into request.state globally.""" + # Hent kategorier direkte fra CategoryController + categories_response = await self.category_controller.list_categories( request ) + categories_data = categories_response.body.decode() + categories = json.loads( categories_data ) + + # Tilføj kategorier til request.state + request.state.categories = categories + + # Find den aktuelle og næste kategori + current_path = request.url.path.split("/")[-1] + next_category = None + print(current_path) + + for index, category in enumerate( categories ): + print(category) + if category["path"] == current_path: + # Find næste kategori (cirkulær, hvis det er den sidste) + next_index = (index + 1) % len( categories ) + next_category = categories[next_index] + next_category["description"] = generate_dynamic_description( next_category["path"] ) + + break + + # Tilføj næste kategori til request.state + request.state.next_category = next_category + + response = await call_next( request ) + return response diff --git a/app/main.py b/app/main.py index f9c99bf..91762fd 100644 --- a/app/main.py +++ b/app/main.py @@ -1,6 +1,8 @@ from fastapi import FastAPI from contextlib import asynccontextmanager from fastapi.staticfiles import StaticFiles + +from app.controllers.route_to_web import RouteToWeb from app.services.markdown_processor import MarkdownProcessor from app.services.metadata_processor import MetadataProcessor from app.controllers.dynamic_controller import DynamicController @@ -38,11 +40,13 @@ class Application: def _include_routers(self): """Include all route controllers.""" category_controller = CategoryController() - dynamic_controller = DynamicController( "./data" ) + #dynamic_controller = DynamicController( "./data" ) + route_to_web = RouteToWeb(self.app) self.app.include_router( category_controller.router ) - self.app.include_router( dynamic_controller.router ) + #self.app.include_router( dynamic_controller.router ) + self.app.include_router(route_to_web.router) diff --git a/data/Kultur/index.html b/data/Kultur/index.html index 52efe50..3346e27 100644 --- a/data/Kultur/index.html +++ b/data/Kultur/index.html @@ -54,29 +54,29 @@
  • UCI El Corte Inglés: Den moderne biografoplevelse med de nyeste blockbusters. Sammenligneligt med Palads i København, men med en lidt mere luksuriøs oplevelse i selve komplekset.
  • - -