Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
68263f5
mark sluginfo as obsolete
basilkot May 13, 2025
56f5c67
refactor of searching best seo
basilkot May 15, 2025
83bce70
refactor code correspond to helper method works
basilkot May 15, 2025
270b115
Merge branch 'dev' into fix/VCST-3138
basilkot May 15, 2025
170f16b
Merge branch 'dev' into feat/VCST-3299
basilkot May 19, 2025
908ba4a
Merge branch 'fix/VCST-3138' into feat/VCST-3299
basilkot May 19, 2025
770dbdf
move seo query back
basilkot May 22, 2025
6e7a889
Merge branch 'dev' into feat/VCST-3299
basilkot May 23, 2025
b2f69c4
update references
basilkot May 23, 2025
cf50e14
remove reference to core module
basilkot May 23, 2025
ff8288d
fix link in obsoletes
basilkot May 23, 2025
40ffb70
fix diagnosticid in obsoletes
basilkot May 23, 2025
2e68a94
update dependencies in manifest
basilkot May 23, 2025
25ea52d
update modules versions
basilkot May 23, 2025
30089b4
up dependencies versions
basilkot May 28, 2025
da1c793
use interface instead of implementation
basilkot May 28, 2025
2b28089
move classes to corresponded folders
basilkot May 29, 2025
de0a5fe
revert sluginfoquery changes
basilkot May 29, 2025
db38ec1
revert SlugInfoResponseType changes
basilkot May 29, 2025
2e44ce1
revert SlugInfoQueryBuilder changes
basilkot May 29, 2025
9512f2c
remove obsolete from private methods
basilkot May 29, 2025
e560432
remove slug and permalink from scoring of the seo infos
basilkot Jun 2, 2025
1200d34
up versions
basilkot Jun 2, 2025
c90cdcd
Merge branch 'dev' into feat/VCST-3299
basilkot Jun 2, 2025
4bbb3d0
return Slug argument into SlugInfo query
basilkot Jun 3, 2025
8b6ce77
Merge branch 'dev' into feat/VCST-3299
basilkot Jun 10, 2025
3508ccb
up modules
basilkot Jun 10, 2025
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
35 changes: 21 additions & 14 deletions src/VirtoCommerce.Xapi.Core/Extensions/SeoInfosExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,39 +8,51 @@ namespace VirtoCommerce.Xapi.Core.Extensions;

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

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

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

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

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

[Obsolete("Use VirtoCommerce.Seo.Core.Extensions", DiagnosticId = "VC0010", UrlFormat = "https://docs.virtocommerce.org/products/products-virto3-versions/")]
public static SeoInfo GetFallbackSeoInfo(string id, string name, string cultureName)
{
var result = AbstractTypeFactory<SeoInfo>.TryCreateInstance();
result.SemanticUrl = id;
result.LanguageCode = cultureName;
result.Name = name;
return result;
}

