From ed5960877d5e8db71acde4d5a5f51244cb4e8b69 Mon Sep 17 00:00:00 2001 From: Jan K9f Date: Thu, 27 Mar 2025 12:18:25 +0100 Subject: [PATCH 1/5] feat(blackjack): add hit endpoint for blackjack game --- .../blackjack/BlackJackGameController.java | 22 +++++++++++++++---- .../casino/blackjack/BlackJackService.java | 6 +++++ 2 files changed, 24 insertions(+), 4 deletions(-) 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..930fc1f 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java +++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java @@ -6,10 +6,7 @@ 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; @@ -28,6 +25,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) { + return ResponseEntity.notFound().build(); + } + + + } + @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/BlackJackService.java b/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java index 86a159c..451f743 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java +++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java @@ -5,6 +5,7 @@ import de.szut.casino.user.UserRepository; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.util.Optional; import java.util.List; import java.util.Random; @@ -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); From bd5539bb42d96bdc22b79d49e38d9762e32e0f7b Mon Sep 17 00:00:00 2001 From: Jan K9f Date: Thu, 27 Mar 2025 12:28:38 +0100 Subject: [PATCH 2/5] feat(blackjack): implement hit action for blackjack game --- .../casino/blackjack/BlackJackGameController.java | 5 ++++- .../de/szut/casino/blackjack/BlackJackService.java | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) 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 930fc1f..fd3eb7d 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java +++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java @@ -39,7 +39,10 @@ public class BlackJackGameController { return ResponseEntity.notFound().build(); } - + // TODO validate that hit is a valid action + + blackJackService.hit(game); + return ResponseEntity.ok().build(); } @PostMapping("/blackjack/start") 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 451f743..e46f3b7 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java +++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java @@ -5,6 +5,7 @@ import de.szut.casino.user.UserRepository; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Optional; import java.util.List; import java.util.Random; @@ -49,6 +50,16 @@ public class BlackJackService { return game; } + public BlackJackGameEntity hit(BlackJackGameEntity game) { + CardEntity drawnCard = drawCardFromDeck(game); + ArrayList playerCards = (ArrayList) game.getPlayerCards(); + + playerCards.add(drawnCard); + game.setPlayerCards(playerCards); + blackJackGameRepository.save(game); + return game; + } + private void initializeDeck(BlackJackGameEntity game) { for (Suit suit : Suit.values()) { for (Rank rank : Rank.values()) { From 59562e5b641fcdb31efd0a4db74c96f5d54a68a4 Mon Sep 17 00:00:00 2001 From: Jan K9f Date: Thu, 27 Mar 2025 12:30:01 +0100 Subject: [PATCH 3/5] fix(BlackJackGameController): improve game existence check --- .../java/de/szut/casino/blackjack/BlackJackGameController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 fd3eb7d..0d83b34 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java +++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java @@ -11,6 +11,7 @@ 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 @@ -35,7 +36,7 @@ public class BlackJackGameController { UserEntity user = optionalUser.get(); BlackJackGameEntity game = blackJackService.getBlackJackGame(id); - if (game == null) { + if (game == null || !Objects.equals(game.getUserId(), user.getId())) { return ResponseEntity.notFound().build(); } From 500a76dd7ab110cdff7591df74f84e2a5d0626b7 Mon Sep 17 00:00:00 2001 From: Jan K9f Date: Thu, 27 Mar 2025 12:42:40 +0100 Subject: [PATCH 4/5] player gets way to many cards and I dont know why pls help --- backend/requests/blackjack.http | 5 +++++ .../de/szut/casino/blackjack/BlackJackGameController.java | 2 +- .../main/java/de/szut/casino/blackjack/BlackJackService.java | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/requests/blackjack.http b/backend/requests/blackjack.http index ea20985..f401c12 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/52/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 0d83b34..de0c960 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java +++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java @@ -43,7 +43,7 @@ public class BlackJackGameController { // TODO validate that hit is a valid action blackJackService.hit(game); - return ResponseEntity.ok().build(); + return ResponseEntity.ok(game); } @PostMapping("/blackjack/start") 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 e46f3b7..bb21df0 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.ArrayList; +import java.util.List; import java.util.Optional; import java.util.List; import java.util.Random; @@ -52,10 +53,9 @@ public class BlackJackService { public BlackJackGameEntity hit(BlackJackGameEntity game) { CardEntity drawnCard = drawCardFromDeck(game); - ArrayList playerCards = (ArrayList) game.getPlayerCards(); + List playerCards = game.getPlayerCards(); playerCards.add(drawnCard); - game.setPlayerCards(playerCards); blackJackGameRepository.save(game); return game; } From 7a7d24c8ea87e218d6a0e59759fb88f7e8de60e6 Mon Sep 17 00:00:00 2001 From: Phan Huy Tran Date: Thu, 27 Mar 2025 13:50:17 +0100 Subject: [PATCH 5/5] fix: fix playercards, dealercards and deck referencing the same database entity --- backend/requests/blackjack.http | 2 +- .../casino/blackjack/BlackJackGameController.java | 5 +---- .../szut/casino/blackjack/BlackJackGameEntity.java | 4 ++++ .../de/szut/casino/blackjack/BlackJackService.java | 14 ++++++++------ .../java/de/szut/casino/blackjack/CardEntity.java | 8 +++++++- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/backend/requests/blackjack.http b/backend/requests/blackjack.http index f401c12..fcff731 100644 --- a/backend/requests/blackjack.http +++ b/backend/requests/blackjack.http @@ -7,6 +7,6 @@ Content-Type: application/json } ### -POST http://localhost:8080/blackjack/52/hit +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 de0c960..1319c10 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java +++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java @@ -40,10 +40,7 @@ public class BlackJackGameController { return ResponseEntity.notFound().build(); } - // TODO validate that hit is a valid action - - blackJackService.hit(game); - return ResponseEntity.ok(game); + return ResponseEntity.ok(blackJackService.hit(game)); } @PostMapping("/blackjack/start") 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 bb21df0..05cf93c 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java +++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java @@ -5,10 +5,8 @@ import de.szut.casino.user.UserRepository; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.util.ArrayList; import java.util.List; import java.util.Optional; -import java.util.List; import java.util.Random; @Service @@ -36,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)); @@ -53,11 +53,12 @@ public class BlackJackService { public BlackJackGameEntity hit(BlackJackGameEntity game) { CardEntity drawnCard = drawCardFromDeck(game); - List playerCards = game.getPlayerCards(); + drawnCard.setCardType(CardType.PLAYER); + game.getPlayerCards().add(drawnCard); - playerCards.add(drawnCard); - blackJackGameRepository.save(game); - return game; + game.setState(getState(game)); + + return blackJackGameRepository.save(game); } private void initializeDeck(BlackJackGameEntity game) { @@ -67,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 }