diff --git a/SessionCompanion/SessionCompanion.Services/Intefraces/ICharacterService.cs b/SessionCompanion/SessionCompanion.Services/Intefraces/ICharacterService.cs index 06bdf47..876ce7f 100644 --- a/SessionCompanion/SessionCompanion.Services/Intefraces/ICharacterService.cs +++ b/SessionCompanion/SessionCompanion.Services/Intefraces/ICharacterService.cs @@ -10,5 +10,6 @@ namespace SessionCompanion.Services.Interfaces { public interface ICharacterService : IServiceBase { + Task> GetUserLoginCharacters(int userId); } } diff --git a/SessionCompanion/SessionCompanion.Services/Services/CharacterService.cs b/SessionCompanion/SessionCompanion.Services/Services/CharacterService.cs index 939ea90..28c96e8 100644 --- a/SessionCompanion/SessionCompanion.Services/Services/CharacterService.cs +++ b/SessionCompanion/SessionCompanion.Services/Services/CharacterService.cs @@ -21,5 +21,21 @@ namespace SessionCompanion.Services.Services { public CharacterService(IMapper mapper, IRepository repository) : base(mapper, repository) { } + + /// + /// Funkcja zwraca listę postaci przypisanych do podanego użytkownika + /// + /// identyfikator użytkownika + /// Lista postaci dosępnych dla podanego użytkownika + public async Task> GetUserLoginCharacters(int userId) + { + var characters = await Repository.Get(c => c.UserId.Equals(userId)) + .Include(x => x.Biography) + .Include(x => x.Statistics) + .Include(x => x.Biography).ThenInclude(b => b.Class).ToListAsync(); + var result = Mapper.Map>(characters); + return result; + } + } } diff --git a/SessionCompanion/SessionCompanion/Controllers/CharacterController.cs b/SessionCompanion/SessionCompanion/Controllers/CharacterController.cs index 52507ad..cb6e42e 100644 --- a/SessionCompanion/SessionCompanion/Controllers/CharacterController.cs +++ b/SessionCompanion/SessionCompanion/Controllers/CharacterController.cs @@ -7,6 +7,10 @@ using SessionCompanion.ViewModels.CharacterViewModels; namespace SessionCompanion.Controllers { + using System.Collections.Generic; + using System.ComponentModel.DataAnnotations; + using System.Linq; + [Route("api/character")] [ApiController] public class CharacterController : Controller @@ -35,5 +39,27 @@ namespace SessionCompanion.Controllers }; return characterViewModel; } + + /// + /// Metoda zwraca listę postaci przypisanych do danego użytkownika + /// + /// Identyfikator użytkownika + /// Lista postać lub wiadomość błędu + [HttpGet("userCharactersList")] + public async Task, ErrorResponse>> GetCharacterListForUser([Required] int userId) + { + var charactersList = await this._service.GetUserLoginCharacters(userId); + + if (charactersList.Any()) + { + return charactersList.ToList(); + } + + return new ErrorResponse() + { + StatusCode = 204, + Message = "No characters with given user id" + }; + } } } \ No newline at end of file diff --git a/SessionCompanion/SessionCompanion/Controllers/UserController.cs b/SessionCompanion/SessionCompanion/Controllers/UserController.cs index 2e9081b..ec8607a 100644 --- a/SessionCompanion/SessionCompanion/Controllers/UserController.cs +++ b/SessionCompanion/SessionCompanion/Controllers/UserController.cs @@ -6,8 +6,12 @@ using System.Threading.Tasks; namespace SessionCompanion.Controllers { using System; + using System.Security.Policy; + + using Microsoft.AspNetCore.SignalR; using SessionCompanion.Extensions.EitherType; + using SessionCompanion.Hubs; using SessionCompanion.ViewModels.ApiResponses; using SessionCompanion.ViewModels.UserViewModels; @@ -17,9 +21,12 @@ namespace SessionCompanion.Controllers { private readonly IUserService _service; + private SessionHubData _sessionHubData; + public UserController(IUserService service) { this._service = service; + this._sessionHubData = new SessionHubData(); } /// @@ -69,5 +76,15 @@ namespace SessionCompanion.Controllers return new SuccessResponse("User created"); } + + /// + /// Metoda sprawdza czy ktoś jest już zalogowany jako Game Master + /// + /// true jesli ktoś jest już zalogowany i false jeśli nie + [HttpGet("IsGMLogged")] + public Either IsGameMasterAllreadyLogged() + { + return this._sessionHubData.GameMasterConnected_Prop; + } } } \ No newline at end of file diff --git a/SessionCompanion/SessionCompanion/Hubs/SessionHub.cs b/SessionCompanion/SessionCompanion/Hubs/SessionHub.cs index d6c6573..4e59a32 100644 --- a/SessionCompanion/SessionCompanion/Hubs/SessionHub.cs +++ b/SessionCompanion/SessionCompanion/Hubs/SessionHub.cs @@ -1,7 +1,5 @@ using Microsoft.AspNetCore.SignalR; using System; -using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; namespace SessionCompanion.Hubs @@ -9,17 +7,13 @@ namespace SessionCompanion.Hubs public class SessionHub : Hub { /// - /// Lista zalogowanych graczy i identyfikator wybranej postaci + /// Klasa zawierająca wszystkie dane potrzebne w SignalR odnośnie aktualnej sesji /// - private static Dictionary ConnectedCharacters = new Dictionary(); - - /// - /// Status, czy GM został już zalogowany - /// - private static bool GameMasterConnected = new bool(); + private SessionHubData sessionHubData; public SessionHub() { + this.sessionHubData = new SessionHubData(); } /// @@ -31,16 +25,17 @@ namespace SessionCompanion.Hubs public override Task OnDisconnectedAsync(Exception exception) { // if true then it is character, if false it is GM - if (ConnectedCharacters.ContainsKey(Context.ConnectionId)) + if (this.sessionHubData.ConnectedCharacters_Prop.ContainsKey(Context.ConnectionId)) { Groups.RemoveFromGroupAsync(Context.ConnectionId, "Players"); - ConnectedCharacters.Remove(Context.ConnectionId); + this.sessionHubData.ConnectedCharacters_Prop.Remove(Context.ConnectionId); } else { Groups.RemoveFromGroupAsync(Context.ConnectionId, "GameMaster"); - GameMasterConnected = false; + this.sessionHubData.GameMasterConnected_Prop = false; } + Clients.All.SendAsync("GoodBye", "Player has left the game"); return base.OnDisconnectedAsync(exception); } @@ -54,10 +49,10 @@ namespace SessionCompanion.Hubs /// Zwraca true - jeśli udało się zalogować, false - jesli ktoś zalogował się już jako GM public bool GameMasterLogin() { - if (!GameMasterConnected) + if (!this.sessionHubData.GameMasterConnected_Prop) { Groups.AddToGroupAsync(Context.ConnectionId, "GameMaster"); - GameMasterConnected = true; + this.sessionHubData.GameMasterConnected_Prop = true; Clients.All.SendAsync("Welcome", "Welcome new Game Master"); return true; } @@ -77,7 +72,7 @@ namespace SessionCompanion.Hubs /// Wysyła wiadomość "Welcome" do wszystkich zalogowanych użytkoników public Task PlayerCharacterLogin(int characterId) { - ConnectedCharacters.Add(Context.ConnectionId, characterId); + this.sessionHubData.ConnectedCharacters_Prop.Add(Context.ConnectionId, characterId); Groups.AddToGroupAsync(Context.ConnectionId, "Players"); return Clients.All.SendAsync("Welcome", "Welcome new Player"); diff --git a/SessionCompanion/SessionCompanion/Hubs/SessionHubData.cs b/SessionCompanion/SessionCompanion/Hubs/SessionHubData.cs new file mode 100644 index 0000000..d370d20 --- /dev/null +++ b/SessionCompanion/SessionCompanion/Hubs/SessionHubData.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; + +namespace SessionCompanion.Hubs +{ + /// + /// Statyczna klasa przechowujaca informacje dotyczące SignalR dla SessionHub + /// + public class SessionHubData + { + /// + /// Lista zalogowanych graczy i identyfikator wybranej postaci + /// + public static Dictionary ConnectedCharacters = new Dictionary(); + + /// + /// Status, czy GM został już zalogowany + /// + public static bool GameMasterConnected; + + /// + /// Zwraca lub ustawia status zalogowania GM + /// + public bool GameMasterConnected_Prop + { + get + { + return GameMasterConnected; + } + + set + { + GameMasterConnected = value; + } + } + + /// + /// Zwraca lub ustawia listę zalogowanych graczy + /// + public Dictionary ConnectedCharacters_Prop + { + get + { + return ConnectedCharacters; + } + + set + { + ConnectedCharacters = value; + } + } + } +} diff --git a/SessionCompanion/SessionCompanion/SessionCompanion.xml b/SessionCompanion/SessionCompanion/SessionCompanion.xml index ff31b6a..13641ce 100644 --- a/SessionCompanion/SessionCompanion/SessionCompanion.xml +++ b/SessionCompanion/SessionCompanion/SessionCompanion.xml @@ -26,6 +26,12 @@ Model uzytkownika do zarejestrowania SuccessResponse/ErrorResponse + + + Metoda sprawdza czy ktoś jest już zalogowany jako Game Master + + true jesli ktoś jest już zalogowany i false jeśli nie + Lista zalogowanych graczy i identyfikator wybranej postaci @@ -58,5 +64,30 @@ Identyfikator zalogowanego bohatera Wysyła wiadomość "Welcome" do wszystkich zalogowanych użytkoników + + + Statyczna klasa przechowujaca informacje dotyczące SignalR dla SessionHub + + + + + Lista zalogowanych graczy i identyfikator wybranej postaci + + + + + Status, czy GM został już zalogowany + + + + + Zwraca lub ustawia status zalogowania GM + + + + + Zwraca lub ustawia listę zalogowanych graczy + +