decomposer: generate deliverable files for Implement the task REST API service with FastAPI, including standard CRUD endpoints, HTTP status semantics, request and response models, and structured error handling.; Add a PostgreSQL persistence layer for the task service using SQLAlchemy models, session management, database initialization or migrations, and durable task storage integrated with the existing API contract.; Define and integrate Pydantic request and response schemas for task fields, status values, identifiers, timestamps, and validation errors across the existing FastAPI service and persistence contract.; Add automated pytest coverage for the task API, including CRUD behavior, request and response validation failures, HTTP status semantics, and persistence interactions using isolated test data.; Containerize the FastAPI task service and PostgreSQL persistence service with Docker Compose, including environment-based configuration, health checks, networking, startup dependencies, and persistent database storage.; Create project documentation and operational guidance covering local setup, Docker Compose configuration, environment variables, API endpoints, validation and error responses, testing commands, persistence behavior, and relevant best-practice notes.

This commit is contained in:
2026-08-19 11:37:10 +00:00
parent 878957c05a
commit 324ddc19db
18 changed files with 550 additions and 5 deletions

39
app/repository.py Normal file
View File

@@ -0,0 +1,39 @@
from uuid import UUID
from sqlalchemy import select
from sqlalchemy.orm import Session
from .models import Task, TaskStatus
from .schemas import TaskCreate, TaskUpdate
def create_task(db: Session, data: TaskCreate) -> Task:
task = Task(**data.model_dump())
db.add(task)
db.commit()
db.refresh(task)
return task
def list_tasks(db: Session, status: TaskStatus | None, skip: int, limit: int) -> list[Task]:
query = select(Task).order_by(Task.created_at.desc()).offset(skip).limit(limit)
if status is not None:
query = query.where(Task.status == status)
return list(db.scalars(query).all())
def get_task(db: Session, task_id: UUID) -> Task | None:
return db.get(Task, str(task_id))
def update_task(db: Session, task: Task, data: TaskUpdate) -> Task:
for key, value in data.model_dump(exclude_unset=True).items():
setattr(task, key, value)
db.commit()
db.refresh(task)
return task
def delete_task(db: Session, task: Task) -> None:
db.delete(task)
db.commit()