2025-06-12 19:05:38 +00:00

118 lines
3.1 KiB
Python

from typing import Any, List, Optional
from fastapi import APIRouter, Depends, HTTPException, Query, status
from sqlalchemy.orm import Session
from app import crud
from app.api import deps
from app.models.user import User
from app.schemas.task import Task, TaskCreate, TaskUpdate
router = APIRouter()
@router.get("/", response_model=List[Task])
def read_tasks(
db: Session = Depends(deps.get_db),
skip: int = 0,
limit: int = 100,
is_completed: Optional[bool] = None,
priority: Optional[int] = Query(None, ge=1, le=3),
sort_by: str = Query("created_at", regex="^(created_at|due_date|priority|title)$"),
sort_order: str = Query("desc", regex="^(asc|desc)$"),
current_user: User = Depends(deps.get_current_user),
) -> Any:
"""
Retrieve tasks for current user with optional filtering and sorting.
"""
tasks = crud.task.get_multi_by_owner(
db=db,
owner_id=current_user.id,
skip=skip,
limit=limit,
is_completed=is_completed,
priority=priority,
sort_by=sort_by,
sort_order=sort_order
)
return tasks
@router.post("/", response_model=Task)
def create_task(
*,
db: Session = Depends(deps.get_db),
task_in: TaskCreate,
current_user: User = Depends(deps.get_current_user),
) -> Any:
"""
Create new task.
"""
task = crud.task.create_with_owner(db=db, obj_in=task_in, owner_id=current_user.id)
return task
@router.get("/{task_id}", response_model=Task)
def read_task(
*,
db: Session = Depends(deps.get_db),
task_id: str,
current_user: User = Depends(deps.get_current_user),
) -> Any:
"""
Get task by ID.
"""
task = crud.task.get_task_by_id_and_owner(
db=db, task_id=task_id, owner_id=current_user.id
)
if not task:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Task not found"
)
return task
@router.put("/{task_id}", response_model=Task)
def update_task(
*,
db: Session = Depends(deps.get_db),
task_id: str,
task_in: TaskUpdate,
current_user: User = Depends(deps.get_current_user),
) -> Any:
"""
Update a task.
"""
task = crud.task.get_task_by_id_and_owner(
db=db, task_id=task_id, owner_id=current_user.id
)
if not task:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Task not found"
)
task = crud.task.update(db=db, db_obj=task, obj_in=task_in)
return task
@router.delete("/{task_id}", status_code=status.HTTP_204_NO_CONTENT, response_model=None)
def delete_task(
*,
db: Session = Depends(deps.get_db),
task_id: str,
current_user: User = Depends(deps.get_current_user),
) -> Any:
"""
Delete a task.
"""
task = crud.task.get_task_by_id_and_owner(
db=db, task_id=task_id, owner_id=current_user.id
)
if not task:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Task not found"
)
crud.task.remove(db=db, id=task_id)
return None