Files
fastapi-todolist/main.py
T

98 lines
2.2 KiB
Python

from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from sqlalchemy import select
from sqlalchemy.exc import SQLAlchemyError
from dependencies import SessionDep
from models import Todo
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
class todocreate(BaseModel):
task: str
class todoupdate(BaseModel):
completion: bool | None = None
task: str | None = None
class todoresponse(BaseModel):
id: int
task: str
completion: bool
@app.get("/health")
def health():
return {"status": "ok"}
@app.get("/todos", response_model=list[todoresponse])
def todos_get(session: SessionDep):
statement = select(Todo)
todos = session.scalars(statement).all()
return todos
@app.post("/todos", response_model=todoresponse)
def todos_create(
todo_data: todocreate,
session: SessionDep,
):
try:
new_todo = Todo(task=todo_data.task)
session.add(new_todo)
session.commit()
return new_todo
except SQLAlchemyError:
session.rollback()
raise
@app.patch("/todos/{todo_id}", response_model=todoresponse)
def todos_patch(
todo_id: int,
update_data: todoupdate,
session: SessionDep,
):
try:
todo = session.get(Todo, todo_id)
if todo is None:
raise HTTPException(status_code=404, detail="Todo not found")
if update_data.task is not None:
todo.task = update_data.task
if update_data.completion is not None:
todo.completion = update_data.completion
session.commit()
return todo
except SQLAlchemyError:
session.rollback()
raise
@app.delete("/todos/{todo_id}", response_model=todoresponse)
def todos_delete(
todo_id: int,
session: SessionDep,
):
try:
todo = session.get(Todo, todo_id)
if todo is None:
raise HTTPException(status_code=404, detail="Todo not found")
session.delete(todo)
session.commit()
return todo
except SQLAlchemyError:
session.rollback()
raise