From 2a51dce565d8f00565ce1793ca272477b6ddeb67 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 28 May 2025 12:31:32 +0200
Subject: [PATCH] refactor: outsource deck related actions to service
---
.../casino/blackjack/BlackJackGameEntity.java | 2 +
.../casino/blackjack/BlackJackService.java | 86 +++++--------------
.../de/szut/casino/blackjack/DeckService.java | 57 ++++++++++++
.../java/de/szut/casino/user/UserEntity.java | 4 +-
4 files changed, 82 insertions(+), 67 deletions(-)
create mode 100644 backend/src/main/java/de/szut/casino/blackjack/DeckService.java
diff --git a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameEntity.java b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameEntity.java
index 4f22c9d..c9f57d7 100644
--- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameEntity.java
+++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameEntity.java
@@ -4,6 +4,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import de.szut.casino.user.UserEntity;
import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Positive;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
diff --git a/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java b/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java
index cbdbc27..272334d 100644
--- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java
+++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java
@@ -11,28 +11,27 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
-import java.util.Random;
@Service
public class BlackJackService {
private final BlackJackGameRepository blackJackGameRepository;
private final UserRepository userRepository;
- private final Random random;
private final BalanceService balanceService;
private final UserService userService;
+ private final DeckService deckService;
public BlackJackService(
BlackJackGameRepository blackJackGameRepository,
UserRepository userRepository,
- Random random,
BalanceService balanceService,
- UserService userService
+ UserService userService,
+ DeckService deckService
) {
this.blackJackGameRepository = blackJackGameRepository;
this.userRepository = userRepository;
- this.random = random;
this.balanceService = balanceService;
this.userService = userService;
+ this.deckService = deckService;
}
public BlackJackGameEntity getBlackJackGame(Long id) {
@@ -53,8 +52,8 @@ public class BlackJackService {
game.setUser(user);
game.setBet(betDto.getBetAmount());
- initializeDeck(game);
- dealInitialCards(game);
+ this.deckService.initializeDeck(game);
+ this.deckService.dealInitialCards(game);
game.setState(getState(game));
@@ -67,7 +66,7 @@ public class BlackJackService {
return game;
}
- dealCardToPlayer(game);
+ this.deckService.dealCardToPlayer(game);
updateGameStateAndBalance(game);
return processGameBasedOnState(game);
@@ -91,14 +90,14 @@ public class BlackJackService {
return game;
}
- UserEntity user = getUserWithFreshData(game.getUser());
+ UserEntity user = game.getUser();
BigDecimal additionalBet = game.getBet();
this.balanceService.subtractFunds(user, additionalBet);
game.setBet(game.getBet().add(additionalBet));
- dealCardToPlayer(game);
+ this.deckService.dealCardToPlayer(game);
updateGameStateAndBalance(game);
if (game.getState() == BlackJackState.IN_PROGRESS) {
@@ -117,36 +116,6 @@ public class BlackJackService {
return blackJackGameRepository.save(game);
}
- private UserEntity getUserWithFreshData(UserEntity user) {
- return userRepository.findById(user.getId()).orElse(user);
- }
-
- private void dealInitialCards(BlackJackGameEntity game) {
- for (int i = 0; i < 2; i++) {
- dealCardToPlayer(game);
- }
-
- dealCardToDealer(game);
- }
-
- private void dealCardToPlayer(BlackJackGameEntity game) {
- CardEntity card = drawCardFromDeck(game);
- card.setCardType(CardType.PLAYER);
- game.getPlayerCards().add(card);
- }
-
- private void dealCardToDealer(BlackJackGameEntity game) {
- CardEntity card = drawCardFromDeck(game);
- card.setCardType(CardType.DEALER);
- game.getDealerCards().add(card);
- }
-
- private void dealCardsToDealerUntilMinimumScore(BlackJackGameEntity game) {
- while (calculateHandValue(game.getDealerCards()) < 17) {
- dealCardToDealer(game);
- }
- }
-
private void updateGameStateAndBalance(BlackJackGameEntity game) {
game.setState(getState(game));
@@ -174,7 +143,7 @@ public class BlackJackService {
}
protected void updateUserBalance(BlackJackGameEntity game, boolean isWin) {
- UserEntity user = getUserWithFreshData(game.getUser());
+ UserEntity user = game.getUser();
BigDecimal totalBet = game.getBet();
BigDecimal balance = user.getBalance();
@@ -188,34 +157,11 @@ public class BlackJackService {
userRepository.save(user);
}
- private void initializeDeck(BlackJackGameEntity game) {
- for (Suit suit : Suit.values()) {
- for (Rank rank : Rank.values()) {
- CardEntity card = new CardEntity();
- card.setGame(game);
- card.setSuit(suit);
- card.setRank(rank);
- card.setCardType(CardType.DECK);
- game.getDeck().add(card);
- }
- }
-
- java.util.Collections.shuffle(game.getDeck(), random);
- }
-
- private CardEntity drawCardFromDeck(BlackJackGameEntity game) {
- if (game.getDeck().isEmpty()) {
- throw new IllegalStateException("Deck is empty");
- }
-
- return game.getDeck().removeFirst();
- }
-
private BlackJackState getState(BlackJackGameEntity game) {
int playerHandValue = calculateHandValue(game.getPlayerCards());
if (playerHandValue == 21) {
- CardEntity hole = drawCardFromDeck(game);
+ CardEntity hole = this.deckService.drawCardFromDeck(game);
hole.setCardType(CardType.DEALER);
game.getDealerCards().add(hole);
@@ -225,7 +171,7 @@ public class BlackJackService {
return BlackJackState.DRAW;
} else {
BigDecimal blackjackWinnings = game.getBet().multiply(new BigDecimal("1.5"));
- UserEntity user = getUserWithFreshData(game.getUser());
+ UserEntity user = game.getUser();
user.setBalance(user.getBalance().add(blackjackWinnings));
return BlackJackState.PLAYER_BLACKJACK;
}
@@ -253,4 +199,12 @@ public class BlackJackService {
return sum;
}
+
+ private void dealCardsToDealerUntilMinimumScore(BlackJackGameEntity game) {
+ while (calculateHandValue(game.getDealerCards()) < 17) {
+ this.deckService.dealCardToDealer(game);
+ }
+ }
}
+
+
diff --git a/backend/src/main/java/de/szut/casino/blackjack/DeckService.java b/backend/src/main/java/de/szut/casino/blackjack/DeckService.java
new file mode 100644
index 0000000..0511abd
--- /dev/null
+++ b/backend/src/main/java/de/szut/casino/blackjack/DeckService.java
@@ -0,0 +1,57 @@
+package de.szut.casino.blackjack;
+
+import org.springframework.stereotype.Service;
+
+import java.util.Random;
+
+@Service
+public class DeckService {
+ private final Random random;
+
+ public DeckService(Random random) {
+ this.random = random;
+ }
+
+ public void initializeDeck(BlackJackGameEntity game) {
+ for (Suit suit : Suit.values()) {
+ for (Rank rank : Rank.values()) {
+ CardEntity card = new CardEntity();
+ card.setGame(game);
+ card.setSuit(suit);
+ card.setRank(rank);
+ card.setCardType(CardType.DECK);
+ game.getDeck().add(card);
+ }
+ }
+
+ java.util.Collections.shuffle(game.getDeck(), random);
+ }
+
+ public CardEntity drawCardFromDeck(BlackJackGameEntity game) {
+ if (game.getDeck().isEmpty()) {
+ throw new IllegalStateException("Deck is empty");
+ }
+
+ return game.getDeck().removeFirst();
+ }
+
+ public void dealInitialCards(BlackJackGameEntity game) {
+ for (int i = 0; i < 2; i++) {
+ dealCardToPlayer(game);
+ }
+
+ dealCardToDealer(game);
+ }
+
+ public void dealCardToPlayer(BlackJackGameEntity game) {
+ CardEntity card = drawCardFromDeck(game);
+ card.setCardType(CardType.PLAYER);
+ game.getPlayerCards().add(card);
+ }
+
+ public void dealCardToDealer(BlackJackGameEntity game) {
+ CardEntity card = drawCardFromDeck(game);
+ card.setCardType(CardType.DEALER);
+ game.getDealerCards().add(card);
+ }
+}
diff --git a/backend/src/main/java/de/szut/casino/user/UserEntity.java b/backend/src/main/java/de/szut/casino/user/UserEntity.java
index c263d9c..534859f 100644
--- a/backend/src/main/java/de/szut/casino/user/UserEntity.java
+++ b/backend/src/main/java/de/szut/casino/user/UserEntity.java
@@ -16,6 +16,9 @@ public class UserEntity {
@GeneratedValue
private Long id;
+ @Version
+ private Long version;
+
@Column(unique = true)
private String email;
@@ -44,7 +47,6 @@ public class UserEntity {
this.password = password;
this.balance = balance;
this.verificationToken = verificationToken;
- this.provider = AuthProvider.LOCAL;
}
public UserEntity(String email, String username, AuthProvider provider, String providerId, BigDecimal balance) {