using Gameboard.Shogi.Api.ServiceModels.Messages; using Newtonsoft.Json; using System; using System.Net.Http; using System.Text; using System.Threading.Tasks; using Gameboard.ShogiUI.Sockets.Repositories.Utility; namespace Gameboard.ShogiUI.Sockets.Repositories { public interface IGameboardRepository { Task DeleteGame(string gameName); Task GetGame(string gameName); Task GetGames(); Task GetGames(string playerName); Task GetMoves(string gameName); Task PostSession(PostSession request); Task PostJoinPrivateSession(PostJoinPrivateSession request); Task PutJoinPublicSession(string gameName, PutJoinPublicSession request); Task PostMove(string gameName, PostMove request); Task PostJoinCode(string gameName, string userName); Task GetPlayer(string userName); Task PostPlayer(PostPlayer request); } public class GameboardRepository : IGameboardRepository { private readonly IAuthenticatedHttpClient client; public GameboardRepository(IAuthenticatedHttpClient client) { this.client = client; } public async Task GetGames() { var response = await client.GetAsync("Sessions"); var json = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(json); } public async Task GetGames(string playerName) { var uri = $"Sessions/{playerName}"; var response = await client.GetAsync(Uri.EscapeUriString(uri)); var json = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(json); } public async Task GetGame(string gameName) { var uri = $"Session/{gameName}"; var response = await client.GetAsync(Uri.EscapeUriString(uri)); var json = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(json); } public async Task DeleteGame(string gameName) { var uri = $"Session/{gameName}"; await client.DeleteAsync(Uri.EscapeUriString(uri)); } public async Task PostSession(PostSession request) { var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"); var response = await client.PostAsync("Session", content); var json = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(json); } public async Task PutJoinPublicSession(string gameName, PutJoinPublicSession request) { var uri = $"Session/{gameName}/Join"; var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"); var response = await client.PostAsync(Uri.EscapeUriString(uri), content); var json = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(json); } public async Task PostJoinPrivateSession(PostJoinPrivateSession request) { var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"); var response = await client.PostAsync("Session/Join", content); var json = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(json); } public async Task GetMoves(string gameName) { var uri = $"Session/{gameName}/Moves"; var response = await client.GetAsync(Uri.EscapeUriString(uri)); var json = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(json); } public async Task PostMove(string gameName, PostMove request) { var uri = $"Session/{gameName}/Move"; var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"); await client.PostAsync(Uri.EscapeUriString(uri), content); } public async Task PostJoinCode(string gameName, string userName) { var uri = $"JoinCode/{gameName}"; var serialized = JsonConvert.SerializeObject(new PostJoinCode { PlayerName = userName }); var content = new StringContent(serialized, Encoding.UTF8, "application/json"); var json = await (await client.PostAsync(Uri.EscapeUriString(uri), content)).Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(json); } public async Task GetPlayer(string playerName) { var uri = $"Player/{playerName}"; var response = await client.GetAsync(Uri.EscapeUriString(uri)); var json = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(json); } public async Task PostPlayer(PostPlayer request) { var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"); return await client.PostAsync("Player", content); } } }