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