import { Module, DynamicModule, Provider, Global } from '@nestjs/common'; import { NestGdatastoreService } from './nest-gdatastore.service'; import { NestGdatastoreOptions, NestGdatastoreAsyncOptions, } from './interfaces'; @Global() @Module({ providers: [NestGdatastoreService], exports: [NestGdatastoreService], }) export class NestGdatastoreModule { /** * Registers a configured NestGdatastore Module for import into the current module */ public static register(options: NestGdatastoreOptions): DynamicModule { return { module: NestGdatastoreModule, providers: [{ provide: 'datastoreKeys', useValue: options }], imports: [], }; } /** * Registers a configured NestGdatastore Module for import into the current module * using dynamic options (factory, etc) */ public static registerAsync( dbOptions: NestGdatastoreAsyncOptions, ): DynamicModule { return { module: NestGdatastoreModule, providers: [...this.createProviders(dbOptions)], imports: [], }; } private static createProviders( options: NestGdatastoreAsyncOptions, ): Provider[] { if (options.useExisting || options.useFactory) { return [this.createOptionsProvider(options)]; } return [ this.createOptionsProvider(options), { provide: options.useClass, useClass: options.useClass, }, ]; } private static createOptionsProvider( options: NestGdatastoreAsyncOptions, ): Provider { if (options.useFactory) { return { provide: 'datastoreKeys', useFactory: options.useFactory, inject: options.inject || [], }; } // For useExisting... return { provide: 'datastoreKeys', useFactory: (configService: { get: (get) => string }) => { const extractionKeys = [ 'PROJECT_ID', 'DATASTOREKEY', 'DATASTORE_NAMESPACE', ]; let configObject = {}; extractionKeys.forEach(key => { configObject[key] = configService.get(key); }); return configObject; }, inject: [options.useExisting || options.useClass], }; } }