v1.0.0提交
This commit is contained in:
84
backend/routers/v1/todos.py
Normal file
84
backend/routers/v1/todos.py
Normal file
@@ -0,0 +1,84 @@
|
||||
#!/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": "已删除"}
|
||||
Reference in New Issue
Block a user