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
2 changes: 1 addition & 1 deletion src/VirtoCommerce.Xapi.Core/Models/SlugInfoResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ namespace VirtoCommerce.Xapi.Core.Models
public class SlugInfoResponse
{
public SeoInfo EntityInfo { get; set; }
//public string RedirectUrl { get; set; }
public string RedirectUrl { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public class SlugInfoResponseType : ExtendableGraphType<SlugInfoResponse>
public SlugInfoResponseType()
{
Field<SeoInfoType>("entityInfo").Description("SEO info").Resolve(context => context.Source.EntityInfo);
// here should be redirectUrl soon
Field(x => x.RedirectUrl, nullable: true).Description("Target URL when SEO is null");
}
}
}
5 changes: 2 additions & 3 deletions src/VirtoCommerce.Xapi.Core/VirtoCommerce.Xapi.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,17 @@
<PackageReference Include="MediatR" Version="12.4.1" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.22.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.8" />
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
<PackageReference Include="PipelineNet" Version="0.9.0" />
<PackageReference Include="RedLock.net" Version="2.3.2" />
<PackageReference Include="System.Reactive" Version="6.0.0" />
<PackageReference Include="VirtoCommerce.Platform.Core" Version="3.889.0" />
<PackageReference Include="VirtoCommerce.CustomerModule.Core" Version="3.833.0" />
<PackageReference Include="VirtoCommerce.SearchModule.Core" Version="3.804.0" />
<PackageReference Include="VirtoCommerce.Seo.Core" Version="3.801.0" />
<PackageReference Include="VirtoCommerce.Seo.Core" Version="3.802.0" />
<PackageReference Include="VirtoCommerce.StoreModule.Core" Version="3.818.0" />
<PackageReference Include="VirtoCommerce.TaxModule.Core" Version="3.802.0" />
</ItemGroup>

<!--Workaround for vulnerable transitive packages-->
<ItemGroup>
<PackageReference Include="System.Net.Http" Version="4.3.4" />
Expand Down
44 changes: 28 additions & 16 deletions src/VirtoCommerce.Xapi.Data/Queries/SlugInfoQueryHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,12 @@

namespace VirtoCommerce.Xapi.Data.Queries;

public class SlugInfoQueryHandler : IQueryHandler<SlugInfoQuery, SlugInfoResponse>
public class SlugInfoQueryHandler(
ICompositeSeoResolver seoResolver,
IStoreService storeService,
IBrokenLinkSearchService brokenLinkSearchService)
: IQueryHandler<SlugInfoQuery, SlugInfoResponse>
{
private readonly ICompositeSeoResolver _seoResolver;
private readonly IStoreService _storeService;

public SlugInfoQueryHandler(ICompositeSeoResolver seoResolver, IStoreService storeService)
{
_seoResolver = seoResolver;
_storeService = storeService;
}

public async Task<SlugInfoResponse> Handle(SlugInfoQuery request, CancellationToken cancellationToken)
{
Expand All @@ -34,7 +30,7 @@ public async Task<SlugInfoResponse> Handle(SlugInfoQuery request, CancellationTo
return result;
}

var store = await _storeService.GetByIdAsync(request.StoreId);
var store = await storeService.GetByIdAsync(request.StoreId);
if (store is null)
{
return result;
Expand All @@ -54,18 +50,34 @@ public async Task<SlugInfoResponse> Handle(SlugInfoQuery request, CancellationTo

result.EntityInfo = await GetBestMatchingSeoInfo(criteria, store);

//if (result.EntityInfo == null)
//{
// // todo: use seofaultservice
// result.RedirectUrl = "";
//}
if (result.EntityInfo == null)
{
var brokenLinkCriteria = AbstractTypeFactory<BrokenLinkSearchCriteria>.TryCreateInstance();

brokenLinkCriteria.Permalink = request.Permalink;
brokenLinkCriteria.StoreId = store.Id;
brokenLinkCriteria.Status = Seo.Core.ModuleConstants.LinkStatus.Resolved;
brokenLinkCriteria.LanguageCode = request.CultureName;

var brokenLinkResult = await brokenLinkSearchService.SearchAsync(brokenLinkCriteria);

if (brokenLinkResult.Results.Count > 0)
{
var resultItem = brokenLinkResult.Results.FirstOrDefault(x =>
(x.Language == request.CultureName) ||
(!request.CultureName.IsNullOrEmpty() && x.Language.IsNullOrEmpty()))
?? brokenLinkResult.Results.FirstOrDefault();

result.RedirectUrl = resultItem?.RedirectUrl;
}
}

return result;
}

protected virtual async Task<SeoInfo> GetBestMatchingSeoInfo(SeoSearchCriteria criteria, Store store)
{
var itemsToMatch = await _seoResolver.FindSeoAsync(criteria);
var itemsToMatch = await seoResolver.FindSeoAsync(criteria);
return itemsToMatch.GetBestMatchingSeoInfo(store, criteria.LanguageCode);
}
}
Loading