From be2a8287305a0535cbb947d0590ca1d42d3a6f16 Mon Sep 17 00:00:00 2001 From: Leysan Date: Wed, 6 Oct 2021 16:27:23 +0300 Subject: [PATCH] feat: Add description for Category --- .../RecommendationsGatewayModule.Core.csproj | 2 +- .../RecommendationsGatewayModule.Data.csproj | 2 +- .../VirtoCommerce.Exp.ExtensionSamples.csproj | 4 +- .../Index/IndexFieldsMapper.cs | 162 +++++++++--------- .../Schemas/CategoryType.cs | 38 +++- .../VirtoCommerce.XDigitalCatalog.csproj | 6 +- ...rtoCommerce.ExperienceApiModule.Web.csproj | 2 +- ....ExperienceApiModule.XProfile.Tests.csproj | 5 +- ...Commerce.ExperienceApiModule.XOrder.csproj | 2 +- .../VirtoCommerce.XPurchase.Tests.csproj | 5 +- ...oCommerce.ExperienceApiModule.Tests.csproj | 6 +- ...ce.ExperienceApiModule.XOrder.Tests.csproj | 5 +- ...VirtoCommerce.XDigitalCatalog.Tests.csproj | 5 +- 13 files changed, 148 insertions(+), 96 deletions(-) diff --git a/samples/RecommendationsGatewayModule/RecommendationsGatewayModule.Core/RecommendationsGatewayModule.Core.csproj b/samples/RecommendationsGatewayModule/RecommendationsGatewayModule.Core/RecommendationsGatewayModule.Core.csproj index c72e443c9..bbe2e07b1 100644 --- a/samples/RecommendationsGatewayModule/RecommendationsGatewayModule.Core/RecommendationsGatewayModule.Core.csproj +++ b/samples/RecommendationsGatewayModule/RecommendationsGatewayModule.Core/RecommendationsGatewayModule.Core.csproj @@ -13,7 +13,7 @@ - + diff --git a/samples/RecommendationsGatewayModule/RecommendationsGatewayModule.Data/RecommendationsGatewayModule.Data.csproj b/samples/RecommendationsGatewayModule/RecommendationsGatewayModule.Data/RecommendationsGatewayModule.Data.csproj index aa6cd7656..7393c44b6 100644 --- a/samples/RecommendationsGatewayModule/RecommendationsGatewayModule.Data/RecommendationsGatewayModule.Data.csproj +++ b/samples/RecommendationsGatewayModule/RecommendationsGatewayModule.Data/RecommendationsGatewayModule.Data.csproj @@ -11,7 +11,7 @@ - + diff --git a/samples/VirtoCommerce.Exp.ExtensionSamples/VirtoCommerce.Exp.ExtensionSamples.csproj b/samples/VirtoCommerce.Exp.ExtensionSamples/VirtoCommerce.Exp.ExtensionSamples.csproj index 39d5d8328..2f899ec0b 100644 --- a/samples/VirtoCommerce.Exp.ExtensionSamples/VirtoCommerce.Exp.ExtensionSamples.csproj +++ b/samples/VirtoCommerce.Exp.ExtensionSamples/VirtoCommerce.Exp.ExtensionSamples.csproj @@ -1,4 +1,4 @@ - + netcoreapp3.1 @@ -15,7 +15,7 @@ - + diff --git a/src/VirtoCommerce.ExperienceApiModule.DigitalCatalog/Index/IndexFieldsMapper.cs b/src/VirtoCommerce.ExperienceApiModule.DigitalCatalog/Index/IndexFieldsMapper.cs index a5a66e967..d7c4ed870 100644 --- a/src/VirtoCommerce.ExperienceApiModule.DigitalCatalog/Index/IndexFieldsMapper.cs +++ b/src/VirtoCommerce.ExperienceApiModule.DigitalCatalog/Index/IndexFieldsMapper.cs @@ -1,103 +1,103 @@ -using System.Collections.Generic; -using System.Linq; +using System.Collections.Generic; +using System.Linq; using System.Text.RegularExpressions; - -namespace VirtoCommerce.ExperienceApiModule.XDigitalCatalog.Index -{ - public static class IndexFieldsMapper - { - public class RegexpNameMapper - { + +namespace VirtoCommerce.ExperienceApiModule.XDigitalCatalog.Index +{ + public static class IndexFieldsMapper + { + public class RegexpNameMapper + { protected Regex _regex { get; set; } - - protected string Replacement { get; set; } - public string[] AdditionalFields { get; set; } - - public RegexpNameMapper(string pattern, string replacement, string[] additionalFields = null) - { - _regex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); - Replacement = replacement; - AdditionalFields = additionalFields; - } - - public virtual bool CanMap(string input) + + protected string Replacement { get; set; } + public string[] AdditionalFields { get; set; } + + public RegexpNameMapper(string pattern, string replacement, string[] additionalFields = null) { - return _regex.IsMatch(input); - } - - public virtual string Map(string input) - { - return _regex.Replace(input, Replacement); - } - } + _regex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); + Replacement = replacement; + AdditionalFields = additionalFields; + } + + public virtual bool CanMap(string input) + { + return _regex.IsMatch(input); + } + + public virtual string Map(string input) + { + return _regex.Replace(input, Replacement); + } + } private static IList _mappers; - + public static IList Mappers { get { if (_mappers == null) { - _mappers = new List() - { - new RegexpNameMapper(@".*", "$0", new [] { "__object.id", "__object.categoryId", "__object.catalogId" }), - new RegexpNameMapper(@"(items.)?price[s]?.(?[^\.]+).*$","__prices.$2", new [] { "__prices.currency" }), - new RegexpNameMapper(@"^items.variations", "__variations", new [] { "__variations" }), - new RegexpNameMapper(@"^variations", "__variations", new [] { "__variations" }), - new RegexpNameMapper(@"^items", "__object"), + _mappers = new List() + { + new RegexpNameMapper(@".*", "$0", new [] { "__object.id", "__object.categoryId", "__object.catalogId" }), + new RegexpNameMapper(@"(items.)?price[s]?.(?[^\.]+).*$","__prices.$2", new [] { "__prices.currency" }), + new RegexpNameMapper(@"^items.variations", "__variations", new [] { "__variations" }), + new RegexpNameMapper(@"^variations", "__variations", new [] { "__variations" }), + new RegexpNameMapper(@"^items", "__object"), new RegexpNameMapper(@"^(?!__)", "__object."), - new RegexpNameMapper(@"properties.value$", "properties.values"), - new RegexpNameMapper(@"imgSrc", "images"), - - new RegexpNameMapper(@"__object.availabilityData.isActive", "__object.isActive"), - new RegexpNameMapper(@"__object.availabilityData.isBuyable", "__object.isBuyable"), - new RegexpNameMapper(@"__object.availabilityData.trackInventory", "__object.trackInventory"), - - new RegexpNameMapper(@"__object.parent.*", "__object.parentId"), - new RegexpNameMapper(@"__object.hasParent.*", "__object.parentId"), - new RegexpNameMapper(@"__object.parent.*", "__object.parentId"), - - new RegexpNameMapper(@"__object.category.*", "__object.categoryId"), - new RegexpNameMapper(@"__object.descriptions", "__object.reviews"), - new RegexpNameMapper(@"__object.description.*", "__object.reviews"), + new RegexpNameMapper(@"properties.value$", "properties.values"), + new RegexpNameMapper(@"imgSrc", "images"), + + new RegexpNameMapper(@"__object.availabilityData.isActive", "__object.isActive"), + new RegexpNameMapper(@"__object.availabilityData.isBuyable", "__object.isBuyable"), + new RegexpNameMapper(@"__object.availabilityData.trackInventory", "__object.trackInventory"), + + new RegexpNameMapper(@"__object.parent.*", "__object.parentId"), + new RegexpNameMapper(@"__object.hasParent.*", "__object.parentId"), + new RegexpNameMapper(@"__object.parent.*", "__object.parentId"), + + new RegexpNameMapper(@"__object.category.*", "__object.categoryId"), + new RegexpNameMapper(@"__object.descriptions", "__object.reviews"), + new RegexpNameMapper(@"__object.description.*", "__object.reviews"), new RegexpNameMapper(@"__object.seoInfo.*", "__object.seoInfos"), new RegexpNameMapper(@"__object.breadcrumbs.*", "__object.outlines"), - - #region Category - - new RegexpNameMapper(@"__object.slug$", "__object.outlines", new [] { "__object.seoInfos" }), - new RegexpNameMapper(@"__object.outline$", "__object.outlines"), - new RegexpNameMapper(@"__object.level$", "__object.outlines"), - #endregion + + #region Category + + new RegexpNameMapper(@"__object.slug$", "__object.outlines", new [] { "__object.seoInfos" }), + new RegexpNameMapper(@"__object.outline$", "__object.outlines"), + new RegexpNameMapper(@"__object.level$", "__object.outlines"), + #endregion }; } return _mappers; } - } - - public static IEnumerable MapToIndexIncludes(IEnumerable includeFields) - { + } + + public static IEnumerable MapToIndexIncludes(IEnumerable includeFields) + { IEnumerable result = new string[] { }; - foreach (var includeField in includeFields) - { - var indexField = includeField; - foreach (var mapper in Mappers) - { - if (mapper.CanMap(indexField)) - { - indexField = mapper.Map(indexField); - if (mapper.AdditionalFields != null) - { - result = result.Union(mapper.AdditionalFields); - } - } - } - result = result.Union(new string[] { indexField }); - } - return result; - } + foreach (var includeField in includeFields) + { + var indexField = includeField; + foreach (var mapper in Mappers) + { + if (mapper.CanMap(indexField)) + { + indexField = mapper.Map(indexField); + if (mapper.AdditionalFields != null) + { + result = result.Union(mapper.AdditionalFields); + } + } + } + result = result.Union(new string[] { indexField }); + } + return result; + } } -} +} diff --git a/src/VirtoCommerce.ExperienceApiModule.DigitalCatalog/Schemas/CategoryType.cs b/src/VirtoCommerce.ExperienceApiModule.DigitalCatalog/Schemas/CategoryType.cs index 7d7204d7e..f7ae4fd10 100644 --- a/src/VirtoCommerce.ExperienceApiModule.DigitalCatalog/Schemas/CategoryType.cs +++ b/src/VirtoCommerce.ExperienceApiModule.DigitalCatalog/Schemas/CategoryType.cs @@ -6,7 +6,8 @@ using GraphQL.DataLoader; using GraphQL.Types; using MediatR; -using VirtoCommerce.CoreModule.Core.Seo; +using VirtoCommerce.CatalogModule.Core.Model; +using VirtoCommerce.CoreModule.Core.Seo; using VirtoCommerce.ExperienceApiModule.Core.Extensions; using VirtoCommerce.ExperienceApiModule.Core.Schemas; using VirtoCommerce.Platform.Core.Common; @@ -109,6 +110,41 @@ public CategoryType(IMediator mediator, IDataLoaderContextAccessor dataLoader) result = result.Where(x => names.Contains(x.Name, StringComparer.InvariantCultureIgnoreCase)).ToList(); } return result; + }); + + Field>("descriptions", + arguments: new QueryArguments(new QueryArgument { Name = "type" }), + resolve: context => + { + var descriptions = context.Source.Category.Descriptions; + var cultureName = context.GetArgumentOrValue("cultureName"); + var type = context.GetArgumentOrValue("type"); + if (cultureName != null) + { + descriptions = descriptions.Where(x => string.IsNullOrEmpty(x.LanguageCode) || x.LanguageCode.EqualsInvariant(cultureName)).ToList(); + } + if (type != null) + { + descriptions = descriptions.Where(x => x.DescriptionType?.EqualsInvariant(type) ?? true).ToList(); + } + return descriptions; + }); + + Field("description", + arguments: new QueryArguments(new QueryArgument { Name = "type" }), + resolve: context => + { + var descriptions = context.Source.Category.Descriptions; + var type = context.GetArgumentOrValue("type"); + var cultureName = context.GetArgumentOrValue("cultureName"); + + if (!descriptions.IsNullOrEmpty()) + { + return descriptions.Where(x => x.DescriptionType.EqualsInvariant(type ?? "FullReview")).FirstBestMatchForLanguage(cultureName) as CategoryDescription + ?? descriptions.FirstBestMatchForLanguage(cultureName) as CategoryDescription; + } + + return null; }); } diff --git a/src/VirtoCommerce.ExperienceApiModule.DigitalCatalog/VirtoCommerce.XDigitalCatalog.csproj b/src/VirtoCommerce.ExperienceApiModule.DigitalCatalog/VirtoCommerce.XDigitalCatalog.csproj index 2a8ed8957..bf9f909b5 100644 --- a/src/VirtoCommerce.ExperienceApiModule.DigitalCatalog/VirtoCommerce.XDigitalCatalog.csproj +++ b/src/VirtoCommerce.ExperienceApiModule.DigitalCatalog/VirtoCommerce.XDigitalCatalog.csproj @@ -21,12 +21,12 @@ - + - + - + diff --git a/src/VirtoCommerce.ExperienceApiModule.Web/VirtoCommerce.ExperienceApiModule.Web.csproj b/src/VirtoCommerce.ExperienceApiModule.Web/VirtoCommerce.ExperienceApiModule.Web.csproj index 3d1316034..1a32612ba 100644 --- a/src/VirtoCommerce.ExperienceApiModule.Web/VirtoCommerce.ExperienceApiModule.Web.csproj +++ b/src/VirtoCommerce.ExperienceApiModule.Web/VirtoCommerce.ExperienceApiModule.Web.csproj @@ -34,7 +34,7 @@ - + diff --git a/src/XProfile/VirtoCommerce.ExperienceApiModule.XProfile.Tests/VirtoCommerce.ExperienceApiModule.XProfile.Tests.csproj b/src/XProfile/VirtoCommerce.ExperienceApiModule.XProfile.Tests/VirtoCommerce.ExperienceApiModule.XProfile.Tests.csproj index cbb5c6541..cb8fa090d 100644 --- a/src/XProfile/VirtoCommerce.ExperienceApiModule.XProfile.Tests/VirtoCommerce.ExperienceApiModule.XProfile.Tests.csproj +++ b/src/XProfile/VirtoCommerce.ExperienceApiModule.XProfile.Tests/VirtoCommerce.ExperienceApiModule.XProfile.Tests.csproj @@ -17,7 +17,10 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + diff --git a/src/XPurchase/VirtoCommerce.ExperienceApiModule.XOrder/VirtoCommerce.ExperienceApiModule.XOrder.csproj b/src/XPurchase/VirtoCommerce.ExperienceApiModule.XOrder/VirtoCommerce.ExperienceApiModule.XOrder.csproj index 3503842e1..f1c3e8e2e 100644 --- a/src/XPurchase/VirtoCommerce.ExperienceApiModule.XOrder/VirtoCommerce.ExperienceApiModule.XOrder.csproj +++ b/src/XPurchase/VirtoCommerce.ExperienceApiModule.XOrder/VirtoCommerce.ExperienceApiModule.XOrder.csproj @@ -22,7 +22,7 @@ - + diff --git a/src/XPurchase/VirtoCommerce.XPurchase.Domain.Tests/VirtoCommerce.XPurchase.Tests.csproj b/src/XPurchase/VirtoCommerce.XPurchase.Domain.Tests/VirtoCommerce.XPurchase.Tests.csproj index 2b90c05de..6af317a04 100644 --- a/src/XPurchase/VirtoCommerce.XPurchase.Domain.Tests/VirtoCommerce.XPurchase.Tests.csproj +++ b/src/XPurchase/VirtoCommerce.XPurchase.Domain.Tests/VirtoCommerce.XPurchase.Tests.csproj @@ -18,7 +18,10 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + diff --git a/tests/VirtoCommerce.ExperienceApiModule.Tests/VirtoCommerce.ExperienceApiModule.Tests.csproj b/tests/VirtoCommerce.ExperienceApiModule.Tests/VirtoCommerce.ExperienceApiModule.Tests.csproj index d05778dd3..133ee33ea 100644 --- a/tests/VirtoCommerce.ExperienceApiModule.Tests/VirtoCommerce.ExperienceApiModule.Tests.csproj +++ b/tests/VirtoCommerce.ExperienceApiModule.Tests/VirtoCommerce.ExperienceApiModule.Tests.csproj @@ -12,7 +12,11 @@ - + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + diff --git a/tests/VirtoCommerce.ExperienceApiModule.XOrder.Tests/VirtoCommerce.ExperienceApiModule.XOrder.Tests.csproj b/tests/VirtoCommerce.ExperienceApiModule.XOrder.Tests/VirtoCommerce.ExperienceApiModule.XOrder.Tests.csproj index e2fb4d885..5c3b1cfe6 100644 --- a/tests/VirtoCommerce.ExperienceApiModule.XOrder.Tests/VirtoCommerce.ExperienceApiModule.XOrder.Tests.csproj +++ b/tests/VirtoCommerce.ExperienceApiModule.XOrder.Tests/VirtoCommerce.ExperienceApiModule.XOrder.Tests.csproj @@ -13,7 +13,10 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + diff --git a/tests/VirtoCommerce.XDigitalCatalog.Tests/VirtoCommerce.XDigitalCatalog.Tests.csproj b/tests/VirtoCommerce.XDigitalCatalog.Tests/VirtoCommerce.XDigitalCatalog.Tests.csproj index cc9f54e79..f6c4dab06 100644 --- a/tests/VirtoCommerce.XDigitalCatalog.Tests/VirtoCommerce.XDigitalCatalog.Tests.csproj +++ b/tests/VirtoCommerce.XDigitalCatalog.Tests/VirtoCommerce.XDigitalCatalog.Tests.csproj @@ -17,7 +17,10 @@ - + + runtime; build; native; contentfiles; analyzers; buildtransitive + all +