From e4bcd9d7910300ef47fb5de37a763377ae542f78 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 2 Apr 2025 10:08:23 +0200
Subject: [PATCH] refactor: use many to many relation for lootboxes and rewards
---
.../de/szut/casino/CasinoApplication.java | 69 +++++++++++++++++++
.../szut/casino/lootboxes/LootBoxEntity.java | 7 +-
.../casino/lootboxes/LootBoxRepository.java | 1 -
.../szut/casino/lootboxes/RewardEntity.java | 12 ++--
4 files changed, 81 insertions(+), 8 deletions(-)
diff --git a/backend/src/main/java/de/szut/casino/CasinoApplication.java b/backend/src/main/java/de/szut/casino/CasinoApplication.java
index 8c99f02..cc22e2c 100644
--- a/backend/src/main/java/de/szut/casino/CasinoApplication.java
+++ b/backend/src/main/java/de/szut/casino/CasinoApplication.java
@@ -1,10 +1,19 @@
package de.szut.casino;
+import de.szut.casino.lootboxes.LootBoxEntity;
+import de.szut.casino.lootboxes.LootBoxRepository;
+import de.szut.casino.lootboxes.RewardEntity;
+import de.szut.casino.lootboxes.RewardRepository;
+import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.List;
+
@SpringBootApplication
public class CasinoApplication {
@@ -16,4 +25,64 @@ public class CasinoApplication {
public static RestTemplate restTemplate() {
return new RestTemplate();
}
+
+ @Bean
+ public CommandLineRunner initData(LootBoxRepository lootBoxRepository, RewardRepository rewardRepository) {
+ return _ -> {
+ if (lootBoxRepository.count() == 0) {
+ // Create basic LootBox
+ LootBoxEntity basicLootBox = new LootBoxEntity();
+ basicLootBox.setName("Basic LootBox");
+ basicLootBox.setPrice(new BigDecimal("1.99"));
+
+ // Create premium LootBox
+ LootBoxEntity premiumLootBox = new LootBoxEntity();
+ premiumLootBox.setName("Premium LootBox");
+ premiumLootBox.setPrice(new BigDecimal("4.99"));
+
+ // Save LootBoxes first to get IDs
+ lootBoxRepository.saveAll(Arrays.asList(basicLootBox, premiumLootBox));
+
+ // Create rewards for basic LootBox
+ RewardEntity commonReward = new RewardEntity();
+ commonReward.setValue(new BigDecimal("0.50"));
+ commonReward.setProbability(new BigDecimal("70.00"));
+ commonReward.setLootBoxes(List.of(premiumLootBox));
+
+ RewardEntity rareReward = new RewardEntity();
+ rareReward.setValue(new BigDecimal("2.00"));
+ rareReward.setProbability(new BigDecimal("25.00"));
+ rareReward.setLootBoxes(List.of(basicLootBox));
+
+ RewardEntity epicReward = new RewardEntity();
+ epicReward.setValue(new BigDecimal("5.00"));
+ epicReward.setProbability(new BigDecimal("5.00"));
+ epicReward.setLootBoxes(List.of(basicLootBox));
+
+ // Create rewards for premium LootBox
+ RewardEntity premiumCommon = new RewardEntity();
+ premiumCommon.setValue(new BigDecimal("2.00"));
+ premiumCommon.setProbability(new BigDecimal("60.00"));
+ premiumCommon.setLootBoxes(List.of(premiumLootBox));
+
+ RewardEntity premiumRare = new RewardEntity();
+ premiumRare.setValue(new BigDecimal("5.00"));
+ premiumRare.setProbability(new BigDecimal("30.00"));
+ premiumRare.setLootBoxes(List.of(premiumLootBox));
+
+ RewardEntity legendaryReward = new RewardEntity();
+ legendaryReward.setValue(new BigDecimal("15.00"));
+ legendaryReward.setProbability(new BigDecimal("10.00"));
+ legendaryReward.setLootBoxes(List.of(premiumLootBox));
+
+ rewardRepository.saveAll(Arrays.asList(
+ commonReward, rareReward, epicReward,
+ premiumCommon, premiumRare, legendaryReward
+ ));
+ System.out.println("Initial LootBoxes and rewards created successfully");
+ } else {
+ System.out.println("LootBoxes already exist, skipping initialization");
+ }
+ };
+ }
}
diff --git a/backend/src/main/java/de/szut/casino/lootboxes/LootBoxEntity.java b/backend/src/main/java/de/szut/casino/lootboxes/LootBoxEntity.java
index 7138bf3..bd6c588 100644
--- a/backend/src/main/java/de/szut/casino/lootboxes/LootBoxEntity.java
+++ b/backend/src/main/java/de/szut/casino/lootboxes/LootBoxEntity.java
@@ -29,6 +29,11 @@ public class LootBoxEntity {
@Column(precision = 19, scale = 2)
private BigDecimal price;
- @OneToMany(mappedBy = "lootBox", cascade = CascadeType.ALL, orphanRemoval = true)
+ @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+ @JoinTable(
+ name = "lootbox_reward",
+ joinColumns = @JoinColumn(name = "lootbox_id"),
+ inverseJoinColumns = @JoinColumn(name = "reward_id")
+ )
private List rewards = new ArrayList<>();
}
diff --git a/backend/src/main/java/de/szut/casino/lootboxes/LootBoxRepository.java b/backend/src/main/java/de/szut/casino/lootboxes/LootBoxRepository.java
index 96ba188..472388e 100644
--- a/backend/src/main/java/de/szut/casino/lootboxes/LootBoxRepository.java
+++ b/backend/src/main/java/de/szut/casino/lootboxes/LootBoxRepository.java
@@ -1,6 +1,5 @@
package de.szut.casino.lootboxes;
-import de.szut.casino.blackjack.BlackJackGameEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
diff --git a/backend/src/main/java/de/szut/casino/lootboxes/RewardEntity.java b/backend/src/main/java/de/szut/casino/lootboxes/RewardEntity.java
index 0c1d21d..97ad6d1 100644
--- a/backend/src/main/java/de/szut/casino/lootboxes/RewardEntity.java
+++ b/backend/src/main/java/de/szut/casino/lootboxes/RewardEntity.java
@@ -1,14 +1,16 @@
package de.szut.casino.lootboxes;
import com.fasterxml.jackson.annotation.JsonBackReference;
-import com.fasterxml.jackson.annotation.JsonManagedReference;
-import de.szut.casino.blackjack.BlackJackGameEntity;
import jakarta.persistence.*;
+import lombok.Getter;
+import lombok.Setter;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
+@Getter
+@Setter
@Entity
public class RewardEntity {
@Id
@@ -21,8 +23,6 @@ public class RewardEntity {
@Column(precision = 5, scale = 2)
private BigDecimal probability;
- @ManyToOne
- @JoinColumn(name = "lootBox_id", nullable = false)
- @JsonBackReference
- private LootBoxEntity lootBox;
+ @ManyToMany(mappedBy = "rewards")
+ private List lootBoxes = new ArrayList<>();
}