Coverage for app/api/routes/items.py: 93%
58 statements
« prev ^ index » next coverage.py v7.16.1, created at 2026-10-26 10:48 +0000
« prev ^ index » next coverage.py v7.16.1, created at 2026-10-26 10:48 +0000
1import uuid
2from typing import Any
4from fastapi import APIRouter, HTTPException
5from sqlmodel import col, func, select
7from app.api.deps import CurrentUser, SessionDep
8from app.models import Item, ItemCreate, ItemPublic, ItemsPublic, ItemUpdate, Message
10router = APIRouter(prefix="/items", tags=["items"])
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: 1c
22 count_statement = select(func.count()).select_from(Item) 1c
23 count = session.exec(count_statement).one() 1c
24 statement = ( 1c
25 select(Item).order_by(col(Item.created_at).desc()).offset(skip).limit(limit)
26 )
27 items = session.exec(statement).all() 1c
28 else:
29 count_statement = (
30 select(func.count())
31 .select_from(Item)
32 .where(Item.owner_id == current_user.id)
33 )
34 count = session.exec(count_statement).one()
35 statement = (
36 select(Item)
37 .where(Item.owner_id == current_user.id)
38 .order_by(col(Item.created_at).desc())
39 .offset(skip)
40 .limit(limit)
41 )
42 items = session.exec(statement).all()
44 items_public = [ItemPublic.model_validate(item) for item in items] 1c
45 return ItemsPublic(data=items_public, count=count) 1c
48@router.get("/{id}", response_model=ItemPublic)
49def read_item(session: SessionDep, current_user: CurrentUser, id: uuid.UUID) -> Any:
50 """
51 Get item by ID.
52 """
53 item = session.get(Item, id) 1fgj
54 if not item: 1fgj
55 raise HTTPException(status_code=404, detail="Item not found") 1j
56 if not current_user.is_superuser and (item.owner_id != current_user.id): 1fg
57 raise HTTPException(status_code=403, detail="Not enough permissions") 1g
58 return item 1f
61@router.post("/", response_model=ItemPublic)
62def create_item(
63 *, session: SessionDep, current_user: CurrentUser, item_in: ItemCreate
64) -> Any:
65 """
66 Create new item.
67 """
68 item = Item.model_validate(item_in, update={"owner_id": current_user.id}) 1e
69 session.add(item) 1e
70 session.commit() 1e
71 session.refresh(item) 1e
72 return item 1e
75@router.put("/{id}", response_model=ItemPublic)
76def update_item(
77 *,
78 session: SessionDep,
79 current_user: CurrentUser,
80 id: uuid.UUID,
81 item_in: ItemUpdate,
82) -> Any:
83 """
84 Update an item.
85 """
86 item = session.get(Item, id) 1bhk
87 if not item: 1bhk
88 raise HTTPException(status_code=404, detail="Item not found") 1k
89 if not current_user.is_superuser and (item.owner_id != current_user.id): 1bh
90 raise HTTPException(status_code=403, detail="Not enough permissions") 1h
91 update_dict = item_in.model_dump(exclude_unset=True) 1b
92 item.sqlmodel_update(update_dict) 1b
93 session.add(item) 1b
94 session.commit() 1b
95 session.refresh(item) 1b
96 return item 1b
99@router.delete("/{id}")
100def delete_item(
101 session: SessionDep, current_user: CurrentUser, id: uuid.UUID
102) -> Message:
103 """
104 Delete an item.
105 """
106 item = session.get(Item, id) 1dil
107 if not item: 1dil
108 raise HTTPException(status_code=404, detail="Item not found") 1l
109 if not current_user.is_superuser and (item.owner_id != current_user.id): 1di
110 raise HTTPException(status_code=403, detail="Not enough permissions") 1i
111 session.delete(item) 1d
112 session.commit() 1d
113 return Message(message="Item deleted successfully") 1d