Coverage for app/api/routes/items.py: 93%
57 statements
« prev ^ index » next coverage.py v7.6.1, created at 2026-03-24 11:40 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2026-03-24 11:40 +0000
1import uuid
2from typing import Any
4from fastapi import APIRouter, HTTPException
5from sqlmodel import func, select
7from app.api.deps import CurrentUser, SessionDep
8from app.models import Item, ItemCreate, ItemPublic, ItemsPublic, ItemUpdate, Message
10router = APIRouter()
13@router.get("/", response_model=ItemsPublic)
14def read_items(
15 session: SessionDep, current_user: CurrentUser, skip: int = 0, limit: int = 100
16) -> Any:
17 """
18 Retrieve items.
19 """
21 if current_user.is_superuser:
22 count_statement = select(func.count()).select_from(Item)
23 count = session.exec(count_statement).one()
24 statement = select(Item).offset(skip).limit(limit)
25 items = session.exec(statement).all()
26 else:
27 count_statement = (
28 select(func.count())
29 .select_from(Item)
30 .where(Item.owner_id == current_user.id)
31 )
32 count = session.exec(count_statement).one()
33 statement = (
34 select(Item)
35 .where(Item.owner_id == current_user.id)
36 .offset(skip)
37 .limit(limit)
38 )
39 items = session.exec(statement).all()
41 return ItemsPublic(data=items, count=count)
44@router.get("/{id}", response_model=ItemPublic)
45def read_item(session: SessionDep, current_user: CurrentUser, id: uuid.UUID) -> Any:
46 """
47 Get item by ID.
48 """
49 item = session.get(Item, id)
50 if not item:
51 raise HTTPException(status_code=404, detail="Item not found")
52 if not current_user.is_superuser and (item.owner_id != current_user.id):
53 raise HTTPException(status_code=400, detail="Not enough permissions")
54 return item
57@router.post("/", response_model=ItemPublic)
58def create_item(
59 *, session: SessionDep, current_user: CurrentUser, item_in: ItemCreate
60) -> Any:
61 """
62 Create new item.
63 """
64 item = Item.model_validate(item_in, update={"owner_id": current_user.id})
65 session.add(item)
66 session.commit()
67 session.refresh(item)
68 return item
71@router.put("/{id}", response_model=ItemPublic)
72def update_item(
73 *,
74 session: SessionDep,
75 current_user: CurrentUser,
76 id: uuid.UUID,
77 item_in: ItemUpdate,
78) -> Any:
79 """
80 Update an item.
81 """
82 item = session.get(Item, id)
83 if not item:
84 raise HTTPException(status_code=404, detail="Item not found")
85 if not current_user.is_superuser and (item.owner_id != current_user.id):
86 raise HTTPException(status_code=400, detail="Not enough permissions")
87 update_dict = item_in.model_dump(exclude_unset=True)
88 item.sqlmodel_update(update_dict)
89 session.add(item)
90 session.commit()
91 session.refresh(item)
92 return item
95@router.delete("/{id}")
96def delete_item(
97 session: SessionDep, current_user: CurrentUser, id: uuid.UUID
98) -> Message:
99 """
100 Delete an item.
101 """
102 item = session.get(Item, id)
103 if not item:
104 raise HTTPException(status_code=404, detail="Item not found")
105 if not current_user.is_superuser and (item.owner_id != current_user.id):
106 raise HTTPException(status_code=400, detail="Not enough permissions")
107 session.delete(item)
108 session.commit()
109 return Message(message="Item deleted successfully")