55from . import service , schemas , repository
66from .service import InvalidOrderTransition
77from app .core .auth import get_current_user
8+ from app .modules .payment import service as payment_service
9+ from app .modules .payment import repository as payment_repo
10+ from app .modules .payment .service import PaymentError
11+ from app .modules .users import repository as user_repo
812
913router = APIRouter ()
1014
@@ -13,57 +17,136 @@ def get_orders_repository(db: Session = Depends(get_db)):
1317 return repository .OrderRepository (db )
1418
1519
20+ def get_payment_repository (db : Session = Depends (get_db )):
21+ return payment_repo .InvoiceRepository (db )
22+
23+
24+ def get_user_repository (db : Session = Depends (get_db )):
25+ return user_repo .UserRepository (db )
26+
27+
1628@router .post ("/" , response_model = schemas .OrderRead )
1729def create_order (
1830 payload : schemas .OrderCreate ,
1931 repo : repository .OrderRepository = Depends (get_orders_repository ),
20- _user : str = Depends (get_current_user ),
32+ user_repo : user_repo .UserRepository = Depends (get_user_repository ),
33+ username : str = Depends (get_current_user ),
2134):
22- return service .create_order (repo , payload .item )
35+ user = user_repo .get_user_by_username (username )
36+ if not user :
37+ raise HTTPException (status_code = 404 , detail = "User not found" )
38+ return service .create_order (repo , user .id , payload .item )
2339
2440
2541@router .get ("/{order_id}" , response_model = schemas .OrderRead )
2642def get_order (
2743 order_id : int ,
2844 repo : repository .OrderRepository = Depends (get_orders_repository ),
29- _user : str = Depends (get_current_user ),
45+ user_repo : user_repo .UserRepository = Depends (get_user_repository ),
46+ username : str = Depends (get_current_user ),
3047):
31- try :
32- return service .get_order (repo , order_id )
33- except ValueError :
48+ order = repo .get_order (order_id )
49+ if not order :
50+ raise HTTPException (status_code = 404 , detail = "Order not found" )
51+ user = user_repo .get_user_by_username (username )
52+ if not user :
53+ raise HTTPException (status_code = 404 , detail = "User not found" )
54+ if order .user_id != user .id :
3455 raise HTTPException (status_code = 404 , detail = "Order not found" )
56+ return order
3557
3658
37- @router .get ("/" , response_model = list [ schemas .OrderRead ] )
59+ @router .get ("/" , response_model = schemas .PaginatedOrders )
3860def list_orders (
61+ page : int = 1 ,
62+ page_size : int = 20 ,
63+ status : str | None = None ,
64+ search : str | None = None ,
3965 repo : repository .OrderRepository = Depends (get_orders_repository ),
40- _user : str = Depends (get_current_user ),
66+ user_repo : user_repo .UserRepository = Depends (get_user_repository ),
67+ username : str = Depends (get_current_user ),
4168):
42- return service .list_orders (repo )
69+ user = user_repo .get_user_by_username (username )
70+ if not user :
71+ raise HTTPException (status_code = 404 , detail = "User not found" )
72+ items , total = service .list_orders (repo , user_id = user .id , status = status , search = search , page = page , page_size = page_size )
73+ return {"items" : items , "total" : total , "page" : page , "page_size" : page_size }
4374
4475
4576@router .put ("/{order_id}" , response_model = schemas .OrderRead )
4677def update_order (
4778 order_id : int ,
4879 payload : schemas .OrderUpdate ,
4980 repo : repository .OrderRepository = Depends (get_orders_repository ),
50- _user : str = Depends (get_current_user ),
81+ user_repo : user_repo .UserRepository = Depends (get_user_repository ),
82+ username : str = Depends (get_current_user ),
5183):
84+ order = repo .get_order (order_id )
85+ if not order :
86+ raise HTTPException (status_code = 404 , detail = "Order not found" )
87+ user = user_repo .get_user_by_username (username )
88+ if not user :
89+ raise HTTPException (status_code = 404 , detail = "User not found" )
90+ if order .user_id != user .id :
91+ raise HTTPException (status_code = 404 , detail = "Order not found" )
5292 try :
5393 updates = {k : v for k , v in payload .model_dump (exclude_unset = True ).items ()}
5494 return service .update_order (repo , order_id , ** updates )
55- except ValueError :
56- raise HTTPException (status_code = 404 , detail = "Order not found" )
5795 except InvalidOrderTransition as e :
5896 raise HTTPException (status_code = 400 , detail = str (e ))
5997
6098
99+ @router .post ("/{order_id}/cancel" , response_model = schemas .OrderRead )
100+ def cancel_order (
101+ order_id : int ,
102+ repo : repository .OrderRepository = Depends (get_orders_repository ),
103+ user_repo : user_repo .UserRepository = Depends (get_user_repository ),
104+ payment_repo : payment_repo .InvoiceRepository = Depends (get_payment_repository ),
105+ username : str = Depends (get_current_user ),
106+ ):
107+ order = repo .get_order (order_id )
108+ if not order :
109+ raise HTTPException (status_code = 404 , detail = "Order not found" )
110+ user = user_repo .get_user_by_username (username )
111+ if not user :
112+ raise HTTPException (status_code = 404 , detail = "User not found" )
113+ if order .user_id != user .id :
114+ raise HTTPException (status_code = 404 , detail = "Order not found" )
115+ try :
116+ order = service .cancel_order (repo , order_id )
117+ except ValueError as e :
118+ detail = str (e )
119+ if "not found" in detail :
120+ raise HTTPException (status_code = 404 , detail = detail )
121+ if "already cancelled" in detail :
122+ raise HTTPException (status_code = 400 , detail = detail )
123+ if "Cannot cancel" in detail :
124+ raise HTTPException (status_code = 400 , detail = detail )
125+ raise HTTPException (status_code = 400 , detail = detail )
126+
127+ try :
128+ payment_service .cancel_invoice_by_order_id (payment_repo , order_id )
129+ except PaymentError as e :
130+ raise HTTPException (status_code = 400 , detail = str (e ))
131+
132+ return order
133+
134+
61135@router .delete ("/{order_id}" , status_code = 204 )
62136def delete_order (
63137 order_id : int ,
64138 repo : repository .OrderRepository = Depends (get_orders_repository ),
65- _user : str = Depends (get_current_user ),
139+ user_repo : user_repo .UserRepository = Depends (get_user_repository ),
140+ username : str = Depends (get_current_user ),
66141):
142+ order = repo .get_order (order_id )
143+ if not order :
144+ raise HTTPException (status_code = 404 , detail = "Order not found" )
145+ user = user_repo .get_user_by_username (username )
146+ if not user :
147+ raise HTTPException (status_code = 404 , detail = "User not found" )
148+ if order .user_id != user .id :
149+ raise HTTPException (status_code = 404 , detail = "Order not found" )
67150 try :
68151 service .delete_order (repo , order_id )
69152 except ValueError :
0 commit comments