From 4f3c1a565a000d5201bc05634181d81b8ba44aa9 Mon Sep 17 00:00:00 2001 From: hgh Date: Mon, 20 Oct 2025 11:32:26 +0330 Subject: [PATCH] FIX(wallet): fix category deposit and set logger update wallet client --- apps/wallet/serializers.py | 1 + apps/wallet/views/application.py | 40 ++++++++++++++++++++++++++++---- wallet/exceptions.py | 6 +++++ 3 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 wallet/exceptions.py diff --git a/apps/wallet/serializers.py b/apps/wallet/serializers.py index 8d5b669..635c7f0 100755 --- a/apps/wallet/serializers.py +++ b/apps/wallet/serializers.py @@ -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)]) diff --git a/apps/wallet/views/application.py b/apps/wallet/views/application.py index 3811029..e73b38e 100755 --- a/apps/wallet/views/application.py +++ b/apps/wallet/views/application.py @@ -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) diff --git a/wallet/exceptions.py b/wallet/exceptions.py new file mode 100644 index 0000000..d690fe5 --- /dev/null +++ b/wallet/exceptions.py @@ -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' \ No newline at end of file