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 Microsoft.Extensions.Logging; using System.Linq; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Controllers { [Authorize] [Route("[controller]")] [ApiController] public class SocketController : ControllerBase { private readonly ILogger logger; private readonly ISocketTokenManager tokenManager; private readonly IGameboardRepositoryManager gameboardManager; private readonly IGameboardRepository gameboardRepository; public SocketController( ILogger logger, ISocketTokenManager tokenManager, IGameboardRepositoryManager gameboardManager, IGameboardRepository gameboardRepository) { this.logger = logger; this.tokenManager = tokenManager; this.gameboardManager = gameboardManager; this.gameboardRepository = gameboardRepository; } [HttpGet("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] [HttpGet("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 { if (await gameboardRepository.IsGuestUser(request.ClientId)) { var token = tokenManager.GenerateToken(request.ClientId); return new JsonResult(new GetGuestTokenResponse(request.ClientId, token)); } } return new UnauthorizedResult(); } } }