diff --git a/backend/requests/blackjack.http b/backend/requests/blackjack.http index ea20985..fcff731 100644 --- a/backend/requests/blackjack.http +++ b/backend/requests/blackjack.http @@ -5,3 +5,8 @@ Content-Type: application/json { "betAmount": 1.01 } + +### +POST http://localhost:8080/blackjack/103/hit +Authorization: Bearer {{token}} + diff --git a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java index 0aab2cb..1319c10 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java +++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java @@ -6,14 +6,12 @@ import de.szut.casino.user.UserService; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Optional; @Slf4j @@ -28,6 +26,23 @@ public class BlackJackGameController { this.userService = userService; } + @PostMapping("/blackjack/{id}/hit") + public ResponseEntity hit(@PathVariable Long id, @RequestHeader("Authorization") String token) { + Optional optionalUser = userService.getCurrentUser(token); + + if (optionalUser.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + UserEntity user = optionalUser.get(); + BlackJackGameEntity game = blackJackService.getBlackJackGame(id); + if (game == null || !Objects.equals(game.getUserId(), user.getId())) { + return ResponseEntity.notFound().build(); + } + + return ResponseEntity.ok(blackJackService.hit(game)); + } + @PostMapping("/blackjack/start") public ResponseEntity createBlackJackGame(@RequestBody @Valid CreateBlackJackGameDto createBlackJackGameDto, @RequestHeader("Authorization") String token) { Optional optionalUser = userService.getCurrentUser(token); 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 0193991..eb5a704 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameEntity.java +++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameEntity.java @@ -8,6 +8,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.hibernate.annotations.SQLRestriction; import java.math.BigDecimal; import java.util.ArrayList; @@ -39,13 +40,16 @@ public class BlackJackGameEntity { @OneToMany(mappedBy = "game", cascade = CascadeType.ALL, orphanRemoval = true) @JsonIgnore + @SQLRestriction("card_type = 'DECK'") private List deck = new ArrayList<>(); @OneToMany(mappedBy = "game", cascade = CascadeType.ALL, orphanRemoval = true) @JsonManagedReference + @SQLRestriction("card_type = 'PLAYER'") private List playerCards = new ArrayList<>(); @OneToMany(mappedBy = "game", cascade = CascadeType.ALL, orphanRemoval = true) @JsonManagedReference + @SQLRestriction("card_type = 'DEALER'") private List dealerCards = new ArrayList<>(); } 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 86a159c..05cf93c 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java +++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.List; +import java.util.Optional; import java.util.Random; @Service @@ -20,6 +21,11 @@ public class BlackJackService { private final Random random = new Random(); + public BlackJackGameEntity getBlackJackGame(Long id) { + Optional optionalBlackJackGame = blackJackGameRepository.findById(id); + return optionalBlackJackGame.orElse(null); + } + public BlackJackGameEntity createBlackJackGame(UserEntity user, BigDecimal betAmount) { BlackJackGameEntity game = new BlackJackGameEntity(); game.setUser(user); @@ -28,10 +34,12 @@ public class BlackJackService { for (int i = 0; i < 2; i++) { CardEntity playerCard = drawCardFromDeck(game); + playerCard.setCardType(CardType.PLAYER); game.getPlayerCards().add(playerCard); } CardEntity dealerCard = drawCardFromDeck(game); + dealerCard.setCardType(CardType.DEALER); game.getDealerCards().add(dealerCard); game.setState(getState(game)); @@ -43,6 +51,16 @@ public class BlackJackService { return game; } + public BlackJackGameEntity hit(BlackJackGameEntity game) { + CardEntity drawnCard = drawCardFromDeck(game); + drawnCard.setCardType(CardType.PLAYER); + game.getPlayerCards().add(drawnCard); + + game.setState(getState(game)); + + return blackJackGameRepository.save(game); + } + private void initializeDeck(BlackJackGameEntity game) { for (Suit suit : Suit.values()) { for (Rank rank : Rank.values()) { @@ -50,6 +68,7 @@ public class BlackJackService { card.setGame(game); card.setSuit(suit); card.setRank(rank); + card.setCardType(CardType.DECK); game.getDeck().add(card); } } diff --git a/backend/src/main/java/de/szut/casino/blackjack/CardEntity.java b/backend/src/main/java/de/szut/casino/blackjack/CardEntity.java index 8026d72..5520b58 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/CardEntity.java +++ b/backend/src/main/java/de/szut/casino/blackjack/CardEntity.java @@ -1,6 +1,5 @@ package de.szut.casino.blackjack; - import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; @@ -30,4 +29,11 @@ public class CardEntity { @Enumerated(EnumType.STRING) private Rank rank; + + @Enumerated(EnumType.STRING) + private CardType cardType; +} + +enum CardType { + DECK, PLAYER, DEALER }