From 8e43420fa0cbc978efa92f841ce303260ddf54e9 Mon Sep 17 00:00:00 2001 From: RezecNoble Date: Sun, 10 Nov 2024 22:08:01 -0500 Subject: [PATCH] Implemented new controllers and requests for Characters, WorldServers and Zones/ZoneInstances. Get requests are complete. Remove requests are a WIP. Next stage will be add/edit. --- .../MSSQL/CharactersRepository.cs | 44 ++++++ .../MSSQL/InstanceManagementRepository.cs | 132 +++++++++++++++++ .../Implementations/MSSQL/UsersRepository.cs | 31 ++++ .../MySQL/CharactersRepository.cs | 44 ++++++ .../MySQL/InstanceManagementRepository.cs | 133 ++++++++++++++++++ .../Implementations/MySQL/UsersRepository.cs | 31 ++++ .../Postgres/CharactersRepository.cs | 44 ++++++ .../Postgres/InstanceManagementRepository.cs | 133 ++++++++++++++++++ .../Postgres/UsersRepository.cs | 30 ++++ .../Interfaces/ICharactersRepository.cs | 3 + .../IInstanceManagementRepository.cs | 7 + .../Interfaces/IUsersRepository.cs | 3 +- src/OWSData/SQL/GenericQueries.cs | 31 +++- .../Controllers/CharactersController.cs | 54 +++++++ .../Controllers/UsersController.cs | 16 +++ .../Controllers/WorldServersController.cs | 54 +++++++ .../Controllers/ZonesController.cs | 70 +++++++++ src/OWSManagement/DTOs/RemoveUserDTO.cs | 10 ++ .../PlayerCharacters/GetCharactersRequest.cs | 25 ++++ .../Requests/Users/RemoveUserRequest.cs | 30 ++++ .../Requests/Worlds/GetWorldServersRequest.cs | 25 ++++ .../Requests/Zones/GetZoneInstancesRequest.cs | 25 ++++ .../Requests/Zones/GetZonesRequest.cs | 25 ++++ src/OWSManagement/Startup.cs | 15 +- src/OWSManagement/appsettings.json | 2 +- .../wwwroot/src/components/CharactersGrid.vue | 118 +++++++++++++--- .../wwwroot/src/components/UsersAdd.vue | 4 +- .../wwwroot/src/components/UsersGrid.vue | 32 ++++- .../src/components/WorldServersGrid.vue | 75 ++++++++-- .../src/components/ZoneInstancesGrid.vue | 68 +++++++-- .../wwwroot/src/components/ZonesGrid.vue | 85 ++++++++--- src/OWSManagement/wwwroot/src/owsApi.ts | 18 ++- .../Controllers/UsersController.cs | 17 ++- src/OWSPublicAPI/OWSPublicAPI.xml | 50 ++++++- .../Requests/Users/RegisterUserRequest.cs | 23 ++- .../Requests/Users/RemoveUserRequest.cs | 66 +++++++++ .../DefaultPublicAPIInputValidation.cs | 15 +- 37 files changed, 1505 insertions(+), 83 deletions(-) create mode 100644 src/OWSManagement/Controllers/CharactersController.cs create mode 100644 src/OWSManagement/Controllers/WorldServersController.cs create mode 100644 src/OWSManagement/Controllers/ZonesController.cs create mode 100644 src/OWSManagement/DTOs/RemoveUserDTO.cs create mode 100644 src/OWSManagement/Requests/PlayerCharacters/GetCharactersRequest.cs create mode 100644 src/OWSManagement/Requests/Users/RemoveUserRequest.cs create mode 100644 src/OWSManagement/Requests/Worlds/GetWorldServersRequest.cs create mode 100644 src/OWSManagement/Requests/Zones/GetZoneInstancesRequest.cs create mode 100644 src/OWSManagement/Requests/Zones/GetZonesRequest.cs create mode 100644 src/OWSPublicAPI/Requests/Users/RemoveUserRequest.cs diff --git a/src/OWSData/Repositories/Implementations/MSSQL/CharactersRepository.cs b/src/OWSData/Repositories/Implementations/MSSQL/CharactersRepository.cs index 73a3bf3875..fe74cba7bc 100644 --- a/src/OWSData/Repositories/Implementations/MSSQL/CharactersRepository.cs +++ b/src/OWSData/Repositories/Implementations/MSSQL/CharactersRepository.cs @@ -638,5 +638,49 @@ public async Task UpdateAbilityOnCharacter(Guid customerGUID, string abilityName await Connection.ExecuteAsync(MSSQLQueries.UpdateAbilityOnCharacter, parameters); } } + + public async Task> GetCharacters(Guid customerGuid) + { + IEnumerable outputObject = null; + + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + + outputObject = await Connection.QueryAsync(GenericQueries.GetCharacters, p); + } + + return outputObject; + } + + public async Task RemoveCharacter(Guid customerGuid, string characterName) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + p.Add("@CharacterName", characterName); + + await Connection.ExecuteAsync(GenericQueries.RemoveCharacter, p, commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } } } diff --git a/src/OWSData/Repositories/Implementations/MSSQL/InstanceManagementRepository.cs b/src/OWSData/Repositories/Implementations/MSSQL/InstanceManagementRepository.cs index 90a0a953f6..e5b22379c8 100644 --- a/src/OWSData/Repositories/Implementations/MSSQL/InstanceManagementRepository.cs +++ b/src/OWSData/Repositories/Implementations/MSSQL/InstanceManagementRepository.cs @@ -401,5 +401,137 @@ await Connection.ExecuteAsync("AddOrUpdateMapZone", return output; } } + + public async Task> GetWorldServers(Guid customerGuid) + { + IEnumerable outputObject = null; + + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + + outputObject = await Connection.QueryAsync(GenericQueries.GetWorldServers, p); + } + + return outputObject; + } + + public async Task RemoveWorldServer(Guid customerGuid, int worldserverid) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + p.Add("@WorldServerID", worldserverid); + + await Connection.ExecuteAsync(GenericQueries.RemoveWorldServer, p, commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } + + public async Task> GetZones(Guid customerGuid) + { + IEnumerable outputObject = null; + + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + + outputObject = await Connection.QueryAsync(GenericQueries.GetZones, p); + } + + return outputObject; + } + + public async Task RemoveZone(Guid customerGuid, int mapid) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + p.Add("@MapID", mapid); + + await Connection.ExecuteAsync(GenericQueries.RemoveZone, p, commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } + + public async Task> GetMapInstances(Guid customerGuid) + { + IEnumerable outputObject = null; + + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + + outputObject = await Connection.QueryAsync(GenericQueries.GetMapInstances, p); + } + + return outputObject; + } + + public async Task RemoveMapInstances(Guid customerGuid, int mapinstanceid) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + p.Add("@MapInstanceID", mapinstanceid); + + await Connection.ExecuteAsync(GenericQueries.RemoveMapInstances, p, commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } } } diff --git a/src/OWSData/Repositories/Implementations/MSSQL/UsersRepository.cs b/src/OWSData/Repositories/Implementations/MSSQL/UsersRepository.cs index f1b5c17e8a..e1be2d6d71 100644 --- a/src/OWSData/Repositories/Implementations/MSSQL/UsersRepository.cs +++ b/src/OWSData/Repositories/Implementations/MSSQL/UsersRepository.cs @@ -447,5 +447,36 @@ await Connection.ExecuteAsync(GenericQueries.UpdateUser, return outputObject; } } + + public async Task RemoveUser(Guid customerGuid, Guid userGuid, string email) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@UserGUID", userGuid); + p.Add("@Email", email); + + await Connection.ExecuteAsync(GenericQueries.RemoveUser, + p, + commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } } } diff --git a/src/OWSData/Repositories/Implementations/MySQL/CharactersRepository.cs b/src/OWSData/Repositories/Implementations/MySQL/CharactersRepository.cs index 5ae7063f08..cf9e33f7d0 100644 --- a/src/OWSData/Repositories/Implementations/MySQL/CharactersRepository.cs +++ b/src/OWSData/Repositories/Implementations/MySQL/CharactersRepository.cs @@ -591,5 +591,49 @@ public async Task UpdateAbilityOnCharacter(Guid customerGUID, string abilityName await Connection.ExecuteAsync(MySQLQueries.UpdateAbilityOnCharacter, parameters); } } + + public async Task> GetCharacters(Guid customerGuid) + { + IEnumerable outputObject = null; + + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + + outputObject = await Connection.QueryAsync(GenericQueries.GetCharacters, p); + } + + return outputObject; + } + + public async Task RemoveCharacter(Guid customerGuid, string characterName) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + p.Add("@CharacterName", characterName); + + await Connection.ExecuteAsync(GenericQueries.RemoveCharacter, p, commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } } } diff --git a/src/OWSData/Repositories/Implementations/MySQL/InstanceManagementRepository.cs b/src/OWSData/Repositories/Implementations/MySQL/InstanceManagementRepository.cs index e017dad920..d7bf3bcfdd 100644 --- a/src/OWSData/Repositories/Implementations/MySQL/InstanceManagementRepository.cs +++ b/src/OWSData/Repositories/Implementations/MySQL/InstanceManagementRepository.cs @@ -11,6 +11,7 @@ using OWSData.Repositories.Interfaces; using OWSData.SQL; using OWSShared.Options; +using OWSData.Models.Tables; namespace OWSData.Repositories.Implementations.MySQL { @@ -371,5 +372,137 @@ await Connection.ExecuteAsync("call AddOrUpdateMapZone(@CustomerGUID,@MapID,@Map return output; } } + + public async Task> GetWorldServers(Guid customerGuid) + { + IEnumerable outputObject = null; + + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + + outputObject = await Connection.QueryAsync(GenericQueries.GetWorldServers, p); + } + + return outputObject; + } + + public async Task RemoveWorldServer(Guid customerGuid, int worldserverid) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + p.Add("@WorldServerID", worldserverid); + + await Connection.ExecuteAsync(GenericQueries.RemoveWorldServer, p, commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } + + public async Task> GetZones(Guid customerGuid) + { + IEnumerable outputObject = null; + + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + + outputObject = await Connection.QueryAsync(GenericQueries.GetZones, p); + } + + return outputObject; + } + + public async Task RemoveZone(Guid customerGuid, int mapid) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + p.Add("@MapID", mapid); + + await Connection.ExecuteAsync(GenericQueries.RemoveZone, p, commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } + + public async Task> GetMapInstances(Guid customerGuid) + { + IEnumerable outputObject = null; + + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + + outputObject = await Connection.QueryAsync(GenericQueries.GetMapInstances, p); + } + + return outputObject; + } + + public async Task RemoveMapInstances(Guid customerGuid, int mapinstanceid) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + p.Add("@MapInstanceID", mapinstanceid); + + await Connection.ExecuteAsync(GenericQueries.RemoveMapInstances, p, commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } } } diff --git a/src/OWSData/Repositories/Implementations/MySQL/UsersRepository.cs b/src/OWSData/Repositories/Implementations/MySQL/UsersRepository.cs index da9f0e785e..ca56a7c2d8 100644 --- a/src/OWSData/Repositories/Implementations/MySQL/UsersRepository.cs +++ b/src/OWSData/Repositories/Implementations/MySQL/UsersRepository.cs @@ -422,5 +422,36 @@ await Connection.ExecuteAsync(GenericQueries.UpdateUser, return outputObject; } } + + public async Task RemoveUser(Guid customerGuid, Guid userGuid, string email) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@UserGUID", userGuid); + p.Add("@Email", email); + + await Connection.ExecuteAsync(GenericQueries.RemoveUser, + p, + commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } } } diff --git a/src/OWSData/Repositories/Implementations/Postgres/CharactersRepository.cs b/src/OWSData/Repositories/Implementations/Postgres/CharactersRepository.cs index 410208834a..9cd68b75be 100644 --- a/src/OWSData/Repositories/Implementations/Postgres/CharactersRepository.cs +++ b/src/OWSData/Repositories/Implementations/Postgres/CharactersRepository.cs @@ -591,5 +591,49 @@ public async Task UpdateAbilityOnCharacter(Guid customerGUID, string abilityName await Connection.ExecuteAsync(PostgresQueries.UpdateAbilityOnCharacter, parameters); } } + + public async Task> GetCharacters(Guid customerGuid) + { + IEnumerable outputObject = null; + + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + + outputObject = await Connection.QueryAsync(GenericQueries.GetCharacters, p); + } + + return outputObject; + } + + public async Task RemoveCharacter(Guid customerGuid, string characterName) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + p.Add("@CharacterName", characterName); + + await Connection.ExecuteAsync(GenericQueries.RemoveCharacter, p, commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } } } diff --git a/src/OWSData/Repositories/Implementations/Postgres/InstanceManagementRepository.cs b/src/OWSData/Repositories/Implementations/Postgres/InstanceManagementRepository.cs index 4793f850f3..e91058681c 100644 --- a/src/OWSData/Repositories/Implementations/Postgres/InstanceManagementRepository.cs +++ b/src/OWSData/Repositories/Implementations/Postgres/InstanceManagementRepository.cs @@ -11,6 +11,7 @@ using OWSData.Repositories.Interfaces; using OWSData.SQL; using OWSShared.Options; +using OWSData.Models.Tables; namespace OWSData.Repositories.Implementations.Postgres { @@ -375,5 +376,137 @@ await Connection.ExecuteAsync("call AddOrUpdateMapZone(@CustomerGUID,@MapID,@Map return output; } } + + public async Task> GetWorldServers(Guid customerGuid) + { + IEnumerable outputObject = null; + + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + + outputObject = await Connection.QueryAsync(GenericQueries.GetWorldServers, p); + } + + return outputObject; + } + + public async Task RemoveWorldServer(Guid customerGuid, int worldserverid) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + p.Add("@WorldServerID", worldserverid); + + await Connection.ExecuteAsync(GenericQueries.RemoveWorldServer, p, commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } + + public async Task> GetZones(Guid customerGuid) + { + IEnumerable outputObject = null; + + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + + outputObject = await Connection.QueryAsync(GenericQueries.GetZones, p); + } + + return outputObject; + } + + public async Task RemoveZone(Guid customerGuid, int mapid) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + p.Add("@MapID", mapid); + + await Connection.ExecuteAsync(GenericQueries.RemoveZone, p, commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } + + public async Task> GetMapInstances(Guid customerGuid) + { + IEnumerable outputObject = null; + + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + + outputObject = await Connection.QueryAsync(GenericQueries.GetMapInstances, p); + } + + return outputObject; + } + + public async Task RemoveMapInstances(Guid customerGuid, int mapinstanceid) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + p.Add("@MapInstanceID", mapinstanceid); + + await Connection.ExecuteAsync(GenericQueries.RemoveMapInstances, p, commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } } } diff --git a/src/OWSData/Repositories/Implementations/Postgres/UsersRepository.cs b/src/OWSData/Repositories/Implementations/Postgres/UsersRepository.cs index 9f5ceac24e..c6a9dfa59c 100644 --- a/src/OWSData/Repositories/Implementations/Postgres/UsersRepository.cs +++ b/src/OWSData/Repositories/Implementations/Postgres/UsersRepository.cs @@ -424,5 +424,35 @@ await Connection.ExecuteAsync(GenericQueries.UpdateUser, return outputObject; } } + + public async Task RemoveUser(Guid customerGuid, Guid userGuid, string email) + { + SuccessAndErrorMessage outputObject = new SuccessAndErrorMessage(); + + try + { + using (Connection) + { + var p = new DynamicParameters(); + p.Add("@CustomerGUID", customerGuid); + p.Add("@UserGUID", userGuid); + p.Add("@Email", email); + + await Connection.ExecuteAsync(GenericQueries.RemoveUser, p, commandType: CommandType.Text); + } + + outputObject.Success = true; + outputObject.ErrorMessage = ""; + + return outputObject; + } + catch (Exception ex) + { + outputObject.Success = false; + outputObject.ErrorMessage = ex.Message; + + return outputObject; + } + } } } diff --git a/src/OWSData/Repositories/Interfaces/ICharactersRepository.cs b/src/OWSData/Repositories/Interfaces/ICharactersRepository.cs index 5817b5ec40..e4d7195773 100644 --- a/src/OWSData/Repositories/Interfaces/ICharactersRepository.cs +++ b/src/OWSData/Repositories/Interfaces/ICharactersRepository.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using OWSData.Models.Composites; using OWSData.Models.StoredProcs; using OWSData.Models.Tables; @@ -27,5 +28,7 @@ public interface ICharactersRepository Task SpinUpInstance(Guid customerGUID, string zoneName, int playerGroupId = 0); Task RemoveAbilityFromCharacter(Guid customerGUID, string abilityName, string characterName); Task UpdateAbilityOnCharacter(Guid customerGUID, string abilityName, string characterName, int abilityLevel, string charHasAbilitiesCustomJSON); + Task> GetCharacters(Guid customerGuid); + Task RemoveCharacter(Guid customerGuid, string characterName); } } diff --git a/src/OWSData/Repositories/Interfaces/IInstanceManagementRepository.cs b/src/OWSData/Repositories/Interfaces/IInstanceManagementRepository.cs index 63dc9442e7..928b8df30a 100644 --- a/src/OWSData/Repositories/Interfaces/IInstanceManagementRepository.cs +++ b/src/OWSData/Repositories/Interfaces/IInstanceManagementRepository.cs @@ -1,5 +1,6 @@ using OWSData.Models.Composites; using OWSData.Models.StoredProcs; +using OWSData.Models.Tables; using System; using System.Collections.Generic; using System.Text; @@ -21,5 +22,11 @@ public interface IInstanceManagementRepository Task RegisterLauncher(Guid customerGUID, string launcherGuid, string serverIp, int maxNumberOfInstances, string internalServerIp, int startingInstancePort); Task AddZone(Guid customerGUID, string mapName, string zoneName, string worldCompContainsFilter, string worldCompListFilter, int softPlayerCap, int hardPlayerCap, int mapMode); Task UpdateZone(Guid customerGUID, int mapId, string mapName, string zoneName, string worldCompContainsFilter, string worldCompListFilter, int softPlayerCap, int hardPlayerCap, int mapMode); + Task> GetWorldServers(Guid customerGuid); + Task RemoveWorldServer(Guid customerGuid, int worldserverid); + Task> GetZones(Guid customerGuid); + Task RemoveZone(Guid customerGuid, int mapid); + Task> GetMapInstances(Guid customerGuid); + Task RemoveMapInstances(Guid customerGuid, int mapinstanceid); } } diff --git a/src/OWSData/Repositories/Interfaces/IUsersRepository.cs b/src/OWSData/Repositories/Interfaces/IUsersRepository.cs index 149f660e4d..8f73ccb25e 100644 --- a/src/OWSData/Repositories/Interfaces/IUsersRepository.cs +++ b/src/OWSData/Repositories/Interfaces/IUsersRepository.cs @@ -27,6 +27,7 @@ public interface IUsersRepository Task GetUserFromEmail(Guid customerGUID, string email); Task RemoveCharacter(Guid customerGUID, Guid userSessionGUID, string characterName); Task UpdateUser(Guid customerGuid, Guid userGuid, string firstName, string lastName, string email); - + Task RemoveUser(Guid customerGuid, Guid userGuid, string email); + } } diff --git a/src/OWSData/SQL/GenericQueries.cs b/src/OWSData/SQL/GenericQueries.cs index 2b4a419d0a..74a2eeaf47 100644 --- a/src/OWSData/SQL/GenericQueries.cs +++ b/src/OWSData/SQL/GenericQueries.cs @@ -134,12 +134,21 @@ FROM PlayerGroupCharacters PGC FROM Users WHERE CustomerGUID = @CustomerGUID"; + public static readonly string GetCharacters = @"SELECT CharacterID, UserGUID, CharName, MapName, X, Y, Z, LastActivity, CreateDate + FROM Characters"; + + public static readonly string RemoveCharacter = @"DELETE From Characters + WHERE charname = @charname"; + public static readonly string UpdateUser = @"UPDATE Users SET FirstName = @FirstName , LastName = @LastName , Email = @Email WHERE CustomerGUID = @CustomerGUID AND UserGUID = @UserGUID"; + public static readonly string RemoveUser = @"DELETE From Users + WHERE UserGUID = @UserGUID AND Email = @Email"; + public static readonly string HasCustomCharacterDataForField = @"SELECT 1 FROM CustomCharacterData WHERE CustomerGUID = @CustomerGUID @@ -305,6 +314,13 @@ FROM MapInstances , ServerStatus = @ServerStatus WHERE CustomerGUID = @CustomerGUID AND WorldServerID = @WorldServerID"; + + public static readonly string GetWorldServers = @"SELECT * + FROM WorldServers"; + + public static readonly string RemoveWorldServer = @"DELETE From WorldServers + WHERE worldserverid = @worldserverid"; + #endregion #region Zone Queries @@ -341,7 +357,10 @@ FROM Maps M WHERE M.CustomerGUID = @CustomerGUID AND MI.MapInstanceID = @MapInstanceID"; - public static readonly string RemoveMapInstances = @"DELETE FROM MapInstances WHERE CustomerGUID = @CustomerGUID AND MapInstanceID IN @MapInstances"; + public static readonly string GetMapInstances = @"SELECT mapinstanceid, worldserverid, mapid, port, status, numberofreportedplayers, createdate, lastupdatefromserver, lastserveremptydate + FROM MapInstances"; + + public static readonly string RemoveMapInstances = @"DELETE FROM MapInstances WHERE CustomerGUID = @CustomerGUID AND MapInstanceID IN @MapInstances"; public static readonly string RemoveAllMapInstancesForWorldServer = @"DELETE FROM MapInstances WHERE CustomerGUID = @CustomerGUID AND WorldServerId = @WorldServerId"; @@ -350,11 +369,17 @@ FROM Maps M WHERE CustomerGUID = @CustomerGUID AND MapInstanceID = @MapInstanceID"; + public static readonly string GetZones = @"SELECT mapid, mapname, zonename, softplayercap, hardplayercap, mapmode, minutestoshutdownafterempty + FROM Maps"; + + public static readonly string RemoveZone = @"DELETE From Maps + WHERE mapid = @mapid"; + #endregion - #region Global Data Queries + #region Global Data Queries - public static readonly string AddGlobalData = @"INSERT INTO GlobalData (CustomerGUID, GlobalDataKey, GlobalDataValue) + public static readonly string AddGlobalData = @"INSERT INTO GlobalData (CustomerGUID, GlobalDataKey, GlobalDataValue) VALUES (@CustomerGUID, @GlobalDataKey, @GlobalDataValue)"; public static readonly string GetGlobalDataByGlobalDataKey = @"SELECT CustomerGUID, GlobalDataKey, GlobalDataValue diff --git a/src/OWSManagement/Controllers/CharactersController.cs b/src/OWSManagement/Controllers/CharactersController.cs new file mode 100644 index 0000000000..bfaffb80d2 --- /dev/null +++ b/src/OWSManagement/Controllers/CharactersController.cs @@ -0,0 +1,54 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using OWSData.Models.Composites; +using OWSData.Models.Tables; +using OWSData.Repositories.Interfaces; +using OWSManagement.DTOs; +using OWSManagement.Requests.PlayerCharacters; +using OWSShared.Interfaces; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace OWSManagement.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class CharactersController : Controller + { + private readonly IHeaderCustomerGUID _customerGuid; + private readonly ICharactersRepository _charactersRepository; + + public CharactersController(IHeaderCustomerGUID customerGuid, ICharactersRepository charactersRepository) + { + _customerGuid = customerGuid; + _charactersRepository = charactersRepository; + } + + public override void OnActionExecuting(ActionExecutingContext context) + { + if (_customerGuid.CustomerGUID == Guid.Empty) + { + context.Result = new UnauthorizedResult(); + } + } + + + /// + /// Get all Characters + /// + /// + /// Gets a list of all Characters + /// + [HttpGet] + [Route("Get")] + [Produces(typeof(IEnumerable))] + public async Task> Get() + { + GetCharactersRequest getCharactersRequest = new GetCharactersRequest(_customerGuid.CustomerGUID, _charactersRepository); + + return await getCharactersRequest.Handle(); + } + } +} diff --git a/src/OWSManagement/Controllers/UsersController.cs b/src/OWSManagement/Controllers/UsersController.cs index 60feeccf62..73fea45fb2 100644 --- a/src/OWSManagement/Controllers/UsersController.cs +++ b/src/OWSManagement/Controllers/UsersController.cs @@ -82,5 +82,21 @@ public async Task Put([FromBody] EditUserDTO editUserDTO return await editUserRequest.Handle(); } + + /// + /// Remove a User + /// + /// + /// Removes a new user + /// + [HttpPost] + [Route("RemoveUser")] + [Produces(typeof(SuccessAndErrorMessage))] + public async Task RemoveUser([FromBody] RemoveUserDTO removeUserDTO) + { + RemoveUserRequest removeUserRequest = new RemoveUserRequest(_customerGuid.CustomerGUID, removeUserDTO, _usersRepository); + + return await removeUserRequest.Handle(); + } } } diff --git a/src/OWSManagement/Controllers/WorldServersController.cs b/src/OWSManagement/Controllers/WorldServersController.cs new file mode 100644 index 0000000000..d7e979ce0b --- /dev/null +++ b/src/OWSManagement/Controllers/WorldServersController.cs @@ -0,0 +1,54 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using OWSData.Models.Composites; +using OWSData.Models.Tables; +using OWSData.Repositories.Interfaces; +using OWSManagement.DTOs; +using OWSManagement.Requests.Worlds; +using OWSShared.Interfaces; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace OWSManagement.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class WorldServersController : Controller + { + private readonly IHeaderCustomerGUID _customerGuid; + private readonly IInstanceManagementRepository _zonesRepository; + + public WorldServersController(IHeaderCustomerGUID customerGuid, IInstanceManagementRepository zonesRepository) + { + _customerGuid = customerGuid; + _zonesRepository = zonesRepository; + } + + public override void OnActionExecuting(ActionExecutingContext context) + { + if (_customerGuid.CustomerGUID == Guid.Empty) + { + context.Result = new UnauthorizedResult(); + } + } + + + /// + /// Get all WorldServers + /// + /// + /// Gets a list of all WorldServers + /// + [HttpGet] + [Route("Get")] + [Produces(typeof(IEnumerable))] + public async Task> Get() + { + GetWorldServersRequest getWorldServersRequest = new GetWorldServersRequest(_customerGuid.CustomerGUID, _zonesRepository); + + return await getWorldServersRequest.Handle(); + } + } +} diff --git a/src/OWSManagement/Controllers/ZonesController.cs b/src/OWSManagement/Controllers/ZonesController.cs new file mode 100644 index 0000000000..c0074074bb --- /dev/null +++ b/src/OWSManagement/Controllers/ZonesController.cs @@ -0,0 +1,70 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using OWSData.Models.Composites; +using OWSData.Models.Tables; +using OWSData.Repositories.Interfaces; +using OWSManagement.DTOs; +using OWSManagement.Requests.Zones; +using OWSShared.Interfaces; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace OWSManagement.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class ZonesController : Controller + { + private readonly IHeaderCustomerGUID _customerGuid; + private readonly IInstanceManagementRepository _zonesRepository; + + public ZonesController(IHeaderCustomerGUID customerGuid, IInstanceManagementRepository zonesRepository) + { + _customerGuid = customerGuid; + _zonesRepository = zonesRepository; + } + + public override void OnActionExecuting(ActionExecutingContext context) + { + if (_customerGuid.CustomerGUID == Guid.Empty) + { + context.Result = new UnauthorizedResult(); + } + } + + + /// + /// Get all Zones + /// + /// + /// Gets a list of all Zones + /// + [HttpGet] + [Route("Get")] + [Produces(typeof(IEnumerable))] + public async Task> Get() + { + GetZonesRequest getZonesRequest = new GetZonesRequest(_customerGuid.CustomerGUID, _zonesRepository); + + return await getZonesRequest.Handle(); + } + + /// + /// Get all Zone Instances + /// + /// + /// Gets a list of all Zone Instances + /// + [HttpGet] + [Route("GetInstances")] + [Produces(typeof(IEnumerable))] + public async Task> GetInstances() + { + GetMapInstancesRequest getMapInstancesRequest = new GetMapInstancesRequest(_customerGuid.CustomerGUID, _zonesRepository); + + return await getMapInstancesRequest.Handle(); + } + } +} diff --git a/src/OWSManagement/DTOs/RemoveUserDTO.cs b/src/OWSManagement/DTOs/RemoveUserDTO.cs new file mode 100644 index 0000000000..76f05cbdf3 --- /dev/null +++ b/src/OWSManagement/DTOs/RemoveUserDTO.cs @@ -0,0 +1,10 @@ +using System; + +namespace OWSManagement.DTOs +{ + public class RemoveUserDTO + { + public Guid UserGUID { get; set; } + public string Email { get; set; } + } +} diff --git a/src/OWSManagement/Requests/PlayerCharacters/GetCharactersRequest.cs b/src/OWSManagement/Requests/PlayerCharacters/GetCharactersRequest.cs new file mode 100644 index 0000000000..90c7786448 --- /dev/null +++ b/src/OWSManagement/Requests/PlayerCharacters/GetCharactersRequest.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Mvc; +using OWSData.Models.Tables; +using OWSData.Repositories.Interfaces; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace OWSManagement.Requests.PlayerCharacters +{ + public class GetCharactersRequest + { + private readonly Guid _customerGuid; + private readonly ICharactersRepository _charactersRepository; + + public GetCharactersRequest(Guid customerGuid, ICharactersRepository charactersRepository) + { + _customerGuid = customerGuid; + _charactersRepository = charactersRepository; + } + public async Task> Handle() + { + return await _charactersRepository.GetCharacters(_customerGuid); ; + } + } +} diff --git a/src/OWSManagement/Requests/Users/RemoveUserRequest.cs b/src/OWSManagement/Requests/Users/RemoveUserRequest.cs new file mode 100644 index 0000000000..0f0f3b0a07 --- /dev/null +++ b/src/OWSManagement/Requests/Users/RemoveUserRequest.cs @@ -0,0 +1,30 @@ +using OWSData.Models.Composites; +using OWSData.Models.Tables; +using OWSData.Repositories.Interfaces; +using OWSManagement.DTOs; +using System; +using System.Reflection.Metadata; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; + +namespace OWSManagement.Requests.Users +{ + public class RemoveUserRequest + { + private readonly Guid _customerGuid; + private RemoveUserDTO _removeUserDTO { get; set; } + private readonly IUsersRepository _usersRepository; + + public RemoveUserRequest(Guid customerGuid, RemoveUserDTO removeUserDTO, IUsersRepository usersRepository) + { + _customerGuid = customerGuid; + _removeUserDTO = removeUserDTO; + _usersRepository = usersRepository; + } + + public async Task Handle() + { + return await _usersRepository.RemoveUser(_customerGuid, _removeUserDTO.UserGUID, _removeUserDTO.Email); + } + } +} diff --git a/src/OWSManagement/Requests/Worlds/GetWorldServersRequest.cs b/src/OWSManagement/Requests/Worlds/GetWorldServersRequest.cs new file mode 100644 index 0000000000..f2423b0cc2 --- /dev/null +++ b/src/OWSManagement/Requests/Worlds/GetWorldServersRequest.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Mvc; +using OWSData.Models.Tables; +using OWSData.Repositories.Interfaces; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace OWSManagement.Requests.Worlds +{ + public class GetWorldServersRequest + { + private readonly Guid _customerGuid; + private readonly IInstanceManagementRepository _zonesRepository; + + public GetWorldServersRequest(Guid customerGuid, IInstanceManagementRepository zonesRepository) + { + _customerGuid = customerGuid; + _zonesRepository = zonesRepository; + } + public async Task> Handle() + { + return await _zonesRepository.GetWorldServers(_customerGuid); ; + } + } +} diff --git a/src/OWSManagement/Requests/Zones/GetZoneInstancesRequest.cs b/src/OWSManagement/Requests/Zones/GetZoneInstancesRequest.cs new file mode 100644 index 0000000000..583db04d4a --- /dev/null +++ b/src/OWSManagement/Requests/Zones/GetZoneInstancesRequest.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Mvc; +using OWSData.Models.Tables; +using OWSData.Repositories.Interfaces; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace OWSManagement.Requests.Zones +{ + public class GetMapInstancesRequest + { + private readonly Guid _customerGuid; + private readonly IInstanceManagementRepository _zonesRepository; + + public GetMapInstancesRequest(Guid customerGuid, IInstanceManagementRepository zonesRepository) + { + _customerGuid = customerGuid; + _zonesRepository = zonesRepository; + } + public async Task> Handle() + { + return await _zonesRepository.GetMapInstances(_customerGuid); ; + } + } +} diff --git a/src/OWSManagement/Requests/Zones/GetZonesRequest.cs b/src/OWSManagement/Requests/Zones/GetZonesRequest.cs new file mode 100644 index 0000000000..f028ba88d4 --- /dev/null +++ b/src/OWSManagement/Requests/Zones/GetZonesRequest.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Mvc; +using OWSData.Models.Tables; +using OWSData.Repositories.Interfaces; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace OWSManagement.Requests.Zones +{ + public class GetZonesRequest + { + private readonly Guid _customerGuid; + private readonly IInstanceManagementRepository _zonesRepository; + + public GetZonesRequest(Guid customerGuid, IInstanceManagementRepository zonesRepository) + { + _customerGuid = customerGuid; + _zonesRepository = zonesRepository; + } + public async Task> Handle() + { + return await _zonesRepository.GetZones(_customerGuid); ; + } + } +} diff --git a/src/OWSManagement/Startup.cs b/src/OWSManagement/Startup.cs index 370cf5bde8..c731168b51 100644 --- a/src/OWSManagement/Startup.cs +++ b/src/OWSManagement/Startup.cs @@ -131,17 +131,20 @@ private void InitializeContainer(IServiceCollection services) switch (dbBackend) { - case "postgres": - container.Register(Lifestyle.Transient); - container.Register(Lifestyle.Transient); + case "mssql": + container.Register(Lifestyle.Transient); + container.Register(Lifestyle.Transient); + container.Register(Lifestyle.Transient); break; case "mysql": container.Register(Lifestyle.Transient); container.Register(Lifestyle.Transient); + container.Register(Lifestyle.Transient); break; - default: // Default to MSSQL - container.Register(Lifestyle.Transient); - container.Register(Lifestyle.Transient); + default: // Default to postgres + container.Register(Lifestyle.Transient); + container.Register(Lifestyle.Transient); + container.Register(Lifestyle.Transient); break; } } diff --git a/src/OWSManagement/appsettings.json b/src/OWSManagement/appsettings.json index 4461fedd67..4e1c88bbb1 100644 --- a/src/OWSManagement/appsettings.json +++ b/src/OWSManagement/appsettings.json @@ -13,7 +13,7 @@ "InternalPublicApiURL": "http://localhost:44302/" }, "OWSStorageConfig": { - "OWSDBBackend": "mssql", + "OWSDBBackend": "postgres", "OWSDBConnectionString": "Server=host.docker.internal;Database=OpenWorldServer;User Id=SA;Password=yourStrong(!)Password;ConnectRetryCount=0" } } diff --git a/src/OWSManagement/wwwroot/src/components/CharactersGrid.vue b/src/OWSManagement/wwwroot/src/components/CharactersGrid.vue index ca79767f9f..541aeed820 100644 --- a/src/OWSManagement/wwwroot/src/components/CharactersGrid.vue +++ b/src/OWSManagement/wwwroot/src/components/CharactersGrid.vue @@ -1,39 +1,119 @@  \ No newline at end of file diff --git a/src/OWSManagement/wwwroot/src/components/UsersAdd.vue b/src/OWSManagement/wwwroot/src/components/UsersAdd.vue index 8d8d9c8dad..de07ec91c2 100644 --- a/src/OWSManagement/wwwroot/src/components/UsersAdd.vue +++ b/src/OWSManagement/wwwroot/src/components/UsersAdd.vue @@ -29,7 +29,7 @@ ], passwordRules: [ (v: string) => !!v || 'Password is required', - (v: HTMLFormElement) => (v && v.length >= 6) || 'Password must be 6 or more characters in length', + (v: HTMLFormElement) => (v && v.length >= 8) || 'Password must be 8 or more characters in length', ], }); @@ -131,4 +131,4 @@ display: flex; } - \ No newline at end of file + diff --git a/src/OWSManagement/wwwroot/src/components/UsersGrid.vue b/src/OWSManagement/wwwroot/src/components/UsersGrid.vue index 8ee15d0f20..eae41e3087 100644 --- a/src/OWSManagement/wwwroot/src/components/UsersGrid.vue +++ b/src/OWSManagement/wwwroot/src/components/UsersGrid.vue @@ -9,6 +9,8 @@ showEditingUserDialog: boolean, editUser: Record, editUserIndex: number, + deleteUser: Record, + deleteUserIndex: number, addingANewUser: boolean } @@ -24,6 +26,8 @@ showEditingUserDialog: false, editUser: {}, editUserIndex: -1, + deleteUser: {}, + deleteUserIndex: -1, addingANewUser: false }); @@ -73,9 +77,27 @@ data.showEditingUserDialog = false; } - function deleteUser(userToDelete: Record) { - if (confirm("Are you sure you want to remove the player: " + userToDelete.firstName + " " + userToDelete.lastName)) { - alert("Delete the user. Not implemented yet!"); + function deleteUser(userToDelete: Record) + { + if (confirm("Are you sure you want to remove the player with the email: " + userToDelete.email + " and the username:" + userToDelete.username + "? A player with existing characters will not be deleted unless all characters are removed first.")) + { + data.deleteUserIndex = data.rows.indexOf(userToDelete); + data.deleteUser = Object.assign({}, userToDelete); + owsApi.removeUser(data.deleteUser).then((response: any) => { + if (response.data != null) { + if (response.data) { + alert("User deleted!"); + location.reload(); // Reloads the current page + } + else { + alert("Unable to delete the user!"); + } + } + }).catch((error: any) => { + console.log(error); + }).finally(function () { + + }); } } @@ -94,7 +116,7 @@