-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
cc7a0af
commit 04e2944
Showing
18 changed files
with
211 additions
and
127 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,5 +2,5 @@ | |
|
||
public interface IRandomService | ||
{ | ||
int GetNumber(int min, int max); | ||
int GetNumber(int min, int toInclusive); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
namespace Gambling.API.Models; | ||
|
||
public record BetHttpRequest(int Points, int Number) | ||
{ | ||
private const int MinAllowedNumber = 0; | ||
private const int MaxAllowedNumber = 9; | ||
public bool IsNotValid(out Dictionary<string, string[]> problems) | ||
{ | ||
problems = new Dictionary<string, string[]>(); | ||
|
||
if (Points < 0) | ||
{ | ||
problems.Add(nameof(Points), new[] { "Bet can't be negative" }); | ||
} | ||
|
||
if (Number is < MinAllowedNumber or > MaxAllowedNumber) | ||
{ | ||
problems.Add(nameof(Number), new[] { $"Winning number must be between {MinAllowedNumber} and {MaxAllowedNumber}" }); | ||
} | ||
|
||
return problems.Any(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
namespace Gambling.API.Models; | ||
|
||
public record BetHttpResponse(int Account, string Status, string Points); |
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
namespace Gambling.API.Services; | ||
|
||
public record BalanceUpdateCommand(string UserId, int BetAmount, int TheoreticalReward, int StartingBalance); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
namespace Gambling.API.Services; | ||
|
||
public record BalanceUpdateResult(bool HadEnoughCredit, int CurrentBalance); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
namespace Gambling.API.Services; | ||
|
||
public record BetRequest(string UserId, int Points, int Number); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
|
||
namespace Gambling.API.Services; | ||
|
||
public class BetHttpHandler | ||
{ | ||
private readonly IAuthService _auth; | ||
private readonly BetService _service; | ||
|
||
public BetHttpHandler(IAuthService auth, BetService service) | ||
{ | ||
_auth = auth; | ||
_service = service; | ||
} | ||
|
||
public async Task<IResult> HandleAsync(BetHttpRequest httpRequest) | ||
{ | ||
if (httpRequest.IsNotValid(out var problemDetails)) | ||
{ | ||
return Results.ValidationProblem(problemDetails); | ||
} | ||
|
||
var userId = await _auth.GetCurrentUserIdAsync(); | ||
var request = new BetRequest(userId, httpRequest.Points, httpRequest.Number); | ||
var betResult = await _service.BetAsync(request); | ||
if (!betResult.UserHadEnoughCredit) | ||
{ | ||
return Results.BadRequest("Not enough points on the account!"); | ||
}; | ||
|
||
var response = MapToResponse(betResult); | ||
return Results.Ok(response); | ||
} | ||
|
||
private static BetHttpResponse MapToResponse(BetResult betResult) | ||
{ | ||
var statusString = betResult.HasWon ? "won" : "lost"; | ||
var rewardString = betResult.Reward >= 0 ? $"+{betResult.Reward}" : betResult.Reward.ToString(); | ||
return new BetHttpResponse(betResult.CurrentBalance, statusString, rewardString); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
namespace Gambling.API.Services; | ||
|
||
public class BetHttpRequestValidator | ||
{ | ||
private const int MinAllowedNumber = 0; | ||
private const int MaxAllowedNumber = 9; | ||
public bool IsNotValid(BetHttpRequest httpRequest, out Dictionary<string, string[]> problems) | ||
{ | ||
problems = new Dictionary<string, string[]>(); | ||
|
||
if (httpRequest.Points < 0) | ||
{ | ||
problems.Add(nameof(httpRequest.Points), new[] { "Bet can't be negative" }); | ||
} | ||
|
||
if (httpRequest.Number is < MinAllowedNumber or > MaxAllowedNumber) | ||
{ | ||
problems.Add(nameof(httpRequest.Number), new[] { $"Winning number must be between {MinAllowedNumber} and {MaxAllowedNumber}" }); | ||
} | ||
|
||
return problems.Any(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
namespace Gambling.API.Services; | ||
|
||
public record BetResult(bool UserHadEnoughCredit, int CurrentBalance, int Reward, bool HasWon); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
namespace Gambling.API.Services; | ||
|
||
public class BetService | ||
{ | ||
private readonly RngFunc _rngFunc; | ||
private readonly IBetRepository _repository; | ||
private const int StartingBalance = 10_000; | ||
private const int WinPointsMultiplier = 9; | ||
private const int MinWinningNumber = 0; | ||
private const int MaxWinningNumber = 9; | ||
|
||
public BetService(RngFunc rngFunc, IBetRepository repository) | ||
{ | ||
_rngFunc = rngFunc; | ||
_repository = repository; | ||
} | ||
|
||
public async Task<BetResult> BetAsync(BetRequest request) | ||
{ | ||
var winningNumber = _rngFunc(MinWinningNumber, MaxWinningNumber + 1); | ||
var hasWon = request.Number == winningNumber; | ||
var reward = hasWon ? request.Points * WinPointsMultiplier : -request.Points; | ||
var updateCommand = new BalanceUpdateCommand(request.UserId, request.Points, reward, StartingBalance); | ||
var updateResult = await _repository.UpdateBalance(updateCommand); | ||
return new BetResult(updateResult.HadEnoughCredit, updateResult.CurrentBalance, reward, hasWon); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.