diff --git a/Sledgemapper.Api/Commands/NewSessionCommand.cs b/Sledgemapper.Api/Commands/NewSessionCommand.cs new file mode 100644 index 0000000..bdd19e8 --- /dev/null +++ b/Sledgemapper.Api/Commands/NewSessionCommand.cs @@ -0,0 +1,15 @@ +using MediatR; + +namespace Sledgemapper.Api.Commands +{ + public class NewSessionCommand : IRequest + { + public string SessionName { get; set; } + public int UserId { get; } + public NewSessionCommand(string sessionName, int userId) + { + SessionName = sessionName; + UserId = userId; + } + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Controllers/SessionController.cs b/Sledgemapper.Api/Controllers/SessionController.cs index 55f3b9f..43ef61b 100644 --- a/Sledgemapper.Api/Controllers/SessionController.cs +++ b/Sledgemapper.Api/Controllers/SessionController.cs @@ -1,6 +1,7 @@ using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Sledgemapper.Api.Commands; using Sledgemapper.Api.Handlers; using Sledgemapper.Shared.Entities; using System.Threading.Tasks; @@ -8,13 +9,22 @@ using System.Threading.Tasks; namespace Sledgemapper.Api.Controllers { [Authorize] - [Route("[controller]/{sessionName}")] + [Route("[controller]/{sessionName}")] public class SessionController : ControllerBase { private readonly IMediator _mediator; public SessionController(IMediator mediator) { _mediator = mediator; } + [HttpPost] + public async Task Post(string sessionName) + { + var userId = int.Parse(HttpContext.User.Identity.Name); + + var result = await _mediator.Send(new NewSessionCommand(sessionName, userId)); + + } + [HttpPost("tile")] public async Task Post(string sessionName, [FromBody]Tile tile) { diff --git a/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs b/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs new file mode 100644 index 0000000..df125d6 --- /dev/null +++ b/Sledgemapper.Api/Handlers/StartNewSessionHandler.cs @@ -0,0 +1,32 @@ +using MediatR; +using Sledgemapper.Api.Commands; +using Sledgemapper.Api.Data; +using Sledgemapper.Api.Models; +using System.Threading; +using System.Threading.Tasks; + +namespace Sledgemapper.Api.Handlers +{ + public class StartNewSessionHandler : IRequestHandler + { + private readonly IMediator _mediator; + private readonly MyDbContext _dbcontext; + + public StartNewSessionHandler(IMediator mediator, MyDbContext dbcontext) + { + _mediator = mediator; + _dbcontext = dbcontext; + } + + public async Task Handle(NewSessionCommand notification, CancellationToken cancellationToken) + { + // _dbcontext.MapLogs.Add(new Session + // { + // SessionName = notification.SessionName, + // OwnerUserId = notification.UserId + // }); + await _dbcontext.SaveChangesAsync(); + return true; + } + } +} diff --git a/Sledgemapper.Api/Hubs/SledgemapperHub.cs b/Sledgemapper.Api/Hubs/SledgemapperHub.cs index 84823c3..90824ad 100644 --- a/Sledgemapper.Api/Hubs/SledgemapperHub.cs +++ b/Sledgemapper.Api/Hubs/SledgemapperHub.cs @@ -15,12 +15,15 @@ using Microsoft.AspNetCore.Authorization; namespace SignalRChat.Hubs { + + [Authorize] public class SledgemapperHub : Hub { - public SledgemapperHub() { - - } + public SledgemapperHub() + { + + } private static Dictionary _sessions = new Dictionary(); public List Colors = new List{"CC0000", "CC3300", @@ -113,6 +116,10 @@ namespace SignalRChat.Hubs public async Task NewSession(string sessionName, string initials) { + + var userId = int.Parse(Context.User.Identity.Name); + + // var user = this.Context.GetHttpContext().; var session = new Session(); session.Colors = new List(Colors); session.Colors.Shuffle(); @@ -120,7 +127,7 @@ namespace SignalRChat.Hubs session.Players.Add(player); _sessions.Add(sessionName, session); - + await Groups.AddToGroupAsync(Context.ConnectionId, sessionName); return session; } diff --git a/Sledgemapper.Api/Models/Session.cs b/Sledgemapper.Api/Models/Session.cs new file mode 100644 index 0000000..8416f42 --- /dev/null +++ b/Sledgemapper.Api/Models/Session.cs @@ -0,0 +1,17 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace Sledgemapper.Api.Models +{ + public class Session + { + [Key] + public int SessionId { get; set; } + + [Required] + public string SessionName{get;set;} + + [Required] + public int OwnerUserId { get; set; } + } +} diff --git a/Sledgemapper.Api/MyDatabase.db b/Sledgemapper.Api/MyDatabase.db deleted file mode 100644 index 027f640..0000000 Binary files a/Sledgemapper.Api/MyDatabase.db and /dev/null differ diff --git a/Sledgemapper.Api/Notifications/NewSessionNotification.cs b/Sledgemapper.Api/Notifications/NewSessionNotification.cs new file mode 100644 index 0000000..31aa937 --- /dev/null +++ b/Sledgemapper.Api/Notifications/NewSessionNotification.cs @@ -0,0 +1,8 @@ +namespace Sledgemapper.Api.Handlers +{ + public class NewSessionNotification : BaseNotification + { + public int UserId { get; } + public NewSessionNotification(string sessionName, int userId) : base(sessionName) => UserId = userId; + } +} \ No newline at end of file diff --git a/Sledgemapper.Api/Startup.cs b/Sledgemapper.Api/Startup.cs index 2a8ea2f..d442c73 100644 --- a/Sledgemapper.Api/Startup.cs +++ b/Sledgemapper.Api/Startup.cs @@ -19,7 +19,7 @@ using Microsoft.AspNetCore.Authentication.JwtBearer; using System.Text; using AutoMapper; using Sledgemapper.Services; - +using System.Security.Claims; namespace SignalRChat { @@ -79,6 +79,8 @@ namespace SignalRChat // return unauthorized if user no longer exists context.Fail("Unauthorized"); } + context.HttpContext.User.Claims.Append(new Claim(ClaimTypes.Name, user.Username)); + context.HttpContext.User.Claims.Append(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())); return Task.CompletedTask; } }; diff --git a/Sledgemapper.Api/sledgemapper.db b/Sledgemapper.Api/sledgemapper.db deleted file mode 100644 index f0e9dd6..0000000 Binary files a/Sledgemapper.Api/sledgemapper.db and /dev/null differ diff --git a/Sledgemapper/CommunicationManager.cs b/Sledgemapper/CommunicationManager.cs index 041aa38..d94bb00 100644 --- a/Sledgemapper/CommunicationManager.cs +++ b/Sledgemapper/CommunicationManager.cs @@ -17,6 +17,7 @@ namespace Sledgemapper public HubConnection Connection { get; private set; } public Session SessionData; private ChannelsQueue Queue = new ChannelsQueue(); + private AuthenticateResponse _authenticateResponse; public CommunicationManager(Session sessionData) { @@ -24,12 +25,15 @@ namespace Sledgemapper Connection = new HubConnectionBuilder() .WithAutomaticReconnect() - .WithUrl("http://localhost:5000/SledgemapperHub") + .WithUrl("http://localhost:5000/SledgemapperHub", options => + { + options.AccessTokenProvider = () => Task.FromResult(_authenticateResponse.Token); + }) // .WithUrl("http://hub.michelescandura.com:5000/SledgemapperHub") .Build(); - + var httpClientHandler = new HttpClientHandler(); @@ -58,7 +62,7 @@ namespace Sledgemapper var p = SessionData.Players.FirstOrDefault(m => m.ConnectionId == player.ConnectionId); if (p != null) { - p.Position = player.Position; + p.Position = player.Position; } }); @@ -100,16 +104,28 @@ namespace Sledgemapper var p = SessionData.Players.FirstOrDefault(m => m.ConnectionId == player.ConnectionId); if (p is null) { - SessionData.Players.Add(player); + SessionData.Players.Add(player); } else { - p.Color = player.Color; - p.Position = player.Position; + p.Color = player.Color; + p.Position = player.Position; } }); } + public async Task Register(RegisterModel registerModel) + { + var result = await Api.Register(registerModel); + return result.IsSuccessStatusCode; + } + + public async Task Login(AuthenticateModel authenticateModel) + { + _authenticateResponse = await Api.Authenticate(authenticateModel); + return _authenticateResponse; + } + private async Task Execute(Func call) { await Policy diff --git a/Sledgemapper/IMapApi.cs b/Sledgemapper/IMapApi.cs index 08423d4..01af572 100644 --- a/Sledgemapper/IMapApi.cs +++ b/Sledgemapper/IMapApi.cs @@ -3,6 +3,7 @@ using Sledgemapper.Shared.Entities; using System; using System.Collections.Generic; using System.Linq; +using System.Net.Http; using System.Text; using System.Threading.Tasks; @@ -27,5 +28,11 @@ namespace Sledgemapper [Delete("/session/{sessionName}/overlay")] Task DeleteOverlay([Body] Overlay overlay, string sessionName); + + [Post("/users/register")] + Task Register([Body] RegisterModel registerModel); + + [Post("/users/authenticate")] + Task Authenticate([Body] AuthenticateModel registerModel); } } \ No newline at end of file diff --git a/Sledgemapper/MyDatabase.db b/Sledgemapper/MyDatabase.db deleted file mode 100644 index cc490d7..0000000 Binary files a/Sledgemapper/MyDatabase.db and /dev/null differ diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index 73630fc..e660503 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -243,7 +243,8 @@ namespace Sledgemapper { return; } - GraphicsDevice.Clear(new Color(24,118,157)); + //GraphicsDevice.Clear(new Color(24,118,157)); + GraphicsDevice.Clear(Color.LightGray); var visibleTilesX = GraphicsDevice.Viewport.Width / _state._tileSize + 1; var visibleTilesY = GraphicsDevice.Viewport.Height / _state._tileSize + 1; @@ -518,20 +519,8 @@ namespace Sledgemapper var successful = false; try { - var httpClientHandler = new HttpClientHandler(); - -#if DEBUG - httpClientHandler.ServerCertificateCustomValidationCallback = - (message, certificate, chain, sslPolicyErrors) => true; -#endif - - var identiyApi = RestService.For( - new HttpClient(httpClientHandler) - { - BaseAddress = new Uri("http://localhost:4000") - }); - - _authResponse = await identiyApi.Authenticate(new AuthenticateModel + + _authResponse = await _communicationManager.Login(new AuthenticateModel { Username = localContent.TxtEmail.Text, Password = localContent.TxtPassword.Text @@ -577,19 +566,7 @@ namespace Sledgemapper var successful = false; try { - var httpClientHandler = new HttpClientHandler(); - -#if DEBUG - httpClientHandler.ServerCertificateCustomValidationCallback = - (message, certificate, chain, sslPolicyErrors) => true; -#endif - - var identiyApi = RestService.For( - new HttpClient(httpClientHandler) - { - BaseAddress = new Uri("http://localhost:4000") - }); - var result = await identiyApi.Register(new RegisterModel + var result = await _communicationManager.Register(new RegisterModel { Username = localContent.TxtEmail.Text, Password = localContent.TxtPassword.Text, @@ -597,9 +574,9 @@ namespace Sledgemapper LastName = localContent.TxtLastname.Text, Initials = localContent.TxtInitials.Text }); - if (result.IsSuccessStatusCode) + if (result) { - _authResponse = await identiyApi.Authenticate(new AuthenticateModel + _authResponse = await _communicationManager.Login(new AuthenticateModel { Username = localContent.TxtEmail.Text, Password = localContent.TxtPassword.Text diff --git a/Sledgemapper/UI/MainWidget.Generated.cs b/Sledgemapper/UI/MainWidget.Generated.cs index eb99e0c..d0b5cc3 100644 --- a/Sledgemapper/UI/MainWidget.Generated.cs +++ b/Sledgemapper/UI/MainWidget.Generated.cs @@ -1,4 +1,4 @@ -/* Generated by MyraPad at 10/11/2020 15:49:08 */ +/* Generated by MyraPad at 11/11/2020 09:47:53 */ using Myra.Graphics2D; using Myra.Graphics2D.TextureAtlases; using Myra.Graphics2D.UI; diff --git a/Sledgemapper/UI/mainwidget.xml b/Sledgemapper/UI/mainwidget.xml index 37eadde..8dfb054 100644 --- a/Sledgemapper/UI/mainwidget.xml +++ b/Sledgemapper/UI/mainwidget.xml @@ -23,7 +23,7 @@ - +