From a0e891a2f719f45e52a019aa67636f37cc3f3f7d Mon Sep 17 00:00:00 2001 From: Goro Date: Wed, 28 Jun 2023 16:25:57 +0200 Subject: [PATCH] perf(core): Improve performance of Product.facetValues resolver (#2239) --- .../entity/product-entity.resolver.ts | 21 +++++++++++-------- .../src/service/services/product.service.ts | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/core/src/api/resolvers/entity/product-entity.resolver.ts b/packages/core/src/api/resolvers/entity/product-entity.resolver.ts index 8dc5d0a8ae..9086c3be31 100644 --- a/packages/core/src/api/resolvers/entity/product-entity.resolver.ts +++ b/packages/core/src/api/resolvers/entity/product-entity.resolver.ts @@ -15,6 +15,7 @@ import { ProductVariant } from '../../../entity/product-variant/product-variant. import { LocaleStringHydrator } from '../../../service/helpers/locale-string-hydrator/locale-string-hydrator'; import { AssetService } from '../../../service/services/asset.service'; import { CollectionService } from '../../../service/services/collection.service'; +import { FacetValueService } from '../../../service/services/facet-value.service'; import { ProductOptionGroupService } from '../../../service/services/product-option-group.service'; import { ProductVariantService } from '../../../service/services/product-variant.service'; import { ProductService } from '../../../service/services/product.service'; @@ -32,6 +33,7 @@ export class ProductEntityResolver { private productOptionGroupService: ProductOptionGroupService, private assetService: AssetService, private productService: ProductService, + private facetValueService: FacetValueService, private localeStringHydrator: LocaleStringHydrator, ) {} @@ -113,15 +115,16 @@ export class ProductEntityResolver { } else { facetValues = await this.productService.getFacetValuesForProduct(ctx, product.id); } - return facetValues.filter(fv => { - if (!fv.channels.find(c => idsAreEqual(c.id, ctx.channelId))) { - return false; - } - if (apiType === 'shop' && fv.facet.isPrivate) { - return false; - } - return true; - }); + const filteredFacetValues = await this.facetValueService.findByIds( + ctx, + facetValues.map(facetValue => facetValue.id), + ); + + if (apiType === 'shop') { + return filteredFacetValues.filter(fv => !fv.facet.isPrivate); + } else { + return filteredFacetValues; + } } @ResolveField() diff --git a/packages/core/src/service/services/product.service.ts b/packages/core/src/service/services/product.service.ts index 8bee2a0626..39ec1c63c3 100644 --- a/packages/core/src/service/services/product.service.ts +++ b/packages/core/src/service/services/product.service.ts @@ -172,7 +172,7 @@ export class ProductService { .getRepository(ctx, Product) .findOne({ where: { id: productId }, - relations: ['facetValues', 'facetValues.facet', 'facetValues.channels'], + relations: ['facetValues'], }) .then(variant => !variant ? [] : variant.facetValues.map(o => this.translator.translate(o, ctx, ['facet'])),