from uuid import uuid4 from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from schemas import ItemCreate from models import Item, Tag from database import get_db from sqlalchemy import select, update from sqlalchemy.orm import selectinload from config import FIXED_USER_ID router = APIRouter() @router.post("/items/") async def create_item(item: ItemCreate, db: AsyncSession = Depends(get_db)): user_id = FIXED_USER_ID db_item = Item(id=uuid4(), name=item.name, user_id=user_id) tags = [] for tag_name in item.tag_names: result = await db.execute(select(Tag).where(Tag.name == tag_name, Tag.user_id == user_id)) tag = result.scalar_one_or_none() if not tag: tag = Tag(id=uuid4(), name=tag_name, user_id=user_id) db.add(tag) tags.append(tag) db_item.tags = tags db.add(db_item) await db.commit() return {"status": "item created", "item_id": str(db_item.id)} @router.get("/items/") async def read_items(db: AsyncSession = Depends(get_db)): user_id = FIXED_USER_ID result = await db.execute(select(Item).where(Item.user_id == user_id).options(selectinload(Item.tags))) items = result.scalars().all() return { "items": [ { "id": str(item.id), "name": item.name, "tags": [tag.name for tag in item.tags] } for item in items ] } @router.put("/items/{item_id}") async def update_item(item_id: str, item: ItemCreate, db: AsyncSession = Depends(get_db)): user_id = FIXED_USER_ID result = await db.execute(select(Item).where(Item.id == item_id, Item.user_id == user_id).options(selectinload(Item.tags))) db_item = result.scalar_one_or_none() if not db_item: raise HTTPException(status_code=404, detail="Item not found") db_item.name = item.name # Update tags tags = [] for tag_name in item.tag_names: result = await db.execute(select(Tag).where(Tag.name == tag_name, Tag.user_id == user_id)) tag = result.scalar_one_or_none() if not tag: tag = Tag(id=uuid4(), name=tag_name, user_id=user_id) db.add(tag) tags.append(tag) db_item.tags = tags await db.commit() return {"status": "item updated", "item_id": str(db_item.id)} @router.get("/items/{item_id}") async def get_item(item_id: str, db: AsyncSession = Depends(get_db)): user_id = FIXED_USER_ID result = await db.execute( select(Item).where(Item.id == item_id, Item.user_id == user_id).options(selectinload(Item.tags)) ) db_item = result.scalar_one_or_none() if not db_item: raise HTTPException(status_code=404, detail="Item not found") return { "id": str(db_item.id), "name": db_item.name, "tags": [tag.name for tag in db_item.tags] }