Backend: - Setting + GeneratedPdf models, Alembic migration with default settings seed - PDF generation service (WeasyPrint + Jinja2 with autoescape) - Health report HTML template with memory entries + document excerpts - Admin user management: list, create, update (role/max_chats/is_active) - Admin settings: self_registration_enabled, default_max_chats - Self-registration check wired into auth register endpoint - default_max_chats applied to new user registrations - AI tool: generate_pdf creates health compilation PDFs - PDF compile/list/download API endpoints - WeasyPrint system deps added to Dockerfile Frontend: - PDF reports page with generate + download - Admin users page with create/edit/activate/deactivate - Admin settings page with self-registration toggle + max chats - Extended sidebar with PDF reports + admin users/settings links - English + Russian translations for all new UI Review fixes applied: - Jinja2 autoescape enabled (XSS prevention in PDFs) - db.refresh after flush (created_at populated correctly) - storage_path removed from API response (no internal path leak) - Role field uses Literal["user", "admin"] validation - React hooks called before conditional returns (rules of hooks) - default_max_chats setting now applied during registration Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
31 lines
1.1 KiB
Python
31 lines
1.1 KiB
Python
from fastapi import APIRouter
|
|
|
|
from app.api.v1.auth import router as auth_router
|
|
from app.api.v1.chats import router as chats_router
|
|
from app.api.v1.admin import router as admin_router
|
|
from app.api.v1.skills import router as skills_router
|
|
from app.api.v1.users import router as users_router
|
|
from app.api.v1.documents import router as documents_router
|
|
from app.api.v1.memory import router as memory_router
|
|
from app.api.v1.notifications import router as notifications_router
|
|
from app.api.v1.ws import router as ws_router
|
|
from app.api.v1.pdf import router as pdf_router
|
|
|
|
api_v1_router = APIRouter(prefix="/api/v1")
|
|
|
|
api_v1_router.include_router(auth_router)
|
|
api_v1_router.include_router(chats_router)
|
|
api_v1_router.include_router(admin_router)
|
|
api_v1_router.include_router(skills_router)
|
|
api_v1_router.include_router(users_router)
|
|
api_v1_router.include_router(documents_router)
|
|
api_v1_router.include_router(memory_router)
|
|
api_v1_router.include_router(notifications_router)
|
|
api_v1_router.include_router(ws_router)
|
|
api_v1_router.include_router(pdf_router)
|
|
|
|
|
|
@api_v1_router.get("/health")
|
|
async def health():
|
|
return {"status": "ok"}
|