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>
This commit is contained in:
@@ -1,11 +1,15 @@
|
||||
from fastapi import APIRouter, Depends, Request
|
||||
from fastapi.responses import JSONResponse
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.core.response import ok
|
||||
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"])
|
||||
|
||||
@@ -18,3 +22,47 @@ def admin_dashboard(
|
||||
):
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user