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

1import uuid 

2from typing import Any 

3 

4from fastapi import APIRouter, HTTPException 

5from sqlmodel import col, func, select 

6 

7from app.api.deps import CurrentUser, SessionDep 

8from app.models import Item, ItemCreate, ItemPublic, ItemsPublic, ItemUpdate, Message 

9 

10router = APIRouter(prefix="/items", tags=["items"]) 

11 

12 

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 """ 

20 

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() 

43 

44 items_public = [ItemPublic.model_validate(item) for item in items] 1c

45 return ItemsPublic(data=items_public, count=count) 1c

46 

47 

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

59 

60 

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

73 

74 

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

97 

98 

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