selling selected rewards

This commit is contained in:
rizwanisready
2024-06-07 20:34:45 +05:30
parent 15265b1914
commit b6a0b0b537
3 changed files with 74 additions and 1 deletions

View File

@@ -50,4 +50,5 @@ class ReferralRecordRewardSerializer(serializers.ModelSerializer):
"coins",
"unique_token",
"value",
"created_on",
]

View File

@@ -24,4 +24,9 @@ urlpatterns = [
views.RedeemRewardView.as_view(),
name="redeem_reward",
),
path(
"redeem-selected-rewards/",
views.RedeemSelectedRewardsView.as_view(),
name="redeem_selected_rewards",
),
]

View File

@@ -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.",
)