Browse Source

fix(core): Implement field resolvers for Facet & FacetValue

Michael Bromley 5 years ago
parent
commit
7a4d046968

+ 4 - 0
packages/core/src/api/api-internal-modules.ts

@@ -36,6 +36,8 @@ import {
     CustomerEntityResolver,
 } from './resolvers/entity/customer-entity.resolver';
 import { CustomerGroupEntityResolver } from './resolvers/entity/customer-group-entity.resolver';
+import { FacetEntityResolver } from './resolvers/entity/facet-entity.resolver';
+import { FacetValueEntityResolver } from './resolvers/entity/facet-value-entity.resolver';
 import { FulfillmentEntityResolver } from './resolvers/entity/fulfillment-entity.resolver';
 import { OrderEntityResolver } from './resolvers/entity/order-entity.resolver';
 import { OrderLineEntityResolver } from './resolvers/entity/order-line-entity.resolver';
@@ -95,6 +97,8 @@ export const entityResolvers = [
     CollectionEntityResolver,
     CustomerEntityResolver,
     CustomerGroupEntityResolver,
+    FacetEntityResolver,
+    FacetValueEntityResolver,
     FulfillmentEntityResolver,
     OrderEntityResolver,
     OrderLineEntityResolver,

+ 20 - 0
packages/core/src/api/resolvers/entity/facet-entity.resolver.ts

@@ -0,0 +1,20 @@
+import { Parent, ResolveField, Resolver } from '@nestjs/graphql';
+
+import { FacetValue } from '../../../entity/facet-value/facet-value.entity';
+import { Facet } from '../../../entity/facet/facet.entity';
+import { FacetValueService } from '../../../service/services/facet-value.service';
+import { RequestContext } from '../../common/request-context';
+import { Ctx } from '../../decorators/request-context.decorator';
+
+@Resolver('Facet')
+export class FacetEntityResolver {
+    constructor(private facetValueService: FacetValueService) {}
+
+    @ResolveField()
+    async values(@Ctx() ctx: RequestContext, @Parent() facet: Facet): Promise<FacetValue[]> {
+        if (facet.values) {
+            return facet.values;
+        }
+        return this.facetValueService.findByFacetId(facet.id, ctx.languageCode);
+    }
+}

+ 20 - 0
packages/core/src/api/resolvers/entity/facet-value-entity.resolver.ts

@@ -0,0 +1,20 @@
+import { Parent, ResolveField, Resolver } from '@nestjs/graphql';
+
+import { FacetValue } from '../../../entity/facet-value/facet-value.entity';
+import { Facet } from '../../../entity/facet/facet.entity';
+import { FacetService } from '../../../service/services/facet.service';
+import { RequestContext } from '../../common/request-context';
+import { Ctx } from '../../decorators/request-context.decorator';
+
+@Resolver('FacetValue')
+export class FacetValueEntityResolver {
+    constructor(private facetService: FacetService) {}
+
+    @ResolveField()
+    async facet(@Ctx() ctx: RequestContext, @Parent() facetValue: FacetValue): Promise<Facet | undefined> {
+        if (facetValue.facet) {
+            return facetValue.facet;
+        }
+        return this.facetService.findByFacetValueId(facetValue.id, ctx.languageCode);
+    }
+}

+ 16 - 7
packages/core/src/service/services/facet-value.service.ts

@@ -36,9 +36,7 @@ export class FacetValueService {
             .find(FacetValue, {
                 relations: ['facet'],
             })
-            .then((facetValues) =>
-                facetValues.map((facetValue) => translateDeep(facetValue, lang, ['facet'])),
-            );
+            .then(facetValues => facetValues.map(facetValue => translateDeep(facetValue, lang, ['facet'])));
     }
 
     findOne(id: ID, lang: LanguageCode): Promise<Translated<FacetValue> | undefined> {
@@ -46,7 +44,7 @@ export class FacetValueService {
             .findOne(FacetValue, id, {
                 relations: ['facet'],
             })
-            .then((facetValue) => facetValue && translateDeep(facetValue, lang, ['facet']));
+            .then(facetValue => facetValue && translateDeep(facetValue, lang, ['facet']));
     }
 
     findByIds(ids: ID[]): Promise<FacetValue[]>;
@@ -56,14 +54,25 @@ export class FacetValueService {
             .getRepository(FacetValue)
             .findByIds(ids, { relations: ['facet'] });
         if (lang) {
-            return facetValues.then((values) =>
-                values.map((facetValue) => translateDeep(facetValue, lang, ['facet'])),
+            return facetValues.then(values =>
+                values.map(facetValue => translateDeep(facetValue, lang, ['facet'])),
             );
         } else {
             return facetValues;
         }
     }
 
+    findByFacetId(id: ID, lang: LanguageCode): Promise<Array<Translated<FacetValue>>> {
+        return this.connection
+            .getRepository(FacetValue)
+            .find({
+                where: {
+                    facet: { id },
+                },
+            })
+            .then(values => values.map(facetValue => translateDeep(facetValue, lang)));
+    }
+
     async create(
         facet: Facet,
         input: CreateFacetValueInput | CreateFacetValueWithFacetInput,
@@ -72,7 +81,7 @@ export class FacetValueService {
             input,
             entityType: FacetValue,
             translationType: FacetValueTranslation,
-            beforeSave: (fv) => (fv.facet = facet),
+            beforeSave: fv => (fv.facet = facet),
         });
         return assertFound(this.findOne(facetValue.id, this.configService.defaultLanguageCode));
     }

+ 17 - 4
packages/core/src/service/services/facet.service.ts

@@ -44,7 +44,7 @@ export class FacetService {
             .build(Facet, options, { relations })
             .getManyAndCount()
             .then(([facets, totalItems]) => {
-                const items = facets.map((facet) =>
+                const items = facets.map(facet =>
                     translateDeep(facet, lang, ['values', ['values', 'facet']]),
                 );
                 return {
@@ -59,7 +59,7 @@ export class FacetService {
 
         return this.connection.manager
             .findOne(Facet, facetId, { relations })
-            .then((facet) => facet && translateDeep(facet, lang, ['values', ['values', 'facet']]));
+            .then(facet => facet && translateDeep(facet, lang, ['values', ['values', 'facet']]));
     }
 
     findByCode(facetCode: string, lang: LanguageCode): Promise<Translated<Facet> | undefined> {
@@ -72,7 +72,20 @@ export class FacetService {
                 },
                 relations,
             })
-            .then((facet) => facet && translateDeep(facet, lang, ['values', ['values', 'facet']]));
+            .then(facet => facet && translateDeep(facet, lang, ['values', ['values', 'facet']]));
+    }
+
+    async findByFacetValueId(id: ID, lang: LanguageCode): Promise<Translated<Facet> | undefined> {
+        const facet = await this.connection
+            .getRepository(Facet)
+            .createQueryBuilder('facet')
+            .leftJoinAndSelect('facet.translations', 'translations')
+            .leftJoin('facet.values', 'facetValue')
+            .where('facetValue.id = :id', { id })
+            .getOne();
+        if (facet) {
+            return translateDeep(facet, lang);
+        }
     }
 
     async create(input: CreateFacetInput): Promise<Translated<Facet>> {
@@ -98,7 +111,7 @@ export class FacetService {
         let productCount = 0;
         let variantCount = 0;
         if (facet.values.length) {
-            const counts = await this.facetValueService.checkFacetValueUsage(facet.values.map((fv) => fv.id));
+            const counts = await this.facetValueService.checkFacetValueUsage(facet.values.map(fv => fv.id));
             productCount = counts.productCount;
             variantCount = counts.variantCount;
         }