فهرست منبع

feat(core): Extend configurable operation arguments API

This allows richer configuration for ConfigurableOperations, i.e. ShippingEligibilityChecker, ShippingCalculator, CollectionFilter, PromotionCondition, PromotionAction.

Relates to #135

BREAKING CHANGE:
`adjustmentOperations` query has been replaced by `promotionConditions` and `promotionActions`

* ConfigurableOperations (ShippingEligibilityChecker, ShippingCalculator, CollectionFilter, PromotionCondition, PromotionAction, PaymentMethodHandler) have a new API for defining their arguments. For existing Vendure installations, any Shipping Methods, Promotions and Collection will need to be re-configured after the update by removing any checker/calculator/filter/condition/action and re-adding it.
Michael Bromley 6 سال پیش
والد
کامیت
d17aaa9de8
27فایلهای تغییر یافته به همراه259 افزوده شده و 146 حذف شده
  1. 22 8
      packages/common/src/generated-shop-types.ts
  2. 27 12
      packages/common/src/generated-types.ts
  3. 40 39
      packages/core/e2e/__snapshots__/promotion.e2e-spec.ts.snap
  4. 35 19
      packages/core/e2e/graphql/generated-e2e-admin-types.ts
  5. 22 8
      packages/core/e2e/graphql/generated-e2e-shop-types.ts
  6. 21 10
      packages/core/e2e/promotion.e2e-spec.ts
  7. 2 2
      packages/core/src/api/resolvers/admin/collection.resolver.ts
  8. 11 6
      packages/core/src/api/resolvers/admin/promotion.resolver.ts
  9. 3 3
      packages/core/src/api/resolvers/admin/shipping-method.resolver.ts
  10. 1 1
      packages/core/src/api/schema/admin-api/collection.api.graphql
  11. 2 1
      packages/core/src/api/schema/admin-api/promotion.api.graphql
  12. 2 2
      packages/core/src/api/schema/admin-api/shipping-method.api.graphql
  13. 14 2
      packages/core/src/api/schema/common/common-types.graphql
  14. 0 5
      packages/core/src/api/schema/type/promotion.type.graphql
  15. 23 4
      packages/core/src/common/configurable-operation.ts
  16. 1 1
      packages/core/src/config/collection/default-collection-filters.ts
  17. 9 0
      packages/core/src/config/promotion/default-promotion-actions.ts
  18. 1 1
      packages/core/src/config/promotion/default-promotion-conditions.ts
  19. 2 2
      packages/core/src/config/shipping-method/default-shipping-calculator.ts
  20. 1 1
      packages/core/src/config/shipping-method/default-shipping-eligibility-checker.ts
  21. 3 3
      packages/core/src/data-import/providers/populator/populator.ts
  22. 5 1
      packages/core/src/entity/shipping-method/shipping-method.entity.ts
  23. 2 1
      packages/core/src/service/services/collection.service.ts
  24. 7 11
      packages/core/src/service/services/promotion.service.ts
  25. 3 3
      packages/core/src/service/services/shipping-method.service.ts
  26. 0 0
      schema-admin.json
  27. 0 0
      schema-shop.json

+ 22 - 8
packages/common/src/generated-shop-types.ts

@@ -45,12 +45,6 @@ export type Adjustment = {
     amount: Scalars['Int'];
 };
 
