from fastapi import FastAPI, HTTPException, Depends from fastapi.middleware.cors import CORSMiddleware from sqlalchemy.orm import Session from typing import List import os from pathlib import Path from app.db.session import SessionLocal from app.models.todo import Todo as TodoModel from app.schemas.todo import TodoCreate, TodoUpdate, TodoResponse app = FastAPI( title="Todo API", description="A simple todo application API", version="1.0.0", openapi_url="/openapi.json" ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) def get_db(): db = SessionLocal() try: yield db finally: db.close() @app.get("/") async def root(): return { "title": "Todo API", "documentation": "/docs", "health": "/health" } @app.get("/health") async def health_check(): return {"status": "healthy", "service": "Todo API"} @app.post("/todos/", response_model=TodoResponse) async def create_todo(todo: TodoCreate, db: Session = Depends(get_db)): db_todo = TodoModel(**todo.dict()) db.add(db_todo) db.commit() db.refresh(db_todo) return db_todo @app.get("/todos/", response_model=List[TodoResponse]) async def read_todos(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)): todos = db.query(TodoModel).offset(skip).limit(limit).all() return todos @app.get("/todos/{todo_id}", response_model=TodoResponse) async def read_todo(todo_id: int, db: Session = Depends(get_db)): todo = db.query(TodoModel).filter(TodoModel.id == todo_id).first() if todo is None: raise HTTPException(status_code=404, detail="Todo not found") return todo @app.put("/todos/{todo_id}", response_model=TodoResponse) async def update_todo(todo_id: int, todo: TodoUpdate, db: Session = Depends(get_db)): db_todo = db.query(TodoModel).filter(TodoModel.id == todo_id).first() if db_todo is None: raise HTTPException(status_code=404, detail="Todo not found") update_data = todo.dict(exclude_unset=True) for field, value in update_data.items(): setattr(db_todo, field, value) db.commit() db.refresh(db_todo) return db_todo @app.delete("/todos/{todo_id}") async def delete_todo(todo_id: int, db: Session = Depends(get_db)): todo = db.query(TodoModel).filter(TodoModel.id == todo_id).first() if todo is None: raise HTTPException(status_code=404, detail="Todo not found") db.delete(todo) db.commit() return {"message": "Todo deleted successfully"} if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)