From 948240ba1e61d404adad56b4ed6ac96869ea7c23 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 2 Apr 2025 11:15:08 +0200
Subject: [PATCH] fix: fix wrong reward getting returned, refactor to service
---
backend/requests/lootboxes.http | 2 +-
.../de/szut/casino/CasinoApplication.java | 4 --
.../casino/lootboxes/LootBoxController.java | 32 ++++-----------
.../szut/casino/lootboxes/LootBoxService.java | 40 +++++++++++++++++++
4 files changed, 48 insertions(+), 30 deletions(-)
create mode 100644 backend/src/main/java/de/szut/casino/lootboxes/LootBoxService.java
diff --git a/backend/requests/lootboxes.http b/backend/requests/lootboxes.http
index 126d237..9059570 100644
--- a/backend/requests/lootboxes.http
+++ b/backend/requests/lootboxes.http
@@ -4,6 +4,6 @@ Content-Type: application/json
###
-POST http://localhost:8080/lootboxes/1
+POST http://localhost:8080/lootboxes/2
Authorization: Bearer {{token}}
Content-Type: application/json
\ No newline at end of file
diff --git a/backend/src/main/java/de/szut/casino/CasinoApplication.java b/backend/src/main/java/de/szut/casino/CasinoApplication.java
index 4b47f5c..1d7e861 100644
--- a/backend/src/main/java/de/szut/casino/CasinoApplication.java
+++ b/backend/src/main/java/de/szut/casino/CasinoApplication.java
@@ -41,7 +41,6 @@ public class CasinoApplication {
premiumLootBox.setPrice(new BigDecimal("5"));
premiumLootBox.setRewards(new ArrayList<>()); // Initialize the list
- // Save the loot boxes first
lootBoxRepository.saveAll(Arrays.asList(basicLootBox, premiumLootBox));
RewardEntity commonReward = new RewardEntity();
@@ -68,13 +67,11 @@ public class CasinoApplication {
legendaryReward.setValue(new BigDecimal("15.00"));
legendaryReward.setProbability(new BigDecimal("0.10"));
- // Save all rewards
rewardRepository.saveAll(Arrays.asList(
commonReward, rareReward, epicReward,
premiumCommon, premiumRare, legendaryReward
));
- // Add relationships from the owning side (LootBox)
basicLootBox.getRewards().add(commonReward);
basicLootBox.getRewards().add(premiumRare);
@@ -82,7 +79,6 @@ public class CasinoApplication {
premiumLootBox.getRewards().add(premiumRare);
premiumLootBox.getRewards().add(legendaryReward);
- // Update the loot boxes to save the relationships
lootBoxRepository.saveAll(Arrays.asList(basicLootBox, premiumLootBox));
System.out.println("Initial LootBoxes and rewards created successfully");
diff --git a/backend/src/main/java/de/szut/casino/lootboxes/LootBoxController.java b/backend/src/main/java/de/szut/casino/lootboxes/LootBoxController.java
index 716b02a..51a17e1 100644
--- a/backend/src/main/java/de/szut/casino/lootboxes/LootBoxController.java
+++ b/backend/src/main/java/de/szut/casino/lootboxes/LootBoxController.java
@@ -6,7 +6,6 @@ import de.szut.casino.user.UserService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
-import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -15,13 +14,13 @@ import java.util.Optional;
@RestController
public class LootBoxController {
private final LootBoxRepository lootBoxRepository;
- private final UserRepository userRepository;
private final UserService userService;
+ private final LootBoxService lootBoxService;
- public LootBoxController(LootBoxRepository lootBoxRepository, UserRepository userRepository, UserService userService) {
+ public LootBoxController(LootBoxRepository lootBoxRepository, UserRepository userRepository, UserService userService, LootBoxService lootBoxService) {
this.lootBoxRepository = lootBoxRepository;
- this.userRepository = userRepository;
this.userService = userService;
+ this.lootBoxService = lootBoxService;
}
@GetMapping("/lootboxes")
@@ -37,7 +36,6 @@ public class LootBoxController {
}
LootBoxEntity lootBox = optionalLootBox.get();
- RewardEntity reward = determineReward(lootBox);
Optional optionalUser = userService.getCurrentUser(token);
if (optionalUser.isEmpty()) {
@@ -46,31 +44,15 @@ public class LootBoxController {
UserEntity user = optionalUser.get();
- if (user.getBalance().compareTo(lootBox.getPrice()) < 0) {
+ if (lootBoxService.hasSufficientBalance(user, lootBox.getPrice())) {
Map errorResponse = new HashMap<>();
errorResponse.put("error", "Insufficient balance");
return ResponseEntity.badRequest().body(errorResponse);
}
- user.setBalance(user.getBalance().subtract(lootBox.getPrice()));
- user.setBalance(user.getBalance().add(reward.getValue()));
- userRepository.save(user);
+ RewardEntity reward = lootBoxService.determineReward(lootBox);
+ lootBoxService.handleBalance(user, lootBox, reward);
- return ResponseEntity.ok(determineReward(lootBox));
+ return ResponseEntity.ok(reward);
}
-
- public RewardEntity determineReward(LootBoxEntity lootBox) {
- double randomValue = Math.random();
- BigDecimal cumulativeProbability = BigDecimal.ZERO;
-
- for (RewardEntity reward : lootBox.getRewards()) {
- cumulativeProbability = cumulativeProbability.add(reward.getProbability());
- if (randomValue <= cumulativeProbability.doubleValue()) {
- return reward;
- }
- }
-
- return lootBox.getRewards().getLast();
- }
-
}
diff --git a/backend/src/main/java/de/szut/casino/lootboxes/LootBoxService.java b/backend/src/main/java/de/szut/casino/lootboxes/LootBoxService.java
new file mode 100644
index 0000000..d80370e
--- /dev/null
+++ b/backend/src/main/java/de/szut/casino/lootboxes/LootBoxService.java
@@ -0,0 +1,40 @@
+package de.szut.casino.lootboxes;
+
+import de.szut.casino.user.UserEntity;
+import de.szut.casino.user.UserRepository;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+@Service
+public class LootBoxService {
+ private final UserRepository userRepository;
+
+ public LootBoxService(UserRepository userRepository) {
+ this.userRepository = userRepository;
+ }
+
+ public boolean hasSufficientBalance(UserEntity user, BigDecimal price) {
+ return user.getBalance().compareTo(price) < 0;
+ }
+
+ public RewardEntity determineReward(LootBoxEntity lootBox) {
+ double randomValue = Math.random();
+ BigDecimal cumulativeProbability = BigDecimal.ZERO;
+
+ for (RewardEntity reward : lootBox.getRewards()) {
+ cumulativeProbability = cumulativeProbability.add(reward.getProbability());
+ if (randomValue <= cumulativeProbability.doubleValue()) {
+ return reward;
+ }
+ }
+
+ return lootBox.getRewards().getLast();
+ }
+
+ public void handleBalance(UserEntity user, LootBoxEntity lootBox, RewardEntity reward) {
+ user.setBalance(user.getBalance().subtract(lootBox.getPrice()));
+ user.setBalance(user.getBalance().add(reward.getValue()));
+ userRepository.save(user);
+ }
+}