diff --git a/backend/src/main/java/de/szut/casino/coinflip/CoinSide.java b/backend/src/main/java/de/szut/casino/coinflip/CoinSide.java new file mode 100644 index 0000000..f369cb4 --- /dev/null +++ b/backend/src/main/java/de/szut/casino/coinflip/CoinSide.java @@ -0,0 +1,6 @@ +package de.szut.casino.coinflip; + +public enum CoinSide { + HEAD, + TAILS; +} diff --git a/backend/src/main/java/de/szut/casino/coinflip/CoinflipController.java b/backend/src/main/java/de/szut/casino/coinflip/CoinflipController.java new file mode 100644 index 0000000..0a526f1 --- /dev/null +++ b/backend/src/main/java/de/szut/casino/coinflip/CoinflipController.java @@ -0,0 +1,45 @@ +package de.szut.casino.coinflip; + +import de.szut.casino.exceptionHandling.exceptions.InsufficientFundsException; +import de.szut.casino.exceptionHandling.exceptions.UserNotFoundException; +import de.szut.casino.shared.service.BalanceService; +import de.szut.casino.user.UserEntity; +import de.szut.casino.user.UserService; +import jakarta.validation.Valid; +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.RestController; + +import java.util.Optional; + +@RestController +public class CoinflipController { + private final UserService userService; + private final BalanceService balanceService; + private final CoinflipService coinflipService; + + public CoinflipController(UserService userService, BalanceService balanceService, CoinflipService coinflipService) { + this.userService = userService; + this.balanceService = balanceService; + this.coinflipService = coinflipService; + } + + + @PostMapping("/coinflip") + public ResponseEntity coinFlip(@RequestBody @Valid CoinflipDto coinflipDto) { + Optional optionalUser = userService.getCurrentUser(); + + if (optionalUser.isEmpty()) { + throw new UserNotFoundException(); + } + + UserEntity user = optionalUser.get(); + + if (!this.balanceService.hasFunds(user, coinflipDto)) { + throw new InsufficientFundsException(); + } + + return ResponseEntity.ok(coinflipService.play(user, coinflipDto)); + } +} diff --git a/backend/src/main/java/de/szut/casino/coinflip/CoinflipDto.java b/backend/src/main/java/de/szut/casino/coinflip/CoinflipDto.java new file mode 100644 index 0000000..8d5a47b --- /dev/null +++ b/backend/src/main/java/de/szut/casino/coinflip/CoinflipDto.java @@ -0,0 +1,20 @@ +package de.szut.casino.coinflip; + +import de.szut.casino.shared.dto.BetDto; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +import java.math.BigDecimal; + +@Getter +@Setter +public class CoinflipDto extends BetDto { + @NotNull(message = "chosen side cannot be null") + private CoinSide coinSide; + + public CoinflipDto(BigDecimal betAmount, CoinSide coinSide) { + super(betAmount); + this.coinSide = coinSide; + } +} diff --git a/backend/src/main/java/de/szut/casino/coinflip/CoinflipResult.java b/backend/src/main/java/de/szut/casino/coinflip/CoinflipResult.java new file mode 100644 index 0000000..71ead05 --- /dev/null +++ b/backend/src/main/java/de/szut/casino/coinflip/CoinflipResult.java @@ -0,0 +1,15 @@ +package de.szut.casino.coinflip; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.math.BigDecimal; + +@AllArgsConstructor +@Setter +@Getter +public class CoinflipResult { + private boolean isWin; + private BigDecimal payout; +} diff --git a/backend/src/main/java/de/szut/casino/coinflip/CoinflipService.java b/backend/src/main/java/de/szut/casino/coinflip/CoinflipService.java new file mode 100644 index 0000000..4cdc3e1 --- /dev/null +++ b/backend/src/main/java/de/szut/casino/coinflip/CoinflipService.java @@ -0,0 +1,34 @@ +package de.szut.casino.coinflip; + +import de.szut.casino.shared.service.BalanceService; +import de.szut.casino.user.UserEntity; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Random; + +@Service +public class CoinflipService { + private final Random random = new Random(); + private final BalanceService balanceService; + + public CoinflipService(BalanceService balanceService) { + this.balanceService = balanceService; + } + + public CoinflipResult play(UserEntity user, CoinflipDto coinflipDto) { + this.balanceService.subtractFunds(user, coinflipDto.getBetAmount()); + + CoinflipResult coinflipResult = new CoinflipResult(false, BigDecimal.ZERO); + CoinSide coinSide = this.random.nextBoolean() ? CoinSide.HEAD : CoinSide.TAILS; + if (coinSide == coinflipDto.getCoinSide()) { + coinflipResult.setWin(true); + + BigDecimal payout = coinflipDto.getBetAmount().multiply(BigDecimal.TWO); + this.balanceService.addFunds(user, payout); + coinflipResult.setPayout(payout); + } + + return coinflipResult; + } +} diff --git a/backend/src/main/java/de/szut/casino/shared/service/BalanceService.java b/backend/src/main/java/de/szut/casino/shared/service/BalanceService.java index 40e6caa..048840b 100644 --- a/backend/src/main/java/de/szut/casino/shared/service/BalanceService.java +++ b/backend/src/main/java/de/szut/casino/shared/service/BalanceService.java @@ -9,7 +9,7 @@ import java.math.BigDecimal; @Service public class BalanceService { - private UserRepository userRepository; + private final UserRepository userRepository; public BalanceService(UserRepository userRepository) { this.userRepository = userRepository;