from fastapi import FastAPI, HTTPException, Depends, Query from sqlalchemy.orm import Session from typing import List, Optional from pydantic.v1 import model_dump from models import Task, User, Base, engine from schemas import TaskCreate, TaskResponse from sqlalchemy.exc import SQLAlchemyError app = FastAPI() def get_db(): db = SessionLocal() try: yield db finally: db.close() @app.post("/tasks/", response_model=TaskResponse, status_code=201) async def create_task(task: TaskCreate, db: Session = Depends(get_db)): db_task = Task(**model_dump(task)) db.add(db_task) try: db.commit() db.refresh(db_task) except SQLAlchemyError as e: raise HTTPException(status_code=400, detail=str(e)) return db_task @app.get("/tasks/", response_model=List[TaskResponse]) async def read_tasks( status: Optional[str] = Query(None), db: Session = Depends(get_db) ): query = db.query(Task) if status: query = query.filter(Task.status == status) tasks = query.all() return tasks @app.get("/tasks/{task_id}", response_model=TaskResponse) async def read_task(task_id: int, db: Session = Depends(get_db)): task = db.query(Task).filter(Task.id == task_id).first() if not task: raise HTTPException(status_code=404, detail="Task not found") return task @app.put("/tasks/{task_id}", response_model=TaskResponse) async def update_task(task_id: int, task: TaskCreate, db: Session = Depends(get_db)): db_task = db.query(Task).filter(Task.id == task_id).first() if not db_task: raise HTTPException(status_code=404, detail="Task not found") for key, value in model_dump(task).items(): setattr(db_task, key, value) try: db.commit() db.refresh(db_task) except SQLAlchemyError as e: raise HTTPException(status_code=400, detail=str(e)) return db_task @app.delete("/tasks/{task_id}", status_code=204) async def delete_task(task_id: int, db: Session = Depends(get_db)): task = db.query(Task).filter(Task.id == task_id).first() if not task: raise HTTPException(status_code=404, detail="Task not found") try: db.delete(task) db.commit() except SQLAlchemyError as e: raise HTTPException(status_code=400, detail=str(e))