fix: add explicit routes for platform path prefixes

Add explicit routes for /oms/ and /loyalty/ to handle path-based
platform routing in development mode. These routes are defined before
the generic /{slug} catch-all to ensure proper matching.

Routes added:
- /oms → redirect to /oms/
- /oms/ → OMS homepage
- /oms/{slug} → OMS content pages
- /loyalty → redirect to /loyalty/
- /loyalty/ → Loyalty homepage
- /loyalty/{slug} → Loyalty content pages

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-19 16:50:25 +01:00
parent 47f395b15a
commit 3875ad91df

163
main.py
View File

@@ -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)