from fastapi import APIRouter, Depends, HTTPException, status from sqlmodel import Session, select from app.connection import get_session from app.models.task import Task from app.models.user import User from app.schemas.task import TaskCreate, TaskRead, TaskUpdate from app.auth.dependencies import get_current_organizer router = APIRouter(prefix="/tasks", tags=["Tasks"]) @router.post("/", response_model=TaskRead, status_code=status.HTTP_201_CREATED) def create_task( data: TaskCreate, session: Session = Depends(get_session), organizer: User = Depends(get_current_organizer), ) -> Task: task = Task(**data.model_dump()) session.add(task) session.commit() session.refresh(task) return task @router.get("/", response_model=list[TaskRead]) def list_tasks( hackathon_id: int | None = None, session: Session = Depends(get_session), ) -> list[Task]: query = select(Task) if hackathon_id is not None: query = query.where(Task.hackathon_id == hackathon_id) return list(session.exec(query).all()) @router.get("/{task_id}", response_model=TaskRead) def get_task(task_id: int, session: Session = Depends(get_session)) -> Task: task = session.get(Task, task_id) if not task: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Задача не найдена") return task @router.patch("/{task_id}", response_model=TaskRead) def update_task( task_id: int, data: TaskUpdate, session: Session = Depends(get_session), organizer: User = Depends(get_current_organizer), ) -> Task: task = session.get(Task, task_id) if not task: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Задача не найдена") for field, value in data.model_dump(exclude_unset=True).items(): setattr(task, field, value) session.add(task) session.commit() session.refresh(task) return task @router.delete("/{task_id}", status_code=status.HTTP_204_NO_CONTENT) def delete_task( task_id: int, session: Session = Depends(get_session), organizer: User = Depends(get_current_organizer), ) -> None: task = session.get(Task, task_id) if not task: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Задача не найдена") session.delete(task) session.commit()