84 lines
2.5 KiB
Python
84 lines
2.5 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
|
|
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": "已删除"} |