diff --git a/WotBlitzStatisticsPro.Common/Model/ClanInfoResponse.cs b/WotBlitzStatisticsPro.Common/Model/ClanInfoResponse.cs index f9a01ee..d1b8cc6 100644 --- a/WotBlitzStatisticsPro.Common/Model/ClanInfoResponse.cs +++ b/WotBlitzStatisticsPro.Common/Model/ClanInfoResponse.cs @@ -91,6 +91,6 @@ namespace WotBlitzStatisticsPro.Common.Model /// /// Clan info updated at /// - public int? UpdatedAt { get; set; } + public DateTime? UpdatedAt { get; set; } } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Common/Model/RealmAndLanguage.cs b/WotBlitzStatisticsPro.Common/Model/RealmAndLanguage.cs index 3721c52..5f5c504 100644 --- a/WotBlitzStatisticsPro.Common/Model/RealmAndLanguage.cs +++ b/WotBlitzStatisticsPro.Common/Model/RealmAndLanguage.cs @@ -3,5 +3,5 @@ /// /// Represents pair of realm type a nd requested language /// - public record RealmAndLanguage (RealmType realm, RequestLanguage language); + public record RealmAndLanguage (RealmType Realm, RequestLanguage Language); } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.DataAccess/DictionariesDataAccessor.cs b/WotBlitzStatisticsPro.DataAccess/DictionariesDataAccessor.cs index 3635dc9..77d6969 100644 --- a/WotBlitzStatisticsPro.DataAccess/DictionariesDataAccessor.cs +++ b/WotBlitzStatisticsPro.DataAccess/DictionariesDataAccessor.cs @@ -139,5 +139,19 @@ namespace WotBlitzStatisticsPro.DataAccess return collection.ToDictionary(n => n.typeId, n => n.typeValue); } + + public async Task> GetClanRoles(RequestLanguage language) + { + var collection = await _database.GetCollection(ClanRolesCollectionName) + .Find(Builders.Filter.Empty) + .Project(n => new + { + ClanRoleId = n.ClanRoleId, + ClanRoleValueValue = n.ClanRoleNames.First(v => v.Language == language).Value + }) + .ToListAsync(); + + return collection.ToDictionary(n => n.ClanRoleId, n => n.ClanRoleValueValue); + } } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.DataAccess/IDictionariesDataAccessor.cs b/WotBlitzStatisticsPro.DataAccess/IDictionariesDataAccessor.cs index f757ccc..0f4a5c9 100644 --- a/WotBlitzStatisticsPro.DataAccess/IDictionariesDataAccessor.cs +++ b/WotBlitzStatisticsPro.DataAccess/IDictionariesDataAccessor.cs @@ -30,5 +30,7 @@ namespace WotBlitzStatisticsPro.DataAccess Task> GetNations(RequestLanguage language); Task> GetTankTypes(RequestLanguage language); + + Task> GetClanRoles(RequestLanguage language); } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/IWargamingClans.cs b/WotBlitzStatisticsPro.Logic/IWargamingClans.cs index 6e568e8..e013732 100644 --- a/WotBlitzStatisticsPro.Logic/IWargamingClans.cs +++ b/WotBlitzStatisticsPro.Logic/IWargamingClans.cs @@ -5,6 +5,6 @@ namespace WotBlitzStatisticsPro.Logic { public interface IWargamingClans { - Task GelClanInfoByAccount(long accountId, RealmAndLanguage queryParams); + Task GelClanInfoByAccount(long accountId, RealmAndLanguage queryParams); } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/Mappers/ClansProfile.cs b/WotBlitzStatisticsPro.Logic/Mappers/ClansProfile.cs new file mode 100644 index 0000000..7602c25 --- /dev/null +++ b/WotBlitzStatisticsPro.Logic/Mappers/ClansProfile.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using AutoMapper; +using WotBlitzStatisticsPro.Common.Dictionaries; +using WotBlitzStatisticsPro.Common.Model; +using WotBlitzStatisticsPro.DataAccess.Model; +using WotBlitzStatisticsPro.WgApiClient.Model; +using WotBlitzStatisticsPro.Logic.Calculations; + + +namespace WotBlitzStatisticsPro.Logic.Mappers +{ + public class ClansProfile: Profile + { + public ClansProfile() + { + CreateMap() + .ForMember(d => d.JoinedAt, + o => o.MapFrom(s => s.JoinedAt.HasValue ? s.JoinedAt.Value.ToDateTime() : new DateTime(1970, 1, 1))) + .ForMember(d => d.Role, + o => o.MapFrom((src, dest, destMember, context) => + { + var dictionary = context.Items["roles"] as Dictionary; + if (string.IsNullOrEmpty(src.Role) || dictionary == null) + { + return string.Empty; + } + + return dictionary[src.Role]; + })) + ; + + CreateMap() + .ForMember(d => d.CreatedAt, + o => o.MapFrom(s => s.CreatedAt.HasValue ? s.CreatedAt.Value.ToDateTime() : new DateTime(1970, 1, 1))) + .ForMember(d => d.UpdatedAt, + o => o.MapFrom(s => s.UpdatedAt.HasValue ? (DateTime?)s.UpdatedAt.Value.ToDateTime() : null)) + ; +; + } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/WargamingClans.cs b/WotBlitzStatisticsPro.Logic/WargamingClans.cs index 479ec07..e794864 100644 --- a/WotBlitzStatisticsPro.Logic/WargamingClans.cs +++ b/WotBlitzStatisticsPro.Logic/WargamingClans.cs @@ -1,18 +1,48 @@ using System; using System.Threading.Tasks; +using AutoMapper; using WotBlitzStatisticsPro.Common.Model; +using WotBlitzStatisticsPro.DataAccess; +using WotBlitzStatisticsPro.WgApiClient; +using WotBlitzStatisticsPro.WgApiClient.Model; namespace WotBlitzStatisticsPro.Logic { public class WargamingClans: IWargamingClans { - private const RealmType DefaultRealm = RealmType.Ru; - private const RequestLanguage DefaultRequestLanguage = RequestLanguage.En; + private readonly IDictionariesDataAccessor _dictionariesDataAccessor; + private readonly IWargamingApiClient _wargamingApiClient; + private readonly IMapper _mapper; - public Task GelClanInfoByAccount(long accountId, RealmAndLanguage queryParams) + public WargamingClans( + IDictionariesDataAccessor dictionariesDataAccessor, + IWargamingApiClient wargamingApiClient, + IMapper mapper) { - // ToDo: Make Wargaming request - return Task.FromResult(new ClanInfoResponse {ClanId = 42, Name = "Fake clan"}); + _dictionariesDataAccessor = dictionariesDataAccessor; + _wargamingApiClient = wargamingApiClient; + _mapper = mapper; + } + + public async Task GelClanInfoByAccount(long accountId, RealmAndLanguage queryParams) + { + var clanRoles = await _dictionariesDataAccessor.GetClanRoles(queryParams.Language); + var accountClanInfo = + await _wargamingApiClient.GetPlayerClanInfo(accountId, queryParams.Realm, queryParams.Language); + if (accountClanInfo?.ClanId == null) + { + return null; + } + + var result = _mapper.Map(accountClanInfo, + opt => opt.Items["roles"] = clanRoles); + + var clanInfo = await _wargamingApiClient.GetClanInfo(accountClanInfo.ClanId.Value, queryParams.Realm, + queryParams.Language); + + _mapper.Map(clanInfo, result); + + return result; } } } \ No newline at end of file