diff --git a/src/OWSData/Models/Composites/DefaultCustomDataDTO.cs b/src/OWSData/Models/Composites/DefaultCustomDataDTO.cs new file mode 100644 index 000000000..c19ac58fe --- /dev/null +++ b/src/OWSData/Models/Composites/DefaultCustomDataDTO.cs @@ -0,0 +1,8 @@ +namespace OWSData.Models.Composites +{ + public class DefaultCustomDataDTO + { + public string CustomFieldName { get; set; } + public string FieldValue { get; set; } + } +} diff --git a/src/OWSData/Models/Composites/DefaultCustomDataRows.cs b/src/OWSData/Models/Composites/DefaultCustomDataRows.cs new file mode 100644 index 000000000..0493061d3 --- /dev/null +++ b/src/OWSData/Models/Composites/DefaultCustomDataRows.cs @@ -0,0 +1,12 @@ +using OWSData.Models.Tables; +using System; +using System.Collections.Generic; +using System.Text; + +namespace OWSData.Models.Composites +{ + public class DefaultCustomDataRows + { + public List Rows { get; set; } + } +} diff --git a/src/OWSData/Models/Tables/DefaultCustomData.cs b/src/OWSData/Models/Tables/DefaultCustomData.cs new file mode 100644 index 000000000..d8b97be49 --- /dev/null +++ b/src/OWSData/Models/Tables/DefaultCustomData.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace OWSData.Models.Tables +{ + public partial class DefaultCustomData + { + // public Guid CustomerGuid { get; set; } + // public int DefaultCustomCharacterDataId { get; set; } + // public int DefaultCharacterValuesId { get; set; } + public string CustomFieldName { get; set; } + public string FieldValue { get; set; } + + } +} diff --git a/src/OWSData/Repositories/Implementations/MSSQL/CharactersRepository.cs b/src/OWSData/Repositories/Implementations/MSSQL/CharactersRepository.cs index 73a3bf387..17bc90900 100644 --- a/src/OWSData/Repositories/Implementations/MSSQL/CharactersRepository.cs +++ b/src/OWSData/Repositories/Implementations/MSSQL/CharactersRepository.cs @@ -194,6 +194,24 @@ public async Task GetCharByCharName(Guid customerGUID, string return outputCharacter.FirstOrDefault(); } + public async Task> GetDefaultCustomCharacterData(Guid customerGUID, string defaultSetName) + { + IEnumerable outputDefaultCustomCharacterDataRows; + + using (Connection) + { + var parameters = new DynamicParameters(); + parameters.Add("@CustomerGUID", customerGUID); + parameters.Add("@DefaultSetName", defaultSetName); + + outputDefaultCustomCharacterDataRows = await Connection.QueryAsync(GenericQueries.GetDefaultCharacterCustomDataByName, + parameters, + commandType: CommandType.Text); + } + + return outputDefaultCustomCharacterDataRows; + } + public async Task> GetCustomCharacterData(Guid customerGUID, string characterName) { IEnumerable outputCustomCharacterDataRows; diff --git a/src/OWSData/Repositories/Implementations/MySQL/CharactersRepository.cs b/src/OWSData/Repositories/Implementations/MySQL/CharactersRepository.cs index 5ae7063f0..58657e58d 100644 --- a/src/OWSData/Repositories/Implementations/MySQL/CharactersRepository.cs +++ b/src/OWSData/Repositories/Implementations/MySQL/CharactersRepository.cs @@ -210,6 +210,23 @@ public async Task> GetCustomCharacterData(Guid return outputCustomCharacterDataRows; } + public async Task> GetDefaultCustomCharacterData(Guid customerGUID, string defaultSetName) + { + IEnumerable outputDefaultCustomCharacterDataRows; + + using (Connection) + { + var parameters = new DynamicParameters(); + parameters.Add("@CustomerGUID", customerGUID); + parameters.Add("@DefaultSetName", defaultSetName); + + outputDefaultCustomCharacterDataRows = await Connection.QueryAsync(GenericQueries.GetDefaultCharacterCustomDataByName, + parameters, + commandType: CommandType.Text); + } + + return outputDefaultCustomCharacterDataRows; + } public async Task JoinMapByCharName(Guid customerGUID, string characterName, string zoneName, int playerGroupType) { diff --git a/src/OWSData/Repositories/Implementations/Postgres/CharactersRepository.cs b/src/OWSData/Repositories/Implementations/Postgres/CharactersRepository.cs index 410208834..dfc83da10 100644 --- a/src/OWSData/Repositories/Implementations/Postgres/CharactersRepository.cs +++ b/src/OWSData/Repositories/Implementations/Postgres/CharactersRepository.cs @@ -210,6 +210,23 @@ public async Task> GetCustomCharacterData(Guid return outputCustomCharacterDataRows; } + public async Task> GetDefaultCustomCharacterData(Guid customerGUID, string defaultSetName) + { + IEnumerable outputDefaultCustomCharacterDataRows; + + using (Connection) + { + var parameters = new DynamicParameters(); + parameters.Add("@CustomerGUID", customerGUID); + parameters.Add("@DefaultSetName", defaultSetName); + + outputDefaultCustomCharacterDataRows = await Connection.QueryAsync(GenericQueries.GetDefaultCustomCharacterDataByDefaultSetName, + parameters, + commandType: CommandType.Text); + } + + return outputDefaultCustomCharacterDataRows; + } public async Task JoinMapByCharName(Guid customerGUID, string characterName, string zoneName, int playerGroupType) { diff --git a/src/OWSData/Repositories/Interfaces/ICharactersRepository.cs b/src/OWSData/Repositories/Interfaces/ICharactersRepository.cs index 5817b5ec4..38558e256 100644 --- a/src/OWSData/Repositories/Interfaces/ICharactersRepository.cs +++ b/src/OWSData/Repositories/Interfaces/ICharactersRepository.cs @@ -15,6 +15,7 @@ public interface ICharactersRepository Task CleanUpInstances(Guid customerGUID); Task GetCharByCharName(Guid customerGUID, string characterName); Task> GetCustomCharacterData(Guid customerGUID, string characterName); + Task> GetDefaultCustomCharacterData(Guid customerGUID, string defaultSetName); Task JoinMapByCharName(Guid customerGUID, string characterName, string zoneName, int playerGroupType); Task UpdateCharacterStats(UpdateCharacterStats updateCharacterStats); Task UpdatePosition(Guid customerGUID, string characterName, string mapName, float X, float Y, float Z, float RX, float RY, float RZ); diff --git a/src/OWSData/SQL/GenericQueries.cs b/src/OWSData/SQL/GenericQueries.cs index 2b4a419d0..bf4c654af 100644 --- a/src/OWSData/SQL/GenericQueries.cs +++ b/src/OWSData/SQL/GenericQueries.cs @@ -123,7 +123,21 @@ FROM CustomCharacterData CCD WHERE CCD.CustomerGUID = @CustomerGUID AND C.CharName = @CharName"; - public static readonly string GetPlayerGroupIDByType = @"SELECT COALESCE(PG.PlayerGroupID, 0) + public static readonly string GetDefaultCharacterCustomDataByName = @"SELECT * + FROM CustomCharacterData CCD + INNER JOIN Characters C ON C.CharacterID = CCD.CharacterID + WHERE CCD.CustomerGUID = @CustomerGUID + AND C.CharName = @DefaultSetName"; + + public static readonly string GetDefaultCustomCharacterDataByDefaultSetName = @"SELECT * + FROM DefaultCustomCharacterData DCCD + INNER JOIN DefaultCharacterValues DCV + ON DCCD.DefaultCharacterValuesId = DCV.DefaultCharacterValuesId + WHERE DCV.DefaultSetName = @DefaultSetName + AND DCCD.CustomerGUID = @CustomerGUID"; + + + public static readonly string GetPlayerGroupIDByType = @"SELECT COALESCE(PG.PlayerGroupID, 0) FROM PlayerGroupCharacters PGC INNER JOIN PlayerGroup PG ON PG.PlayerGroupID = PGC.PlayerGroupID WHERE PGC.CustomerGUID = @CustomerGUID diff --git a/src/OWSPublicAPI/Controllers/CharactersController.cs b/src/OWSPublicAPI/Controllers/CharactersController.cs index ebb2e33c6..5e5f46618 100644 --- a/src/OWSPublicAPI/Controllers/CharactersController.cs +++ b/src/OWSPublicAPI/Controllers/CharactersController.cs @@ -16,6 +16,7 @@ using OWSPublicAPI.Requests.Characters; using OWSData.Repositories.Interfaces; using OWSPublicAPI.DTOs; +using OWSData.Models.Composites; namespace OWSPublicAPI.Controllers { @@ -34,6 +35,7 @@ public class CharactersController : Controller private readonly ICharactersRepository _charactersRepository; private readonly IHeaderCustomerGUID _customerGuid; private readonly ICustomCharacterDataSelector _customCharacterDataSelector; + private readonly ICustomDataSelector _customDataSelector; private readonly IGetReadOnlyPublicCharacterData _getReadOnlyPublicCharacterData; /// @@ -43,13 +45,14 @@ public class CharactersController : Controller /// All dependencies are injected. /// public CharactersController(Container container, IUsersRepository usersRepository, ICharactersRepository charactersRepository, IHeaderCustomerGUID customerGuid, - ICustomCharacterDataSelector customCharacterDataSelector, IGetReadOnlyPublicCharacterData getReadOnlyPublicCharacterData) + ICustomCharacterDataSelector customCharacterDataSelector, ICustomDataSelector customDataSelector, IGetReadOnlyPublicCharacterData getReadOnlyPublicCharacterData) { _container = container; _usersRepository = usersRepository; _charactersRepository = charactersRepository; _customerGuid = customerGuid; _customCharacterDataSelector = customCharacterDataSelector; + _customDataSelector = customDataSelector; _getReadOnlyPublicCharacterData = getReadOnlyPublicCharacterData; } @@ -85,5 +88,20 @@ public async Task GetByName([FromBody] GetByNameDTO request) return await getByNameRequest.Handle(); } + /// + /// Get Default Custom Character Data by defaultSetName. + /// + /// + /// Get Default Custom Character Data by defaultSetName + /// + [HttpPost] + [Route("GetDefaultCustomData")] + [Produces(typeof(DefaultCustomDataRows))] + + public async Task GetDefaultCustomData([FromBody] GetDefaultCustomrDataDTO request) + { + GetDefaultCustomDataRequest getDefaultCustomData = new GetDefaultCustomDataRequest(request, _usersRepository, _charactersRepository, _customerGuid, _customDataSelector, _getReadOnlyPublicCharacterData); + return await getDefaultCustomData.Handle(); + } } } diff --git a/src/OWSPublicAPI/DTOs/GetDefaultCustomrDataDTO.cs b/src/OWSPublicAPI/DTOs/GetDefaultCustomrDataDTO.cs new file mode 100644 index 000000000..a356d8869 --- /dev/null +++ b/src/OWSPublicAPI/DTOs/GetDefaultCustomrDataDTO.cs @@ -0,0 +1,27 @@ +namespace OWSPublicAPI.DTOs +{ + /// + /// GetByNameDTO data transfer object + /// + /// + /// GetByNameDTO is data transfer object for GetByNameRequest + /// + public class GetDefaultCustomrDataDTO + { + /// + /// UserSessionGUID Request Parameter + /// + /// + /// Contains the User Session GUID from the request + /// + public string UserSessionGUID { get; set; } + + /// + /// CharacterName Request Paramater + /// + /// + /// Contains the Character Name from the request + /// + public string DefaultSetName { get; set; } + } +} diff --git a/src/OWSPublicAPI/OWSPublicAPI.xml b/src/OWSPublicAPI/OWSPublicAPI.xml index 3244d67ed..f7e2cafa0 100644 --- a/src/OWSPublicAPI/OWSPublicAPI.xml +++ b/src/OWSPublicAPI/OWSPublicAPI.xml @@ -12,7 +12,7 @@ Contains character related API calls that are all publicly accessible. - + Constructor for Public Character related API calls. @@ -36,6 +36,14 @@ Gets a Characters by Name. + + + Get Default Custom Character Data by defaultSetName. + + + Get Default Custom Character Data by defaultSetName + + Public System API calls. @@ -230,6 +238,30 @@ Contains the Character Name from the request + + + GetByNameDTO data transfer object + + + GetByNameDTO is data transfer object for GetByNameRequest + + + + + UserSessionGUID Request Parameter + + + Contains the User Session GUID from the request + + + + + CharacterName Request Paramater + + + Contains the Character Name from the request + + RegisterUser Data Transfer Object @@ -318,6 +350,30 @@ Overrides IRequestHandler Handle(). + + + GetByNameRequest Handler + + + Handles api/Characters/GetByName requests. + + + + + Constructor for GetDefaultCustomerCharacterDataRequest + + + Injects the dependencies for the GetDefaultCustomerCharacterDataRequest. + + + + + Handles the GetDefaultCustomerCharacterDataRequest + + + Overrides IRequestHandler Handle(). + + CreateCharacterRequest Handler diff --git a/src/OWSPublicAPI/Requests/Characters/GetDefaultCustomDataRequest.cs b/src/OWSPublicAPI/Requests/Characters/GetDefaultCustomDataRequest.cs new file mode 100644 index 000000000..70319dfc2 --- /dev/null +++ b/src/OWSPublicAPI/Requests/Characters/GetDefaultCustomDataRequest.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using OWSData.Models.Composites; +using OWSData.Models.StoredProcs; +using OWSData.Models.Tables; +using OWSData.Repositories.Interfaces; +using OWSPublicAPI.DTOs; +using OWSShared.Interfaces; + +namespace OWSPublicAPI.Requests.Characters +{ + /// + /// GetByNameRequest Handler + /// + /// + /// Handles api/Characters/GetByName requests. + /// + public class GetDefaultCustomDataRequest : IRequestHandler, IRequest + { + private readonly GetDefaultCustomrDataDTO _getDefaultCustomCharacterDataDTO; + private readonly Guid _customerGUID; + private readonly IUsersRepository _usersRepository; + private readonly ICharactersRepository _charactersRepository; + private readonly ICustomDataSelector _customDataSelector; + private readonly IGetReadOnlyPublicCharacterData _getReadOnlyPublicCharacterData; + + /// + /// Constructor for GetDefaultCustomerCharacterDataRequest + /// + /// + /// Injects the dependencies for the GetDefaultCustomerCharacterDataRequest. + /// + public GetDefaultCustomDataRequest(GetDefaultCustomrDataDTO getDefaultCustomCharacterDataDTO, IUsersRepository usersRepository, ICharactersRepository charactersRepository, IHeaderCustomerGUID customerGuid, + ICustomDataSelector customDataSelector, IGetReadOnlyPublicCharacterData getReadOnlyPublicCharacterData) + { + _getDefaultCustomCharacterDataDTO = getDefaultCustomCharacterDataDTO; + _customerGUID = customerGuid.CustomerGUID; + _usersRepository = usersRepository; + _charactersRepository = charactersRepository; + _customDataSelector = customDataSelector; + _getReadOnlyPublicCharacterData = getReadOnlyPublicCharacterData; + } + + /// + /// Handles the GetDefaultCustomerCharacterDataRequest + /// + /// + /// Overrides IRequestHandler Handle(). + /// + public async Task Handle() + { + DefaultCustomDataRows Output = new DefaultCustomDataRows(); + + //Test if a valid Guid was passed + if (!Guid.TryParse(_getDefaultCustomCharacterDataDTO.UserSessionGUID, out Guid parsedGuid)) + { + return new BadRequestObjectResult(Output); + } + + //Get the User Session + GetUserSession userSession = await _usersRepository.GetUserSession(_customerGUID, parsedGuid); + + //Make sure the User Session is valid + if (userSession == null || !userSession.UserGuid.HasValue) + { + return new BadRequestObjectResult(Output); + } + + IEnumerable customDataItems = await _charactersRepository.GetDefaultCustomCharacterData(_customerGUID, _getDefaultCustomCharacterDataDTO.DefaultSetName); + Output.Rows = new List(); + //Loop through all the CustomCharacterData rows + + foreach (DefaultCustomData currentCustomData in customDataItems) + { + //Use the ICustomCharacterDataSelector implementation to filter which fields are returned + if (_customDataSelector.ShouldExportThisCustomDataField(currentCustomData.CustomFieldName)) + { + DefaultCustomData customDataDTO = new DefaultCustomData() + { + CustomFieldName = currentCustomData.CustomFieldName, + FieldValue = currentCustomData.FieldValue + }; + //Add the filtered Custom Character Data + Output.Rows.Add(customDataDTO); + } + } + + // Output.Rows = await _charactersRepository.GetDefaultCustomCharacterData(_customerGUID, _getDefaultCustomCharacterDataDTO.DefaultSetName); + + + return new OkObjectResult(Output); + } + } +} diff --git a/src/OWSPublicAPI/Startup.cs b/src/OWSPublicAPI/Startup.cs index aeda6435e..75cfdc880 100644 --- a/src/OWSPublicAPI/Startup.cs +++ b/src/OWSPublicAPI/Startup.cs @@ -187,6 +187,7 @@ private void InitializeContainer(IServiceCollection services) container.Register(Lifestyle.Singleton); container.Register(Lifestyle.Singleton); + container.Register(Lifestyle.Singleton); container.Register(Lifestyle.Singleton); container.Register(Lifestyle.Scoped); diff --git a/src/OWSShared/Implementations/DefaultCustomDataSelector.cs b/src/OWSShared/Implementations/DefaultCustomDataSelector.cs new file mode 100644 index 000000000..56645a1fe --- /dev/null +++ b/src/OWSShared/Implementations/DefaultCustomDataSelector.cs @@ -0,0 +1,22 @@ +using OWSShared.Interfaces; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OWSShared.Implementations +{ + public class DefaultCustomDataSelector : ICustomDataSelector + { + public bool ShouldExportThisCustomDataField(string fieldName) + { + return fieldName switch + { + "BaseCharacterStats" => true, + "CharacterExperience" => true, + _ => false, + }; + } + } +} diff --git a/src/OWSShared/Interfaces/ICustomDataSelector.cs b/src/OWSShared/Interfaces/ICustomDataSelector.cs new file mode 100644 index 000000000..5c917d6aa --- /dev/null +++ b/src/OWSShared/Interfaces/ICustomDataSelector.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OWSShared.Interfaces +{ + public interface ICustomDataSelector + { + bool ShouldExportThisCustomDataField(string fieldName); + } +}