Просмотр исходного кода

fix(core): Add resolver for Product.facetValues

Fixes #449
Michael Bromley 5 лет назад
Родитель
Сommit
163a32fd2d

+ 13 - 1
packages/core/src/api/resolvers/entity/product-entity.resolver.ts

@@ -1,10 +1,10 @@
 import { Parent, ResolveField, Resolver } from '@nestjs/graphql';
-import { ID } from '@vendure/common/lib/shared-types';
 
 import { Translated } from '../../../common/types/locale-types';
 import { Asset } from '../../../entity/asset/asset.entity';
 import { Channel } from '../../../entity/channel/channel.entity';
 import { Collection } from '../../../entity/collection/collection.entity';
+import { FacetValue } from '../../../entity/facet-value/facet-value.entity';
 import { ProductOptionGroup } from '../../../entity/product-option-group/product-option-group.entity';
 import { ProductVariant } from '../../../entity/product-variant/product-variant.entity';
 import { Product } from '../../../entity/product/product.entity';
@@ -25,6 +25,7 @@ export class ProductEntityResolver {
         private collectionService: CollectionService,
         private productOptionGroupService: ProductOptionGroupService,
         private assetService: AssetService,
+        private productService: ProductService,
     ) {}
 
     @ResolveField()
@@ -54,6 +55,17 @@ export class ProductEntityResolver {
         return this.productOptionGroupService.getOptionGroupsByProductId(ctx, product.id);
     }
 
+    @ResolveField()
+    async facetValues(
+        @Ctx() ctx: RequestContext,
+        @Parent() product: Product,
+    ): Promise<Array<Translated<FacetValue>>> {
+        if (product.facetValues) {
+            return product.facetValues as Array<Translated<FacetValue>>;
+        }
+        return this.productService.getFacetValuesForProduct(ctx, product.id);
+    }
+
     @ResolveField()
     async featuredAsset(@Ctx() ctx: RequestContext, @Parent() product: Product): Promise<Asset | undefined> {
         if (product.featuredAsset) {

+ 10 - 0
packages/core/src/service/services/product.service.ts

@@ -18,6 +18,7 @@ import { ListQueryOptions } from '../../common/types/common-types';
 import { Translated } from '../../common/types/locale-types';
 import { assertFound, idsAreEqual } from '../../common/utils';
 import { Channel } from '../../entity/channel/channel.entity';
+import { FacetValue } from '../../entity/facet-value/facet-value.entity';
 import { ProductOptionGroup } from '../../entity/product-option-group/product-option-group.entity';
 import { ProductTranslation } from '../../entity/product/product-translation.entity';
 import { Product } from '../../entity/product/product.entity';
@@ -110,6 +111,15 @@ export class ProductService {
         return product.channels;
     }
 
+    getFacetValuesForProduct(ctx: RequestContext, productId: ID): Promise<Array<Translated<FacetValue>>> {
+        return this.connection
+            .getRepository(Product)
+            .findOne(productId, { relations: ['facetValues', 'facetValues.facet'] })
+            .then(variant =>
+                !variant ? [] : variant.facetValues.map(o => translateDeep(o, ctx.languageCode, ['facet'])),
+            );
+    }
+
     async findOneBySlug(ctx: RequestContext, slug: string): Promise<Translated<Product> | undefined> {
         const translation = await this.connection.getRepository(ProductTranslation).findOne({
             relations: ['base'],