Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/VirtoCommerce.Xapi.Core/Models/IStoreDomainRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace VirtoCommerce.Xapi.Core.Models;

public class StoreDomainRequest
{
public string StoreId { get; set; }

public string Domain { get; set; }
}
Original file line number Diff line number Diff line change
@@ -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<Store> GetStoreAsync(StoreDomainRequest request);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -55,8 +54,8 @@ public static IServiceCollection AddXCore(this IServiceCollection services, ICon
services.AddTransient<ITokenRequestValidator, ContactSignInValidator>();
services.AddTransient<IExternalSignInValidator, ExternalSignInValidator>();
services.AddTransient<IExternalSignInUserBuilder, ExternalSignInUserBuilder>();

services.AddTransient<ILoadUserToEvalContextService, LoadUserToEvalContextService>();
services.AddTransient<IStoreDomainResolverService, StoreDomainResolverService>();
services.AddDistributedLockService(configuration);

return services;
Expand Down
34 changes: 17 additions & 17 deletions src/VirtoCommerce.Xapi.Data/Queries/GetStoreQueryHandler.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
Expand All @@ -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;
Expand All @@ -31,6 +33,7 @@ public class GetStoreQueryHandler : IQueryHandler<GetStoreQuery, StoreResponse>
private readonly GraphQLWebSocketOptions _webSocketOptions;
private readonly StoresOptions _storeOptions;
private readonly IStoreAuthenticationService _storeAuthenticationService;
private readonly IStoreDomainResolverService _storeDomainResolverService;

public GetStoreQueryHandler(
IStoreService storeService,
Expand All @@ -40,8 +43,8 @@ public GetStoreQueryHandler(
IOptions<IdentityOptions> identityOptions,
IOptions<GraphQLWebSocketOptions> webSocketOptions,
IOptions<StoresOptions> storeOptions,
IStoreAuthenticationService storeAuthenticationService)

IStoreAuthenticationService storeAuthenticationService,
IStoreDomainResolverService storeDomainResolverService)
{
_storeService = storeService;
_storeSearchService = storeSearchService;
Expand All @@ -51,25 +54,13 @@ public GetStoreQueryHandler(
_identityOptions = identityOptions.Value;
_webSocketOptions = webSocketOptions.Value;
_storeOptions = storeOptions.Value;
_storeDomainResolverService = storeDomainResolverService;
}

public async Task<StoreResponse> 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)
{
Expand Down Expand Up @@ -135,6 +126,15 @@ public async Task<StoreResponse> Handle(GetStoreQuery request, CancellationToken
return response;
}

protected virtual StoreDomainRequest CreateStoreResolveRequest(GetStoreQuery request)
{
var storeResolverRequest = AbstractTypeFactory<StoreDomainRequest>.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<Store> ResolveStoreByDomain(string domain)
{
if (_storeOptions.Domains.TryGetValue(domain, out var storeId))
Expand Down
65 changes: 65 additions & 0 deletions src/VirtoCommerce.Xapi.Data/Services/StoreDomainResolverService.cs
Original file line number Diff line number Diff line change
@@ -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<StoresOptions> storeOptions)

{
_storeService = storeService;
_storeSearchService = storeSearchService;
_storeOptions = storeOptions.Value;
}

public virtual async Task<Store> 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<Store> ResolveStoreByDomain(string domain)
{
if (_storeOptions.Domains.TryGetValue(domain, out var storeId))
{
return await _storeService.GetByIdAsync(storeId, clone: false);
}

var criteria = AbstractTypeFactory<StoreSearchCriteria>.TryCreateInstance();
criteria.Domain = domain;
criteria.Take = 1;

var result = await _storeSearchService.SearchAsync(criteria, clone: false);
return result.Results.FirstOrDefault();
}
}
Loading