Spaces:
Running
Running
| """Task API routes.""" | |
| from typing import Optional | |
| from fastapi import APIRouter, Depends, HTTPException, status, Query | |
| from sqlmodel import Session | |
| from src.api.deps import get_db, get_current_user | |
| from src.schemas.task import TaskCreate, TaskUpdate, TaskPatch, TaskResponse, TaskListResponse | |
| from src.services.task_service import TaskService | |
| router = APIRouter(prefix="/api/tasks", tags=["tasks"]) | |
| def get_tasks( | |
| completed: Optional[bool] = Query(None, description="Filter by completion status"), | |
| sort: str = Query("created_at", description="Sort field (created_at or updated_at)"), | |
| order: str = Query("desc", description="Sort order (asc or desc)"), | |
| limit: Optional[int] = Query(None, description="Maximum number of tasks to return"), | |
| offset: int = Query(0, description="Number of tasks to skip"), | |
| db: Session = Depends(get_db), | |
| current_user_id: int = Depends(get_current_user) | |
| ): | |
| """ | |
| Get tasks for the current user with filtering and sorting. | |
| Query Parameters: | |
| - completed: Filter by completion status (true/false/null for all) | |
| - sort: Sort field (created_at or updated_at) | |
| - order: Sort order (asc or desc) | |
| - limit: Maximum number of tasks to return | |
| - offset: Number of tasks to skip | |
| Returns: | |
| TaskListResponse: List of tasks with total count | |
| """ | |
| service = TaskService(db) | |
| tasks = service.get_tasks( | |
| user_id=current_user_id, | |
| completed=completed, | |
| sort=sort, | |
| order=order, | |
| limit=limit, | |
| offset=offset | |
| ) | |
| return TaskListResponse(tasks=tasks, total=len(tasks)) | |
| def create_task( | |
| task_data: TaskCreate, | |
| db: Session = Depends(get_db), | |
| current_user_id: int = Depends(get_current_user) | |
| ): | |
| """ | |
| Create a new task for the current user. | |
| Args: | |
| task_data: Task creation data | |
| Returns: | |
| TaskResponse: Created task | |
| """ | |
| service = TaskService(db) | |
| task = service.create_task(user_id=current_user_id, task_data=task_data) | |
| return task | |
| def get_task( | |
| task_id: int, | |
| db: Session = Depends(get_db), | |
| current_user_id: int = Depends(get_current_user) | |
| ): | |
| """ | |
| Get a single task by ID. | |
| Args: | |
| task_id: ID of the task | |
| Returns: | |
| TaskResponse: Task details | |
| Raises: | |
| HTTPException: 404 if task not found or doesn't belong to user | |
| """ | |
| service = TaskService(db) | |
| task = service.get_task(task_id=task_id, user_id=current_user_id) | |
| if not task: | |
| raise HTTPException( | |
| status_code=status.HTTP_404_NOT_FOUND, | |
| detail="Task not found" | |
| ) | |
| return task | |
| def update_task( | |
| task_id: int, | |
| task_data: TaskUpdate, | |
| db: Session = Depends(get_db), | |
| current_user_id: int = Depends(get_current_user) | |
| ): | |
| """ | |
| Update a task (PUT - replaces all fields). | |
| Args: | |
| task_id: ID of the task | |
| task_data: Task update data | |
| Returns: | |
| TaskResponse: Updated task | |
| Raises: | |
| HTTPException: 404 if task not found or doesn't belong to user | |
| """ | |
| service = TaskService(db) | |
| task = service.update_task(task_id=task_id, user_id=current_user_id, task_data=task_data) | |
| if not task: | |
| raise HTTPException( | |
| status_code=status.HTTP_404_NOT_FOUND, | |
| detail="Task not found" | |
| ) | |
| return task | |
| def patch_task( | |
| task_id: int, | |
| task_data: TaskPatch, | |
| db: Session = Depends(get_db), | |
| current_user_id: int = Depends(get_current_user) | |
| ): | |
| """ | |
| Partially update a task (PATCH - updates only provided fields). | |
| Args: | |
| task_id: ID of the task | |
| task_data: Task patch data | |
| Returns: | |
| TaskResponse: Updated task | |
| Raises: | |
| HTTPException: 404 if task not found or doesn't belong to user | |
| """ | |
| service = TaskService(db) | |
| task = service.patch_task(task_id=task_id, user_id=current_user_id, task_data=task_data) | |
| if not task: | |
| raise HTTPException( | |
| status_code=status.HTTP_404_NOT_FOUND, | |
| detail="Task not found" | |
| ) | |
| return task | |
| def delete_task( | |
| task_id: int, | |
| db: Session = Depends(get_db), | |
| current_user_id: int = Depends(get_current_user) | |
| ): | |
| """ | |
| Delete a task. | |
| Args: | |
| task_id: ID of the task | |
| Returns: | |
| No content (204) | |
| Raises: | |
| HTTPException: 404 if task not found or doesn't belong to user | |
| """ | |
| service = TaskService(db) | |
| deleted = service.delete_task(task_id=task_id, user_id=current_user_id) | |
| if not deleted: | |
| raise HTTPException( | |
| status_code=status.HTTP_404_NOT_FOUND, | |
| detail="Task not found" | |
| ) | |