111 lines
3.1 KiB
Python
111 lines
3.1 KiB
Python
# 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,
|
|
}
|
|
)
|