From b6a0b0b537ac1fcb1be54869ed4afb766d72b9c4 Mon Sep 17 00:00:00 2001 From: rizwanisready Date: Fri, 7 Jun 2024 20:34:45 +0530 Subject: [PATCH] selling selected rewards --- manage_referrals/api/serializers.py | 1 + manage_referrals/api/urls.py | 5 +++ manage_referrals/api/views.py | 69 ++++++++++++++++++++++++++++- 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/manage_referrals/api/serializers.py b/manage_referrals/api/serializers.py index 48dfa83..53c559a 100644 --- a/manage_referrals/api/serializers.py +++ b/manage_referrals/api/serializers.py @@ -50,4 +50,5 @@ class ReferralRecordRewardSerializer(serializers.ModelSerializer): "coins", "unique_token", "value", + "created_on", ] diff --git a/manage_referrals/api/urls.py b/manage_referrals/api/urls.py index 6d2f4c0..569815c 100644 --- a/manage_referrals/api/urls.py +++ b/manage_referrals/api/urls.py @@ -24,4 +24,9 @@ urlpatterns = [ views.RedeemRewardView.as_view(), name="redeem_reward", ), + path( + "redeem-selected-rewards/", + views.RedeemSelectedRewardsView.as_view(), + name="redeem_selected_rewards", + ), ] diff --git a/manage_referrals/api/views.py b/manage_referrals/api/views.py index c748556..f131bea 100644 --- a/manage_referrals/api/views.py +++ b/manage_referrals/api/views.py @@ -62,7 +62,9 @@ class RewardListView(APIView): def get(self, request): # Filter rewards based on specified conditions - current_principal = request.user # Adjust based on how user is linked to principal + current_principal = ( + request.user + ) # Adjust based on how user is linked to principal # Filter rewards based on the authenticated referrer rewards_query = ReferralRecordReward.objects.filter( @@ -126,3 +128,68 @@ class RedeemRewardView(APIView): message=constants.SUCCESS, data="Token sold successfully.", ) + + +class RedeemSelectedRewardsView(APIView): + authentication_classes = [JWTAuthentication] + permission_classes = [IsAuthenticated] + + def patch(self, request): + # Extract the number of tokens from the request data + num_tokens_to_sell = request.data.get("num_tokens", None) + + if num_tokens_to_sell is None: + return ApiResponse.error( + status=status.HTTP_400_BAD_REQUEST, + message=constants.FAILURE, + errors="Number of tokens to sell is required.", + ) + + try: + num_tokens_to_sell = int(num_tokens_to_sell) + except ValueError: + return ApiResponse.error( + status=status.HTTP_400_BAD_REQUEST, + message=constants.FAILURE, + errors="Invalid number of tokens.", + ) + + # Retrieve the rewards for the authenticated user + rewards = ReferralRecordReward.objects.filter( + referral_record__referrer_principal=request.user, sell=False + ).order_by( + "id" + ) # FIFO method + + if rewards.count() < num_tokens_to_sell: + return ApiResponse.error( + status=status.HTTP_404_NOT_FOUND, + message=constants.FAILURE, + errors="Not enough unsold rewards available.", + ) + + # Select the required number of rewards + rewards_to_sell = rewards[:num_tokens_to_sell] + total_value = sum(reward.value for reward in rewards_to_sell) + total_coins = sum(reward.coins for reward in rewards_to_sell) + tokens = ",".join(str(reward.unique_token) for reward in rewards_to_sell) + + with transaction.atomic(): + # Create a new withdrawal request + withdrawal_request = WithdrawalRequest.objects.create( + principal=request.user, + coins=total_coins, + amount=total_value, + token=tokens, + ) + + # Update each reward to mark it as sold + for reward in rewards_to_sell: + reward.sell = True + reward.save() + + return ApiResponse.success( + status=status.HTTP_200_OK, + message=constants.SUCCESS, + data="Selected tokens sold successfully.", + )