TalhaRafique1/Full-stack-Todo
0
1"""Todo API endpoints with CRUD operations."""2 3from typing import List4from fastapi import APIRouter, HTTPException, status, Depends5from fastapi.security import HTTPAuthorizationCredentials6from sqlmodel import Session7from ..middleware.auth import security8from ..database import get_db9from ..models.todo import Task, TaskCreate, TaskUpdate, TaskResponse10from ..services.todo_service import create_todo_service11from ..middleware.auth import get_current_user, verify_user_access12from ..models.user import UserResponse13 14 15router = APIRouter(prefix="/api/{user_id}/tasks", tags=["todos"])16 17 18@router.get("", response_model=List[TaskResponse])19async def get_tasks(20 user_id: str,21 current_user: UserResponse = Depends(get_current_user),22 credentials: HTTPAuthorizationCredentials = Depends(security),23 db: Session = Depends(get_db)24):25 """Get all tasks for the authenticated user."""26 # Verify user owns the requested data27 await verify_user_access(user_id, credentials)28 29 service = create_todo_service(db, user_id)30 tasks = service.get_all()31 return tasks32 33 34@router.post("", response_model=TaskResponse, status_code=status.HTTP_201_CREATED)35async def create_task(36 user_id: str,37 task_data: TaskCreate,38 current_user: UserResponse = Depends(get_current_user),39 credentials: HTTPAuthorizationCredentials = Depends(security),40 db: Session = Depends(get_db)41):42 """Create a new task for the authenticated user."""43 await verify_user_access(user_id, credentials)44 45 service = create_todo_service(db, user_id)46 task = service.create(task_data)47 return task48 49 50@router.get("/{task_id}", response_model=TaskResponse)51async def get_task(52 user_id: str,53 task_id: str,54 current_user: UserResponse = Depends(get_current_user),55 credentials: HTTPAuthorizationCredentials = Depends(security),56 db: Session = Depends(get_db)57):58 """Get a specific task by ID."""59 await verify_user_access(user_id, credentials)60 61 service = create_todo_service(db, user_id)62 task = service.get_by_id(task_id)63 64 if not task:65 raise HTTPException(66 status_code=status.HTTP_404_NOT_FOUND,67 detail="Task not found"68 )69 70 return task71 72 73@router.put("/{task_id}", response_model=TaskResponse)74async def update_task(75 user_id: str,76 task_id: str,77 task_data: TaskUpdate,78 current_user: UserResponse = Depends(get_current_user),79 credentials: HTTPAuthorizationCredentials = Depends(security),80 db: Session = Depends(get_db)81):82 """Update a task."""83 await verify_user_access(user_id, credentials)84 85 service = create_todo_service(db, user_id)86 task = service.update(task_id, task_data)87 88 if not task:89 raise HTTPException(90 status_code=status.HTTP_404_NOT_FOUND,91 detail="Task not found"92 )93 94 return task95 96 97@router.patch("/{task_id}/complete", response_model=TaskResponse)98async def toggle_complete(99 user_id: str,100 task_id: str,101 current_user: UserResponse = Depends(get_current_user),102 credentials: HTTPAuthorizationCredentials = Depends(security),103 db: Session = Depends(get_db)104):105 """Toggle task completion status."""106 await verify_user_access(user_id, credentials)107 108 service = create_todo_service(db, user_id)109 task = service.toggle_completion(task_id)110 111 if not task:112 raise HTTPException(113 status_code=status.HTTP_404_NOT_FOUND,114 detail="Task not found"115 )116 117 return task118 119 120@router.delete("/{task_id}", status_code=status.HTTP_204_NO_CONTENT)121async def delete_task(122 user_id: str,123 task_id: str,124 current_user: UserResponse = Depends(get_current_user),125 credentials: HTTPAuthorizationCredentials = Depends(security),126 db: Session = Depends(get_db)127):128 """Delete a task."""129 await verify_user_access(user_id, credentials)130 131 service = create_todo_service(db, user_id)132 success = service.delete(task_id)133 134 if not success:135 raise HTTPException(136 status_code=status.HTTP_404_NOT_FOUND,137 detail="Task not found"138 )139 140 return None141 