#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ PerToolBox Server - 待办事项路由 Copyright (C) 2024 Sea Network Technology Studio Author: Canglan License: AGPL v3 """ from fastapi import APIRouter, HTTPException, Query from typing import Optional, List from ...dependencies import CurrentUserDependency, DbDependency from ...models import Todo from ...schemas import TodoCreate, TodoUpdate, TodoResponse from ...middleware.rate_limit import rate_limit router = APIRouter(prefix="/api/v1/todos", tags=["todos"]) @router.get("/", response_model=List[TodoResponse]) @rate_limit(requests=100, period=60) async def get_todos( current_user: CurrentUserDependency, db: DbDependency, skip: int = Query(0, ge=0), limit: int = Query(100, ge=1, le=500), completed: Optional[bool] = None, category: Optional[str] = None ): query = db.query(Todo).filter(Todo.user_id == current_user.id) if completed is not None: query = query.filter(Todo.completed == completed) if category: query = query.filter(Todo.category == category) return query.order_by(Todo.priority.desc(), Todo.created_at.desc()).offset(skip).limit(limit).all() @router.post("/", response_model=TodoResponse, status_code=201) @rate_limit(requests=50, period=60) async def create_todo( data: TodoCreate, current_user: CurrentUserDependency, db: DbDependency ): todo = Todo(user_id=current_user.id, **data.model_dump()) db.add(todo) db.commit() db.refresh(todo) return todo @router.put("/{todo_id}", response_model=TodoResponse) @rate_limit(requests=50, period=60) async def update_todo( todo_id: int, data: TodoUpdate, current_user: CurrentUserDependency, db: DbDependency ): todo = db.query(Todo).filter(Todo.id == todo_id, Todo.user_id == current_user.id).first() if not todo: raise HTTPException(status_code=404, detail="待办事项不存在") update_data = data.model_dump(exclude_unset=True) for key, value in update_data.items(): setattr(todo, key, value) db.commit() db.refresh(todo) return todo @router.delete("/{todo_id}") @rate_limit(requests=30, period=60) async def delete_todo( todo_id: int, current_user: CurrentUserDependency, db: DbDependency ): todo = db.query(Todo).filter(Todo.id == todo_id, Todo.user_id == current_user.id).first() if not todo: raise HTTPException(status_code=404, detail="待办事项不存在") db.delete(todo) db.commit() return {"success": True, "message": "已删除"}