From 9dc124172847e39f8ed8ae656b3fb44731b7320e Mon Sep 17 00:00:00 2001 From: Felix Zett Date: Sat, 9 Aug 2025 21:05:20 +0200 Subject: [PATCH] Add routes for updating and showing single items --- backend/routes/items.py | 57 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/backend/routes/items.py b/backend/routes/items.py index 61f9318..55611a4 100644 --- a/backend/routes/items.py +++ b/backend/routes/items.py @@ -1,10 +1,10 @@ from uuid import uuid4 -from fastapi import APIRouter, Depends +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 +from sqlalchemy import select, update from sqlalchemy.orm import selectinload from config import FIXED_USER_ID @@ -35,6 +35,53 @@ 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() - for item in items: - print(f"DEBUG: Item {item.id}: {item.name} - Tags: {[tag.name for tag in item.tags]}") - return {"items" : [item.name for item in items]} \ No newline at end of file + 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] + } \ No newline at end of file