Files
fastapi-todolist/main.py
T

91 lines
2.2 KiB
Python
Raw Normal View History

2026-07-16 15:42:31 +08:00
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
2026-07-21 16:11:23 +08:00
from sqlalchemy import select
from sqlalchemy.exc import SQLAlchemyError
2026-07-16 15:42:31 +08:00
from dependencies import SessionDep
from models import Todo
2026-07-16 15:42:31 +08:00
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
2026-07-16 15:42:31 +08:00
@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
2026-07-21 16:11:23 +08:00
2026-07-16 15:42:31 +08:00
@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
2026-07-16 15:42:31 +08:00
@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