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:
163
main.py
163
main.py
@@ -377,6 +377,8 @@ async def vendor_root_path(
|
|||||||
# ============================================================================
|
# ============================================================================
|
||||||
logger.info("Registering platform public page routes:")
|
logger.info("Registering platform public page routes:")
|
||||||
logger.info(" - / (platform homepage)")
|
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)")
|
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)
|
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)
|
@app.get("/{slug}", response_class=HTMLResponse, include_in_schema=False)
|
||||||
async def platform_content_page(
|
async def platform_content_page(
|
||||||
request: Request, slug: str, db: Session = Depends(get_db)
|
request: Request, slug: str, db: Session = Depends(get_db)
|
||||||
|
|||||||
Reference in New Issue
Block a user