Skip to content

Commit 50c7752

Browse files
authored
VCST-3299: Use SEO module (#42)
* mark sluginfo as obsolete * refactor of searching best seo * refactor code correspond to helper method works * move seo query back * update references * remove reference to core module * fix link in obsoletes * fix diagnosticid in obsoletes * update dependencies in manifest * update modules versions * up dependencies versions * use interface instead of implementation * move classes to corresponded folders * revert sluginfoquery changes * revert SlugInfoResponseType changes * revert SlugInfoQueryBuilder changes * remove obsolete from private methods * remove slug and permalink from scoring of the seo infos * up versions * return Slug argument into SlugInfo query * up modules
1 parent 7a080e8 commit 50c7752

File tree

10 files changed

+82
-168
lines changed

10 files changed

+82
-168
lines changed

src/VirtoCommerce.Xapi.Core/Extensions/SeoInfosExtensions.cs

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,39 +8,51 @@ namespace VirtoCommerce.Xapi.Core.Extensions;
88

99
public static class SeoInfosExtensions
1010
{
11-
[Obsolete("Use VirtoCommerce.StoreModule.Core.Extensions", DiagnosticId = "VC0010", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions/")]
11+
[Obsolete("Use VirtoCommerce.Seo.Core.Extensions", DiagnosticId = "VC0010", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions/")]
1212
public static SeoInfo GetBestMatchingSeoInfo(this IList<SeoInfo> seoInfos, string storeId, string cultureName)
1313
{
1414
return GetBestMatchingSeoInfoInternal(seoInfos, storeId, cultureName, cultureName, slug: null, permalink: null);
1515
}
1616

17-
[Obsolete("Use VirtoCommerce.StoreModule.Core.Extensions", DiagnosticId = "VC0010", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions/")]
17+
[Obsolete("Use VirtoCommerce.Seo.Core.Extensions", DiagnosticId = "VC0010", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions/")]
1818
public static SeoInfo GetBestMatchingSeoInfo(this IList<SeoInfo> seoInfos, string storeId, string cultureName, string slug)
1919
{
2020
return GetBestMatchingSeoInfoInternal(seoInfos, storeId, cultureName, cultureName, slug, permalink: null);
2121
}
2222

23-
[Obsolete("Use VirtoCommerce.StoreModule.Core.Extensions", DiagnosticId = "VC0010", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions/")]
23+
[Obsolete("Use VirtoCommerce.Seo.Core.Extensions", DiagnosticId = "VC0010", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions/")]
2424
public static SeoInfo GetBestMatchingSeoInfo(this IList<SeoInfo> seoInfos, string storeId, string defaultStoreLang, string cultureName, string slug)
2525
{
2626
return GetBestMatchingSeoInfoInternal(seoInfos, storeId, defaultStoreLang, cultureName, slug, permalink: null);
2727
}
2828

29-
[Obsolete("Use VirtoCommerce.StoreModule.Core.Extensions", DiagnosticId = "VC0010", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions/")]
29+
[Obsolete("Use VirtoCommerce.Seo.Core.Extensions", DiagnosticId = "VC0010", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions/")]
3030
public static SeoInfo GetBestMatchingSeoInfo(this IList<SeoInfo> seoInfos, string storeId, string defaultStoreLang, string cultureName, string slug, string permalink)
3131
{
3232
return GetBestMatchingSeoInfoInternal(seoInfos, storeId, defaultStoreLang, cultureName, slug, permalink);
3333
}
3434

35-
[Obsolete("Use VirtoCommerce.StoreModule.Core.Extensions", DiagnosticId = "VC0010", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions/")]
35+
[Obsolete("Use VirtoCommerce.Seo.Core.Extensions", DiagnosticId = "VC0010", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions/")]
3636
public static SeoInfo GetBestMatchingSeoInfo(this IList<SeoInfo> seoInfos, string defaultStoreLang,
3737
SeoSearchCriteria criteria)
3838
{
3939
return GetBestMatchingSeoInfoInternal(seoInfos, criteria.StoreId, defaultStoreLang, criteria.LanguageCode,
4040
criteria.Slug, criteria.Permalink);
4141
}
4242

43+
[Obsolete("Use VirtoCommerce.Seo.Core.Extensions", DiagnosticId = "VC0010", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions/")]
44+
public static SeoInfo GetFallbackSeoInfo(string id, string name, string cultureName)
45+
{
46+
var result = AbstractTypeFactory<SeoInfo>.TryCreateInstance();
47+
result.SemanticUrl = id;
48+
result.LanguageCode = cultureName;
49+
result.Name = name;
50+
return result;
51+
}
52+
53+
#pragma warning disable VC0010 // Type or member is obsolete
4354
private static SeoInfo GetBestMatchingSeoInfoInternal(IList<SeoInfo> seoInfos, string storeId,
55+
#pragma warning restore VC0010 // Type or member is obsolete
4456
string defaultStoreLang, string cultureName, string slug, string permalink)
4557
{
4658
if (storeId.IsNullOrEmpty() || cultureName.IsNullOrEmpty())
@@ -50,16 +62,9 @@ private static SeoInfo GetBestMatchingSeoInfoInternal(IList<SeoInfo> seoInfos, s
5062
return seoInfos.GetBestMatchingSeoInfos(storeId, defaultStoreLang, cultureName, slug, permalink);
5163
}
5264

53-
public static SeoInfo GetFallbackSeoInfo(string id, string name, string cultureName)
54-
{
55-
var result = AbstractTypeFactory<SeoInfo>.TryCreateInstance();
56-
result.SemanticUrl = id;
57-
result.LanguageCode = cultureName;
58-
result.Name = name;
59-
return result;
60-
}
61-
65+
#pragma warning disable VC0010 // Type or member is obsolete
6266
private static SeoInfo GetBestMatchingSeoInfos(this IEnumerable<SeoInfo> seoRecords, string storeId, string defaultStoreLang, string language, string slug, string permalink)
67+
#pragma warning restore VC0010 // Type or member is obsolete
6368
{
6469
var result = seoRecords?.Select(s => new
6570
{
@@ -73,7 +78,9 @@ private static SeoInfo GetBestMatchingSeoInfos(this IEnumerable<SeoInfo> seoReco
7378
return result;
7479
}
7580

81+
#pragma warning disable VC0010 // Type or member is obsolete
7682
private static int CalculateScore(SeoInfo seoInfo, string slug, string permalink, string storeId, string defaultStoreLang, string language)
83+
#pragma warning restore VC0010 // Type or member is obsolete
7784
{
7885
var score = new[]
7986
{
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
using VirtoCommerce.CoreModule.Core.Seo;
1+
using VirtoCommerce.Seo.Core.Models;
22

33
namespace VirtoCommerce.Xapi.Core.Models
44
{
55
public class SlugInfoResponse
66
{
77
public SeoInfo EntityInfo { get; set; }
8+
//public string RedirectUrl { get; set; }
89
}
910
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using VirtoCommerce.CoreModule.Core.Seo;
1+
using VirtoCommerce.Seo.Core.Models;
22

33
namespace VirtoCommerce.Xapi.Core.Schemas
44
{

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +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
1011
}
1112
}
1213
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@
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" />
30-
<PackageReference Include="VirtoCommerce.Platform.Core" Version="3.887.0" />
31-
<PackageReference Include="VirtoCommerce.CoreModule.Core" Version="3.811.0" />
32-
<PackageReference Include="VirtoCommerce.CustomerModule.Core" Version="3.817.0" />
30+
<PackageReference Include="VirtoCommerce.Platform.Core" Version="3.889.0" />
31+
<PackageReference Include="VirtoCommerce.CustomerModule.Core" Version="3.833.0" />
3332
<PackageReference Include="VirtoCommerce.SearchModule.Core" Version="3.804.0" />
34-
<PackageReference Include="VirtoCommerce.StoreModule.Core" Version="3.814.0" />
33+
<PackageReference Include="VirtoCommerce.Seo.Core" Version="3.801.0" />
34+
<PackageReference Include="VirtoCommerce.StoreModule.Core" Version="3.818.0" />
3535
<PackageReference Include="VirtoCommerce.TaxModule.Core" Version="3.802.0" />
3636
</ItemGroup>
3737

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

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,64 +2,70 @@
22
using System.Linq;
33
using System.Threading;
44
using System.Threading.Tasks;
5-
using VirtoCommerce.CoreModule.Core.Seo;
65
using VirtoCommerce.Platform.Core.Common;
6+
using VirtoCommerce.Seo.Core.Models;
7+
using VirtoCommerce.Seo.Core.Services;
78
using VirtoCommerce.StoreModule.Core.Extensions;
89
using VirtoCommerce.StoreModule.Core.Model;
910
using VirtoCommerce.StoreModule.Core.Services;
1011
using VirtoCommerce.Xapi.Core.Infrastructure;
1112
using VirtoCommerce.Xapi.Core.Models;
1213
using VirtoCommerce.Xapi.Core.Queries;
1314

14-
namespace VirtoCommerce.Xapi.Data.Queries
15+
namespace VirtoCommerce.Xapi.Data.Queries;
16+
17+
public class SlugInfoQueryHandler : IQueryHandler<SlugInfoQuery, SlugInfoResponse>
1518
{
16-
public class SlugInfoQueryHandler : IQueryHandler<SlugInfoQuery, SlugInfoResponse>
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+
}
27+
28+
public async Task<SlugInfoResponse> Handle(SlugInfoQuery request, CancellationToken cancellationToken)
1729
{
18-
private readonly CompositeSeoResolver _seoResolver;
19-
private readonly IStoreService _storeService;
30+
var result = new SlugInfoResponse();
2031

21-
public SlugInfoQueryHandler(CompositeSeoResolver seoResolver, IStoreService storeService)
32+
if (string.IsNullOrEmpty(request.Permalink))
2233
{
23-
_seoResolver = seoResolver;
24-
_storeService = storeService;
34+
return result;
2535
}
2636

27-
public async Task<SlugInfoResponse> Handle(SlugInfoQuery request, CancellationToken cancellationToken)
37+
var store = await _storeService.GetByIdAsync(request.StoreId);
38+
if (store is null)
2839
{
29-
var result = new SlugInfoResponse();
30-
31-
if (string.IsNullOrEmpty(request.Permalink))
32-
{
33-
return result;
34-
}
40+
return result;
41+
}
3542

36-
var store = await _storeService.GetByIdAsync(request.StoreId);
37-
if (store is null)
38-
{
39-
return result;
40-
}
43+
var currentCulture = request.CultureName ?? store.DefaultLanguage;
4144

42-
var currentCulture = request.CultureName ?? store.DefaultLanguage;
45+
var segments = request.Permalink.Split("/", StringSplitOptions.RemoveEmptyEntries);
46+
var lastSegment = segments.LastOrDefault();
4347

44-
var segments = request.Permalink.Split("/", StringSplitOptions.RemoveEmptyEntries);
45-
var lastSegment = segments.LastOrDefault();
48+
var criteria = AbstractTypeFactory<SeoSearchCriteria>.TryCreateInstance();
49+
criteria.StoreId = store.Id;
50+
criteria.LanguageCode = currentCulture;
51+
criteria.Permalink = request.Permalink;
52+
criteria.Slug = lastSegment;
53+
criteria.UserId = request.UserId;
4654

47-
var criteria = AbstractTypeFactory<SeoSearchCriteria>.TryCreateInstance();
48-
criteria.StoreId = store.Id;
49-
criteria.LanguageCode = currentCulture;
50-
criteria.Permalink = request.Permalink;
51-
criteria.Slug = lastSegment;
52-
criteria.UserId = request.UserId;
55+
result.EntityInfo = await GetBestMatchingSeoInfo(criteria, store);
5356

54-
result.EntityInfo = await GetBestMatchingSeoInfo(criteria, store);
57+
//if (result.EntityInfo == null)
58+
//{
59+
// // todo: use seofaultservice
60+
// result.RedirectUrl = "";
61+
//}
5562

56-
return result;
57-
}
63+
return result;
64+
}
5865

59-
protected virtual async Task<SeoInfo> GetBestMatchingSeoInfo(SeoSearchCriteria criteria, Store store)
60-
{
61-
var itemsToMatch = await _seoResolver.FindSeoAsync(criteria);
62-
return itemsToMatch.GetBestMatchingSeoInfo(store, criteria.LanguageCode, criteria.Slug, criteria.Permalink);
63-
}
66+
protected virtual async Task<SeoInfo> GetBestMatchingSeoInfo(SeoSearchCriteria criteria, Store store)
67+
{
68+
var itemsToMatch = await _seoResolver.FindSeoAsync(criteria);
69+
return itemsToMatch.GetBestMatchingSeoInfo(store, criteria.LanguageCode);
6470
}
6571
}

src/VirtoCommerce.Xapi.Data/VirtoCommerce.Xapi.Data.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
</PropertyGroup>
1111
<ItemGroup>
1212
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
13-
<PackageReference Include="VirtoCommerce.Platform.Security" Version="3.887.0" />
13+
<PackageReference Include="VirtoCommerce.Platform.Security" Version="3.889.0" />
1414
</ItemGroup>
1515
<ItemGroup>
1616
<ProjectReference Include="..\VirtoCommerce.Xapi.Core\VirtoCommerce.Xapi.Core.csproj" />

src/VirtoCommerce.Xapi.Web/Module.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ public void Initialize(IServiceCollection serviceCollection)
4949
#pragma warning restore CS0618 // Type or member is obsolete
5050

5151
// Register .NET GraphQL server
52-
serviceCollection.AddGraphQL(bulder =>
52+
serviceCollection.AddGraphQL(builder =>
5353
{
54-
bulder
54+
builder
5555
.AddNewtonsoftJson()
5656
.AddSchema(serviceCollection, typeof(CoreAssemblyMarker), typeof(DataAssemblyMarker))
5757
.AddPermissionAuthorization()
@@ -71,9 +71,9 @@ public void Initialize(IServiceCollection serviceCollection)
7171

7272
if (!IsSchemaIntrospectionEnabled)
7373
{
74-
bulder.ReplaceValidationRule<KnownTypeNames, CustomKnownTypeNames>();
75-
bulder.ReplaceValidationRule<FieldsOnCorrectType, CustomFieldsOnCorrectType>();
76-
bulder.ReplaceValidationRule<KnownArgumentNames, CustomKnownArgumentNames>();
74+
builder.ReplaceValidationRule<KnownTypeNames, CustomKnownTypeNames>();
75+
builder.ReplaceValidationRule<FieldsOnCorrectType, CustomFieldsOnCorrectType>();
76+
builder.ReplaceValidationRule<KnownArgumentNames, CustomKnownArgumentNames>();
7777
}
7878
});
7979

src/VirtoCommerce.Xapi.Web/module.manifest

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
<version>3.915.0</version>
55
<version-tag></version-tag>
66

7-
<platformVersion>3.887.0</platformVersion>
7+
<platformVersion>3.889.0</platformVersion>
88
<dependencies>
99
<dependency id="VirtoCommerce.ApplicationInsights" version="3.804.0" optional="true" />
10-
<dependency id="VirtoCommerce.Core" version="3.811.0" />
11-
<dependency id="VirtoCommerce.Customer" version="3.817.0" />
10+
<dependency id="VirtoCommerce.Customer" version="3.833.0" />
1211
<dependency id="VirtoCommerce.Search" version="3.804.0" />
13-
<dependency id="VirtoCommerce.Store" version="3.814.0" />
12+
<dependency id="VirtoCommerce.Seo" version="3.801.0" />
13+
<dependency id="VirtoCommerce.Store" version="3.818.0" />
1414
<dependency id="VirtoCommerce.Tax" version="3.802.0" optional="true" />
1515
</dependencies>
1616
<incompatibilities>

tests/VirtoCommerce.Xapi.Tests/Extensions/SeoInfosExtensionsTests.cs

Lines changed: 0 additions & 101 deletions
This file was deleted.

0 commit comments

Comments
 (0)