11import uuid
2- from typing import Any
2+ from typing import Any , NoReturn
33
44from fastapi import APIRouter , HTTPException
5- from sqlmodel import col , func , select
65
76from app .api .deps import CurrentUser , SessionDep
8- from app .models import Item , ItemCreate , ItemPublic , ItemsPublic , ItemUpdate , Message
7+ from app .models import ItemCreate , ItemPublic , ItemsPublic , ItemUpdate , Message
8+ from app .services import item_service
9+ from app .services .exceptions import ServiceError
910
1011router = APIRouter (prefix = "/items" , tags = ["items" ])
1112
1213
14+ def _raise_http_from_service_error (exc : ServiceError ) -> NoReturn :
15+ raise HTTPException (status_code = exc .status_code , detail = exc .detail )
16+
17+
1318@router .get ("/" , response_model = ItemsPublic )
1419def read_items (
1520 session : SessionDep , current_user : CurrentUser , skip : int = 0 , limit : int = 100
1621) -> Any :
1722 """
1823 Retrieve items.
1924 """
20-
21- if current_user .is_superuser :
22- count_statement = select (func .count ()).select_from (Item )
23- count = session .exec (count_statement ).one ()
24- statement = (
25- select (Item ).order_by (col (Item .created_at ).desc ()).offset (skip ).limit (limit )
26- )
27- items = session .exec (statement ).all ()
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-
25+ items , count = item_service .list_items_for_user (
26+ session = session ,
27+ current_user = current_user ,
28+ skip = skip ,
29+ limit = limit ,
30+ )
4431 return ItemsPublic (data = items , count = count )
4532
4633
@@ -49,12 +36,12 @@ def read_item(session: SessionDep, current_user: CurrentUser, id: uuid.UUID) ->
4936 """
5037 Get item by ID.
5138 """
52- item = session . get ( Item , id )
53- if not item :
54- raise HTTPException ( status_code = 404 , detail = "Item not found" )
55- if not current_user . is_superuser and ( item . owner_id != current_user . id ):
56- raise HTTPException ( status_code = 403 , detail = "Not enough permissions" )
57- return item
39+ try :
40+ return item_service . get_item_for_user (
41+ session = session , current_user = current_user , item_id = id
42+ )
43+ except ServiceError as exc :
44+ _raise_http_from_service_error ( exc )
5845
5946
6047@router .post ("/" , response_model = ItemPublic )
@@ -64,11 +51,9 @@ def create_item(
6451 """
6552 Create new item.
6653 """
67- item = Item .model_validate (item_in , update = {"owner_id" : current_user .id })
68- session .add (item )
69- session .commit ()
70- session .refresh (item )
71- return item
54+ return item_service .create_item_for_user (
55+ session = session , current_user = current_user , item_in = item_in
56+ )
7257
7358
7459@router .put ("/{id}" , response_model = ItemPublic )
@@ -82,17 +67,12 @@ def update_item(
8267 """
8368 Update an item.
8469 """
85- item = session .get (Item , id )
86- if not item :
87- raise HTTPException (status_code = 404 , detail = "Item not found" )
88- if not current_user .is_superuser and (item .owner_id != current_user .id ):
89- raise HTTPException (status_code = 403 , detail = "Not enough permissions" )
90- update_dict = item_in .model_dump (exclude_unset = True )
91- item .sqlmodel_update (update_dict )
92- session .add (item )
93- session .commit ()
94- session .refresh (item )
95- return item
70+ try :
71+ return item_service .update_item_for_user (
72+ session = session , current_user = current_user , item_id = id , item_in = item_in
73+ )
74+ except ServiceError as exc :
75+ _raise_http_from_service_error (exc )
9676
9777
9878@router .delete ("/{id}" )
@@ -102,11 +82,11 @@ def delete_item(
10282 """
10383 Delete an item.
10484 """
105- item = session . get ( Item , id )
106- if not item :
107- raise HTTPException ( status_code = 404 , detail = "Item not found" )
108- if not current_user . is_superuser and ( item . owner_id != current_user . id ):
109- raise HTTPException ( status_code = 403 , detail = "Not enough permissions" )
110- session . delete ( item )
111- session . commit ()
85+ try :
86+ item_service . delete_item_for_user (
87+ session = session , current_user = current_user , item_id = id
88+ )
89+ except ServiceError as exc :
90+ _raise_http_from_service_error ( exc )
91+
11292 return Message (message = "Item deleted successfully" )
0 commit comments