using GameData.Model; using GameModel; using GameModel.Contracts; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.Mime.MediaTypeNames; namespace GameData.Repository { public class GameRepository : IGameRepository { readonly ILogger _log; private ApiClient _client; string UrlGameState => "items/gamestate"; string UrlGame => "items/game"; public GameRepository(ILogger log, ApiClient apiClient) { _log = log; _client = apiClient; } public async Task?> LoadStates(Guid gameId) { string str = JsonConvert.SerializeObject( new { gameid = new { _eq = gameId } } ); var states = await _client.Get( UrlGameState + "?filter" + str); var res = states.OrderBy(_ => _.Counter).Select(_ => JsonConvert.DeserializeObject(_.GameState, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Auto })); return res; } public async Task Save(GameState gameState) { var str = JsonConvert.SerializeObject(gameState, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Auto }); var gameStateDo = new GameStateDo(gameState.Id, gameState.GameId, gameState.GameName, str, gameState.Counter); var res = await _client.Post(gameStateDo,UrlGameState); if (res == null) { var msg = "error saviong gamestate - save rsult cannot be null - repo not online, or game deleted"; _log.LogError(msg); throw new InvalidOperationException(msg); } var obj = JsonConvert.DeserializeObject(res.GameState, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Auto }); return obj; } public async Task Update(Game game) { await _client.Put(game, UrlGame); } public async Task Create(Game game) { return await _client.Post(game, UrlGame); } public async Task LoadGame(Guid gameId) { return await _client.GetSingle(UrlGame + "/" + gameId); } public async Task Create(string gameName) { dynamic payload = new JObject(); payload.gamename = gameName; return await _client.Post(payload, UrlGame); } public async Task Delete(IEnumerable gameStates) { try { var arr = gameStates.Select(_ => _.Id.ToString()).ToArray(); dynamic keys = new JObject(); keys.keys = new JArray(arr); await _client.Delete(keys, UrlGameState); } catch (Exception e) { _log.LogError(e, "error on Delete"); throw; } } } }