using Gameboard.ShogiUI.Sockets.Managers; using Gameboard.ShogiUI.Sockets.Repositories; using Gameboard.ShogiUI.Sockets.Repositories.RepositoryManagers; using Gameboard.ShogiUI.Sockets.ServiceModels.Api.Messages; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Linq; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Controllers { [Authorize] [Route("[controller]")] [ApiController] public class SocketController : ControllerBase { private readonly ISocketTokenManager tokenManager; private readonly IGameboardRepository gameboardRepository; private readonly IGameboardRepositoryManager gameboardManager; public SocketController( ISocketTokenManager tokenManager, IGameboardRepository gameboardRepository, IGameboardRepositoryManager gameboardManager) { this.tokenManager = tokenManager; this.gameboardRepository = gameboardRepository; this.gameboardManager = gameboardManager; } [Route("Token")] public IActionResult GetToken() { var userName = HttpContext.User.Claims.First(c => c.Type == "preferred_username").Value; var token = tokenManager.GenerateToken(userName); return new JsonResult(new GetTokenResponse(token)); } [AllowAnonymous] [Route("GuestToken")] public async Task GetGuestToken([FromQuery] GetGuestToken request) { if (request.ClientId == null) { var clientId = await gameboardManager.CreateGuestUser(); var token = tokenManager.GenerateToken(clientId); return new JsonResult(new GetGuestTokenResponse(clientId, token)); } else { var response = await gameboardRepository.GetPlayer(request.ClientId); if (response != null && response.Player != null) { var token = tokenManager.GenerateToken(response.Player.Name); return new JsonResult(new GetGuestTokenResponse(response.Player.Name, token)); } } return new UnauthorizedResult(); } } }