diff --git a/GameData/ApiClient.cs b/GameData/ApiClient.cs index bbfffae..2a1553a 100644 --- a/GameData/ApiClient.cs +++ b/GameData/ApiClient.cs @@ -1,4 +1,5 @@ -using GameData.Model; +using GameData.Helper; +using GameData.Model; using GameData.Repository; using GameModel.Settings; using Microsoft.Extensions.Logging; @@ -84,7 +85,7 @@ namespace GameData StringContent content = null; if (payload != null) { - var payloadString = JsonConvert.SerializeObject(payload); + var payloadString = LowercaseJsonSerializer.SerializeObject(payload); content = new StringContent(payloadString, Encoding.UTF8, "application/json"); } diff --git a/GameData/Dummy/DummyExpenseRepository.cs b/GameData/Dummy/DummyExpenseRepository.cs index 3052624..c8521e8 100644 --- a/GameData/Dummy/DummyExpenseRepository.cs +++ b/GameData/Dummy/DummyExpenseRepository.cs @@ -15,12 +15,12 @@ namespace GameData.Dummy return IExpenseRepository.TestData; } - public void Save(MemberExpense data) + public void Save(PlayerExpense data) { throw new NotImplementedException(); } - Task IExpenseRepository.Save(MemberExpense data) + Task IExpenseRepository.Save(PlayerExpense data) { throw new NotImplementedException(); } diff --git a/GameData/Helper/LowercaseJsonSerializer.cs b/GameData/Helper/LowercaseJsonSerializer.cs new file mode 100644 index 0000000..74e77b7 --- /dev/null +++ b/GameData/Helper/LowercaseJsonSerializer.cs @@ -0,0 +1,31 @@ +using Newtonsoft.Json.Serialization; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GameData.Helper +{ + public class LowercaseJsonSerializer + { + private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings + { + ContractResolver = new LowercaseContractResolver() + }; + + public static string SerializeObject(object o) + { + return JsonConvert.SerializeObject(o, Formatting.Indented, Settings); + } + + public class LowercaseContractResolver : DefaultContractResolver + { + protected override string ResolvePropertyName(string propertyName) + { + return propertyName.ToLower(); + } + } + } +} diff --git a/GameData/Repository/ExpenseRepository.cs b/GameData/Repository/ExpenseRepository.cs index 36fa496..1108af6 100644 --- a/GameData/Repository/ExpenseRepository.cs +++ b/GameData/Repository/ExpenseRepository.cs @@ -15,8 +15,9 @@ namespace GameData.Repository readonly ILogger _log; private ApiClient _client; - string Url => "items/expense"; - List _memberExpenses = new List(); + string UrlExpense => "items/expense"; + string UrlPlayerExpense => "items/playerexpense"; + List _memberExpenses = new List(); public ExpenseRepository(ILogger log, ApiClient apiClient) { @@ -28,12 +29,12 @@ namespace GameData.Repository public IEnumerable GetAll() { - return _client.Get(Url); + return _client.Get(UrlExpense).ToList(); } - public async Task Save(MemberExpense memberExpense) + public async Task Save(PlayerExpense memberExpense) { - _memberExpenses.Add(memberExpense); + return await _client.Post(memberExpense, UrlPlayerExpense); } } } diff --git a/GameHandler.UnitTests/ExpenseHandlerTests.cs b/GameHandler.UnitTests/ExpenseHandlerTests.cs index 750057a..9b06e4a 100644 --- a/GameHandler.UnitTests/ExpenseHandlerTests.cs +++ b/GameHandler.UnitTests/ExpenseHandlerTests.cs @@ -1,6 +1,6 @@ -using GameModel; +using GameHandler.UnitTests.Mocks; +using GameModel; using GameModel.Exceptions; -using GameModel.Mocks; using System; using System.Collections.Generic; using System.Linq; diff --git a/GameHandler.UnitTests/Extensions/PinThrowExtensionTests.cs b/GameHandler.UnitTests/Extensions/PinThrowExtensionTests.cs index dab2ca5..f700267 100644 --- a/GameHandler.UnitTests/Extensions/PinThrowExtensionTests.cs +++ b/GameHandler.UnitTests/Extensions/PinThrowExtensionTests.cs @@ -1,6 +1,5 @@ using GameHandler.Extensions; using GameModel; -using GameModel.Mocks; using NUnit.Framework.Legacy; using System; using System.Collections.Generic; diff --git a/GameHandler.UnitTests/GameServiceTests.cs b/GameHandler.UnitTests/GameServiceTests.cs index e66b6f1..2630e5e 100644 --- a/GameHandler.UnitTests/GameServiceTests.cs +++ b/GameHandler.UnitTests/GameServiceTests.cs @@ -1,9 +1,10 @@ using Autofac; using GameHandler.DeathGame; +using GameHandler.UnitTests.Mocks; using GameModel; using GameModel.Contract; +using GameModel.Contracts; using GameModel.Exceptions; -using GameModel.Mocks; using System; using System.Collections.Generic; using System.Linq; @@ -22,7 +23,8 @@ namespace GameHandler.UnitTests { var builder = new ContainerBuilder(); - builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); service = new GameService(builder.Build()); } @@ -55,13 +57,13 @@ namespace GameHandler.UnitTests } [Test] - public void HandleThrow_UpdatesTheBoardState() + public async Task HandleThrow_UpdatesTheBoardState() { - var ts1 = service.Start(DeathGameHandler.GAMENAME_DEATHBOX); + var ts1 = await service.Start(DeathGameHandler.GAMENAME_DEATHBOX); var bs1 = ts1.ThrowState.BoardState; var pinThrow = PinThrow.Create(1,PinPicture.Create(1,PinState.Down), false, false); - var ts2 = service.HandleThrow(pinThrow); + var ts2 = await service.HandleThrow(pinThrow); var bs2 = ts2.ThrowState.BoardState; diff --git a/GameHandler.UnitTests/Mocks/FakeExpenseRepository.cs b/GameHandler.UnitTests/Mocks/FakeExpenseRepository.cs index bf5be23..a576e0a 100644 --- a/GameHandler.UnitTests/Mocks/FakeExpenseRepository.cs +++ b/GameHandler.UnitTests/Mocks/FakeExpenseRepository.cs @@ -1,11 +1,12 @@ -using GameModel.Contract; +using GameModel; +using GameModel.Contract; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace GameModel.Mocks +namespace GameHandler.UnitTests.Mocks { public class FakeExpenseRepository : IExpenseRepository { @@ -15,5 +16,10 @@ namespace GameModel.Mocks { return IExpenseRepository.TestData; } + + public Task Save(PlayerExpense data) + { + return Task.FromResult(data); + } } } diff --git a/GameHandler.UnitTests/Mocks/FakeGameRepository.cs b/GameHandler.UnitTests/Mocks/FakeGameRepository.cs new file mode 100644 index 0000000..4eb7016 --- /dev/null +++ b/GameHandler.UnitTests/Mocks/FakeGameRepository.cs @@ -0,0 +1,33 @@ +using GameModel; +using GameModel.Contracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GameHandler.UnitTests.Mocks +{ + internal class FakeGameRepository : IGameRepository + { + public Task Create(Game game) + { + return Task.FromResult(Game.Create()); + } + + public GameState Load(Guid gameId) + { + throw new NotImplementedException(); + } + + public Task Save(GameState gameState) + { + return Task.CompletedTask; + } + + public Task Update(Game game) + { + return Task.CompletedTask; + } + } +} diff --git a/GameHandler/ExpenseHandler.cs b/GameHandler/ExpenseHandler.cs index dbd61be..55f80ba 100644 --- a/GameHandler/ExpenseHandler.cs +++ b/GameHandler/ExpenseHandler.cs @@ -30,7 +30,7 @@ namespace GameHandler throw new InvalidPinThrowException($"Player {gameExenseEventArgs.PlayerId} not found"); } - List memberExpenses = PrepareResult(ref expenseModelToAppend); + List memberExpenses = PrepareResult(ref expenseModelToAppend); var triggers = gameExenseEventArgs.Triggers; AssignExpenses(gameExenseEventArgs.PlayerId, gameExenseEventArgs.PlayerIds, memberExpenses, triggers); @@ -38,7 +38,7 @@ namespace GameHandler return expenseModelToAppend with { MemberExpenses = memberExpenses.ToArray() }; } - private void AssignExpenses(int playerId, int[] playerIds, List memberExpenses, ExpenseTrigger[] triggers) + private void AssignExpenses(int playerId, int[] playerIds, List memberExpenses, ExpenseTrigger[] triggers) { var destExpenses = _expenseRepository.GetAll().Where(_ => _.ExpenseTriggers.Any(et => triggers.Any(et2 => et2 == et))); @@ -49,12 +49,12 @@ namespace GameHandler { foreach (var player in inversePlayers) { - memberExpenses.Add(MemberExpense.Create(player, expense)); + memberExpenses.Add(PlayerExpense.Create(player, expense)); } } else { - memberExpenses.Add(MemberExpense.Create(playerId, expense)); + memberExpenses.Add(PlayerExpense.Create(playerId, expense)); } } } @@ -66,7 +66,7 @@ namespace GameHandler throw new InvalidPinThrowException($"Player {pinThrow.PlayerId} not found"); } - List memberExpenses = PrepareResult(ref expenseModelToAppend); + List memberExpenses = PrepareResult(ref expenseModelToAppend); var triggers = pinThrow.GetExpenseTriggers(currentState); AssignExpenses(pinThrow.PlayerId, PlayerIds, memberExpenses, triggers); @@ -74,13 +74,13 @@ namespace GameHandler return expenseModelToAppend with { MemberExpenses = memberExpenses.ToArray() }; } - private static List PrepareResult(ref ExpenseModel expenseModelToAppend) + private static List PrepareResult(ref ExpenseModel expenseModelToAppend) { if (expenseModelToAppend == null) { - expenseModelToAppend = new ExpenseModel(Array.Empty()); + expenseModelToAppend = new ExpenseModel(Array.Empty()); } - var memberExpenses = new List(expenseModelToAppend.MemberExpenses); + var memberExpenses = new List(expenseModelToAppend.MemberExpenses); return memberExpenses; } } diff --git a/GameHandler/GameStateHandler.cs b/GameHandler/GameStateHandler.cs index 5ecb28d..218ab5d 100644 --- a/GameHandler/GameStateHandler.cs +++ b/GameHandler/GameStateHandler.cs @@ -27,7 +27,7 @@ namespace GameHandler private Guid _gameStateId; private List> gameStates = new List>(); private List> expenseModels = new List>(); - private List> memberExpenses = new List>(); + private List> memberExpenses = new List>(); private IGameRepository _gameRepository; private IExpenseRepository _expenseRepository; @@ -71,20 +71,20 @@ namespace GameHandler if (!expenseModel.Equals(ExpenseModel)) { expenseModels.Add(new GameStateHandlerItem(_gameStateId, expenseModel, false)); - await Save(); } } else { expenseModels.Add(new GameStateHandlerItem(_gameStateId, expenseModel, false)); - await Save(); } - foreach(var memberExpense in expenseModel.MemberExpenses.Where(_ => memberExpenses.Any(me => me.Data.Id.Equals(_.Id)))) + foreach(var memberExpense in expenseModel.MemberExpenses.Where(_ => !memberExpenses.Any(me => me.Data.Id.Equals(_.Id)))) { - memberExpenses.Add(new GameStateHandlerItem(_gameStateId,memberExpense,false)); + memberExpenses.Add(new GameStateHandlerItem(_gameStateId,memberExpense with { GamestateId = _gameStateId },false)); } + + await Save(); } internal async Task Add(GameState newState, Game game) @@ -92,7 +92,7 @@ namespace GameHandler if (!newState.Equals(GameState)) { _gameStateId = Guid.NewGuid(); - gameStates.Add(new GameStateHandlerItem(_gameStateId, newState, false)); + gameStates.Add(new GameStateHandlerItem(_gameStateId, newState with { Id = _gameStateId }, false)); await Save(); } } diff --git a/GameModel/Contracts/IExpenseRepository.cs b/GameModel/Contracts/IExpenseRepository.cs index 2a55ee5..606aeb1 100644 --- a/GameModel/Contracts/IExpenseRepository.cs +++ b/GameModel/Contracts/IExpenseRepository.cs @@ -18,6 +18,6 @@ namespace GameModel.Contract }; IEnumerable GetAll(); - Task Save(MemberExpense data); + Task Save(PlayerExpense data); } } \ No newline at end of file diff --git a/GameModel/ExpenseModel.cs b/GameModel/ExpenseModel.cs index 5f9b631..3012ecb 100644 --- a/GameModel/ExpenseModel.cs +++ b/GameModel/ExpenseModel.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace GameModel { - public record ExpenseModel(MemberExpense[] MemberExpenses) + public record ExpenseModel(PlayerExpense[] MemberExpenses) { public virtual bool Equals(ExpenseModel other) { @@ -19,7 +19,7 @@ namespace GameModel public static ExpenseModel Create() { - return new ExpenseModel(Array.Empty()); + return new ExpenseModel(Array.Empty()); } } } diff --git a/GameModel/MemberExpense.cs b/GameModel/MemberExpense.cs deleted file mode 100644 index 0ef6735..0000000 --- a/GameModel/MemberExpense.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace GameModel -{ - public record MemberExpense(Guid Id, int MemberId, Guid ExpenseId, ExpenseType ExpenseType, DateTime Created, decimal Price, string Name) - { - public static MemberExpense Create(int MemberId, Expense Expense) - { - return new MemberExpense(Guid.NewGuid(), MemberId, Expense.Id, Expense.ExpenseType, DateTime.Now, Expense.Price, Expense.Name); - } - } -} diff --git a/GameModel/PlayerExpense.cs b/GameModel/PlayerExpense.cs new file mode 100644 index 0000000..3e9c624 --- /dev/null +++ b/GameModel/PlayerExpense.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GameModel +{ + public record PlayerExpense(Guid Id, int PlayerId, Guid ExpenseId, ExpenseType ExpenseType, + DateTime Created, decimal Price, string Name, Guid GamestateId) + { + public static PlayerExpense Create(int playerId, Expense expense) + { + return new PlayerExpense(Guid.NewGuid(), playerId, expense.Id, expense.ExpenseType, + DateTime.Now, expense.Price, expense.Name, Guid.Empty); + } + } +}