From 36be21e61cc9db48e972ec4ee8ca248738eec512 Mon Sep 17 00:00:00 2001 From: Mikhail Shabanov Date: Sat, 30 May 2020 17:15:43 +0200 Subject: [PATCH] Static dictionaries getter and mapper --- .../AchievementSectionDictionary.cs | 27 ++++ .../Dictionaries/ClanRoleDictionary.cs | 21 +++ .../Dictionaries/LanguageDictionary.cs | 19 +++ .../Dictionaries/NationDictionary.cs | 21 +++ .../Dictionaries/VehicleTypeDictionary.cs | 22 +++ .../Dictionaries/StaticDictionariesUpdater.cs | 150 ++++++++++++++++-- .../Mappers/DictionaryLanguageMapper.cs | 16 ++ 7 files changed, 267 insertions(+), 9 deletions(-) create mode 100644 WotBlitzStatisticsPro.Common/Dictionaries/AchievementSectionDictionary.cs create mode 100644 WotBlitzStatisticsPro.Common/Dictionaries/ClanRoleDictionary.cs create mode 100644 WotBlitzStatisticsPro.Common/Dictionaries/LanguageDictionary.cs create mode 100644 WotBlitzStatisticsPro.Common/Dictionaries/NationDictionary.cs create mode 100644 WotBlitzStatisticsPro.Common/Dictionaries/VehicleTypeDictionary.cs create mode 100644 WotBlitzStatisticsPro.Logic/Mappers/DictionaryLanguageMapper.cs diff --git a/WotBlitzStatisticsPro.Common/Dictionaries/AchievementSectionDictionary.cs b/WotBlitzStatisticsPro.Common/Dictionaries/AchievementSectionDictionary.cs new file mode 100644 index 0000000..0d6d7d1 --- /dev/null +++ b/WotBlitzStatisticsPro.Common/Dictionaries/AchievementSectionDictionary.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using WotBlitzStatisticsPro.Common.Model; + +namespace WotBlitzStatisticsPro.Common.Dictionaries +{ + /// + /// Achievement section dictionary item. + /// + public class AchievementSectionDictionary + { + /// + /// Achievement section id + /// + public string AchievementSectionId { get; set; } + + /// + /// Section order + /// + public int Order { get; set; } + + /// + /// Localized section names + /// + public Dictionary AchievementSectionNames { get; set; } + + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Common/Dictionaries/ClanRoleDictionary.cs b/WotBlitzStatisticsPro.Common/Dictionaries/ClanRoleDictionary.cs new file mode 100644 index 0000000..1ad9544 --- /dev/null +++ b/WotBlitzStatisticsPro.Common/Dictionaries/ClanRoleDictionary.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using WotBlitzStatisticsPro.Common.Model; + +namespace WotBlitzStatisticsPro.Common.Dictionaries +{ + /// + /// Clan role dictionary item + /// + public class ClanRoleDictionary + { + /// + /// Clan role id + /// + public string ClanRoleId { get; set; } + + /// + /// Localized clan role names + /// + public Dictionary ClanRoleNames { get; set; } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Common/Dictionaries/LanguageDictionary.cs b/WotBlitzStatisticsPro.Common/Dictionaries/LanguageDictionary.cs new file mode 100644 index 0000000..79fe166 --- /dev/null +++ b/WotBlitzStatisticsPro.Common/Dictionaries/LanguageDictionary.cs @@ -0,0 +1,19 @@ +namespace WotBlitzStatisticsPro.Common.Dictionaries +{ + /// + /// Languages available + /// + public class LanguageDictionary + { + /// + /// Language id + /// + public string LanguageId { get; set; } + + /// + /// Language + /// + public string LanguageName { get; set; } + + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Common/Dictionaries/NationDictionary.cs b/WotBlitzStatisticsPro.Common/Dictionaries/NationDictionary.cs new file mode 100644 index 0000000..8908779 --- /dev/null +++ b/WotBlitzStatisticsPro.Common/Dictionaries/NationDictionary.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using WotBlitzStatisticsPro.Common.Model; + +namespace WotBlitzStatisticsPro.Common.Dictionaries +{ + /// + /// Tanks nations dictionary item + /// + public class NationDictionary + { + /// + /// Nation id + /// + public string NationId { get; set; } + + /// + /// Nation + /// + public Dictionary NationNames { get; set; } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Common/Dictionaries/VehicleTypeDictionary.cs b/WotBlitzStatisticsPro.Common/Dictionaries/VehicleTypeDictionary.cs new file mode 100644 index 0000000..e755e57 --- /dev/null +++ b/WotBlitzStatisticsPro.Common/Dictionaries/VehicleTypeDictionary.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using WotBlitzStatisticsPro.Common.Model; + +namespace WotBlitzStatisticsPro.Common.Dictionaries +{ + /// + /// Vehicle type dictionary item + /// + public class VehicleTypeDictionary + { + /// + /// Vehicle type id + /// + public string VehicleTypeId { get; set; } + + /// + /// Vehicle type localized name + /// + public Dictionary VehicleTypeNames { get; set; } + + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/Dictionaries/StaticDictionariesUpdater.cs b/WotBlitzStatisticsPro.Logic/Dictionaries/StaticDictionariesUpdater.cs index 983da5e..bc5e4bb 100644 --- a/WotBlitzStatisticsPro.Logic/Dictionaries/StaticDictionariesUpdater.cs +++ b/WotBlitzStatisticsPro.Logic/Dictionaries/StaticDictionariesUpdater.cs @@ -1,32 +1,164 @@ using System; +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; +using AutoMapper; +using WotBlitzStatisticsPro.Common.Dictionaries; using WotBlitzStatisticsPro.Common.Model; using WotBlitzStatisticsPro.WgApiClient; +using WotBlitzStatisticsPro.WgApiClient.Model; namespace WotBlitzStatisticsPro.Logic.Dictionaries { public class StaticDictionariesUpdater : IDictionaryUpdater { private readonly IWargamingDictionariesApiClient _wargamingDictionariesApiClient; + private readonly IMapper _mapper; - public StaticDictionariesUpdater(IWargamingDictionariesApiClient wargamingDictionariesApiClient) + public StaticDictionariesUpdater( + IWargamingDictionariesApiClient wargamingDictionariesApiClient, + IMapper mapper) { _wargamingDictionariesApiClient = wargamingDictionariesApiClient; + _mapper = mapper; } public async Task Update() { - var defaultRealmType = RealmType.Eu; - foreach (var requestLanguage in (RequestLanguage[]) Enum.GetValues(typeof(RequestLanguage))) - { - var (WotEncyclopediaInfoResponse, WotClanMembersDictionaryResponse) = - await _wargamingDictionariesApiClient.GetStaticDictionariesAsync(defaultRealmType, requestLanguage); - // ToDo: map - // ToDo: add to dictionary - } + var ( + languages, + nations, + vehicleTypes, + clanRoles, + achievementsSections) = await GetAndMapDictionaries(); // ToDo: Save dictionary to Mongo + // ToDo: create unit tests + throw new System.NotImplementedException(); } + + private async Task<( + List, + List, + List, + List, + List)> GetAndMapDictionaries() + { + var defaultRealmType = RealmType.Eu; + + List languages = null; + var nations = new List(); + var vehicleTypes = new List(); + var clanRoles = new List(); + var achievementsSections = new List(); + + foreach (var requestLanguage in (RequestLanguage[])Enum.GetValues(typeof(RequestLanguage))) + { + var (wotEncyclopediaInfoResponse, wotClanMembersDictionaryResponse) = + await _wargamingDictionariesApiClient.GetStaticDictionariesAsync(defaultRealmType, requestLanguage); + + if (languages == null) + { + languages = + _mapper.Map, List>(wotEncyclopediaInfoResponse + .Languages); + } + + MapVehicleNations(requestLanguage, wotEncyclopediaInfoResponse.VehicleNations, nations); + MapVehicleTypes(requestLanguage, wotEncyclopediaInfoResponse.VehicleTypes, vehicleTypes); + MapClanRoles(requestLanguage, wotClanMembersDictionaryResponse.ClanRoles, clanRoles); + MapAchievementsSections(requestLanguage, wotEncyclopediaInfoResponse.AchievementSections, achievementsSections); + } + + return (languages, nations, vehicleTypes, clanRoles, achievementsSections); + } + + private void MapVehicleNations( + RequestLanguage requestLanguage, + Dictionary sourceDictionary, + List destinationDictionary) + { + foreach (var source in sourceDictionary) + { + var destinationItem = destinationDictionary.FirstOrDefault(d => d.NationId == source.Key); + if (destinationItem == null) + { + destinationItem = new NationDictionary + { + NationId = source.Key, NationNames = new Dictionary() + }; + destinationDictionary.Add(destinationItem); + } + + destinationItem.NationNames[requestLanguage] = source.Value; + } + } + + private void MapVehicleTypes( + RequestLanguage requestLanguage, + Dictionary sourceDictionary, + List destinationDictionary) + { + foreach (var source in sourceDictionary) + { + var destinationItem = destinationDictionary.FirstOrDefault(d => d.VehicleTypeId == source.Key); + if (destinationItem == null) + { + destinationItem = new VehicleTypeDictionary + { + VehicleTypeId = source.Key, VehicleTypeNames = new Dictionary() + }; + destinationDictionary.Add(destinationItem); + } + + destinationItem.VehicleTypeNames[requestLanguage] = source.Value; + } + } + + private void MapClanRoles( + RequestLanguage requestLanguage, + Dictionary sourceDictionary, + List destinationDictionary) + { + foreach (var source in sourceDictionary) + { + var destinationItem = destinationDictionary.FirstOrDefault(d => d.ClanRoleId == source.Key); + if (destinationItem == null) + { + destinationItem = new ClanRoleDictionary + { + ClanRoleId = source.Key, ClanRoleNames = new Dictionary() + }; + destinationDictionary.Add(destinationItem); + } + + destinationItem.ClanRoleNames[requestLanguage] = source.Value; + } + } + + private void MapAchievementsSections( + RequestLanguage requestLanguage, + Dictionary sourceSections, + List destinationDictionary) + { + foreach (var section in sourceSections) + { + var destinationItem = + destinationDictionary.FirstOrDefault(d => d.AchievementSectionId == section.Key); + if (destinationItem == null) + { + destinationItem = new AchievementSectionDictionary + { + AchievementSectionId = section.Key, + Order = Convert.ToInt32(section.Value.Order), + AchievementSectionNames = new Dictionary() + }; + destinationDictionary.Add(destinationItem); + } + + destinationItem.AchievementSectionNames[requestLanguage] = section.Value.Name; + } + } } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/Mappers/DictionaryLanguageMapper.cs b/WotBlitzStatisticsPro.Logic/Mappers/DictionaryLanguageMapper.cs new file mode 100644 index 0000000..db6d578 --- /dev/null +++ b/WotBlitzStatisticsPro.Logic/Mappers/DictionaryLanguageMapper.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using AutoMapper; +using WotBlitzStatisticsPro.Common.Dictionaries; + +namespace WotBlitzStatisticsPro.Logic.Mappers +{ + public class DictionaryLanguageMapper : Profile + { + public DictionaryLanguageMapper() + { + CreateMap, LanguageDictionary>() + .ForMember(dest => dest.LanguageId, op => op.MapFrom(s => s.Key)) + .ForMember(dest => dest.LanguageName, op => op.MapFrom(svm => svm.Value)); + } + } +} \ No newline at end of file