From 24ea51318fca09fc4eeabad5d409d2ea625cb074 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 26 Mar 2025 11:13:51 +0100
Subject: [PATCH 1/8] feat: Add card class
---
.../java/de/szut/casino/blackjack/Card.java | 14 +++++++++
.../java/de/szut/casino/blackjack/Rank.java | 31 +++++++++++++++++++
.../java/de/szut/casino/blackjack/Suit.java | 20 ++++++++++++
3 files changed, 65 insertions(+)
create mode 100644 backend/src/main/java/de/szut/casino/blackjack/Card.java
create mode 100644 backend/src/main/java/de/szut/casino/blackjack/Rank.java
create mode 100644 backend/src/main/java/de/szut/casino/blackjack/Suit.java
diff --git a/backend/src/main/java/de/szut/casino/blackjack/Card.java b/backend/src/main/java/de/szut/casino/blackjack/Card.java
new file mode 100644
index 0000000..2e8922d
--- /dev/null
+++ b/backend/src/main/java/de/szut/casino/blackjack/Card.java
@@ -0,0 +1,14 @@
+package de.szut.casino.blackjack;
+
+import lombok.Getter;
+
+@Getter
+public class Card {
+ private final Suit suit;
+ private final Rank rank;
+
+ public Card(Suit suit, Rank rank) {
+ this.suit = suit;
+ this.rank = rank;
+ }
+}
diff --git a/backend/src/main/java/de/szut/casino/blackjack/Rank.java b/backend/src/main/java/de/szut/casino/blackjack/Rank.java
new file mode 100644
index 0000000..8f9a3b8
--- /dev/null
+++ b/backend/src/main/java/de/szut/casino/blackjack/Rank.java
@@ -0,0 +1,31 @@
+package de.szut.casino.blackjack;
+
+import lombok.Getter;
+
+@Getter
+public enum Rank {
+ TWO("2", "Two", 2),
+ THREE("3", "Three", 3),
+ FOUR("4", "Four", 4),
+ FIVE("5", "Five", 5),
+ SIX("6", "Six", 6),
+ SEVEN("7", "Seven", 7),
+ EIGHT("8", "Eight", 8),
+ NINE("9", "Nine", 9),
+ TEN("10", "Ten", 10),
+ JACK("J", "Jack", 10),
+ QUEEN("Q", "Queen", 10),
+ KING("K", "King", 10),
+ ACE("A", "Ace", 11);
+
+ private final String symbol;
+ private final String displayName;
+ private final int value;
+
+ Rank(String symbol, String displayName, int value) {
+ this.symbol = symbol;
+ this.displayName = displayName;
+ this.value = value;
+ }
+
+}
diff --git a/backend/src/main/java/de/szut/casino/blackjack/Suit.java b/backend/src/main/java/de/szut/casino/blackjack/Suit.java
new file mode 100644
index 0000000..8ee80a9
--- /dev/null
+++ b/backend/src/main/java/de/szut/casino/blackjack/Suit.java
@@ -0,0 +1,20 @@
+package de.szut.casino.blackjack;
+
+import lombok.Getter;
+
+@Getter
+public enum Suit {
+ HEARTS("H", "Hearts"),
+ DIAMONDS("D", "Diamonds"),
+ CLUBS("C", "Clubs"),
+ SPADES("S", "Spades");
+
+ private final String symbol;
+ private final String displayName;
+
+ Suit(String symbol, String displayName) {
+ this.symbol = symbol;
+ this.displayName = displayName;
+ }
+
+}
From 8cb045fcbe7b3be037a3cf8a3059ae0b4ed13e14 Mon Sep 17 00:00:00 2001
From: Jan K9f
Date: Wed, 26 Mar 2025 12:20:27 +0100
Subject: [PATCH 2/8] feat(blackjack): add BlackJack game creation
functionality
---
backend/requests/test.http | 7 ++++
.../blackjack/BlackJackGameController.java | 35 +++++++++++++++++++
.../casino/blackjack/BlackJackGameEntity.java | 23 ++++++++++++
.../java/de/szut/casino/blackjack/Card.java | 1 +
.../blackjack/dto/CreateBlackJackGameDto.java | 14 ++++++++
5 files changed, 80 insertions(+)
create mode 100644 backend/requests/test.http
create mode 100644 backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java
create mode 100644 backend/src/main/java/de/szut/casino/blackjack/BlackJackGameEntity.java
create mode 100644 backend/src/main/java/de/szut/casino/blackjack/dto/CreateBlackJackGameDto.java
diff --git a/backend/requests/test.http b/backend/requests/test.http
new file mode 100644
index 0000000..f7ebab0
--- /dev/null
+++ b/backend/requests/test.http
@@ -0,0 +1,7 @@
+POST http://localhost:8080/blackjack/start
+Authorization: Bearer {{token}}
+Content-Type: application/json
+
+{
+ "betAmount": 999
+}
diff --git a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java
new file mode 100644
index 0000000..3f7fda0
--- /dev/null
+++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java
@@ -0,0 +1,35 @@
+package de.szut.casino.blackjack;
+
+import de.szut.casino.blackjack.dto.CreateBlackJackGameDto;
+import de.szut.casino.user.UserService;
+import de.szut.casino.user.dto.CreateUserDto;
+import jakarta.validation.Valid;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+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;
+
+@Slf4j
+@RestController
+public class BlackJackGameController {
+
+ @Autowired
+ private UserService userService;
+
+ @PostMapping("/blackjack/start")
+ public ResponseEntity> createBlackJackGame(@RequestBody @Valid CreateBlackJackGameDto gameData, @RequestHeader("Authorization") String token) {
+ if (gameData.getBetAmount() <= 0 || gameData.getBetAmount() > userService.getCurrentUser(token).getBalance().intValue()) {
+ return ResponseEntity.badRequest().body("Invalid bet amount");
+ }
+
+ BlackJackGameEntity game = new BlackJackGameEntity();
+ game.setBet(gameData.getBetAmount());
+ System.out.println("Balls: ");
+ System.out.println(game.getBet());
+ return null;
+ }
+}
diff --git a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameEntity.java b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameEntity.java
new file mode 100644
index 0000000..c275953
--- /dev/null
+++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameEntity.java
@@ -0,0 +1,23 @@
+package de.szut.casino.blackjack;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+
+@Entity
+@Getter
+@Setter
+public class BlackJackGameEntity {
+ @Id
+ @GeneratedValue
+ private Long id;
+ private ArrayList playerHand;
+ private ArrayList dealerHand;
+ private ArrayList deck;
+ private String state;
+ private int bet;
+}
diff --git a/backend/src/main/java/de/szut/casino/blackjack/Card.java b/backend/src/main/java/de/szut/casino/blackjack/Card.java
index 2e8922d..2547739 100644
--- a/backend/src/main/java/de/szut/casino/blackjack/Card.java
+++ b/backend/src/main/java/de/szut/casino/blackjack/Card.java
@@ -1,5 +1,6 @@
package de.szut.casino.blackjack;
+
import lombok.Getter;
@Getter
diff --git a/backend/src/main/java/de/szut/casino/blackjack/dto/CreateBlackJackGameDto.java b/backend/src/main/java/de/szut/casino/blackjack/dto/CreateBlackJackGameDto.java
new file mode 100644
index 0000000..4907dd1
--- /dev/null
+++ b/backend/src/main/java/de/szut/casino/blackjack/dto/CreateBlackJackGameDto.java
@@ -0,0 +1,14 @@
+package de.szut.casino.blackjack.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class CreateBlackJackGameDto {
+ private int betAmount;
+}
From 1a4b3f073f0a1e9a8e554c32ce434a08fadeba46 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 26 Mar 2025 13:05:24 +0100
Subject: [PATCH 3/8] fix: add openid scope to get bearer token request
---
backend/requests/getBearerToken.http | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/backend/requests/getBearerToken.http b/backend/requests/getBearerToken.http
index afdea20..791c3a2 100644
--- a/backend/requests/getBearerToken.http
+++ b/backend/requests/getBearerToken.http
@@ -1,6 +1,6 @@
POST http://localhost:9090/realms/LF12/protocol/openid-connect/token
Content-Type: application/x-www-form-urlencoded
-grant_type=password&client_id=lf12&username=lf12_test_user&password=secret
+grant_type=password&client_id=lf12&username=lf12_test_user&password=secret&scope=openid
> {% client.global.set("token", response.body.access_token); %}
\ No newline at end of file
From b2b0bb2f445a8ce939a7c37b481ef62a183b105e Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 26 Mar 2025 13:23:27 +0100
Subject: [PATCH 4/8] feat: Validate bet amount
---
backend/requests/test.http | 2 +-
.../blackjack/BlackJackGameController.java | 29 ++++++++++++++-----
.../blackjack/dto/CreateBlackJackGameDto.java | 4 ++-
.../java/de/szut/casino/user/UserService.java | 1 -
4 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/backend/requests/test.http b/backend/requests/test.http
index f7ebab0..57fd8f1 100644
--- a/backend/requests/test.http
+++ b/backend/requests/test.http
@@ -3,5 +3,5 @@ Authorization: Bearer {{token}}
Content-Type: application/json
{
- "betAmount": 999
+ "betAmount": -1
}
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 3f7fda0..095a20e 100644
--- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java
+++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java
@@ -1,8 +1,10 @@
package de.szut.casino.blackjack;
import de.szut.casino.blackjack.dto.CreateBlackJackGameDto;
+import de.szut.casino.user.UserEntity;
import de.szut.casino.user.UserService;
import de.szut.casino.user.dto.CreateUserDto;
+import de.szut.casino.user.dto.GetUserDto;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -13,6 +15,10 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
@Slf4j
@RestController
public class BlackJackGameController {
@@ -21,15 +27,24 @@ public class BlackJackGameController {
private UserService userService;
@PostMapping("/blackjack/start")
- public ResponseEntity> createBlackJackGame(@RequestBody @Valid CreateBlackJackGameDto gameData, @RequestHeader("Authorization") String token) {
- if (gameData.getBetAmount() <= 0 || gameData.getBetAmount() > userService.getCurrentUser(token).getBalance().intValue()) {
- return ResponseEntity.badRequest().body("Invalid bet amount");
+ public ResponseEntity> createBlackJackGame(@RequestBody @Valid CreateBlackJackGameDto createBlackJackGameDto, @RequestHeader("Authorization") String token) {
+ GetUserDto getUserDto = userService.getCurrentUser(token);
+ BigDecimal balance = getUserDto.getBalance();
+
+ if (createBlackJackGameDto.getBetAmount().compareTo(BigDecimal.ZERO) <= 0) {
+ Map errorResponse = new HashMap<>();
+ errorResponse.put("error", "Invalid bet amount");
+ return ResponseEntity.badRequest().body(errorResponse);
}
- BlackJackGameEntity game = new BlackJackGameEntity();
- game.setBet(gameData.getBetAmount());
- System.out.println("Balls: ");
- System.out.println(game.getBet());
+ if (createBlackJackGameDto.getBetAmount().compareTo(balance) > 0) {
+ Map errorResponse = new HashMap<>();
+ errorResponse.put("error", "Insufficient funds");
+ return ResponseEntity.badRequest().body(errorResponse);
+ }
+
+
+
return null;
}
}
diff --git a/backend/src/main/java/de/szut/casino/blackjack/dto/CreateBlackJackGameDto.java b/backend/src/main/java/de/szut/casino/blackjack/dto/CreateBlackJackGameDto.java
index 4907dd1..e5b0c97 100644
--- a/backend/src/main/java/de/szut/casino/blackjack/dto/CreateBlackJackGameDto.java
+++ b/backend/src/main/java/de/szut/casino/blackjack/dto/CreateBlackJackGameDto.java
@@ -5,10 +5,12 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
+import java.math.BigDecimal;
+
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class CreateBlackJackGameDto {
- private int betAmount;
+ private BigDecimal betAmount;
}
diff --git a/backend/src/main/java/de/szut/casino/user/UserService.java b/backend/src/main/java/de/szut/casino/user/UserService.java
index 724962e..70d961f 100644
--- a/backend/src/main/java/de/szut/casino/user/UserService.java
+++ b/backend/src/main/java/de/szut/casino/user/UserService.java
@@ -40,7 +40,6 @@ public class UserService {
public GetUserDto getCurrentUser(String token) {
KeycloakUserDto userData = getKeycloakUserInfo(token);
-
if (userData == null) {
return null;
}
From 64e41b663e76e6e15d09785c32182fb1d76db0c0 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 26 Mar 2025 13:50:56 +0100
Subject: [PATCH 5/8] feat: Subtract user balance, persist game
---
backend/requests/test.http | 2 +-
.../blackjack/BlackJackGameController.java | 44 +++++--
.../casino/blackjack/BlackJackGameEntity.java | 10 +-
.../blackjack/BlackJackGameRepository.java | 12 ++
.../de/szut/casino/user/UserController.java | 2 +-
.../java/de/szut/casino/user/UserService.java | 11 +-
.../szut/casino/user/UserControllerTest.java | 122 ------------------
7 files changed, 61 insertions(+), 142 deletions(-)
create mode 100644 backend/src/main/java/de/szut/casino/blackjack/BlackJackGameRepository.java
delete mode 100644 backend/src/test/java/de/szut/casino/user/UserControllerTest.java
diff --git a/backend/requests/test.http b/backend/requests/test.http
index 57fd8f1..ea20985 100644
--- a/backend/requests/test.http
+++ b/backend/requests/test.http
@@ -3,5 +3,5 @@ Authorization: Bearer {{token}}
Content-Type: application/json
{
- "betAmount": -1
+ "betAmount": 1.01
}
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 095a20e..e0c6378 100644
--- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java
+++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackGameController.java
@@ -2,13 +2,11 @@ package de.szut.casino.blackjack;
import de.szut.casino.blackjack.dto.CreateBlackJackGameDto;
import de.szut.casino.user.UserEntity;
+import de.szut.casino.user.UserRepository;
import de.szut.casino.user.UserService;
-import de.szut.casino.user.dto.CreateUserDto;
-import de.szut.casino.user.dto.GetUserDto;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -18,33 +16,53 @@ import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
@Slf4j
@RestController
public class BlackJackGameController {
- @Autowired
- private UserService userService;
+ private final UserService userService;
+ private final BlackJackGameRepository blackJackGameRepository;
+ private final UserRepository userRepository;
+
+ public BlackJackGameController(UserService userService, BlackJackGameRepository blackJackGameRepository, UserRepository userRepository) {
+ this.userService = userService;
+ this.blackJackGameRepository = blackJackGameRepository;
+ this.userRepository = userRepository;
+ }
@PostMapping("/blackjack/start")
- public ResponseEntity> createBlackJackGame(@RequestBody @Valid CreateBlackJackGameDto createBlackJackGameDto, @RequestHeader("Authorization") String token) {
- GetUserDto getUserDto = userService.getCurrentUser(token);
- BigDecimal balance = getUserDto.getBalance();
+ public ResponseEntity