Browse Source

refactor(core): Move entityIdStrategy config to entityOptions

Michael Bromley 4 years ago
parent
commit
87de9aabed

+ 2 - 2
packages/core/e2e/entity-uuid-strategy.e2e-spec.ts

@@ -11,7 +11,7 @@ import { createTestEnvironment } from '@vendure/testing';
 import path from 'path';
 
 import { initialData } from '../../../e2e-common/e2e-initial-data';
-import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
+import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
 
 import { GetProductList } from './graphql/generated-e2e-admin-types';
 import { GET_PRODUCT_LIST } from './graphql/shared-definitions';
@@ -19,7 +19,7 @@ import { GET_PRODUCT_LIST } from './graphql/shared-definitions';
 describe('UuidIdStrategy', () => {
     const { server, adminClient } = createTestEnvironment({
         ...testConfig,
-        entityIdStrategy: new UuidIdStrategy(),
+        entityOptions: { entityIdStrategy: new UuidIdStrategy() },
     });
 
     beforeAll(async () => {

+ 2 - 2
packages/core/e2e/lifecycle.e2e-spec.ts

@@ -9,7 +9,7 @@ import { createTestEnvironment } from '@vendure/testing';
 import path from 'path';
 
 import { initialData } from '../../../e2e-common/e2e-initial-data';
-import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
+import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
 import { TransactionalConnection } from '../src/service/transaction/transactional-connection';
 
 const strategyInitSpy = jest.fn();
@@ -53,7 +53,7 @@ const testShippingEligChecker = new ShippingEligibilityChecker({
 describe('lifecycle hooks for configurable objects', () => {
     const { server, adminClient } = createTestEnvironment({
         ...testConfig,
-        entityIdStrategy: new TestIdStrategy(),
+        entityOptions: { entityIdStrategy: new TestIdStrategy() },
         shippingOptions: {
             shippingEligibilityCheckers: [defaultShippingEligibilityChecker, testShippingEligChecker],
         },

+ 3 - 1
packages/core/src/api/common/id-codec.service.ts

@@ -8,7 +8,9 @@ import { IdCodec } from './id-codec';
 export class IdCodecService {
     private idCodec: IdCodec;
     constructor(configService: ConfigService) {
-        this.idCodec = new IdCodec(configService.entityIdStrategy);
+        this.idCodec = new IdCodec(
+            configService.entityOptions.entityIdStrategy ?? configService.entityIdStrategy,
+        );
     }
 
     encode<T extends string | number | boolean | object | undefined>(target: T, transformKeys?: string[]): T {

+ 2 - 1
packages/core/src/bootstrap.ts

@@ -138,7 +138,8 @@ export async function preBootstrapConfig(
     });
 
     let config = getConfig();
-    setEntityIdStrategy(config.entityIdStrategy, entities);
+    const entityIdStrategy = config.entityOptions.entityIdStrategy ?? config.entityIdStrategy;
+    setEntityIdStrategy(entityIdStrategy, entities);
     const customFieldValidationResult = validateCustomFieldsConfig(config.customFields, entities);
     if (!customFieldValidationResult.valid) {
         process.exitCode = 1;

+ 13 - 21
packages/core/src/config/config.module.ts

@@ -1,5 +1,6 @@
 import { Module, OnApplicationBootstrap, OnApplicationShutdown } from '@nestjs/common';
 import { ModuleRef } from '@nestjs/core';
+import { notNullOrUndefined } from '@vendure/common/lib/shared-utils';
 
 import { ConfigurableOperationDef } from '../common/configurable-operation';
 import { Injector } from '../common/injector';
@@ -55,20 +56,12 @@ export class ConfigModule implements OnApplicationBootstrap, OnApplicationShutdo
     }
 
     private getInjectableStrategies(): InjectableStrategy[] {
-        const {
-            assetNamingStrategy,
-            assetPreviewStrategy,
-            assetStorageStrategy,
-        } = this.configService.assetOptions;
-        const {
-            productVariantPriceCalculationStrategy,
-            stockDisplayStrategy,
-        } = this.configService.catalogOptions;
-        const {
-            adminAuthenticationStrategy,
-            shopAuthenticationStrategy,
-            sessionCacheStrategy,
-        } = this.configService.authOptions;
+        const { assetNamingStrategy, assetPreviewStrategy, assetStorageStrategy } =
+            this.configService.assetOptions;
+        const { productVariantPriceCalculationStrategy, stockDisplayStrategy } =
+            this.configService.catalogOptions;
+        const { adminAuthenticationStrategy, shopAuthenticationStrategy, sessionCacheStrategy } =
+            this.configService.authOptions;
         const { taxZoneStrategy } = this.configService.taxOptions;
         const { jobQueueStrategy } = this.configService.jobQueueOptions;
         const {
@@ -82,7 +75,8 @@ export class ConfigModule implements OnApplicationBootstrap, OnApplicationShutdo
         } = this.configService.orderOptions;
         const { customFulfillmentProcess } = this.configService.shippingOptions;
         const { customPaymentProcess } = this.configService.paymentOptions;
-        const { entityIdStrategy } = this.configService;
+        const { entityIdStrategy: entityIdStrategyDeprecated } = this.configService;
+        const { entityIdStrategy } = this.configService.entityOptions;
         return [
             ...adminAuthenticationStrategy,
             ...shopAuthenticationStrategy,
@@ -96,7 +90,8 @@ export class ConfigModule implements OnApplicationBootstrap, OnApplicationShutdo
             checkoutMergeStrategy,
             orderCodeStrategy,
             orderByCodeAccessStrategy,
-            entityIdStrategy,
+            entityIdStrategyDeprecated,
+            ...[entityIdStrategy].filter(notNullOrUndefined),
             productVariantPriceCalculationStrategy,
             orderItemPriceCalculationStrategy,
             ...process,
@@ -111,11 +106,8 @@ export class ConfigModule implements OnApplicationBootstrap, OnApplicationShutdo
         const { paymentMethodHandlers, paymentMethodEligibilityCheckers } = this.configService.paymentOptions;
         const { collectionFilters } = this.configService.catalogOptions;
         const { promotionActions, promotionConditions } = this.configService.promotionOptions;
-        const {
-            shippingCalculators,
-            shippingEligibilityCheckers,
-            fulfillmentHandlers,
-        } = this.configService.shippingOptions;
+        const { shippingCalculators, shippingEligibilityCheckers, fulfillmentHandlers } =
+            this.configService.shippingOptions;
         return [
             ...(paymentMethodEligibilityCheckers || []),
             ...paymentMethodHandlers,

+ 1 - 1
packages/core/src/config/config.service.ts

@@ -55,7 +55,7 @@ export class ConfigService implements VendureConfig {
         return this.activeConfig.defaultLanguageCode;
     }
 
-    get entityOptions(): Required<EntityOptions> {
+    get entityOptions(): Required<Omit<EntityOptions, 'entityIdStrategy'>> & EntityOptions {
         return this.activeConfig.entityOptions;
     }
 

+ 13 - 1
packages/core/src/config/vendure-config.ts

@@ -752,6 +752,17 @@ export interface JobQueueOptions {
  * @since 1.3.0
  */
 export interface EntityOptions {
+    /**
+     * @description
+     * Defines the strategy used for both storing the primary keys of entities
+     * in the database, and the encoding & decoding of those ids when exposing
+     * entities via the API. The default uses a simple auto-increment integer
+     * strategy.
+     *
+     * @since 1.3.0
+     * @default AutoIncrementIdStrategy
+     */
+    entityIdStrategy?: EntityIdStrategy<any>;
     /**
      * @description
      * Channels get cached in-memory as they are accessed very frequently. This
@@ -841,6 +852,7 @@ export interface VendureConfig {
      * entities via the API. The default uses a simple auto-increment integer
      * strategy.
      *
+     * @deprecated Use entityOptions.entityIdStrategy instead
      * @default AutoIncrementIdStrategy
      */
     entityIdStrategy?: EntityIdStrategy<any>;
@@ -911,7 +923,7 @@ export interface RuntimeVendureConfig extends Required<VendureConfig> {
     authOptions: Required<AuthOptions>;
     catalogOptions: Required<CatalogOptions>;
     customFields: Required<CustomFields>;
-    entityOptions: Required<EntityOptions>;
+    entityOptions: Required<Omit<EntityOptions, 'entityIdStrategy'>> & EntityOptions;
     importExportOptions: Required<ImportExportOptions>;
     jobQueueOptions: Required<JobQueueOptions>;
     orderOptions: Required<OrderOptions>;

+ 1 - 1
packages/elasticsearch-plugin/e2e/elasticsearch-plugin-uuid.e2e-spec.ts

@@ -29,7 +29,7 @@ describe('Elasticsearch plugin with UuidIdStrategy', () => {
             apiOptions: {
                 port: 4050,
             },
-            entityIdStrategy: new UuidIdStrategy(),
+            entityOptions: { entityIdStrategy: new UuidIdStrategy() },
             logger: new DefaultLogger({ level: LogLevel.Info }),
             plugins: [
                 ElasticsearchPlugin.init({

+ 0 - 2
packages/elasticsearch-plugin/src/elasticsearch.service.ts

@@ -95,7 +95,6 @@ export class ElasticsearchService implements OnModuleInit, OnModuleDestroy {
                     indexPrefix,
                     this.options.indexSettings,
                     this.options.indexMappingProperties,
-                    this.configService.entityIdStrategy.primaryKeyType,
                 );
             } else {
                 Logger.verbose(`Index "${index}" exists`, loggerCtx);
@@ -115,7 +114,6 @@ export class ElasticsearchService implements OnModuleInit, OnModuleDestroy {
                     tempPrefix,
                     this.options.indexSettings,
                     this.options.indexMappingProperties,
-                    this.configService.entityIdStrategy.primaryKeyType,
                     false,
                 );
                 const tempIndexSettingsResult = await this.client.indices.getSettings({ index: tempIndex });

+ 0 - 1
packages/elasticsearch-plugin/src/indexer.controller.ts

@@ -215,7 +215,6 @@ export class ElasticsearchIndexerController implements OnModuleInit, OnModuleDes
                         this.options.indexPrefix,
                         this.options.indexSettings,
                         this.options.indexMappingProperties,
-                        this.configService.entityIdStrategy.primaryKeyType,
                         true,
                         `-reindex-${reindexTempName}`,
                     );

+ 0 - 1
packages/elasticsearch-plugin/src/indexing-utils.ts

@@ -10,7 +10,6 @@ export async function createIndices(
     prefix: string,
     indexSettings: object,
     indexMappingProperties: object,
-    primaryKeyType: 'increment' | 'uuid',
     mapAlias = true,
     aliasPostfix = ``,
 ) {

+ 1 - 1
packages/testing/src/config/test-config.ts

@@ -50,7 +50,7 @@ export const testConfig: Required<VendureConfig> = mergeConfig(defaultConfig, {
     },
     promotionOptions: {},
     customFields: {},
-    entityIdStrategy: new TestingEntityIdStrategy(),
+    entityOptions: { entityIdStrategy: new TestingEntityIdStrategy() },
     paymentOptions: {
         paymentMethodHandlers: [],
     },

+ 2 - 2
packages/testing/src/data-population/clear-all-tables.ts

@@ -5,14 +5,14 @@ import { createConnection } from 'typeorm';
 // tslint:disable:no-console
 // tslint:disable:no-floating-promises
 /**
- * Clears all tables in the detabase sepcified by the connectionOptions
+ * Clears all tables in the database specified by the connectionOptions
  */
 export async function clearAllTables(config: VendureConfig, logging = true) {
     if (logging) {
         console.log('Clearing all tables...');
     }
     config = await preBootstrapConfig(config);
-    const entityIdStrategy = config.entityIdStrategy;
+    const entityIdStrategy = config.entityIdStrategy ?? config.entityOptions?.entityIdStrategy;
     const connection = await createConnection({ ...config.dbConnectionOptions });
     try {
         await connection.synchronize(true);