#pragma warning disable VC0010 // Type or member is obsolete
private static SeoInfo GetBestMatchingSeoInfoInternal(IList<SeoInfo> seoInfos, string storeId,
#pragma warning restore VC0010 // Type or member is obsolete
string defaultStoreLang, string cultureName, string slug, string permalink)
{
if (storeId.IsNullOrEmpty() || cultureName.IsNullOrEmpty())
Expand All @@ -50,16 +62,9 @@ private static SeoInfo GetBestMatchingSeoInfoInternal(IList<SeoInfo> seoInfos, s
return seoInfos.GetBestMatchingSeoInfos(storeId, defaultStoreLang, cultureName, slug, permalink);
}

public static SeoInfo GetFallbackSeoInfo(string id, string name, string cultureName)
{
var result = AbstractTypeFactory<SeoInfo>.TryCreateInstance();
result.SemanticUrl = id;
result.LanguageCode = cultureName;
result.Name = name;
return result;
}

#pragma warning disable VC0010 // Type or member is obsolete
private static SeoInfo GetBestMatchingSeoInfos(this IEnumerable<SeoInfo> seoRecords, string storeId, string defaultStoreLang, string language, string slug, string permalink)
#pragma warning restore VC0010 // Type or member is obsolete
{
var result = seoRecords?.Select(s => new
{
Expand All @@ -73,7 +78,9 @@ private static SeoInfo GetBestMatchingSeoInfos(this IEnumerable<SeoInfo> seoReco
return result;
}

#pragma warning disable VC0010 // Type or member is obsolete
private static int CalculateScore(SeoInfo seoInfo, string slug, string permalink, string storeId, string defaultStoreLang, string language)
#pragma warning restore VC0010 // Type or member is obsolete
{
var score = new[]
{
Expand Down
3 changes: 2 additions & 1 deletion src/VirtoCommerce.Xapi.Core/Models/SlugInfoResponse.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
using VirtoCommerce.CoreModule.Core.Seo;
using VirtoCommerce.Seo.Core.Models;

namespace VirtoCommerce.Xapi.Core.Models
{
public class SlugInfoResponse
{
public SeoInfo EntityInfo { get; set; }
//public string RedirectUrl { get; set; }
}
}
2 changes: 1 addition & 1 deletion src/VirtoCommerce.Xapi.Core/Schemas/SeoInfoType.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using VirtoCommerce.CoreModule.Core.Seo;
using VirtoCommerce.Seo.Core.Models;

namespace VirtoCommerce.Xapi.Core.Schemas
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +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
}
}
}
8 changes: 4 additions & 4 deletions src/VirtoCommerce.Xapi.Core/VirtoCommerce.Xapi.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@
<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.887.0" />
<PackageReference Include="VirtoCommerce.CoreModule.Core" Version="3.811.0" />
<PackageReference Include="VirtoCommerce.CustomerModule.Core" Version="3.817.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.StoreModule.Core" Version="3.814.0" />
<PackageReference Include="VirtoCommerce.Seo.Core" Version="3.801.0" />
<PackageReference Include="VirtoCommerce.StoreModule.Core" Version="3.818.0" />
<PackageReference Include="VirtoCommerce.TaxModule.Core" Version="3.802.0" />
</ItemGroup>

Expand Down
80 changes: 43 additions & 37 deletions src/VirtoCommerce.Xapi.Data/Queries/SlugInfoQueryHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,64 +2,70 @@
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using VirtoCommerce.CoreModule.Core.Seo;
using VirtoCommerce.Platform.Core.Common;
using VirtoCommerce.Seo.Core.Models;
using VirtoCommerce.Seo.Core.Services;
using VirtoCommerce.StoreModule.Core.Extensions;
using VirtoCommerce.StoreModule.Core.Model;
using VirtoCommerce.StoreModule.Core.Services;
using VirtoCommerce.Xapi.Core.Infrastructure;
using VirtoCommerce.Xapi.Core.Models;
using VirtoCommerce.Xapi.Core.Queries;

namespace VirtoCommerce.Xapi.Data.Queries
namespace VirtoCommerce.Xapi.Data.Queries;

public class SlugInfoQueryHandler : IQueryHandler<SlugInfoQuery, SlugInfoResponse>
{
public class SlugInfoQueryHandler : 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)
{
private readonly CompositeSeoResolver _seoResolver;
private readonly IStoreService _storeService;
var result = new SlugInfoResponse();

public SlugInfoQueryHandler(CompositeSeoResolver seoResolver, IStoreService storeService)
if (string.IsNullOrEmpty(request.Permalink))
{
_seoResolver = seoResolver;
_storeService = storeService;
return result;
}

public async Task<SlugInfoResponse> Handle(SlugInfoQuery request, CancellationToken cancellationToken)
var store = await _storeService.GetByIdAsync(request.StoreId);
if (store is null)
{
var result = new SlugInfoResponse();

if (string.IsNullOrEmpty(request.Permalink))
{
return result;
}
return result;
}

var store = await _storeService.GetByIdAsync(request.StoreId);
if (store is null)
{
return result;
}
var currentCulture = request.CultureName ?? store.DefaultLanguage;

var currentCulture = request.CultureName ?? store.DefaultLanguage;
var segments = request.Permalink.Split("/", StringSplitOptions.RemoveEmptyEntries);
var lastSegment = segments.LastOrDefault();

var segments = request.Permalink.Split("/", StringSplitOptions.RemoveEmptyEntries);
var lastSegment = segments.LastOrDefault();
var criteria = AbstractTypeFactory<SeoSearchCriteria>.TryCreateInstance();
criteria.StoreId = store.Id;
criteria.LanguageCode = currentCulture;
criteria.Permalink = request.Permalink;
criteria.Slug = lastSegment;
criteria.UserId = request.UserId;

var criteria = AbstractTypeFactory<SeoSearchCriteria>.TryCreateInstance();
criteria.StoreId = store.Id;
criteria.LanguageCode = currentCulture;
criteria.Permalink = request.Permalink;
criteria.Slug = lastSegment;
criteria.UserId = request.UserId;
result.EntityInfo = await GetBestMatchingSeoInfo(criteria, store);

result.EntityInfo = await GetBestMatchingSeoInfo(criteria, store);
//if (result.EntityInfo == null)
//{
// // todo: use seofaultservice
// result.RedirectUrl = "";
//}

return result;
}
return result;
}

protected virtual async Task<SeoInfo> GetBestMatchingSeoInfo(SeoSearchCriteria criteria, Store store)
{
var itemsToMatch = await _seoResolver.FindSeoAsync(criteria);
return itemsToMatch.GetBestMatchingSeoInfo(store, criteria.LanguageCode, criteria.Slug, criteria.Permalink);
}
protected virtual async Task<SeoInfo> GetBestMatchingSeoInfo(SeoSearchCriteria criteria, Store store)
{
var itemsToMatch = await _seoResolver.FindSeoAsync(criteria);
return itemsToMatch.GetBestMatchingSeoInfo(store, criteria.LanguageCode);
}
}
2 changes: 1 addition & 1 deletion src/VirtoCommerce.Xapi.Data/VirtoCommerce.Xapi.Data.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
<PackageReference Include="VirtoCommerce.Platform.Security" Version="3.887.0" />
<PackageReference Include="VirtoCommerce.Platform.Security" Version="3.889.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\VirtoCommerce.Xapi.Core\VirtoCommerce.Xapi.Core.csproj" />
Expand Down
10 changes: 5 additions & 5 deletions src/VirtoCommerce.Xapi.Web/Module.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ public void Initialize(IServiceCollection serviceCollection)
#pragma warning restore CS0618 // Type or member is obsolete

// Register .NET GraphQL server
serviceCollection.AddGraphQL(bulder =>
serviceCollection.AddGraphQL(builder =>
{
bulder
builder
.AddNewtonsoftJson()
.AddSchema(serviceCollection, typeof(CoreAssemblyMarker), typeof(DataAssemblyMarker))
.AddPermissionAuthorization()
Expand All @@ -71,9 +71,9 @@ public void Initialize(IServiceCollection serviceCollection)

if (!IsSchemaIntrospectionEnabled)
{
bulder.ReplaceValidationRule<KnownTypeNames, CustomKnownTypeNames>();
bulder.ReplaceValidationRule<FieldsOnCorrectType, CustomFieldsOnCorrectType>();
bulder.ReplaceValidationRule<KnownArgumentNames, CustomKnownArgumentNames>();
builder.ReplaceValidationRule<KnownTypeNames, CustomKnownTypeNames>();
builder.ReplaceValidationRule<FieldsOnCorrectType, CustomFieldsOnCorrectType>();
builder.ReplaceValidationRule<KnownArgumentNames, CustomKnownArgumentNames>();
}
});

Expand Down
8 changes: 4 additions & 4 deletions src/VirtoCommerce.Xapi.Web/module.manifest
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
<version>3.915.0</version>
<version-tag></version-tag>

<platformVersion>3.887.0</platformVersion>
<platformVersion>3.889.0</platformVersion>
<dependencies>
<dependency id="VirtoCommerce.ApplicationInsights" version="3.804.0" optional="true" />
<dependency id="VirtoCommerce.Core" version="3.811.0" />
<dependency id="VirtoCommerce.Customer" version="3.817.0" />
<dependency id="VirtoCommerce.Customer" version="3.833.0" />
<dependency id="VirtoCommerce.Search" version="3.804.0" />
<dependency id="VirtoCommerce.Store" version="3.814.0" />
<dependency id="VirtoCommerce.Seo" version="3.801.0" />
<dependency id="VirtoCommerce.Store" version="3.818.0" />
<dependency id="VirtoCommerce.Tax" version="3.802.0" optional="true" />
</dependencies>
<incompatibilities>
Expand Down
101 changes: 0 additions & 101 deletions tests/VirtoCommerce.Xapi.Tests/Extensions/SeoInfosExtensionsTests.cs

This file was deleted.

Loading