from typing import Any from fastapi import APIRouter, HTTPException from sqlmodel import func, select from app.api.deps import CurrentUser, SessionDep from app.models import Item, ItemCreate, ItemOut, ItemsOut, ItemUpdate, Message router = APIRouter() @router.get("/", response_model=ItemsOut) def read_items( session: SessionDep, current_user: CurrentUser, skip: int = 0, limit: int = 100 ) -> Any: """ Retrieve items. """ statment = select(func.count()).select_from(Item) count = session.exec(statment).one() if current_user.is_superuser: statement = select(Item).offset(skip).limit(limit) items = session.exec(statement).all() else: statement = ( select(Item) .where(Item.owner_id == current_user.id) .offset(skip) .limit(limit) ) items = session.exec(statement).all() return ItemsOut(data=items, count=count) @router.get("/{id}", response_model=ItemOut) def read_item(session: SessionDep, current_user: CurrentUser, id: int) -> Any: """ Get item by ID. """ item = session.get(Item, id) if not item: raise HTTPException(status_code=404, detail="Item not found") if not current_user.is_superuser and (item.owner_id != current_user.id): raise HTTPException(status_code=400, detail="Not enough permissions") return item @router.post("/", response_model=ItemOut) def create_item( *, session: SessionDep, current_user: CurrentUser, item_in: ItemCreate ) -> Any: """ Create new item. """ item = Item.model_validate(item_in, update={"owner_id": current_user.id}) session.add(item) session.commit() session.refresh(item) return item @router.put("/{id}", response_model=ItemOut) def update_item( *, session: SessionDep, current_user: CurrentUser, id: int, item_in: ItemUpdate ) -> Any: """ Update an item. """ item = session.get(Item, id) if not item: raise HTTPException(status_code=404, detail="Item not found") if not current_user.is_superuser and (item.owner_id != current_user.id): raise HTTPException(status_code=400, detail="Not enough permissions") update_dict = item_in.model_dump(exclude_unset=True) item.sqlmodel_update(update_dict) session.add(item) session.commit() session.refresh(item) return item @router.delete("/{id}") def delete_item(session: SessionDep, current_user: CurrentUser, id: int) -> Message: """ Delete an item. """ item = session.get(Item, id) if not item: raise HTTPException(status_code=404, detail="Item not found") if not current_user.is_superuser and (item.owner_id != current_user.id): raise HTTPException(status_code=400, detail="Not enough permissions") session.delete(item) session.commit() return Message(message="Item deleted successfully")