@chelseaapps/recommender documentation

dependenciesLegend Declarations Module Bootstrap Providers Exportscluster_RecommenderModulecluster_RecommenderModule_providerscluster_RecommenderModule_exportsRecommenderServiceRecommenderServiceRecommenderModuleRecommenderModuleRecommenderModule->RecommenderServiceRecommenderServiceRecommenderServiceRecommenderService->RecommenderModule

import { Module, DynamicModule, Provider, Global, CacheModule } from '@nestjs/common';
import { RecommenderService } from './recommender.service';
import { RECOMMENDER_OPTIONS } from './constants';
import { RecommenderOptions, RecommenderAsyncOptions, RecommenderOptionsFactory } from './interfaces';
import { createRecommenderProviders } from './recommender.providers';
import { createRecommenderImports } from './recommender.imports';

@Global()
@Module({
    providers: [RecommenderService],
    exports: [RecommenderService],
})
export class RecommenderModule {
    /**
     * Registers a configured Recommender Module for import into the current module
     */
    public static register(options: RecommenderOptions): DynamicModule {
        return {
            imports: createRecommenderImports(options),
            module: RecommenderModule,
            global: options.isGlobal ?? true,
            providers: createRecommenderProviders(options),
        };
    }

    /**
     * Registers a configured Recommender Module for import into the current module
     * using dynamic options (factory, etc)
     */
    public static registerAsync(options: RecommenderAsyncOptions): DynamicModule {
        const providers = [...this.createProviders(options)];

        return {
            imports: [
                CacheModule.registerAsync({
                    imports: options.imports || [],
                    useFactory: async (options: RecommenderOptions) => ({
                        host: options.cache.redis.host,
                        port: options.cache.redis.port,
                    }),
                    inject: [RECOMMENDER_OPTIONS],
                    extraProviders: providers,
                }),
            ],
            global: options.isGlobal ?? true,
            module: RecommenderModule,
            providers,
        };
    }

    private static createProviders(options: RecommenderAsyncOptions): Provider[] {
        if (options.useExisting || options.useFactory) {
            return [this.createOptionsProvider(options)];
        }

        return [
            this.createOptionsProvider(options),
            {
                provide: options.useClass,
                useClass: options.useClass,
            },
        ];
    }

    private static createOptionsProvider(options: RecommenderAsyncOptions): Provider {
        if (options.useFactory) {
            return {
                provide: RECOMMENDER_OPTIONS,
                useFactory: options.useFactory,
                inject: options.inject || [],
            };
        }

        // For useExisting...
        return {
            provide: RECOMMENDER_OPTIONS,
            useFactory: async (optionsFactory: RecommenderOptionsFactory) =>
                await optionsFactory.createRecommenderOptions(),
            inject: [options.useExisting || options.useClass],
        };
    }
}

Was this helpful?