""" 待办事项相关 API 端点 """ from fastapi import APIRouter, Depends, HTTPException, status from sqlmodel import Session, select from typing import List from app.db.session import get_db from app.models.todo import Todo from app.models.user import User from app.schemas.todo import Todo as TodoSchema, TodoCreate, TodoUpdate from app.api.api_v1.endpoints.users import get_current_user router = APIRouter() @router.post("/", response_model=TodoSchema, status_code=status.HTTP_201_CREATED) def create_todo( todo_in: TodoCreate, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): """创建待办事项""" db_todo = Todo( title=todo_in.title, user_id=current_user.id ) db.add(db_todo) db.commit() db.refresh(db_todo) return db_todo @router.get("/", response_model=List[TodoSchema]) def read_todos( skip: int = 0, limit: int = 100, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): """获取当前用户的待办事项列表""" statement = ( select(Todo) .where(Todo.user_id == current_user.id) .offset(skip) .limit(limit) ) todos = db.exec(statement).all() return todos @router.get("/{todo_id}", response_model=TodoSchema) def read_todo( todo_id: int, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): """获取单个待办事项""" statement = select(Todo).where( Todo.id == todo_id, Todo.user_id == current_user.id ) todo = db.exec(statement).first() if todo is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="待办事项不存在" ) return todo @router.put("/{todo_id}", response_model=TodoSchema) def update_todo( todo_id: int, todo_in: TodoUpdate, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): """更新待办事项""" statement = select(Todo).where( Todo.id == todo_id, Todo.user_id == current_user.id ) todo = db.exec(statement).first() if todo is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="待办事项不存在" ) if todo_in.title is not None: todo.title = todo_in.title if todo_in.done is not None: todo.done = todo_in.done db.add(todo) db.commit() db.refresh(todo) return todo @router.delete("/{todo_id}", status_code=status.HTTP_204_NO_CONTENT) def delete_todo( todo_id: int, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): """删除待办事项""" statement = select(Todo).where( Todo.id == todo_id, Todo.user_id == current_user.id ) todo = db.exec(statement).first() if todo is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="待办事项不存在" ) db.delete(todo) db.commit() return None