todo-backend / src /api /tasks.py
ibad363's picture
todo-backend
a291087
from fastapi import APIRouter, Depends, HTTPException, status
from sqlmodel import Session, select
from typing import List
from datetime import datetime
from ..api.dependencies import get_session, CurrentUserDep
from ..models.task import Task, TaskCreate, TaskUpdate, TaskRead
router = APIRouter(prefix="/api/tasks", tags=["tasks"])
@router.get("", response_model=List[TaskRead])
def list_tasks(
current_user: CurrentUserDep,
session: Session = Depends(get_session)
):
statement = select(Task).where(Task.user_id == current_user.id).order_by(Task.completed.asc(), Task.created_at.desc())
tasks = session.execute(statement).scalars().all()
return tasks
@router.post("", response_model=TaskRead, status_code=status.HTTP_201_CREATED)
def create_task(
current_user: CurrentUserDep,
task_in: TaskCreate,
session: Session = Depends(get_session)
):
db_task = Task.model_validate(task_in, update={"user_id": current_user.id})
session.add(db_task)
session.commit()
session.refresh(db_task)
return db_task
@router.get("/{task_id}", response_model=TaskRead)
def read_task(
current_user: CurrentUserDep,
task_id: int,
session: Session = Depends(get_session)
):
task = session.get(Task, task_id)
if not task:
raise HTTPException(status_code=404, detail="Task not found")
if task.user_id != current_user.id:
raise HTTPException(status_code=403, detail="Not enough permissions")
return task
@router.patch("/{task_id}", response_model=TaskRead)
def update_task(
current_user: CurrentUserDep,
task_id: int,
task_in: TaskUpdate,
session: Session = Depends(get_session)
):
task = session.get(Task, task_id)
if not task:
raise HTTPException(status_code=404, detail="Task not found")
if task.user_id != current_user.id:
raise HTTPException(status_code=403, detail="Not enough permissions")
update_data = task_in.model_dump(exclude_unset=True)
for key, value in update_data.items():
setattr(task, key, value)
task.updated_at = datetime.utcnow()
session.add(task)
session.commit()
session.refresh(task)
return task
@router.patch("/{task_id}/toggle", response_model=TaskRead)
def toggle_task(
current_user: CurrentUserDep,
task_id: int,
session: Session = Depends(get_session)
):
task = session.get(Task, task_id)
if not task:
raise HTTPException(status_code=404, detail="Task not found")
if task.user_id != current_user.id:
raise HTTPException(status_code=403, detail="Not enough permissions")
task.completed = not task.completed
task.completed_at = datetime.utcnow() if task.completed else None
task.updated_at = datetime.utcnow()
session.add(task)
session.commit()
session.refresh(task)
return task
@router.delete("/{task_id}")
def delete_task(
current_user: CurrentUserDep,
task_id: int,
session: Session = Depends(get_session)
):
task = session.get(Task, task_id)
if not task:
raise HTTPException(status_code=404, detail="Task not found")
if task.user_id != current_user.id:
raise HTTPException(status_code=403, detail="Not enough permissions")
session.delete(task)
session.commit()
return {"message": "Task deleted successfully"}