import { MiddlewareConsumer, Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { APP_FILTER, APP_PIPE } from '@nestjs/core'; import { EventEmitterModule } from '@nestjs/event-emitter'; import { ScheduleModule } from '@nestjs/schedule'; import { TypeOrmModule } from '@nestjs/typeorm'; import { I18nMiddleware, I18nModule } from 'nestjs-i18n'; import { LoggerModule } from 'nestjs-pino'; import { DataSource } from 'typeorm'; import { addTransactionalDataSource } from 'typeorm-transactional'; import { AuthModule } from './auth/auth.module'; import { CardModule } from './card/card.module'; import { CacheModule } from './common/modules/cache/cache.module'; import { LookupModule } from './common/modules/lookup/lookup.module'; import { NeoLeapModule } from './common/modules/neoleap/neoleap.module'; import { NotificationModule } from './common/modules/notification/notification.module'; import { OtpModule } from './common/modules/otp/otp.module'; import { AllExceptionsFilter, buildI18nValidationExceptionFilter } from './core/filters'; import { buildConfigOptions, buildLoggerOptions, buildTypeormOptions } from './core/module-options'; import { buildI18nOptions } from './core/module-options/i18n-options'; import { buildValidationPipe } from './core/pipes'; import { CronModule } from './cron/cron.module'; import { CustomerModule } from './customer/customer.module'; import { migrations } from './db'; import { DocumentModule } from './document/document.module'; import { GuardianModule } from './guardian/guardian.module'; import { HealthModule } from './health/health.module'; import { JuniorModule } from './junior/junior.module'; import { UserModule } from './user/user.module'; import { WebhookModule } from './webhook/webhook.module'; import { MoneyRequestModule } from './money-request/money-request.module'; @Module({ controllers: [], imports: [ ConfigModule.forRoot(buildConfigOptions()), TypeOrmModule.forRootAsync({ imports: [], inject: [ConfigService], useFactory: (config: ConfigService) => { return buildTypeormOptions(config, migrations); }, async dataSourceFactory(options) { if (!options) { throw new Error('Invalid options passed'); } return addTransactionalDataSource(new DataSource(options)); }, }), LoggerModule.forRootAsync({ useFactory: (config: ConfigService) => buildLoggerOptions(config), inject: [ConfigService], }), I18nModule.forRoot(buildI18nOptions()), CacheModule, EventEmitterModule.forRoot(), ScheduleModule.forRoot(), // App modules AuthModule, UserModule, CustomerModule, JuniorModule, GuardianModule, CardModule, NotificationModule, OtpModule, DocumentModule, LookupModule, HealthModule, CronModule, NeoLeapModule, WebhookModule, MoneyRequestModule, ], providers: [ // Global Pipes { inject: [ConfigService], provide: APP_PIPE, useFactory: (config: ConfigService) => buildValidationPipe(config), }, // Global Filters (order matters) { provide: APP_FILTER, useClass: AllExceptionsFilter }, { provide: APP_FILTER, useValue: buildI18nValidationExceptionFilter() }, ], }) export class AppModule { configure(consumer: MiddlewareConsumer) { consumer.apply(I18nMiddleware).forRoutes('*'); } }