import { Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { APP_GUARD } from '@nestjs/core'; import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler'; import { TypeOrmModule } from '@nestjs/typeorm'; import { AuditModule } from './audit/audit.module'; import { AdministrationModule } from './administration/administration.module'; import { AuthorizationModule } from './authorization/authorization.module'; import { PermissionsGuard } from './authorization/guards/permissions.guard'; import { AuthModule } from './auth/auth.module'; import { AccessTokenGuard } from './auth/guards/access-token.guard'; import { CsrfGuard } from './auth/guards/csrf.guard'; import { PhaseADataModule } from './core-data/phase-a-data.module'; import { HealthController } from './health.controller'; import { HealthService } from './health.service'; import { DashboardModule } from './dashboard/dashboard.module'; import { AssetMasterModule } from './asset-master/asset-master.module'; import { InspectionVisitsModule } from './inspection-visits/inspection-visits.module'; import { InspectionActsModule } from './inspection-acts/inspection-acts.module'; import { InspectionFindingsModule } from './inspection-findings/inspection-findings.module'; import { InspectionClosingModule } from './inspection-closing/inspection-closing.module'; import { AssetImportsModule } from './asset-imports/asset-imports.module'; import { InspectionReportsModule } from './inspection-reports/inspection-reports.module'; import { InspectionVerificationsModule } from './inspection-verifications/inspection-verifications.module'; import { ActAdministrationModule } from './act-administration/act-administration.module'; function required(config: ConfigService, key: string): string { const value = config.get(key); if (!value) throw new Error(`Missing required environment variable: ${key}`); return value; } @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, ignoreEnvFile: true, }), TypeOrmModule.forRootAsync({ inject: [ConfigService], useFactory: (config: ConfigService) => ({ type: 'postgres', host: required(config, 'DB_HOST'), port: Number(config.get('DB_PORT') ?? 5432), database: required(config, 'DB_NAME'), username: required(config, 'DB_APP_USER'), password: required(config, 'DB_APP_PASSWORD'), autoLoadEntities: true, synchronize: false, migrationsRun: false, logging: false, applicationName: 'dhv2-api', connectTimeoutMS: 5000, }), }), ThrottlerModule.forRoot([ { name: 'default', ttl: 60_000, limit: 120, }, ]), PhaseADataModule, AuditModule, AuthorizationModule, AuthModule, AdministrationModule, DashboardModule, AssetMasterModule, InspectionVisitsModule, InspectionActsModule, InspectionFindingsModule, InspectionClosingModule, InspectionReportsModule, InspectionVerificationsModule, ActAdministrationModule, AssetImportsModule, ], controllers: [HealthController], providers: [ HealthService, { provide: APP_GUARD, useClass: ThrottlerGuard }, { provide: APP_GUARD, useClass: AccessTokenGuard }, { provide: APP_GUARD, useClass: PermissionsGuard }, { provide: APP_GUARD, useClass: CsrfGuard }, ], }) export class AppModule {}