Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
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 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