# app/api/v1/admin/pages.py """ Admin HTML page routes using Jinja2 templates. These routes return rendered HTML pages (response_class=HTMLResponse). Separate from other admin routes which return JSON data. Routes: - GET / - Admin root (redirects to login) - GET /login - Admin login page (no auth required) - GET /dashboard - Admin dashboard (requires auth) - GET /vendors - Vendor management page (requires auth) - GET /users - User management page (requires auth) """ from fastapi import APIRouter, Request, Depends from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.templating import Jinja2Templates from sqlalchemy.orm import Session from app.api.deps import get_current_admin_user, get_db from models.database.user import User router = APIRouter() templates = Jinja2Templates(directory="app/templates") @router.get("/", response_class=RedirectResponse, include_in_schema=False) async def admin_root(): """ Redirect /admin/ to /admin/login. This is the simplest approach: - Unauthenticated users: see login form - Authenticated users: login page clears token and shows form (they can manually navigate to dashboard if needed) Alternative: Could redirect to /admin/dashboard and let auth dependency handle the redirect, but that's an extra hop. """ return RedirectResponse(url="/admin/login", status_code=302) @router.get("/login", response_class=HTMLResponse, include_in_schema=False) async def admin_login_page(request: Request): """ Render admin login page. No authentication required. """ return templates.TemplateResponse( "admin/login.html", {"request": request} ) @router.get("/dashboard", response_class=HTMLResponse, include_in_schema=False) async def admin_dashboard_page( request: Request, current_user: User = Depends(get_current_admin_user), db: Session = Depends(get_db) ): """ Render admin dashboard page. Requires admin authentication - will redirect to login if not authenticated. """ return templates.TemplateResponse( "admin/dashboard.html", { "request": request, "user": current_user, } ) @router.get("/vendors", response_class=HTMLResponse, include_in_schema=False) async def admin_vendors_page( request: Request, current_user: User = Depends(get_current_admin_user), db: Session = Depends(get_db) ): """ Render vendors management page. Requires admin authentication. """ return templates.TemplateResponse( "admin/vendors.html", { "request": request, "user": current_user, } ) @router.get("/users", response_class=HTMLResponse, include_in_schema=False) async def admin_users_page( request: Request, current_user: User = Depends(get_current_admin_user), db: Session = Depends(get_db) ): """ Render users management page. Requires admin authentication. """ return templates.TemplateResponse( "admin/users.html", { "request": request, "user": current_user, } )