Files
john 1aaef71f52 Initial commit: Happy Up monorepo through Sprint 5.
Document-driven MVP with FastAPI backend, Vue H5, WeChat mini shell, product demo, and Docker dev stack.

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

96 lines
2.9 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 get_current_user
from app.schemas.models import TrainingPlanCreateRequest, TrainingRecordCreateRequest
from app.services import training as training_service
router = APIRouter(prefix="/api/training", tags=["Training"])
@router.get("/plans")
def list_plans(
childId: int,
request: Request,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
):
plans = training_service.list_plans_for_child(db, current_user.id, childId)
if plans is None:
return JSONResponse(
status_code=404,
content=error(10004, "child_not_found", request.state.request_id),
)
return ok(
{"list": [training_service.plan_to_dict(plan) for plan in plans]},
request_id=request.state.request_id,
)
@router.post("/plans", status_code=201)
def create_plan(
body: TrainingPlanCreateRequest,
request: Request,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
):
plan = training_service.create_plan(db, current_user.id, body)
if not plan:
return JSONResponse(
status_code=404,
content=error(10004, "child_not_found", request.state.request_id),
)
return ok(
training_service.plan_to_dict(plan),
message="created",
request_id=request.state.request_id,
)
@router.get("/plans/{plan_id}")
def get_plan(
plan_id: int,
request: Request,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
):
plan = training_service.get_plan_for_user(db, current_user.id, plan_id)
if not plan:
return JSONResponse(
status_code=404,
content=error(10010, "plan_not_found", request.state.request_id),
)
return ok(training_service.plan_to_dict(plan), request_id=request.state.request_id)
@router.post("/plans/{plan_id}/records", status_code=201)
def create_record(
plan_id: int,
body: TrainingRecordCreateRequest,
request: Request,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
):
record = training_service.create_record(db, current_user.id, plan_id, body)
if not record:
return JSONResponse(
status_code=404,
content=error(10010, "plan_not_found", request.state.request_id),
)
return ok(
{
"id": record.id,
"planId": plan_id,
"exerciseId": record.exercise_id,
"score": record.score,
"completed": record.completed,
"createdAt": record.created_at.isoformat(),
},
message="created",
request_id=request.state.request_id,
)