Files
JARVIS/backend/app/routers/goal.py

93 lines
2.6 KiB
Python
Raw Normal View History

from datetime import date
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.database import get_db
from app.models.goal import Goal
from app.models.user import User
from app.routers.auth import get_current_user
from app.schemas.goal import GoalCreate, GoalListOut, GoalOut, GoalUpdate
router = APIRouter(prefix="/api/goals", tags=["目标"])
@router.get("", response_model=GoalListOut)
async def list_goals(
date_str: str = Query(...),
current_user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
target_date = date.fromisoformat(date_str).isoformat()
query = (
select(Goal)
.where(Goal.user_id == current_user.id)
.where(Goal.goal_date == target_date)
.order_by(Goal.created_at.desc())
)
items = (await db.execute(query)).scalars().all()
return GoalListOut(items=items)
@router.post("", response_model=GoalOut, status_code=201)
async def create_goal(
data: GoalCreate,
current_user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
goal = Goal(
user_id=current_user.id,
title=data.title,
note=data.note,
goal_date=data.goal_date.isoformat(),
status=data.status,
)
db.add(goal)
await db.commit()
await db.refresh(goal)
return goal
@router.patch("/{goal_id}", response_model=GoalOut)
async def update_goal(
goal_id: str,
data: GoalUpdate,
current_user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
result = await db.execute(
select(Goal).where(Goal.id == goal_id, Goal.user_id == current_user.id)
)
goal = result.scalar_one_or_none()
if not goal:
raise HTTPException(status_code=404, detail="目标不存在")
payload = data.model_dump(exclude_none=True)
if "goal_date" in payload:
payload["goal_date"] = payload["goal_date"].isoformat()
for field, value in payload.items():
setattr(goal, field, value)
await db.commit()
await db.refresh(goal)
return goal
@router.delete("/{goal_id}", status_code=204)
async def delete_goal(
goal_id: str,
current_user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
result = await db.execute(
select(Goal).where(Goal.id == goal_id, Goal.user_id == current_user.id)
)
goal = result.scalar_one_or_none()
if not goal:
raise HTTPException(status_code=404, detail="目标不存在")
await db.delete(goal)
await db.commit()