diff --git a/src/VirtoCommerce.Xapi.Core/Models/IStoreDomainRequest.cs b/src/VirtoCommerce.Xapi.Core/Models/IStoreDomainRequest.cs new file mode 100644 index 0000000..fab1bc8 --- /dev/null +++ b/src/VirtoCommerce.Xapi.Core/Models/IStoreDomainRequest.cs @@ -0,0 +1,8 @@ +namespace VirtoCommerce.Xapi.Core.Models; + +public class StoreDomainRequest +{ + public string StoreId { get; set; } + + public string Domain { get; set; } +} diff --git a/src/VirtoCommerce.Xapi.Core/Services/IStoreDomainResolverService.cs b/src/VirtoCommerce.Xapi.Core/Services/IStoreDomainResolverService.cs new file mode 100644 index 0000000..a071ed8 --- /dev/null +++ b/src/VirtoCommerce.Xapi.Core/Services/IStoreDomainResolverService.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using VirtoCommerce.StoreModule.Core.Model; +using VirtoCommerce.Xapi.Core.Models; + +namespace VirtoCommerce.Xapi.Core.Services; + +public interface IStoreDomainResolverService +{ + Task GetStoreAsync(StoreDomainRequest request); +} diff --git a/src/VirtoCommerce.Xapi.Data/Extensions/ServiceCollectionExtensions.cs b/src/VirtoCommerce.Xapi.Data/Extensions/ServiceCollectionExtensions.cs index 44af311..5b0fef6 100644 --- a/src/VirtoCommerce.Xapi.Data/Extensions/ServiceCollectionExtensions.cs +++ b/src/VirtoCommerce.Xapi.Data/Extensions/ServiceCollectionExtensions.cs @@ -8,7 +8,6 @@ using VirtoCommerce.Xapi.Core.Models; using VirtoCommerce.Xapi.Core.Services; using VirtoCommerce.Xapi.Data.Security; -using VirtoCommerce.Xapi.Data.Security.Authorization; using VirtoCommerce.Xapi.Data.Services; using static VirtoCommerce.Xapi.Core.ModuleConstants; using ContactSignInValidator = VirtoCommerce.Xapi.Data.Security.OpenIddict.ContactSignInValidator; @@ -55,8 +54,8 @@ public static IServiceCollection AddXCore(this IServiceCollection services, ICon services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddDistributedLockService(configuration); return services; diff --git a/src/VirtoCommerce.Xapi.Data/Queries/GetStoreQueryHandler.cs b/src/VirtoCommerce.Xapi.Data/Queries/GetStoreQueryHandler.cs index b2415e4..ca66a53 100644 --- a/src/VirtoCommerce.Xapi.Data/Queries/GetStoreQueryHandler.cs +++ b/src/VirtoCommerce.Xapi.Data/Queries/GetStoreQueryHandler.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -15,6 +16,7 @@ using VirtoCommerce.Xapi.Core.Infrastructure; using VirtoCommerce.Xapi.Core.Models; using VirtoCommerce.Xapi.Core.Queries; +using VirtoCommerce.Xapi.Core.Services; using VirtoCommerce.Xapi.Core.Subscriptions; using StoreSettingGeneral = VirtoCommerce.StoreModule.Core.ModuleConstants.Settings.General; using StoreSettingSeo = VirtoCommerce.StoreModule.Core.ModuleConstants.Settings.SEO; @@ -31,6 +33,7 @@ public class GetStoreQueryHandler : IQueryHandler private readonly GraphQLWebSocketOptions _webSocketOptions; private readonly StoresOptions _storeOptions; private readonly IStoreAuthenticationService _storeAuthenticationService; + private readonly IStoreDomainResolverService _storeDomainResolverService; public GetStoreQueryHandler( IStoreService storeService, @@ -40,8 +43,8 @@ public GetStoreQueryHandler( IOptions identityOptions, IOptions webSocketOptions, IOptions storeOptions, - IStoreAuthenticationService storeAuthenticationService) - + IStoreAuthenticationService storeAuthenticationService, + IStoreDomainResolverService storeDomainResolverService) { _storeService = storeService; _storeSearchService = storeSearchService; @@ -51,25 +54,13 @@ public GetStoreQueryHandler( _identityOptions = identityOptions.Value; _webSocketOptions = webSocketOptions.Value; _storeOptions = storeOptions.Value; + _storeDomainResolverService = storeDomainResolverService; } public async Task Handle(GetStoreQuery request, CancellationToken cancellationToken) { - Store store = null; - - if (!string.IsNullOrEmpty(request.StoreId)) - { - store = await _storeService.GetByIdAsync(request.StoreId, clone: false); - } - else if (!string.IsNullOrEmpty(request.Domain)) - { - store = await ResolveStoreByDomain(request.Domain); - - if (store == null && !string.IsNullOrEmpty(_storeOptions.DefaultStore)) - { - store = await _storeService.GetByIdAsync(_storeOptions.DefaultStore, clone: false); - } - } + var storeResolverRequest = CreateStoreResolveRequest(request); + var store = await _storeDomainResolverService.GetStoreAsync(storeResolverRequest); if (store == null) { @@ -135,6 +126,15 @@ public async Task Handle(GetStoreQuery request, CancellationToken return response; } + protected virtual StoreDomainRequest CreateStoreResolveRequest(GetStoreQuery request) + { + var storeResolverRequest = AbstractTypeFactory.TryCreateInstance(); + storeResolverRequest.StoreId = request.StoreId; + storeResolverRequest.Domain = request.Domain; + return storeResolverRequest; + } + + [Obsolete("Not being called anymore. Use IStoreDomainResolverService.ResolveStoreByDomain(string domain) method.", DiagnosticId = "VC0010", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions/")] protected virtual async Task ResolveStoreByDomain(string domain) { if (_storeOptions.Domains.TryGetValue(domain, out var storeId)) diff --git a/src/VirtoCommerce.Xapi.Data/Services/StoreDomainResolverService.cs b/src/VirtoCommerce.Xapi.Data/Services/StoreDomainResolverService.cs new file mode 100644 index 0000000..64cdf46 --- /dev/null +++ b/src/VirtoCommerce.Xapi.Data/Services/StoreDomainResolverService.cs @@ -0,0 +1,65 @@ +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.Options; +using VirtoCommerce.Platform.Core.Common; +using VirtoCommerce.StoreModule.Core.Model; +using VirtoCommerce.StoreModule.Core.Model.Search; +using VirtoCommerce.StoreModule.Core.Services; +using VirtoCommerce.Xapi.Core.Models; +using VirtoCommerce.Xapi.Core.Services; + +namespace VirtoCommerce.Xapi.Data.Services; + +public class StoreDomainResolverService : IStoreDomainResolverService +{ + private readonly IStoreService _storeService; + private readonly IStoreSearchService _storeSearchService; + private readonly StoresOptions _storeOptions; + + public StoreDomainResolverService( + IStoreService storeService, + IStoreSearchService storeSearchService, + IOptions storeOptions) + + { + _storeService = storeService; + _storeSearchService = storeSearchService; + _storeOptions = storeOptions.Value; + } + + public virtual async Task GetStoreAsync(StoreDomainRequest request) + { + Store store = null; + + if (!string.IsNullOrEmpty(request.StoreId)) + { + store = await _storeService.GetByIdAsync(request.StoreId, clone: false); + } + else if (!string.IsNullOrEmpty(request.Domain)) + { + store = await ResolveStoreByDomain(request.Domain); + + if (store == null && !string.IsNullOrEmpty(_storeOptions.DefaultStore)) + { + store = await _storeService.GetByIdAsync(_storeOptions.DefaultStore, clone: false); + } + } + + return store; + } + + protected virtual async Task ResolveStoreByDomain(string domain) + { + if (_storeOptions.Domains.TryGetValue(domain, out var storeId)) + { + return await _storeService.GetByIdAsync(storeId, clone: false); + } + + var criteria = AbstractTypeFactory.TryCreateInstance(); + criteria.Domain = domain; + criteria.Take = 1; + + var result = await _storeSearchService.SearchAsync(criteria, clone: false); + return result.Results.FirstOrDefault(); + } +}