refactor: use many to many relation for lootboxes and rewards

This commit is contained in:
Phan Huy Tran 2025-04-02 10:08:23 +02:00
parent 084d478cd9
commit e4bcd9d791
4 changed files with 81 additions and 8 deletions

View file

@ -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");
}
};
}
}

View file

@ -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<RewardEntity> rewards = new ArrayList<>();
}

View file

@ -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;

View file

@ -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<LootBoxEntity> lootBoxes = new ArrayList<>();
}