{
  "files": [
    {
      "path": "src/main.py",
      "content": "\"\"\"FastAPI application entrypoint.\"\"\"\nfrom fastapi import FastAPI\nfrom .database import engine, Base\nfrom .routes import router\n\napp = FastAPI(title=\"Items API\", version=\"1.0.0\")\n\n@app.on_event(\"startup\")\nasync def startup() -> None:\n    async with engine.begin() as conn:\n        await conn.run_sync(Base.metadata.create_all)\n\napp.include_router(router, prefix=\"/api/v1\")\n",
      "type": "entrypoint"
    },
    {
      "path": "src/database.py",
      "content": "\"\"\"Database connection setup.\"\"\"\nfrom sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker\nfrom sqlalchemy.orm import DeclarativeBase\n\nDATABASE_URL = \"sqlite+aiosqlite:///./app.db\"\n\nengine = create_async_engine(DATABASE_URL, echo=False)\nSessionLocal = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)\n\nclass Base(DeclarativeBase):\n    pass\n\nasync def get_db() -> AsyncSession:\n    async with SessionLocal() as session:\n        yield session\n",
      "type": "config"
    },
    {
      "path": "src/models.py",
      "content": "\"\"\"SQLAlchemy models.\"\"\"\nfrom sqlalchemy import Column, Integer, String, DateTime, func\nfrom .database import Base\n\nclass Item(Base):\n    __tablename__ = \"items\"\n    id = Column(Integer, primary_key=True, index=True)\n    name = Column(String(100), nullable=False)\n    description = Column(String(500), default=\"\")\n    created_at = Column(DateTime(timezone=True), server_default=func.now())\n",
      "type": "model"
    },
    {
      "path": "src/schemas.py",
      "content": "\"\"\"Pydantic schemas for request/response validation.\"\"\"\nfrom pydantic import BaseModel, ConfigDict\nfrom datetime import datetime\n\nclass ItemCreate(BaseModel):\n    name: str\n    description: str = \"\"\n\nclass ItemUpdate(BaseModel):\n    name: str | None = None\n    description: str | None = None\n\nclass ItemResponse(BaseModel):\n    model_config = ConfigDict(from_attributes=True)\n    id: int\n    name: str\n    description: str\n    created_at: datetime\n",
      "type": "schema"
    },
    {
      "path": "src/routes.py",
      "content": "\"\"\"API routes for Item CRUD operations.\"\"\"\nfrom fastapi import APIRouter, Depends, HTTPException, status\nfrom sqlalchemy.ext.asyncio import AsyncSession\nfrom sqlalchemy import select\nfrom .database import get_db\nfrom .models import Item\nfrom .schemas import ItemCreate, ItemUpdate, ItemResponse\n\nrouter = APIRouter(tags=[\"items\"])\n\n@router.post(\"/items\", response_model=ItemResponse, status_code=status.HTTP_201_CREATED)\nasync def create_item(data: ItemCreate, db: AsyncSession = Depends(get_db)) -> Item:\n    item = Item(**data.model_dump())\n    db.add(item)\n    await db.commit()\n    await db.refresh(item)\n    return item\n\n@router.get(\"/items\", response_model=list[ItemResponse])\nasync def list_items(skip: int = 0, limit: int = 100, db: AsyncSession = Depends(get_db)) -> list[Item]:\n    result = await db.execute(select(Item).offset(skip).limit(limit))\n    return list(result.scalars().all())\n\n@router.get(\"/items/{item_id}\", response_model=ItemResponse)\nasync def get_item(item_id: int, db: AsyncSession = Depends(get_db)) -> Item:\n    result = await db.execute(select(Item).where(Item.id == item_id))\n    item = result.scalar_one_or_none()\n    if item is None:\n        raise HTTPException(status_code=404, detail=\"Item not found\")\n    return item\n\n@router.patch(\"/items/{item_id}\", response_model=ItemResponse)\nasync def update_item(item_id: int, data: ItemUpdate, db: AsyncSession = Depends(get_db)) -> Item:\n    result = await db.execute(select(Item).where(Item.id == item_id))\n    item = result.scalar_one_or_none()\n    if item is None:\n        raise HTTPException(status_code=404, detail=\"Item not found\")\n    for key, value in data.model_dump(exclude_unset=True).items():\n        setattr(item, key, value)\n    await db.commit()\n    await db.refresh(item)\n    return item\n\n@router.delete(\"/items/{item_id}\", status_code=status.HTTP_204_NO_CONTENT)\nasync def delete_item(item_id: int, db: AsyncSession = Depends(get_db)) -> None:\n    result = await db.execute(select(Item).where(Item.id == item_id))\n    item = result.scalar_one_or_none()\n    if item is None:\n        raise HTTPException(status_code=404, detail=\"Item not found\")\n    await db.delete(item)\n    await db.commit()\n",
      "type": "route"
    },
    {
      "path": "pyproject.toml",
      "content": "[project]\nname = \"items-api\"\nversion = \"0.1.0\"\nrequires-python = \">=3.11\"\ndependencies = [\n    \"fastapi>=0.104\",\n    \"uvicorn[standard]>=0.24\",\n    \"sqlalchemy[asyncio]>=2.0\",\n    \"aiosqlite>=0.19\",\n    \"pydantic>=2.0\",\n]\n",
      "type": "config"
    }
  ]
}
