diff --git a/main.py b/main.py index 7633ce50..e3f23b01 100644 --- a/main.py +++ b/main.py @@ -377,6 +377,8 @@ async def vendor_root_path( # ============================================================================ logger.info("Registering platform public page routes:") logger.info(" - / (platform homepage)") +logger.info(" - /{platform_code}/ (platform-prefixed homepage for dev mode)") +logger.info(" - /{platform_code}/{slug} (platform-prefixed content pages)") logger.info(" - /{slug} (platform content pages: /about, /faq, /terms, /contact)") @@ -465,6 +467,167 @@ async def platform_homepage(request: Request, db: Session = Depends(get_db)): return templates.TemplateResponse("platform/homepage-default.html", context) +# ============================================================================ +# PLATFORM-PREFIXED ROUTES (Development mode: /oms/, /loyalty/, etc.) +# These routes handle path-based platform routing in development. +# In production, domain-based routing means these won't be needed. +# ============================================================================ + + +async def _serve_platform_homepage(request: Request, platform_code: str, db: Session): + """Helper function to serve platform homepage.""" + from app.services.content_page_service import content_page_service + from models.database.platform import Platform + + # Get platform from middleware or query directly + platform = getattr(request.state, "platform", None) + if not platform: + platform = db.query(Platform).filter( + Platform.code == platform_code.lower(), + Platform.is_active == True + ).first() + + if not platform: + raise HTTPException(status_code=404, detail=f"Platform not found: {platform_code}") + + # Load platform homepage from CMS + homepage = content_page_service.get_platform_page( + db, platform_id=platform.id, slug="home", include_unpublished=False + ) + if not homepage: + homepage = content_page_service.get_platform_page( + db, platform_id=platform.id, slug="platform_homepage", include_unpublished=False + ) + + # Load navigation + header_pages = content_page_service.list_platform_pages( + db, platform_id=platform.id, header_only=True, include_unpublished=False + ) + footer_pages = content_page_service.list_platform_pages( + db, platform_id=platform.id, footer_only=True, include_unpublished=False + ) + + # Build context + language = getattr(request.state, "language", "fr") + i18n_globals = get_jinja2_globals(language) + + if homepage: + template_name = homepage.template or "default" + template_path = f"platform/homepage-{template_name}.html" + logger.info(f"[PLATFORM] Rendering {platform.code} homepage: {template_path}") + + context = { + "request": request, + "page": homepage, + "platform": platform, + "header_pages": header_pages, + "footer_pages": footer_pages, + } + context.update(i18n_globals) + return templates.TemplateResponse(template_path, context) + + # Fallback + logger.info(f"[PLATFORM] No CMS homepage for {platform.code}, using default") + context = { + "request": request, + "platform": platform, + "header_pages": header_pages, + "footer_pages": footer_pages, + } + context.update(i18n_globals) + return templates.TemplateResponse("platform/homepage-default.html", context) + + +async def _serve_platform_content_page(request: Request, platform_code: str, slug: str, db: Session): + """Helper function to serve platform content page.""" + from app.services.content_page_service import content_page_service + from models.database.platform import Platform + + # Get platform + platform = getattr(request.state, "platform", None) + if not platform: + platform = db.query(Platform).filter( + Platform.code == platform_code.lower(), + Platform.is_active == True + ).first() + + if not platform: + raise HTTPException(status_code=404, detail=f"Platform not found: {platform_code}") + + # Load content page + page = content_page_service.get_platform_page( + db, platform_id=platform.id, slug=slug, include_unpublished=False + ) + if not page: + logger.warning(f"[PLATFORM] Page not found: /{platform_code}/{slug}") + raise HTTPException(status_code=404, detail=f"Page not found: {slug}") + + # Load navigation + header_pages = content_page_service.list_platform_pages( + db, platform_id=platform.id, header_only=True, include_unpublished=False + ) + footer_pages = content_page_service.list_platform_pages( + db, platform_id=platform.id, footer_only=True, include_unpublished=False + ) + + logger.info(f"[PLATFORM] Rendering {platform.code} page: {page.title} (/{slug})") + + language = getattr(request.state, "language", "fr") + i18n_globals = get_jinja2_globals(language) + + context = { + "request": request, + "page": page, + "platform": platform, + "header_pages": header_pages, + "footer_pages": footer_pages, + } + context.update(i18n_globals) + return templates.TemplateResponse("platform/content-page.html", context) + + +# Explicit routes for OMS platform +@app.get("/oms", response_class=RedirectResponse, include_in_schema=False) +async def oms_redirect(): + """Redirect /oms to /oms/""" + return RedirectResponse(url="/oms/", status_code=307) + + +@app.get("/oms/", response_class=HTMLResponse, include_in_schema=False) +async def oms_homepage(request: Request, db: Session = Depends(get_db)): + """OMS platform homepage""" + return await _serve_platform_homepage(request, "oms", db) + + +@app.get("/oms/{slug}", response_class=HTMLResponse, include_in_schema=False) +async def oms_content_page(request: Request, slug: str, db: Session = Depends(get_db)): + """OMS platform content pages""" + return await _serve_platform_content_page(request, "oms", slug, db) + + +# Explicit routes for Loyalty platform +@app.get("/loyalty", response_class=RedirectResponse, include_in_schema=False) +async def loyalty_redirect(): + """Redirect /loyalty to /loyalty/""" + return RedirectResponse(url="/loyalty/", status_code=307) + + +@app.get("/loyalty/", response_class=HTMLResponse, include_in_schema=False) +async def loyalty_homepage(request: Request, db: Session = Depends(get_db)): + """Loyalty platform homepage""" + return await _serve_platform_homepage(request, "loyalty", db) + + +@app.get("/loyalty/{slug}", response_class=HTMLResponse, include_in_schema=False) +async def loyalty_content_page(request: Request, slug: str, db: Session = Depends(get_db)): + """Loyalty platform content pages""" + return await _serve_platform_content_page(request, "loyalty", slug, db) + + +# ============================================================================ +# GENERIC PLATFORM CONTENT PAGE (must be LAST - catches all /{slug}) +# ============================================================================ + @app.get("/{slug}", response_class=HTMLResponse, include_in_schema=False) async def platform_content_page( request: Request, slug: str, db: Session = Depends(get_db)