87 lines
No EOL
2.9 KiB
Python
87 lines
No EOL
2.9 KiB
Python
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
|
|
from sqlalchemy.orm import selectinload
|
|
from config import FIXED_USER_ID
|
|
|
|
router = APIRouter(prefix="/items", tags=["Items"])
|
|
|
|
@router.post("/")
|
|
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("/")
|
|
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("/{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("/{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]
|
|
} |