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) {