Skip to content
Snippets Groups Projects
engine.module.ts 1.56 KiB
Newer Older
import { HttpModule, HttpService } from '@nestjs/axios';
import { DynamicModule, Global, Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { join } from 'path';
import { ENGINE_MODULE_OPTIONS, ENGINE_SERVICE } from './engine.constants';
import { EngineController } from './engine.controller';
Steve Reis's avatar
Steve Reis committed
import { IEngineOptions, IEngineService } from './engine.interfaces';
import { EngineResolver } from './engine.resolver';

@Global()
@Module({})
export class EngineModule {
  static async forRootAsync(options: IEngineOptions): Promise<DynamicModule> {
    const optionsProvider = {
      provide: ENGINE_MODULE_OPTIONS,
      useValue: options,
    };

    const engineProvider = {
      provide: ENGINE_SERVICE,
      useFactory: async (httpService: HttpService) => {
        return await this.createEngineConnection(options, httpService)
      },
      inject: [HttpService]
    };

    return {
      module: EngineModule,
      imports: [
        HttpModule,
        GraphQLModule.forRoot({
          autoSchemaFile: join(process.cwd(), 'src/schema.gql'),
        }),
      ],
      providers: [
        optionsProvider,
        engineProvider,
        EngineResolver
      ],
      controllers: [
        EngineController
      ],
      exports: [optionsProvider, engineProvider],
    }
  }

  private static async createEngineConnection(options: IEngineOptions, httpService: HttpService): Promise<IEngineService> {
    let service = await import(`./connectors/${options.type}/main.connector`);

    return new service.default(options, httpService);
  }

}