Add routes for updating and showing single items
This commit is contained in:
parent
33329b7d03
commit
9dc1241728
1 changed files with 52 additions and 5 deletions
|
|
@ -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]
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue