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
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-alpha.37-vcst-3156" />
<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