-export type AdjustmentOperations = {
-    __typename?: 'AdjustmentOperations';
-    conditions: Array<ConfigurableOperation>;
-    actions: Array<ConfigurableOperation>;
-};
-
 export enum AdjustmentType {
     TAX = 'TAX',
     PROMOTION = 'PROMOTION',
@@ -216,13 +210,20 @@ export type ConfigArg = {
     __typename?: 'ConfigArg';
     name: Scalars['String'];
     type: Scalars['String'];
-    value?: Maybe<Scalars['String']>;
+    value: Scalars['String'];
+};
+
+export type ConfigArgDefinition = {
+    __typename?: 'ConfigArgDefinition';
+    name: Scalars['String'];
+    type: Scalars['String'];
+    config?: Maybe<Scalars['JSON']>;
 };
 
 export type ConfigArgInput = {
     name: Scalars['String'];
     type: Scalars['String'];
-    value?: Maybe<Scalars['String']>;
+    value: Scalars['String'];
 };
 
 export type ConfigurableOperation = {
@@ -232,6 +233,13 @@ export type ConfigurableOperation = {
     description: Scalars['String'];
 };
 
+export type ConfigurableOperationDefinition = {
+    __typename?: 'ConfigurableOperationDefinition';
+    code: Scalars['String'];
+    args: Array<ConfigArgDefinition>;
+    description: Scalars['String'];
+};
+
 export type ConfigurableOperationInput = {
     code: Scalars['String'];
     arguments: Array<ConfigArgInput>;
@@ -1808,6 +1816,12 @@ export type PromotionList = PaginatedList & {
     totalItems: Scalars['Int'];
 };
 
+export type PromotionOperations = {
+    __typename?: 'PromotionOperations';
+    conditions: Array<ConfigurableOperationDefinition>;
+    actions: Array<ConfigurableOperationDefinition>;
+};
+
 export type Query = {
     __typename?: 'Query';
     activeChannel: Channel;

+ 27 - 12
packages/common/src/generated-types.ts

@@ -50,12 +50,6 @@ export type Adjustment = {
   amount: Scalars['Int'],
 };
 
-export type AdjustmentOperations = {
-  __typename?: 'AdjustmentOperations',
-  conditions: Array<ConfigurableOperation>,
-  actions: Array<ConfigurableOperation>,
-};
-
 export enum AdjustmentType {
   TAX = 'TAX',
   PROMOTION = 'PROMOTION',
@@ -292,13 +286,20 @@ export type ConfigArg = {
   __typename?: 'ConfigArg',
   name: Scalars['String'],
   type: Scalars['String'],
-  value?: Maybe<Scalars['String']>,
+  value: Scalars['String'],
+};
+
+export type ConfigArgDefinition = {
+  __typename?: 'ConfigArgDefinition',
+  name: Scalars['String'],
+  type: Scalars['String'],
+  config?: Maybe<Scalars['JSON']>,
 };
 
 export type ConfigArgInput = {
   name: Scalars['String'],
   type: Scalars['String'],
-  value?: Maybe<Scalars['String']>,
+  value: Scalars['String'],
 };
 
 export type ConfigurableOperation = {
@@ -308,6 +309,13 @@ export type ConfigurableOperation = {
   description: Scalars['String'],
 };
 
+export type ConfigurableOperationDefinition = {
+  __typename?: 'ConfigurableOperationDefinition',
+  code: Scalars['String'],
+  args: Array<ConfigArgDefinition>,
+  description: Scalars['String'],
+};
+
 export type ConfigurableOperationInput = {
   code: Scalars['String'],
   arguments: Array<ConfigArgInput>,
@@ -2576,6 +2584,12 @@ export type PromotionListOptions = {
   filter?: Maybe<PromotionFilterParameter>,
 };
 
+export type PromotionOperations = {
+  __typename?: 'PromotionOperations',
+  conditions: Array<ConfigurableOperationDefinition>,
+  actions: Array<ConfigurableOperationDefinition>,
+};
+
 export type PromotionSortParameter = {
   id?: Maybe<SortOrder>,
   createdAt?: Maybe<SortOrder>,
@@ -2595,7 +2609,7 @@ export type Query = {
   activeChannel: Channel,
   collections: CollectionList,
   collection?: Maybe<Collection>,
-  collectionFilters: Array<ConfigurableOperation>,
+  collectionFilters: Array<ConfigurableOperationDefinition>,
   countries: CountryList,
   country?: Maybe<Country>,
   customerGroups: Array<CustomerGroup>,
@@ -2619,13 +2633,14 @@ export type Query = {
   product?: Maybe<Product>,
   promotion?: Maybe<Promotion>,
   promotions: PromotionList,
-  adjustmentOperations: AdjustmentOperations,
+  promotionConditions: Array<ConfigurableOperationDefinition>,
+  promotionActions: Array<ConfigurableOperationDefinition>,
   roles: RoleList,
   role?: Maybe<Role>,
   shippingMethods: ShippingMethodList,
   shippingMethod?: Maybe<ShippingMethod>,
-  shippingEligibilityCheckers: Array<ConfigurableOperation>,
-  shippingCalculators: Array<ConfigurableOperation>,
+  shippingEligibilityCheckers: Array<ConfigurableOperationDefinition>,
+  shippingCalculators: Array<ConfigurableOperationDefinition>,
   testShippingMethod: TestShippingMethodResult,
   taxCategories: Array<TaxCategory>,
   taxCategory?: Maybe<TaxCategory>,

+ 40 - 39
packages/core/e2e/__snapshots__/promotion.e2e-spec.ts.snap

@@ -1,45 +1,46 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
 exports[`Promotion resolver adjustmentOperations 1`] = `
-Object {
-  "actions": Array [
-    Object {
-      "args": Array [
-        Object {
-          "name": "facetValueIds",
-          "type": "facetValueIds",
-          "value": null,
-        },
-      ],
-      "code": "promo_action",
-      "description": "description for promo_action",
-    },
-  ],
-  "conditions": Array [
-    Object {
-      "args": Array [
-        Object {
-          "name": "arg",
-          "type": "int",
-          "value": null,
-        },
-      ],
-      "code": "promo_condition",
-      "description": "description for promo_condition",
-    },
-    Object {
-      "args": Array [
-        Object {
-          "name": "arg",
-          "type": "int",
-          "value": null,
-        },
-      ],
-      "code": "promo_condition2",
-      "description": "description for promo_condition2",
-    },
-  ],
-}
+Array [
+  Object {
+    "args": Array [
+      Object {
+        "config": null,
+        "name": "facetValueIds",
+        "type": "facetValueIds",
+      },
+    ],
+    "code": "promo_action",
+    "description": "description for promo_action",
+  },
+]
+`;
+
+exports[`Promotion resolver adjustmentOperations 2`] = `
+Array [
+  Object {
+    "args": Array [
+      Object {
+        "config": null,
+        "name": "arg",
+        "type": "int",
+      },
+    ],
+    "code": "promo_condition",
+    "description": "description for promo_condition",
+  },
+  Object {
+    "args": Array [
+      Object {
+        "config": null,
+        "name": "arg",
+        "type": "int",
+      },
+    ],
+    "code": "promo_condition2",
+    "description": "description for promo_condition2",
+  },
+]
 `;
 
 exports[`Promotion resolver createPromotion 1`] = `

+ 35 - 19
packages/core/e2e/graphql/generated-e2e-admin-types.ts

@@ -50,12 +50,6 @@ export type Adjustment = {
     amount: Scalars['Int'];
 };
 
-export type AdjustmentOperations = {
-    __typename?: 'AdjustmentOperations';
-    conditions: Array<ConfigurableOperation>;
-    actions: Array<ConfigurableOperation>;
-};
-
 export enum AdjustmentType {
     TAX = 'TAX',
     PROMOTION = 'PROMOTION',
@@ -292,13 +286,20 @@ export type ConfigArg = {
     __typename?: 'ConfigArg';
     name: Scalars['String'];
     type: Scalars['String'];
-    value?: Maybe<Scalars['String']>;
+    value: Scalars['String'];
+};
+
+export type ConfigArgDefinition = {
+    __typename?: 'ConfigArgDefinition';
+    name: Scalars['String'];
+    type: Scalars['String'];
+    config?: Maybe<Scalars['JSON']>;
 };
 
 export type ConfigArgInput = {
     name: Scalars['String'];
     type: Scalars['String'];
-    value?: Maybe<Scalars['String']>;
+    value: Scalars['String'];
 };
 
 export type ConfigurableOperation = {
@@ -308,6 +309,13 @@ export type ConfigurableOperation = {
     description: Scalars['String'];
 };
 
+export type ConfigurableOperationDefinition = {
+    __typename?: 'ConfigurableOperationDefinition';
+    code: Scalars['String'];
+    args: Array<ConfigArgDefinition>;
+    description: Scalars['String'];
+};
+
 export type ConfigurableOperationInput = {
     code: Scalars['String'];
     arguments: Array<ConfigArgInput>;
@@ -2510,6 +2518,12 @@ export type PromotionListOptions = {
     filter?: Maybe<PromotionFilterParameter>;
 };
 
+export type PromotionOperations = {
+    __typename?: 'PromotionOperations';
+    conditions: Array<ConfigurableOperationDefinition>;
+    actions: Array<ConfigurableOperationDefinition>;
+};
+
 export type PromotionSortParameter = {
     id?: Maybe<SortOrder>;
     createdAt?: Maybe<SortOrder>;
@@ -2529,7 +2543,7 @@ export type Query = {
     activeChannel: Channel;
     collections: CollectionList;
     collection?: Maybe<Collection>;
-    collectionFilters: Array<ConfigurableOperation>;
+    collectionFilters: Array<ConfigurableOperationDefinition>;
     countries: CountryList;
     country?: Maybe<Country>;
     customerGroups: Array<CustomerGroup>;
@@ -2553,13 +2567,14 @@ export type Query = {
     product?: Maybe<Product>;
     promotion?: Maybe<Promotion>;
     promotions: PromotionList;
-    adjustmentOperations: AdjustmentOperations;
+    promotionConditions: Array<ConfigurableOperationDefinition>;
+    promotionActions: Array<ConfigurableOperationDefinition>;
     roles: RoleList;
     role?: Maybe<Role>;
     shippingMethods: ShippingMethodList;
     shippingMethod?: Maybe<ShippingMethod>;
-    shippingEligibilityCheckers: Array<ConfigurableOperation>;
-    shippingCalculators: Array<ConfigurableOperation>;
+    shippingEligibilityCheckers: Array<ConfigurableOperationDefinition>;
+    shippingCalculators: Array<ConfigurableOperationDefinition>;
     testShippingMethod: TestShippingMethodResult;
     taxCategories: Array<TaxCategory>;
     taxCategory?: Maybe<TaxCategory>;
@@ -4589,10 +4604,12 @@ export type UpdatePromotionMutation = { __typename?: 'Mutation' } & {
 export type GetAdjustmentOperationsQueryVariables = {};
 
 export type GetAdjustmentOperationsQuery = { __typename?: 'Query' } & {
-    adjustmentOperations: { __typename?: 'AdjustmentOperations' } & {
-        actions: Array<{ __typename?: 'ConfigurableOperation' } & ConfigurableOperationFragment>;
-        conditions: Array<{ __typename?: 'ConfigurableOperation' } & ConfigurableOperationFragment>;
-    };
+    promotionActions: Array<
+        { __typename?: 'ConfigurableOperationDefinition' } & ConfigurableOperationFragment
+    >;
+    promotionConditions: Array<
+        { __typename?: 'ConfigurableOperationDefinition' } & ConfigurableOperationFragment
+    >;
 };
 
 export type GetRolesQueryVariables = {
@@ -5702,9 +5719,8 @@ export namespace UpdatePromotion {
 export namespace GetAdjustmentOperations {
     export type Variables = GetAdjustmentOperationsQueryVariables;
     export type Query = GetAdjustmentOperationsQuery;
-    export type AdjustmentOperations = GetAdjustmentOperationsQuery['adjustmentOperations'];
-    export type Actions = ConfigurableOperationFragment;
-    export type Conditions = ConfigurableOperationFragment;
+    export type PromotionActions = ConfigurableOperationFragment;
+    export type PromotionConditions = ConfigurableOperationFragment;
 }
 
 export namespace GetRoles {

+ 22 - 8
packages/core/e2e/graphql/generated-e2e-shop-types.ts

@@ -45,12 +45,6 @@ export type Adjustment = {
     amount: Scalars['Int'];
 };
 
-export type AdjustmentOperations = {
-    __typename?: 'AdjustmentOperations';
-    conditions: Array<ConfigurableOperation>;
-    actions: Array<ConfigurableOperation>;
-};
-
 export enum AdjustmentType {
     TAX = 'TAX',
     PROMOTION = 'PROMOTION',
@@ -216,13 +210,20 @@ export type ConfigArg = {
     __typename?: 'ConfigArg';
     name: Scalars['String'];
     type: Scalars['String'];
-    value?: Maybe<Scalars['String']>;
+    value: Scalars['String'];
+};
+
+export type ConfigArgDefinition = {
+    __typename?: 'ConfigArgDefinition';
+    name: Scalars['String'];
+    type: Scalars['String'];
+    config?: Maybe<Scalars['JSON']>;
 };
 
 export type ConfigArgInput = {
     name: Scalars['String'];
     type: Scalars['String'];
-    value?: Maybe<Scalars['String']>;
+    value: Scalars['String'];
 };
 
 export type ConfigurableOperation = {
@@ -232,6 +233,13 @@ export type ConfigurableOperation = {
     description: Scalars['String'];
 };
 
+export type ConfigurableOperationDefinition = {
+    __typename?: 'ConfigurableOperationDefinition';
+    code: Scalars['String'];
+    args: Array<ConfigArgDefinition>;
+    description: Scalars['String'];
+};
+
 export type ConfigurableOperationInput = {
     code: Scalars['String'];
     arguments: Array<ConfigArgInput>;
@@ -1808,6 +1816,12 @@ export type PromotionList = PaginatedList & {
     totalItems: Scalars['Int'];
 };
 
+export type PromotionOperations = {
+    __typename?: 'PromotionOperations';
+    conditions: Array<ConfigurableOperationDefinition>;
+    actions: Array<ConfigurableOperationDefinition>;
+};
+
 export type Query = {
     __typename?: 'Query';
     activeChannel: Channel;

+ 21 - 10
packages/core/e2e/promotion.e2e-spec.ts

@@ -6,7 +6,7 @@ import { PromotionAction, PromotionOrderAction } from '../src/config/promotion/p
 import { PromotionCondition } from '../src/config/promotion/promotion-condition';
 
 import { TEST_SETUP_TIMEOUT_MS } from './config/test-config';
-import { CONFIGURABLE_FRAGMENT, PROMOTION_FRAGMENT } from './graphql/fragments';
+import { PROMOTION_FRAGMENT } from './graphql/fragments';
 import {
     CreatePromotion,
     DeletePromotion,
@@ -134,7 +134,8 @@ describe('Promotion resolver', () => {
             GET_ADJUSTMENT_OPERATIONS,
         );
 
-        expect(result.adjustmentOperations).toMatchSnapshot();
+        expect(result.promotionActions).toMatchSnapshot();
+        expect(result.promotionConditions).toMatchSnapshot();
     });
 
     describe('deletion', () => {
@@ -254,16 +255,26 @@ export const UPDATE_PROMOTION = gql`
     ${PROMOTION_FRAGMENT}
 `;
 
+export const CONFIGURABLE_DEF_FRAGMENT = gql`
+    fragment ConfigurableOperationDef on ConfigurableOperationDefinition {
+        args {
+            name
+            type
+            config
+        }
+        code
+        description
+    }
+`;
+
 export const GET_ADJUSTMENT_OPERATIONS = gql`
     query GetAdjustmentOperations {
-        adjustmentOperations {
-            actions {
-                ...ConfigurableOperation
-            }
-            conditions {
-                ...ConfigurableOperation
-            }
+        promotionActions {
+            ...ConfigurableOperationDef
+        }
+        promotionConditions {
+            ...ConfigurableOperationDef
         }
     }
-    ${CONFIGURABLE_FRAGMENT}
+    ${CONFIGURABLE_DEF_FRAGMENT}
 `;

+ 2 - 2
packages/core/src/api/resolvers/admin/collection.resolver.ts

@@ -1,6 +1,6 @@
 import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
 import {
-    ConfigurableOperation,
+    ConfigurableOperationDefinition,
     DeletionResponse,
     MutationCreateCollectionArgs,
     MutationDeleteCollectionArgs,
@@ -34,7 +34,7 @@ export class CollectionResolver {
     async collectionFilters(
         @Ctx() ctx: RequestContext,
         @Args() args: QueryCollectionsArgs,
-    ): Promise<ConfigurableOperation[]> {
+    ): Promise<ConfigurableOperationDefinition[]> {
         return this.collectionService.getAvailableFilters();
     }
 

+ 11 - 6
packages/core/src/api/resolvers/admin/promotion.resolver.ts

@@ -1,12 +1,12 @@
 import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
 import {
+    DeletionResponse,
     MutationCreatePromotionArgs,
     MutationDeletePromotionArgs,
-    DeletionResponse,
+    MutationUpdatePromotionArgs,
     Permission,
     QueryPromotionArgs,
     QueryPromotionsArgs,
-    MutationUpdatePromotionArgs,
 } from '@vendure/common/lib/generated-types';
 import { PaginatedList } from '@vendure/common/lib/shared-types';
 
@@ -41,9 +41,14 @@ export class PromotionResolver {
 
     @Query()
     @Allow(Permission.ReadSettings)
-    adjustmentOperations(@Ctx() ctx: RequestContext) {
-        // TODO: split this into 2 queries, one for PromotionConditions and one for PromotionActions
-        return this.promotionService.getAdjustmentOperations();
+    promotionConditions(@Ctx() ctx: RequestContext) {
+        return this.promotionService.getPromotionConditions();
+    }
+
+    @Query()
+    @Allow(Permission.ReadSettings)
+    promotionActions(@Ctx() ctx: RequestContext) {
+        return this.promotionService.getPromotionActions();
     }
 
     @Mutation()
@@ -83,5 +88,5 @@ export class PromotionResolver {
             this.idCodecService.encodeConfigurableOperation(collection.actions);
         }
         return collection;
-    }
+    };
 }

+ 3 - 3
packages/core/src/api/resolvers/admin/shipping-method.resolver.ts

@@ -1,6 +1,6 @@
 import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
 import {
-    ConfigurableOperation,
+    ConfigurableOperationDefinition,
     MutationCreateShippingMethodArgs,
     MutationUpdateShippingMethodArgs,
     Permission,
@@ -38,13 +38,13 @@ export class ShippingMethodResolver {
 
     @Query()
     @Allow(Permission.ReadSettings)
-    shippingEligibilityCheckers(@Args() args: QueryShippingMethodArgs): ConfigurableOperation[] {
+    shippingEligibilityCheckers(@Args() args: QueryShippingMethodArgs): ConfigurableOperationDefinition[] {
         return this.shippingMethodService.getShippingEligibilityCheckers();
     }
 
     @Query()
     @Allow(Permission.ReadSettings)
-    shippingCalculators(@Args() args: QueryShippingMethodArgs): ConfigurableOperation[] {
+    shippingCalculators(@Args() args: QueryShippingMethodArgs): ConfigurableOperationDefinition[] {
         return this.shippingMethodService.getShippingCalculators();
     }
 

+ 1 - 1
packages/core/src/api/schema/admin-api/collection.api.graphql

@@ -1,7 +1,7 @@
 type Query {
     collections(options: CollectionListOptions): CollectionList!
     collection(id: ID!): Collection
-    collectionFilters: [ConfigurableOperation!]!
+    collectionFilters: [ConfigurableOperationDefinition!]!
 }
 
 type Mutation {

+ 2 - 1
packages/core/src/api/schema/admin-api/promotion.api.graphql

@@ -1,7 +1,8 @@
 type Query {
     promotion(id: ID!): Promotion
     promotions(options: PromotionListOptions): PromotionList!
-    adjustmentOperations: AdjustmentOperations!
+    promotionConditions: [ConfigurableOperationDefinition!]!
+    promotionActions: [ConfigurableOperationDefinition!]!
 }
 
 type Mutation {

+ 2 - 2
packages/core/src/api/schema/admin-api/shipping-method.api.graphql

@@ -1,8 +1,8 @@
 type Query {
     shippingMethods(options: ShippingMethodListOptions): ShippingMethodList!
     shippingMethod(id: ID!): ShippingMethod
-    shippingEligibilityCheckers: [ConfigurableOperation!]!
-    shippingCalculators: [ConfigurableOperation!]!
+    shippingEligibilityCheckers: [ConfigurableOperationDefinition!]!
+    shippingCalculators: [ConfigurableOperationDefinition!]!
     testShippingMethod(input: TestShippingMethodInput!): TestShippingMethodResult!
 }
 

+ 14 - 2
packages/core/src/api/schema/common/common-types.graphql

@@ -23,7 +23,13 @@ type Adjustment {
 type ConfigArg {
     name: String!
     type: String!
-    value: String
+    value: String!
+}
+
+type ConfigArgDefinition {
+    name: String!
+    type: String!
+    config: JSON
 }
 
 type ConfigurableOperation {
@@ -32,6 +38,12 @@ type ConfigurableOperation {
     description: String!
 }
 
+type ConfigurableOperationDefinition {
+    code: String!
+    args: [ConfigArgDefinition!]!
+    description: String!
+}
+
 enum DeletionResult {
     "The entity was successfully deleted"
     DELETED
@@ -47,7 +59,7 @@ type DeletionResponse {
 input ConfigArgInput {
     name: String!
     type: String!
-    value: String
+    value: String!
 }
 
 input ConfigurableOperationInput {

+ 0 - 5
packages/core/src/api/schema/type/promotion.type.graphql

@@ -8,11 +8,6 @@ type Promotion implements Node {
     actions: [ConfigurableOperation!]!
 }
 
-type AdjustmentOperations {
-    conditions: [ConfigurableOperation!]!
-    actions: [ConfigurableOperation!]!
-}
-
 type PromotionList implements PaginatedList {
     items: [Promotion!]!
     totalItems: Int!

+ 23 - 4
packages/core/src/common/configurable-operation.ts

@@ -1,13 +1,32 @@
 // prettier-ignore
-import { ConfigArg, ConfigurableOperation } from '@vendure/common/lib/generated-types';
+import { ConfigArg, ConfigurableOperationDefinition, LocalizedString, Maybe, StringFieldOption } from '@vendure/common/lib/generated-types';
 import { ConfigArgType } from '@vendure/common/lib/shared-types';
 
 import { InternalServerError } from './error/errors';
 
-export type ConfigArgDef<T extends ConfigArgType> = {
+export interface ConfigArgCommonDef<T extends ConfigArgType> {
     type: T;
+    label?: Omit<LocalizedString, '__typename'>;
+    description?: Maybe<Array<Omit<LocalizedString, '__typename'>>>;
+}
+
+export type WithArgConfig<T> = {
+    config?: T;
 };
 
+export type StringArgConfig = WithArgConfig<{
+    options?: Maybe<StringFieldOption[]>;
+}>;
+export type IntArgConfig = WithArgConfig<{
+    inputType?: 'default' | 'percentage' | 'money';
+}>;
+
+export type ConfigArgDef<T extends ConfigArgType> = T extends 'string'
+    ? ConfigArgCommonDef<'string'> & StringArgConfig
+    : T extends 'int'
+    ? ConfigArgCommonDef<'int'> & IntArgConfig
+    : ConfigArgCommonDef<T> & WithArgConfig<never>;
+
 export type ConfigArgs<T extends ConfigArgType> = {
     [name: string]: ConfigArgDef<T>;
 };
@@ -48,11 +67,11 @@ export interface ConfigurableOperationDef {
  * Convert a ConfigurableOperationDef into a ConfigurableOperation object, typically
  * so that it can be sent via the API.
  */
-export function configurableDefToOperation(def: ConfigurableOperationDef): ConfigurableOperation {
+export function configurableDefToOperation(def: ConfigurableOperationDef): ConfigurableOperationDefinition {
     return {
         code: def.code,
         description: def.description,
-        args: Object.entries(def.args).map(([name, arg]) => ({ name, type: arg.type })),
+        args: Object.entries(def.args).map(([name, arg]) => ({ name, type: arg.type, config: arg.config })),
     };
 }
 

+ 1 - 1
packages/core/src/config/collection/default-collection-filters.ts

@@ -39,7 +39,7 @@ export const facetValueCollectionFilter = new CollectionFilter({
 
 export const variantNameCollectionFilter = new CollectionFilter({
     args: {
-        operator: { type: 'string' },
+        operator: { type: 'stringOperator' },
         term: { type: 'string' },
     },
     code: 'variant-name-filter',

+ 9 - 0
packages/core/src/config/promotion/default-promotion-actions.ts

@@ -5,6 +5,9 @@ export const orderPercentageDiscount = new PromotionOrderAction({
     args: {
         discount: {
             type: 'int',
+            config: {
+                inputType: 'percentage',
+            },
         },
     },
     execute(order, args) {
@@ -18,6 +21,9 @@ export const itemPercentageDiscount = new PromotionItemAction({
     args: {
         discount: {
             type: 'int',
+            config: {
+                inputType: 'percentage',
+            },
         },
     },
     execute(orderItem, orderLine, args) {
@@ -46,6 +52,9 @@ export const discountOnItemWithFacets = new PromotionItemAction({
     args: {
         discount: {
             type: 'int',
+            config: {
+                inputType: 'percentage',
+            },
         },
         facets: {
             type: 'facetValueIds',

+ 1 - 1
packages/core/src/config/promotion/default-promotion-conditions.ts

@@ -6,7 +6,7 @@ export const minimumOrderAmount = new PromotionCondition({
     description: 'If order total is greater than { amount }',
     code: 'minimum_order_amount',
     args: {
-        amount: { type: 'int' },
+        amount: { type: 'int', config: { inputType: 'money' } },
         taxInclusive: { type: 'boolean' },
     },
     check(order, args) {

+ 2 - 2
packages/core/src/config/shipping-method/default-shipping-calculator.ts

@@ -4,8 +4,8 @@ export const defaultShippingCalculator = new ShippingCalculator({
     code: 'default-shipping-calculator',
     description: 'Default Flat-Rate Shipping Calculator',
     args: {
-        rate: { type: 'int' },
-        taxRate: { type: 'int' },
+        rate: { type: 'int', config: { inputType: 'money' } },
+        taxRate: { type: 'int', config: { inputType: 'percentage' } },
     },
     calculate: (order, args) => {
         return { price: args.rate, priceWithTax: args.rate * ((100 + args.taxRate) / 100) };

+ 1 - 1
packages/core/src/config/shipping-method/default-shipping-eligibility-checker.ts

@@ -4,7 +4,7 @@ export const defaultShippingEligibilityChecker = new ShippingEligibilityChecker(
     code: 'default-shipping-eligibility-checker',
     description: 'Default Shipping Eligibility Checker',
     args: {
-        orderMinimum: { type: 'int' },
+        orderMinimum: { type: 'int', config: { inputType: 'money' } },
     },
     check: (order, args) => {
         return order.total >= args.orderMinimum;

+ 3 - 3
packages/core/src/data-import/providers/populator/populator.ts

@@ -222,13 +222,13 @@ export class Populator {
             await this.shippingMethodService.create({
                 checker: {
                     code: defaultShippingEligibilityChecker.code,
-                    arguments: [{ name: 'orderMinimum', value: '0', type: 'int' /* TODO: money */ }],
+                    arguments: [{ name: 'orderMinimum', value: '0', type: 'int' }],
                 },
                 calculator: {
                     code: defaultShippingCalculator.code,
                     arguments: [
-                        { name: 'rate', value: method.price.toString(), type: 'int' /* TODO: money */ },
-                        { name: 'taxRate', value: '0', type: 'int' /* TODO: percentage */ },
+                        { name: 'rate', value: method.price.toString(), type: 'int' },
+                        { name: 'taxRate', value: '0', type: 'int' },
                     ],
                 },
                 description: method.name,

+ 5 - 1
packages/core/src/entity/shipping-method/shipping-method.entity.ts

@@ -48,7 +48,11 @@ export class ShippingMethod extends VendureEntity implements ChannelAware {
     async apply(order: Order): Promise<ShippingPrice | undefined> {
         const calculator = this.allCalculators[this.calculator.code];
         if (calculator) {
-            return calculator.calculate(order, this.calculator.args);
+            const { price, priceWithTax } = await calculator.calculate(order, this.calculator.args);
+            return {
+                price: Math.round(price),
+                priceWithTax: Math.round(priceWithTax),
+            };
         }
     }
 

+ 2 - 1
packages/core/src/service/services/collection.service.ts

@@ -2,6 +2,7 @@ import { OnModuleInit } from '@nestjs/common';
 import { InjectConnection } from '@nestjs/typeorm';
 import {
     ConfigurableOperation,
+    ConfigurableOperationDefinition,
     CreateCollectionInput,
     DeletionResponse,
     DeletionResult,
@@ -110,7 +111,7 @@ export class CollectionService implements OnModuleInit {
         return translateDeep(collection, ctx.languageCode, ['parent']);
     }
 
-    getAvailableFilters(): ConfigurableOperation[] {
+    getAvailableFilters(): ConfigurableOperationDefinition[] {
         return this.availableFilters.map(configurableDefToOperation);
     }
 

+ 7 - 11
packages/core/src/service/services/promotion.service.ts

@@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common';
 import { InjectConnection } from '@nestjs/typeorm';
 import {
     ConfigurableOperation,
+    ConfigurableOperationDefinition,
     ConfigurableOperationInput,
     CreatePromotionInput,
     DeletionResponse,
@@ -62,17 +63,12 @@ export class PromotionService {
         return this.connection.manager.findOne(Promotion, adjustmentSourceId, { where: { deletedAt: null } });
     }
 
-    /**
-     * Returns all available AdjustmentOperations.
-     */
-    getAdjustmentOperations(): {
-        conditions: ConfigurableOperation[];
-        actions: ConfigurableOperation[];
-    } {
-        return {
-            conditions: this.availableConditions.map(configurableDefToOperation),
-            actions: this.availableActions.map(configurableDefToOperation),
-        };
+    getPromotionConditions(): ConfigurableOperationDefinition[] {
+        return this.availableConditions.map(configurableDefToOperation);
+    }
+
+    getPromotionActions(): ConfigurableOperationDefinition[] {
+        return this.availableActions.map(configurableDefToOperation);
     }
 
     /**

+ 3 - 3
packages/core/src/service/services/shipping-method.service.ts

@@ -1,7 +1,7 @@
 import { Injectable } from '@nestjs/common';
 import { InjectConnection } from '@nestjs/typeorm';
 import {
-    ConfigurableOperation,
+    ConfigurableOperationDefinition,
     CreateShippingMethodInput,
     UpdateShippingMethodInput,
 } from '@vendure/common/lib/generated-types';
@@ -86,11 +86,11 @@ export class ShippingMethodService {
         return assertFound(this.findOne(shippingMethod.id));
     }
 
-    getShippingEligibilityCheckers(): ConfigurableOperation[] {
+    getShippingEligibilityCheckers(): ConfigurableOperationDefinition[] {
         return this.shippingConfiguration.shippingEligibilityCheckers.map(configurableDefToOperation);
     }
 
-    getShippingCalculators(): ConfigurableOperation[] {
+    getShippingCalculators(): ConfigurableOperationDefinition[] {
         return this.shippingConfiguration.shippingCalculators.map(configurableDefToOperation);
     }
 

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
schema-admin.json


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
schema-shop.json


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است