Skip to content

Commit 9309ea7

Browse files
committed
return redirectUrl when slug is null
1 parent fa54e84 commit 9309ea7

File tree

4 files changed

+32
-21
lines changed

4 files changed

+32
-21
lines changed

src/VirtoCommerce.Xapi.Core/Models/SlugInfoResponse.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ namespace VirtoCommerce.Xapi.Core.Models
55
public class SlugInfoResponse
66
{
77
public SeoInfo EntityInfo { get; set; }
8-
//public string RedirectUrl { get; set; }
8+
public string RedirectUrl { get; set; }
99
}
1010
}

src/VirtoCommerce.Xapi.Core/Schemas/SlugInfoResponseType.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public class SlugInfoResponseType : ExtendableGraphType<SlugInfoResponse>
77
public SlugInfoResponseType()
88
{
99
Field<SeoInfoType>("entityInfo").Description("SEO info").Resolve(context => context.Source.EntityInfo);
10-
// here should be redirectUrl soon
10+
Field(x => x.RedirectUrl, nullable: true).Description("Target URL when SEO is null");
1111
}
1212
}
1313
}

src/VirtoCommerce.Xapi.Core/VirtoCommerce.Xapi.Core.csproj

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,17 @@
2323
<PackageReference Include="MediatR" Version="12.4.1" />
2424
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.22.0" />
2525
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.8" />
26-
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
26+
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
2727
<PackageReference Include="PipelineNet" Version="0.9.0" />
2828
<PackageReference Include="RedLock.net" Version="2.3.2" />
2929
<PackageReference Include="System.Reactive" Version="6.0.0" />
3030
<PackageReference Include="VirtoCommerce.Platform.Core" Version="3.889.0" />
3131
<PackageReference Include="VirtoCommerce.CustomerModule.Core" Version="3.833.0" />
3232
<PackageReference Include="VirtoCommerce.SearchModule.Core" Version="3.804.0" />
33-
<PackageReference Include="VirtoCommerce.Seo.Core" Version="3.801.0" />
33+
<PackageReference Include="VirtoCommerce.Seo.Core" Version="3.802.0-alpha.37-vcst-3156" />
3434
<PackageReference Include="VirtoCommerce.StoreModule.Core" Version="3.818.0" />
3535
<PackageReference Include="VirtoCommerce.TaxModule.Core" Version="3.802.0" />
3636
</ItemGroup>
37-
3837
<!--Workaround for vulnerable transitive packages-->
3938
<ItemGroup>
4039
<PackageReference Include="System.Net.Http" Version="4.3.4" />

src/VirtoCommerce.Xapi.Data/Queries/SlugInfoQueryHandler.cs

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,12 @@
1414

1515
namespace VirtoCommerce.Xapi.Data.Queries;
1616

17-
public class SlugInfoQueryHandler : IQueryHandler<SlugInfoQuery, SlugInfoResponse>
17+
public class SlugInfoQueryHandler(
18+
ICompositeSeoResolver seoResolver,
19+
IStoreService storeService,
20+
IBrokenLinkSearchService brokenLinkSearchService)
21+
: IQueryHandler<SlugInfoQuery, SlugInfoResponse>
1822
{
19-
private readonly ICompositeSeoResolver _seoResolver;
20-
private readonly IStoreService _storeService;
21-
22-
public SlugInfoQueryHandler(ICompositeSeoResolver seoResolver, IStoreService storeService)
23-
{
24-
_seoResolver = seoResolver;
25-
_storeService = storeService;
26-
}
2723

2824
public async Task<SlugInfoResponse> Handle(SlugInfoQuery request, CancellationToken cancellationToken)
2925
{
@@ -34,7 +30,7 @@ public async Task<SlugInfoResponse> Handle(SlugInfoQuery request, CancellationTo
3430
return result;
3531
}
3632

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

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

57-
//if (result.EntityInfo == null)
58-
//{
59-
// // todo: use seofaultservice
60-
// result.RedirectUrl = "";
61-
//}
53+
if (result.EntityInfo == null)
54+
{
55+
var brokenLinkCriteria = AbstractTypeFactory<BrokenLinkSearchCriteria>.TryCreateInstance();
56+
57+
brokenLinkCriteria.Permalink = request.Permalink;
58+
brokenLinkCriteria.StoreId = store.Id;
59+
brokenLinkCriteria.Status = Seo.Core.ModuleConstants.LinkStatus.Resolved;
60+
brokenLinkCriteria.LanguageCode = request.CultureName;
61+
62+
var brokenLinkResult = await brokenLinkSearchService.SearchAsync(brokenLinkCriteria);
63+
64+
if (brokenLinkResult.Results.Count > 0)
65+
{
66+
var resultItem = brokenLinkResult.Results.FirstOrDefault(x =>
67+
(x.Language == request.CultureName) ||
68+
(!request.CultureName.IsNullOrEmpty() && x.Language.IsNullOrEmpty()))
69+
?? brokenLinkResult.Results.FirstOrDefault();
70+
71+
result.RedirectUrl = resultItem?.RedirectUrl;
72+
}
73+
}
6274

6375
return result;
6476
}
6577

6678
protected virtual async Task<SeoInfo> GetBestMatchingSeoInfo(SeoSearchCriteria criteria, Store store)
6779
{
68-
var itemsToMatch = await _seoResolver.FindSeoAsync(criteria);
80+
var itemsToMatch = await seoResolver.FindSeoAsync(criteria);
6981
return itemsToMatch.GetBestMatchingSeoInfo(store, criteria.LanguageCode);
7082
}
7183
}

0 commit comments

Comments
 (0)