diff --git a/src/Services/Coolector.Services.Storage/Framework/Bootstrapper.cs b/src/Services/Coolector.Services.Storage/Framework/Bootstrapper.cs index 9fb11a9..7f82e0d 100644 --- a/src/Services/Coolector.Services.Storage/Framework/Bootstrapper.cs +++ b/src/Services/Coolector.Services.Storage/Framework/Bootstrapper.cs @@ -2,6 +2,7 @@ using Coolector.Services.Extensions; using Coolector.Services.Mongo; using Coolector.Services.Nancy; +using Coolector.Services.Storage.Framework.IoC; using Coolector.Services.Storage.Providers; using Coolector.Services.Storage.Repositories; using Coolector.Services.Storage.Settings; @@ -40,6 +41,7 @@ protected override void ConfigureApplicationContainer(ILifetimeScope container) builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterModule(); }); LifeTimeScope = container; } diff --git a/src/Services/Coolector.Services.Storage/Framework/IoC/MapperModule.cs b/src/Services/Coolector.Services.Storage/Framework/IoC/MapperModule.cs new file mode 100644 index 0000000..5df13b1 --- /dev/null +++ b/src/Services/Coolector.Services.Storage/Framework/IoC/MapperModule.cs @@ -0,0 +1,14 @@ +using Autofac; +using Coolector.Common.DTO.Users; +using Coolector.Services.Storage.Mappers; + +namespace Coolector.Services.Storage.Framework.IoC +{ + public class MapperModule : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterType().As>(); + } + } +} \ No newline at end of file diff --git a/src/Services/Coolector.Services.Storage/Mappers/IMapper.cs b/src/Services/Coolector.Services.Storage/Mappers/IMapper.cs new file mode 100644 index 0000000..f0804f8 --- /dev/null +++ b/src/Services/Coolector.Services.Storage/Mappers/IMapper.cs @@ -0,0 +1,7 @@ +namespace Coolector.Services.Storage.Mappers +{ + public interface IMapper + { + T Map(dynamic source); + } +} \ No newline at end of file diff --git a/src/Services/Coolector.Services.Storage/Mappers/UserMapper.cs b/src/Services/Coolector.Services.Storage/Mappers/UserMapper.cs new file mode 100644 index 0000000..cb79fa8 --- /dev/null +++ b/src/Services/Coolector.Services.Storage/Mappers/UserMapper.cs @@ -0,0 +1,21 @@ +using Coolector.Common.DTO.Users; + +namespace Coolector.Services.Storage.Mappers +{ + public class UserMapper : IMapper + { + public UserDto Map(dynamic source) + { + return new UserDto + { + Id = source.id, + UserId = source.userId, + Email = source.email, + Name = source.name, + Role = source.role, + State = source.state, + CreatedAt = source.createdAt + }; + } + } +} \ No newline at end of file diff --git a/src/Services/Coolector.Services.Storage/Providers/IProviderClient.cs b/src/Services/Coolector.Services.Storage/Providers/IProviderClient.cs index a126ee3..3a19f39 100644 --- a/src/Services/Coolector.Services.Storage/Providers/IProviderClient.cs +++ b/src/Services/Coolector.Services.Storage/Providers/IProviderClient.cs @@ -1,13 +1,14 @@ using System; using System.Threading.Tasks; using Coolector.Common.Types; +using Coolector.Services.Storage.Mappers; namespace Coolector.Services.Storage.Providers { public interface IProviderClient { - Task> GetAsync(string url, string endpoint) where T : class; + Task> GetAsync(string url, string endpoint, IMapper mapper) where T : class; Task> GetUsingStorageAsync(string url, string endpoint, - Func>> storageFetch, Func storageSave) where T : class; + Func>> storageFetch, Func storageSave, IMapper mapper) where T : class; } } \ No newline at end of file diff --git a/src/Services/Coolector.Services.Storage/Providers/IServiceClient.cs b/src/Services/Coolector.Services.Storage/Providers/IServiceClient.cs index 94e480c..f0b7411 100644 --- a/src/Services/Coolector.Services.Storage/Providers/IServiceClient.cs +++ b/src/Services/Coolector.Services.Storage/Providers/IServiceClient.cs @@ -1,10 +1,11 @@ using System.Threading.Tasks; using Coolector.Common.Types; +using Coolector.Services.Storage.Mappers; namespace Coolector.Services.Storage.Providers { public interface IServiceClient { - Task> GetAsync(string url, string endpoint) where T : class; + Task> GetAsync(string url, string endpoint, IMapper mapper) where T : class; } } \ No newline at end of file diff --git a/src/Services/Coolector.Services.Storage/Providers/IUserProvider.cs b/src/Services/Coolector.Services.Storage/Providers/IUserProvider.cs index 7a4ed36..66a4cf5 100644 --- a/src/Services/Coolector.Services.Storage/Providers/IUserProvider.cs +++ b/src/Services/Coolector.Services.Storage/Providers/IUserProvider.cs @@ -1,8 +1,6 @@ using System.Threading.Tasks; using Coolector.Common.DTO.Users; using Coolector.Common.Types; -using Coolector.Services.Storage.Repositories; -using Coolector.Services.Storage.Settings; namespace Coolector.Services.Storage.Providers { @@ -10,33 +8,4 @@ public interface IUserProvider { Task> GetAsync(string userId); } - - public class UserProvider : IUserProvider - { - private readonly IUserRepository _userRepository; - private readonly IProviderClient _providerClient; - private readonly ProviderSettings _providerSettings; - - public UserProvider(IUserRepository userRepository, - IProviderClient providerClient, - ProviderSettings providerSettings) - { - _userRepository = userRepository; - _providerClient = providerClient; - _providerSettings = providerSettings; - } - - public async Task> GetAsync(string userId) - => await _providerClient.GetUsingStorageAsync(_providerSettings.UsersApiUrl, $"users/{userId}", - async () => - { - var user = await _userRepository.GetByIdAsync(userId); - - return user.HasValue ? user.Value : new Maybe(); - }, - async user => - { - await _userRepository.AddAsync(user); - }); - } } \ No newline at end of file diff --git a/src/Services/Coolector.Services.Storage/Providers/ProviderClient.cs b/src/Services/Coolector.Services.Storage/Providers/ProviderClient.cs index 48fe94b..ca5a54b 100644 --- a/src/Services/Coolector.Services.Storage/Providers/ProviderClient.cs +++ b/src/Services/Coolector.Services.Storage/Providers/ProviderClient.cs @@ -1,6 +1,7 @@ using System; using System.Threading.Tasks; using Coolector.Common.Types; +using Coolector.Services.Storage.Mappers; namespace Coolector.Services.Storage.Providers { @@ -13,11 +14,11 @@ public ProviderClient(IServiceClient serviceClient) _serviceClient = serviceClient; } - public async Task> GetAsync(string url, string endpoint) where T : class - => await _serviceClient.GetAsync(url, endpoint); + public async Task> GetAsync(string url, string endpoint, IMapper mapper) where T : class + => await _serviceClient.GetAsync(url, endpoint, mapper); public async Task> GetUsingStorageAsync(string url, string endpoint, - Func>> storageFetch, Func storageSave) where T : class + Func>> storageFetch, Func storageSave, IMapper mapper) where T : class { if (storageFetch != null) { @@ -26,7 +27,7 @@ public async Task> GetUsingStorageAsync(string url, string endpoint, return data; } - var response = await GetAsync(url, endpoint); + var response = await GetAsync(url, endpoint, mapper); if (response.HasNoValue) return new Maybe(); diff --git a/src/Services/Coolector.Services.Storage/Providers/ServiceClient.cs b/src/Services/Coolector.Services.Storage/Providers/ServiceClient.cs index 9c05dff..8422ee8 100644 --- a/src/Services/Coolector.Services.Storage/Providers/ServiceClient.cs +++ b/src/Services/Coolector.Services.Storage/Providers/ServiceClient.cs @@ -2,13 +2,14 @@ using System.Net.Http; using System.Threading.Tasks; using Coolector.Common.Types; +using Coolector.Services.Storage.Mappers; using Newtonsoft.Json; namespace Coolector.Services.Storage.Providers { public class ServiceClient : IServiceClient { - public async Task> GetAsync(string url, string endpoint) where T : class + public async Task> GetAsync(string url, string endpoint, IMapper mapper) where T : class { var httpClient = new HttpClient { BaseAddress = new Uri(GetBaseAddress(url)) }; httpClient.DefaultRequestHeaders.Remove("Accept"); @@ -19,9 +20,10 @@ public async Task> GetAsync(string url, string endpoint) where T : c return new Maybe(); var content = await response.Content.ReadAsStringAsync(); - var data = JsonConvert.DeserializeObject(content); + var data = JsonConvert.DeserializeObject(content); + var result = mapper.Map(data); - return data; + return result; } private string GetBaseAddress(string url) => url.EndsWith("/") ? url : $"{url}/"; diff --git a/src/Services/Coolector.Services.Storage/Providers/UserProvider.cs b/src/Services/Coolector.Services.Storage/Providers/UserProvider.cs new file mode 100644 index 0000000..c138420 --- /dev/null +++ b/src/Services/Coolector.Services.Storage/Providers/UserProvider.cs @@ -0,0 +1,42 @@ +using System.Threading.Tasks; +using Coolector.Common.DTO.Users; +using Coolector.Common.Types; +using Coolector.Services.Storage.Mappers; +using Coolector.Services.Storage.Repositories; +using Coolector.Services.Storage.Settings; + +namespace Coolector.Services.Storage.Providers +{ + public class UserProvider : IUserProvider + { + private readonly IUserRepository _userRepository; + private readonly IProviderClient _providerClient; + private readonly ProviderSettings _providerSettings; + private readonly IMapper _mapper; + + public UserProvider(IUserRepository userRepository, + IProviderClient providerClient, + ProviderSettings providerSettings, + IMapper mapper) + { + _userRepository = userRepository; + _providerClient = providerClient; + _providerSettings = providerSettings; + _mapper = mapper; + } + + public async Task> GetAsync(string userId) + => await _providerClient.GetUsingStorageAsync(_providerSettings.UsersApiUrl, $"users/{userId}", + async () => + { + var user = await _userRepository.GetByIdAsync(userId); + + return user.HasValue ? user.Value : new Maybe(); + }, + async user => + { + await _userRepository.AddAsync(user); + }, + _mapper); + } +} \ No newline at end of file diff --git a/src/Services/Coolector.Services.Storage/project.json b/src/Services/Coolector.Services.Storage/project.json index 6041415..9f335c6 100644 --- a/src/Services/Coolector.Services.Storage/project.json +++ b/src/Services/Coolector.Services.Storage/project.json @@ -22,7 +22,8 @@ "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0", "Microsoft.Extensions.Configuration.Json": "1.0.0", "RawRabbit": "1.10.0", - "RawRabbit.vNext": "1.10.0" + "RawRabbit.vNext": "1.10.0", + "Coolector.Common": "1.0.0-*" }, "frameworks": { "netcoreapp1.0": {