using Gameboard.ShogiUI.Sockets.Extensions; using Gameboard.ShogiUI.Sockets.Models; using Gameboard.ShogiUI.Sockets.Repositories; using System; using System.Security.Claims; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Managers { public interface IGameboardManager { Task AssignPlayer2ToSession(string sessionName, User user); Task ReadUser(ClaimsPrincipal user); Task CreateUser(ClaimsPrincipal user); } public class GameboardManager : IGameboardManager { private readonly IGameboardRepository repository; public GameboardManager(IGameboardRepository repository) { this.repository = repository; } public Task CreateUser(ClaimsPrincipal principal) { var id = principal.UserId(); if (string.IsNullOrEmpty(id)) { return Task.FromResult(false); } var user = principal.IsGuest() ? User.CreateGuestUser(id) : User.CreateMsalUser(id); return repository.CreateUser(user); } public Task ReadUser(ClaimsPrincipal principal) { var userId = principal.UserId(); if (!string.IsNullOrEmpty(userId)) { return repository.ReadUser(userId); } return Task.FromResult(null); } public async Task CreateJoinCode(string sessionName, string playerName) { //var session = await repository.GetGame(sessionName); //if (playerName == session?.Player1) //{ // return await repository.PostJoinCode(sessionName, playerName); //} return string.Empty; } public async Task AssignPlayer2ToSession(string sessionName, User user) { var session = await repository.ReadSessionMetaData(sessionName); if (session != null && !session.IsPrivate && session.Player2 == null) { session.SetPlayer2(user); return await repository.UpdateSession(session); } return false; } } }