from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app.db.session import SessionLocal from app.models.task import Task from app.schemas.task import TaskCreate, TaskOut, TaskUpdate router = APIRouter(prefix="/tasks", tags=["tasks"]) def get_db(): db = SessionLocal() try: yield db finally: db.close() @router.get("", response_model=list[TaskOut]) def list_tasks(db: Session = Depends(get_db)): return db.query(Task).order_by(Task.id.desc()).all() @router.post("", response_model=TaskOut) def create_task(payload: TaskCreate, db: Session = Depends(get_db)): task = Task( title=payload.title, description=payload.description, status=payload.status, assignee=payload.assignee, ) db.add(task) db.commit() db.refresh(task) return task @router.patch("/{task_id}", response_model=TaskOut) def update_task(task_id: int, payload: TaskUpdate, db: Session = Depends(get_db)): task = db.get(Task, task_id) if not task: raise HTTPException(status_code=404, detail="Task not found") data = payload.model_dump(exclude_unset=True) for k, v in data.items(): setattr(task, k, v) db.add(task) db.commit() db.refresh(task) return task @router.delete("/{task_id}") def delete_task(task_id: int, db: Session = Depends(get_db)): task = db.get(Task, task_id) if not task: raise HTTPException(status_code=404, detail="Task not found") db.delete(task) db.commit() return {"ok": True}