Files
2026-04-01 16:05:57 +08:00

88 lines
2.7 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
PerToolBox Server - 待办事项路由
Copyright (C) 2024 Sea Network Technology Studio
Author: Canglan <admin@sea-studio.top>
License: AGPL v3
"""
from fastapi import APIRouter, HTTPException, Query, Request
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(
request: Request, # 添加 request 参数
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(
request: Request, # 添加 request 参数
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(
request: Request, # 添加 request 参数
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(
request: Request, # 添加 request 参数
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": "已删除"}