diff --git a/apps/wallet/urls.py b/apps/wallet/urls.py index a12e3a5..16940b7 100644 --- a/apps/wallet/urls.py +++ b/apps/wallet/urls.py @@ -24,9 +24,11 @@ application_urlpatterns = [ path('api/application//deposit/', application_views.DepositSubmitAPIView.as_view(), name='application_deposit_submit_api'), path('api/application//deposit//verify', application_views.DepositVerifyAPIView.as_view(), name='application_deposit_verify_api'), + path('api/application//deposit//rollback', application_views.DepositRollbackAPIView.as_view(), name='application_deposit_rollback_api'), path('api/application//withdraw/', application_views.WithdrawSubmitAPIView.as_view(), name='application_withdraw_submit_api'), path('api/application//withdraw//verify', application_views.WithdrawVerifyAPIView.as_view(), name='application_withdraw_verify_api'), + path('api/application//withdraw//rollback', application_views.WithdrawRollbackAPIView.as_view(), name='application_withdraw_rollback_api'), # path('api/application/wallets//', application_views.WalletTransactionListAPIView.as_view(), name='application_transaction_list_api'), # path('api/application/wallets///', application_views.WalletTransactionDetailAPIView.as_view(), name='application_transaction_detail'), diff --git a/apps/wallet/views/application.py b/apps/wallet/views/application.py index 8078637..6573f22 100755 --- a/apps/wallet/views/application.py +++ b/apps/wallet/views/application.py @@ -259,7 +259,33 @@ class DepositVerifyAPIView(generics.RetrieveAPIView): instance = self.get_object() if instance.state == StateChoices.PENDING: instance.verify() - logger.warning(f"Transaction was retrieved for {instance.uuid}: {instance.state}") + logger.warning(f"Transaction was verified for {instance.uuid}: {instance.state}") + serializer = self.get_serializer(instance) + return Response(serializer.data) + + + +class DepositRollbackAPIView(generics.RetrieveAPIView): + permission_classes = [IsAuthenticatedOrTokenHasScope] + serializer_class = ApplicationDepositSerializer + lookup_field = 'uuid' + required_scopes = ['wallet.application.deposit:rollback'] + + def get_queryset(self): + application = get_application(self.request) + payer_wallet_uuid = self.kwargs.get('payer_wallet') + if payer_wallet_uuid: + wallet = get_object_or_404(Wallet.objects.all(), uuid=payer_wallet_uuid) + else: + wallet = None + account = Account.objects.get(owner_uuid=application.uuid, owner_type=TypeChoices.APPLICATION, wallet=wallet) + return Transaction.objects.filter(application=application, payer_account=account).all() + + def retrieve(self, request, *args, **kwargs): + instance = self.get_object() + + instance.rollback() + logger.warning(f"Transaction was rolled back for {instance.uuid}: {instance.state}") serializer = self.get_serializer(instance) return Response(serializer.data) @@ -359,3 +385,25 @@ class WithdrawVerifyAPIView(generics.RetrieveAPIView): serializer = self.get_serializer(instance) return Response(serializer.data) + + +class WithdrawRollbackAPIView(generics.RetrieveAPIView): + permission_classes = [TokenHasScope] + serializer_class = ApplicationWithdrawSerializer + lookup_field = 'uuid' + required_scopes = ['wallet.application.withdraw:rollback'] + + def get_queryset(self): + application = get_application(self.request) + payee_wallet_uuid = self.kwargs.get('payee_wallet') + wallet = get_object_or_404(Wallet.objects.all(), uuid=payee_wallet_uuid) + payee_account = Account.objects.get(owner_uuid=application.uuid, owner_type=TypeChoices.APPLICATION, wallet=wallet) + return Transaction.objects.filter(application=application, payee_account=payee_account).all() + + def retrieve(self, request, *args, **kwargs): + instance = self.get_object() + + instance.rollback() + logger.warning(f"Transaction was rolled back for {instance.uuid}: {instance.state}") + serializer = self.get_serializer(instance) + return Response(serializer.data)