""" Help page router. Routes: GET /help → full-page help viewer (requires auth) """ import logging from pathlib import Path import jwt from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse, RedirectResponse from auth_utils import COOKIE_NAME, decode_token, _read_auth from persona import list_user_personas logger = logging.getLogger(__name__) router = APIRouter() _STATIC = Path(__file__).parent.parent / "static" _LAST_PERSONA_COOKIE = "cx_last_persona" def _get_session_user(request: Request) -> str | None: token = request.cookies.get(COOKIE_NAME) if not token: return None try: return decode_token(token) except jwt.InvalidTokenError: return None def _preferred_persona(request: Request, username: str) -> str: names = list_user_personas(username) if not names: return "" cookie_val = request.cookies.get(_LAST_PERSONA_COOKIE, "") if cookie_val in names: return cookie_val return names[0] @router.get("/help", include_in_schema=False) async def help_page(request: Request, persona: str = ""): username = _get_session_user(request) if not username: return RedirectResponse("/login", status_code=302) personas = list_user_personas(username) # Use persona from query param if valid, else prefer last-visited from cookie if persona and persona in personas: back_persona = persona else: back_persona = _preferred_persona(request, username) back_href = f"/{username}/{back_persona}" if back_persona else "/" html = (_STATIC / "help.html").read_text() config_tag = ( f'' ) html = html.replace("", f"{config_tag}\n", 1) nav = 'Integrations' \ if _read_auth(username).get("role", "user") == "admin" else "" html = html.replace("{{ integrations_nav }}", nav) return HTMLResponse(html)