FIX(wallet): fix category deposit and set logger

update wallet client
This commit is contained in:
hgh 2025-10-20 11:32:26 +03:30
parent 1443658656
commit 4f3c1a565a
3 changed files with 43 additions and 4 deletions

View file

@ -174,6 +174,7 @@ class ApplicationTransactionSerializer(BaseTransactionSerializer):
pass
class ApplicationDepositSerializer(serializers.ModelSerializer):
uuid = serializers.UUIDField(required=False, validators=[])
payee_id = serializers.UUIDField(required=True)
payee_type = serializers.IntegerField(required=True)
amount = serializers.IntegerField(required=True, validators=[MinValueValidator(1)])

View file

@ -13,6 +13,8 @@ from apps.wallet.constans import TypeChoices, StateChoices
from apps.wallet.models import Transaction, Category, Wallet
from apps.wallet.serializers import ApplicationDepositSerializer, ApplicationWithdrawSerializer, \
ApplicationTransactionSerializer, ApplicationBalanceSerializer, MyWalletSerializer
from wallet.exceptions import UnprocessableEntity
from django.utils.translation import gettext_lazy as _
logger = logging.getLogger(__name__)
@ -276,7 +278,9 @@ class CategoryDepositSubmitAPIView(generics.CreateAPIView):
def perform_create(self, serializer):
# TODO: get_or_create instead of create if uuid given
# TODO: it is possible to merage create and submit in one step for improve performance
logger.info("Starting perform_create for Transaction")
application = get_application(self.request)
logger.debug(f"Application UUID: {application.uuid}")
category_uuid = self.kwargs.get('category_uuid')
if category_uuid:
category = get_object_or_404(Category.objects.all(), uuid=category_uuid)
@ -286,10 +290,38 @@ class CategoryDepositSubmitAPIView(generics.CreateAPIView):
payee_type = serializer.validated_data.pop('payee_type')
payer_wallet, _ = Wallet.objects.get_or_create(owner_uuid=application.uuid, owner_type=TypeChoices.APPLICATION,
category=category)
logger.debug(f"Payer wallet: {payer_wallet.uuid}")
payee_wallet, _ = Wallet.objects.get_or_create(owner_uuid=payee_id, owner_type=payee_type, category=category)
instance = serializer.save(payer_wallet=payer_wallet, application=application, payee_wallet=payee_wallet)
instance.category_submit()
logger.debug(f"Payee wallet: {payee_wallet.uuid}")
uuid = serializer.validated_data.pop('uuid')
details = serializer.validated_data.get('details', {})
reference_id = details.get('reference_id', None)
logger.debug(f"Transaction UUID: {uuid}, Reference ID: {reference_id}")
transaction_params = {
'application': application,
'payer_wallet': payer_wallet,
'payee_wallet': payee_wallet,
'amount': serializer.validated_data.get('amount'),
}
if uuid:
transaction_params['uuid'] = uuid
elif reference_id:
transaction_params['details__reference_id'] = reference_id
else:
logger.error('Missing UUID and Reference ID')
raise UnprocessableEntity('Missing UUID or reference_id')
instance, created = Transaction.objects.get_or_create(**transaction_params, defaults={
'details': details
})
serializer.instance = instance
logger.info(f"Transaction {'created' if created else 'retrieved'} successfully: {instance.uuid}")
if instance.state == StateChoices.PENDING:
return
if created or instance.state == StateChoices.CREATED:
instance.category_submit()
else:
logger.warning(f"Transaction was not in processable state! for {instance.uuid}: {instance.state}")
raise UnprocessableEntity(_('Transaction was not in processable state!'))
class CategoryDepositVerifyAPIView(generics.RetrieveAPIView):
@ -312,7 +344,7 @@ class CategoryDepositVerifyAPIView(generics.RetrieveAPIView):
instance = self.get_object()
if instance.state == StateChoices.PENDING:
instance.category_verify()
logger.warning(f"Transaction was retrieved for {instance.uuid}: {instance.state}")
serializer = self.get_serializer(instance)
return Response(serializer.data)

6
wallet/exceptions.py Normal file
View file

@ -0,0 +1,6 @@
from rest_framework.exceptions import APIException
class UnprocessableEntity(APIException):
status_code = 422
default_detail = 'The request was well-formed but cannot be processed due to semantic errors.'
default_code = 'unprocessable_entity'