Browse Source

fix(core): Fix OrderLine relation customfields

jacobfrantz1 3 years ago
parent
commit
b3cb9f2cc5

+ 17 - 4
packages/core/src/service/helpers/order-modifier/order-modifier.ts

@@ -6,7 +6,7 @@ import {
     RefundOrderInput,
 } from '@vendure/common/lib/generated-types';
 import { ID } from '@vendure/common/lib/shared-types';
-import { summate } from '@vendure/common/lib/shared-utils';
+import { getGraphQlInputName, summate } from '@vendure/common/lib/shared-utils';
 
 import { RequestContext } from '../../../api/common/request-context';
 import { isGraphQlErrorResult, JustErrorResults } from '../../../common/error/error-result';
@@ -27,7 +27,9 @@ import {
 import { AdjustmentSource } from '../../../common/types/adjustment-source';
 import { idsAreEqual } from '../../../common/utils';
 import { ConfigService } from '../../../config/config.service';
+import { CustomFields } from '../../../config/custom-field/custom-field-types';
 import { TransactionalConnection } from '../../../connection/transactional-connection';
+import { VendureEntity } from '../../../entity/base/base.entity';
 import { OrderItem } from '../../../entity/order-item/order-item.entity';
 import { OrderLine } from '../../../entity/order-line/order-line.entity';
 import { OrderModification } from '../../../entity/order-modification/order-modification.entity';
@@ -138,6 +140,9 @@ export class OrderModifier {
             }),
         );
         await this.customFieldRelationService.updateRelations(ctx, OrderLine, { customFields }, orderLine);
+        const customFieldRelations = this.configService.customFields.OrderLine.filter(
+            field => field.type === 'relation',
+        ).map(field => `customFields.${field.name}`);
         const lineWithRelations = await this.connection.getEntityOrThrow(ctx, OrderLine, orderLine.id, {
             relations: [
                 'items',
@@ -145,6 +150,7 @@ export class OrderModifier {
                 'productVariant',
                 'productVariant.productVariantPrices',
                 'productVariant.taxCategory',
+                ...customFieldRelations,
             ],
         });
         lineWithRelations.productVariant = translateDeep(
@@ -626,12 +632,19 @@ export class OrderModifier {
                     return false;
                 }
             } else if (def.type === 'relation') {
-                const inputId = `${key}Id`;
+                const inputId = getGraphQlInputName(def);
                 const inputValue = inputCustomFields?.[inputId];
                 // tslint:disable-next-line:no-non-null-assertion
                 const existingRelation = (lineWithCustomFieldRelations!.customFields as any)[key];
-                if (inputValue && inputValue !== existingRelation?.id) {
-                    return false;
+                if (inputValue) {
+                    const customFieldEqual = def.list
+                        ? inputValue.every((id: ID) =>
+                              existingRelation?.find((relation: VendureEntity) => relation.id === id),
+                          )
+                        : inputValue === existingRelation?.id;
+                    if (!customFieldEqual) {
+                        return false;
+                    }
                 }
             }
         }

+ 5 - 0
packages/core/src/service/services/order.service.ts

@@ -214,6 +214,10 @@ export class OrderService {
         relations?: RelationPaths<Order>,
     ): Promise<Order | undefined> {
         const qb = this.connection.getRepository(ctx, Order).createQueryBuilder('order');
+        const orderLineCustomFieldRelations = this.configService.customFields.OrderLine.filter(
+            field => field.type === 'relation',
+        ).map(field => `lines.customFields.${field.name}`);
+
         const effectiveRelations = relations ?? [
             'channels',
             'customer',
@@ -227,6 +231,7 @@ export class OrderService {
             'lines.productVariant.translations',
             'lines.featuredAsset',
             'lines.taxCategory',
+            ...orderLineCustomFieldRelations,
             'shippingLines',
             'surcharges',
         ];