massive checkpoint
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
using Gameboard.ShogiUI.Sockets.Managers;
|
||||
using Gameboard.ShogiUI.Sockets.Extensions;
|
||||
using Gameboard.ShogiUI.Sockets.Managers;
|
||||
using Gameboard.ShogiUI.Sockets.Repositories;
|
||||
using Gameboard.ShogiUI.Sockets.ServiceModels.Api;
|
||||
using Gameboard.ShogiUI.Sockets.ServiceModels.Socket;
|
||||
using Gameboard.ShogiUI.Sockets.ServiceModels.Types;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using System;
|
||||
@@ -10,16 +12,15 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace Gameboard.ShogiUI.Sockets.Controllers
|
||||
{
|
||||
[Authorize]
|
||||
|
||||
[ApiController]
|
||||
[Route("[controller]")]
|
||||
[Authorize(Roles = "Shogi")]
|
||||
public class GameController : ControllerBase
|
||||
{
|
||||
private static readonly string UsernameClaim = "preferred_username";
|
||||
private readonly IGameboardManager gameboardManager;
|
||||
private readonly IGameboardRepository gameboardRepository;
|
||||
private readonly ISocketConnectionManager communicationManager;
|
||||
private string? JwtUserName => HttpContext.User.Claims.FirstOrDefault(c => c.Type == UsernameClaim)?.Value;
|
||||
|
||||
public GameController(
|
||||
IGameboardRepository repository,
|
||||
@@ -68,22 +69,12 @@ namespace Gameboard.ShogiUI.Sockets.Controllers
|
||||
[HttpPost("{gameName}/Move")]
|
||||
public async Task<IActionResult> PostMove([FromRoute] string gameName, [FromBody] PostMove request)
|
||||
{
|
||||
Models.User? user = null;
|
||||
if (Request.Cookies.ContainsKey(SocketController.WebSessionKey))
|
||||
{
|
||||
var webSessionId = Guid.Parse(Request.Cookies[SocketController.WebSessionKey]!);
|
||||
user = await gameboardManager.ReadUser(webSessionId);
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(JwtUserName))
|
||||
{
|
||||
user = await gameboardManager.ReadUser(JwtUserName);
|
||||
}
|
||||
|
||||
var session = await gameboardManager.ReadSession(gameName);
|
||||
var user = await gameboardManager.ReadUser(User);
|
||||
var session = await gameboardRepository.ReadSession(gameName);
|
||||
|
||||
if (session == null || user == null || (session.Player1 != user.Name && session.Player2 != user.Name))
|
||||
{
|
||||
throw new UnauthorizedAccessException("You are not seated at this game.");
|
||||
throw new UnauthorizedAccessException("User is not seated at this game.");
|
||||
}
|
||||
|
||||
var move = request.Move;
|
||||
@@ -94,13 +85,19 @@ namespace Gameboard.ShogiUI.Sockets.Controllers
|
||||
|
||||
if (moveSuccess)
|
||||
{
|
||||
var createSuccess = await gameboardRepository.CreateBoardState(session);
|
||||
if (!createSuccess)
|
||||
{
|
||||
throw new ApplicationException("Unable to persist board state.");
|
||||
}
|
||||
await communicationManager.BroadcastToPlayers(new MoveResponse
|
||||
{
|
||||
GameName = session.Name,
|
||||
PlayerName = user.Name,
|
||||
Move = moveModel.ToServiceModel()
|
||||
BoardState = session.Shogi.ToServiceModel(),
|
||||
Game = session.ToServiceModel(),
|
||||
MoveHistory = session.Shogi.MoveHistory.Select(h => h.ToServiceModel()).ToList(),
|
||||
PlayerPerspective = user.Name == session.Player1 ? WhichPlayer.Player1 : WhichPlayer.Player2
|
||||
}, session.Player1, session.Player2);
|
||||
return Created(string.Empty, null);
|
||||
return Ok();
|
||||
}
|
||||
throw new InvalidOperationException("Illegal move.");
|
||||
}
|
||||
@@ -124,5 +121,56 @@ namespace Gameboard.ShogiUI.Sockets.Controllers
|
||||
// }
|
||||
// return new ConflictResult();
|
||||
//}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<IActionResult> PostSession([FromBody] PostSession request)
|
||||
{
|
||||
var user = await gameboardManager.ReadUser(User);
|
||||
var session = new Models.SessionMetadata(request.Name, request.IsPrivate, user!.Name);
|
||||
var success = await gameboardRepository.CreateSession(session);
|
||||
|
||||
if (success)
|
||||
{
|
||||
await communicationManager.BroadcastToAll(new CreateGameResponse
|
||||
{
|
||||
Game = session.ToServiceModel(),
|
||||
PlayerName = user.Name
|
||||
});
|
||||
return Ok();
|
||||
}
|
||||
return Conflict();
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reads the board session and subscribes the caller to socket events for that session.
|
||||
/// </summary>
|
||||
[HttpGet("{gameName}")]
|
||||
public async Task<IActionResult> GetSession([FromRoute] string gameName)
|
||||
{
|
||||
var user = await gameboardManager.ReadUser(User);
|
||||
var session = await gameboardRepository.ReadSession(gameName);
|
||||
if (session == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
communicationManager.SubscribeToGame(session, user!.Name);
|
||||
var response = new GetGameResponse()
|
||||
{
|
||||
Game = new Models.SessionMetadata(session).ToServiceModel(),
|
||||
BoardState = session.Shogi.ToServiceModel(),
|
||||
MoveHistory = session.Shogi.MoveHistory.Select(_ => _.ToServiceModel()).ToList(),
|
||||
PlayerPerspective = user.Name == session.Player1 ? WhichPlayer.Player1 : WhichPlayer.Player2
|
||||
};
|
||||
return new JsonResult(response);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public async Task<IActionResult> GetSessions()
|
||||
{
|
||||
var sessions = await gameboardRepository.ReadSessionMetadatas();
|
||||
return new JsonResult(sessions.Select(s => s.ToServiceModel()).ToList());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user