Add routes for updating and showing single items

This commit is contained in:
Felix Zett 2025-08-09 21:05:20 +02:00
parent 33329b7d03
commit 9dc1241728

View file

@ -1,10 +1,10 @@
from uuid import uuid4 from uuid import uuid4
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from schemas import ItemCreate from schemas import ItemCreate
from models import Item, Tag from models import Item, Tag
from database import get_db from database import get_db
from sqlalchemy import select from sqlalchemy import select, update
from sqlalchemy.orm import selectinload from sqlalchemy.orm import selectinload
from config import FIXED_USER_ID from config import FIXED_USER_ID
@ -35,6 +35,53 @@ async def read_items(db: AsyncSession = Depends(get_db)):
user_id = FIXED_USER_ID user_id = FIXED_USER_ID
result = await db.execute(select(Item).where(Item.user_id == user_id).options(selectinload(Item.tags))) result = await db.execute(select(Item).where(Item.user_id == user_id).options(selectinload(Item.tags)))
items = result.scalars().all() items = result.scalars().all()
for item in items: return {
print(f"DEBUG: Item {item.id}: {item.name} - Tags: {[tag.name for tag in item.tags]}") "items": [
return {"items" : [item.name for item in 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]
}