66 PaymentTransactionOut ,
77 TransactionStatus ,
88)
9+ from model .pycon_registrations .pycon_registration import PyconRegistrationOut
10+ from pydantic import ValidationError
911from repository .events_repository import EventsRepository
1012from repository .payment_transaction_repository import PaymentTransactionRepository
1113from starlette .responses import JSONResponse
14+ from utils .logger import logger
1215
1316
1417class PaymentUsecase :
@@ -17,41 +20,103 @@ def __init__(self):
1720 self .events_repo = EventsRepository ()
1821
1922 def create_payment_transaction (self , payment_transaction : PaymentTransactionIn ) -> PaymentTransactionOut :
23+ """
24+ Create a new payment transaction
25+
26+ Arguments:
27+ payment_transaction -- The payment transaction data
28+
29+ Returns:
30+ PaymentTransactionOut -- The created payment transaction
31+ """
32+ logger .info (f'Creating payment transaction for { payment_transaction .eventId } ' )
2033 status , payment_transaction , message = self .payment_repo .store_payment_transaction (payment_transaction )
2134 if status != HTTPStatus .OK :
35+ logger .error (f'[{ payment_transaction .eventId } ] { message } ' )
2236 return JSONResponse (status_code = status , content = {'message' : message })
2337
38+ logger .info (f'Payment transaction created for { payment_transaction .eventId } ' )
2439 payment_transaction_dict = self .__convert_data_entry_to_dict (payment_transaction )
2540 return PaymentTransactionOut (** payment_transaction_dict )
2641
2742 def update_payment_transaction (
28- self , payment_transaction_id : str , payment_transaction : PaymentTransactionIn
43+ self , payment_transaction_id : str , payment_transaction_in : PaymentTransactionIn
2944 ) -> PaymentTransactionOut :
30- status , payment_transaction , message = self .payment_repo .update_payment_transaction (
31- payment_transaction_id , payment_transaction
45+ """
46+ Update the payment transaction with the existing object
47+
48+ Arguments:
49+ payment_transaction_id -- The ID of the payment transaction
50+ payment_transaction_in -- The payment transaction data
51+
52+ Returns:
53+ PaymentTransactionOut -- The updated payment transaction
54+ """
55+ logger .info (f'Updating payment transaction for { payment_transaction_id } ' )
56+ status , existing_payment_transaction , message = self .payment_repo .query_payment_transaction_by_id_only (
57+ payment_transaction_id = payment_transaction_id
3258 )
3359 if status != HTTPStatus .OK :
3460 return JSONResponse (status_code = status , content = {'message' : message })
3561
36- payment_transaction_dict = self .__convert_data_entry_to_dict (payment_transaction )
62+ # Now update the payment transaction with the existing object
63+ status , updated_payment_transaction , message = self .payment_repo .update_payment_transaction (
64+ existing_payment_transaction , payment_transaction_in
65+ )
66+ if status != HTTPStatus .OK :
67+ logger .error (f'[{ payment_transaction_id } ] { message } ' )
68+ return JSONResponse (status_code = status , content = {'message' : message })
69+
70+ logger .info (f'Payment transaction updated for { payment_transaction_id } ' )
71+ payment_transaction_dict = self .__convert_data_entry_to_dict (updated_payment_transaction )
3772 return PaymentTransactionOut (** payment_transaction_dict )
3873
3974 def query_pending_payment_transactions (self ) -> list [PaymentTransactionOut ]:
75+ """
76+ Query all pending payment transactions
77+
78+ Returns:
79+ list[PaymentTransactionOut] -- The list of payment transactions
80+ """
4081 status , payment_transactions , message = self .payment_repo .query_pending_payment_transactions ()
4182 if status != HTTPStatus .OK :
83+ logger .error (f'[{ message } ]' )
4284 return JSONResponse (status_code = status , content = {'message' : message })
4385
44- payment_transactions_out = [
45- PaymentTransactionOut (** self .__convert_data_entry_to_dict (payment_transaction ))
46- for payment_transaction in payment_transactions
47- ]
48- return payment_transactions_out
86+ payment_transaction_list = []
87+ for payment_transaction in payment_transactions :
88+ payment_transaction_data = self .__convert_data_entry_to_dict (payment_transaction )
89+
90+ try :
91+ pycon_registration_out = PyconRegistrationOut (** payment_transaction_data )
92+ payment_transaction_out = PaymentTransactionOut (
93+ ** payment_transaction_data , registrationData = pycon_registration_out
94+ )
95+
96+ except ValidationError as e :
97+ logger .error (f'[{ payment_transaction .rangeKey } ] { e } , skipping this payment transaction' )
98+ continue
99+
100+ payment_transaction_list .append (payment_transaction_out )
101+
102+ return payment_transaction_list
49103
50104 def payment_callback (self , payment_transaction_id : str , event_id : str ):
105+ """
106+ Update the payment transaction status to SUCCESS and redirect to the success page
107+
108+ Arguments:
109+ payment_transaction_id -- The ID of the payment transaction
110+ event_id -- The ID of the event
111+
112+ Returns:
113+ JSONResponse -- The response to the client
114+ """
51115 status , payment_transaction , message = self .payment_repo .query_payment_transaction_with_payment_transaction_id (
52116 payment_transaction_id = payment_transaction_id , event_id = event_id
53117 )
54118 if status != HTTPStatus .OK :
119+ logger .error (f'[{ payment_transaction_id } ] { message } ' )
55120 return JSONResponse (status_code = status , content = {'message' : message })
56121
57122 success_payment_transaction_in = PaymentTransactionIn (
@@ -61,8 +126,10 @@ def payment_callback(self, payment_transaction_id: str, event_id: str):
61126 payment_transaction = payment_transaction , payment_transaction_in = success_payment_transaction_in
62127 )
63128 if status != HTTPStatus .OK :
129+ logger .error (f'[{ payment_transaction_id } ] { message } ' )
64130 return JSONResponse (status_code = status , content = {'message' : message })
65131
132+ logger .info (f'Payment transaction updated for { payment_transaction_id } ' )
66133 frontend_base_url = os .getenv ('FRONTEND_URL' )
67134 redirect_url = (
68135 f'{ frontend_base_url } /{ event_id } /register?step=Success&paymentTransactionId={ payment_transaction_id } '
0 commit comments