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); + } +}