Align the project baseline with the latest admin interface styling and layout structure while documenting setup and usage updates in README.
143 lines
4.1 KiB
Python
143 lines
4.1 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
|
|
from app.core.dependencies import require_admin, require_superuser
|
|
from app.modules.admin.schemas import (
|
|
AdminSettingsPatchIn,
|
|
AdminRevealSecretIn,
|
|
AdminUiActivityIn,
|
|
AdminUserCreateIn,
|
|
AdminUserPasswordPatchIn,
|
|
AdminUserPatchIn,
|
|
)
|
|
from app.modules.admin.service import (
|
|
create_admin_user,
|
|
delete_admin_user,
|
|
get_admin_settings,
|
|
get_admin_summary,
|
|
get_install_secrets,
|
|
get_diagnostics_report,
|
|
get_server_log_tail,
|
|
list_activity_feed,
|
|
list_admin_users,
|
|
patch_admin_settings,
|
|
patch_user,
|
|
record_ui_activity,
|
|
reveal_secret,
|
|
reset_user_password,
|
|
)
|
|
from app.modules.analytics.service import get_admin_dashboard_metrics
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/users")
|
|
async def list_users_route(
|
|
page: int = Query(default=1, ge=1),
|
|
limit: int = Query(default=20, ge=1, le=100),
|
|
_admin=Depends(require_admin),
|
|
):
|
|
return list_admin_users(page, limit)
|
|
|
|
|
|
@router.patch("/users/{user_id}")
|
|
async def patch_user_route(
|
|
user_id: str,
|
|
payload: AdminUserPatchIn,
|
|
admin=Depends(require_admin),
|
|
):
|
|
if payload.is_superuser is not None and not admin.is_superuser:
|
|
raise HTTPException(status_code=403, detail="SUPERUSER_ONLY")
|
|
try:
|
|
return patch_user(admin, user_id, payload.role, payload.status, payload.is_superuser)
|
|
except ValueError as exc:
|
|
raise HTTPException(status_code=400, detail=str(exc))
|
|
|
|
|
|
@router.post("/users")
|
|
async def create_user_route(payload: AdminUserCreateIn, admin=Depends(require_superuser)):
|
|
try:
|
|
return create_admin_user(
|
|
admin,
|
|
email=payload.email,
|
|
password=payload.password,
|
|
role=payload.role,
|
|
is_superuser=payload.is_superuser,
|
|
status=payload.status,
|
|
)
|
|
except ValueError as exc:
|
|
raise HTTPException(status_code=400, detail=str(exc))
|
|
|
|
|
|
@router.patch("/users/{user_id}/password")
|
|
async def reset_user_password_route(
|
|
user_id: str, payload: AdminUserPasswordPatchIn, admin=Depends(require_superuser)
|
|
):
|
|
try:
|
|
return reset_user_password(admin, user_id, payload.password)
|
|
except ValueError as exc:
|
|
raise HTTPException(status_code=400, detail=str(exc))
|
|
|
|
|
|
@router.delete("/users/{user_id}")
|
|
async def delete_user_route(user_id: str, admin=Depends(require_superuser)):
|
|
try:
|
|
return delete_admin_user(admin, user_id)
|
|
except ValueError as exc:
|
|
raise HTTPException(status_code=400, detail=str(exc))
|
|
|
|
|
|
@router.get("/summary")
|
|
async def summary_route(_admin=Depends(require_admin)):
|
|
return get_admin_summary()
|
|
|
|
|
|
@router.get("/stats")
|
|
async def stats_route(_admin=Depends(require_admin)):
|
|
return get_admin_dashboard_metrics()
|
|
|
|
|
|
@router.get("/settings")
|
|
async def admin_settings_route(_admin=Depends(require_superuser)):
|
|
return get_admin_settings()
|
|
|
|
|
|
@router.patch("/settings")
|
|
async def admin_settings_patch_route(payload: AdminSettingsPatchIn, admin=Depends(require_superuser)):
|
|
return patch_admin_settings(admin, payload.values)
|
|
|
|
|
|
@router.get("/diagnostics/report")
|
|
async def diagnostics_route(_admin=Depends(require_superuser)):
|
|
return get_diagnostics_report()
|
|
|
|
|
|
@router.get("/activity-feed")
|
|
async def activity_feed_route(limit: int = Query(default=200, ge=1, le=1000), _admin=Depends(require_admin)):
|
|
return list_activity_feed(limit=limit)
|
|
|
|
|
|
@router.post("/ui-activity")
|
|
async def ui_activity_route(payload: AdminUiActivityIn, admin=Depends(require_admin)):
|
|
return record_ui_activity(admin, payload.event, payload.meta)
|
|
|
|
|
|
@router.get("/server-log")
|
|
async def server_log_route(
|
|
lines: int = Query(default=200, ge=1, le=1000),
|
|
_admin=Depends(require_superuser),
|
|
):
|
|
return get_server_log_tail(lines=lines)
|
|
|
|
|
|
@router.get("/secrets")
|
|
async def install_secrets_route(_admin=Depends(require_superuser)):
|
|
return get_install_secrets()
|
|
|
|
|
|
@router.post("/secrets/reveal")
|
|
async def reveal_secret_route(payload: AdminRevealSecretIn, admin=Depends(require_superuser)):
|
|
try:
|
|
return reveal_secret(admin, payload.key)
|
|
except ValueError as exc:
|
|
raise HTTPException(status_code=400, detail=str(exc))
|