Files
john a400130c67
CI / api-test (push) Has been cancelled
CI / web-build (push) Has been cancelled
Sprint 6: report review workflow, CI/K8s, and client tabs.
Add coach review APIs, pose calibration thresholds, Gitea CI, Kubernetes skeleton, H5 practice page, and mini program tab bar.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 11:44:11 +08:00

69 lines
2.2 KiB
Python

from fastapi import APIRouter, Depends, Request
from fastapi.responses import JSONResponse
from sqlalchemy.orm import Session
from app.core.response import error, ok
from app.db.models import User
from app.db.session import get_db
from app.deps import require_staff
from app.schemas.models import ReportReviewRequest
from app.services import admin as admin_service
from app.services import report_review as review_service
from app.services.reports import report_to_dict
router = APIRouter(prefix="/api/admin", tags=["Admin"])
@router.get("/dashboard")
def admin_dashboard(
request: Request,
db: Session = Depends(get_db),
current_user: User = Depends(require_staff),
):
metrics = admin_service.get_dashboard_metrics(db, tenant_id=current_user.tenant_id)
return ok(metrics, request_id=request.state.request_id)
@router.get("/reports/pending")
def pending_reports(
request: Request,
db: Session = Depends(get_db),
current_user: User = Depends(require_staff),
):
items = review_service.list_pending_reports(db, tenant_id=current_user.tenant_id)
return ok({"list": items}, request_id=request.state.request_id)
@router.post("/reports/{report_id}/review")
def review_report(
report_id: int,
body: ReportReviewRequest,
request: Request,
db: Session = Depends(get_db),
current_user: User = Depends(require_staff),
):
report, err = review_service.review_report(
db,
current_user.id,
report_id,
body.action,
tenant_id=current_user.tenant_id,
note=body.note,
)
if err == "report_not_found":
return JSONResponse(
status_code=404,
content=error(10008, "report_not_found", request.state.request_id),
)
if err == "invalid_status":
return JSONResponse(
status_code=409,
content=error(10012, "invalid_report_status", request.state.request_id),
)
if err == "invalid_action":
return JSONResponse(
status_code=400,
content=error(10013, "invalid_review_action", request.state.request_id),
)
return ok(report_to_dict(report), message="reviewed", request_id=request.state.request_id)