1- import { Module , DynamicModule } from '@nestjs/common' ;
1+ import { Module , DynamicModule , Type } from '@nestjs/common' ;
22import { APP_INTERCEPTOR , APP_GUARD } from '@nestjs/core' ;
33import { ConfigModule } from '@nestjs/config' ;
44import { TypeOrmModule } from '@nestjs/typeorm' ;
@@ -40,13 +40,13 @@ import { SearchModule } from './search/search.module';
4040import { NotificationsModule } from './notifications/notifications.module' ;
4141import { EmailMarketingModule } from './email-marketing/email-marketing.module' ;
4242import { GamificationModule } from './gamification/gamification.module' ;
43- import { AssessmentModule } from './assessment/assessment.module' ;
43+ import { AssessmentsModule } from './assessment/assessment.module' ;
4444import { LearningPathsModule } from './learning-paths/learning-paths.module' ;
4545import { ModerationModule } from './moderation/moderation.module' ;
4646import { OrchestrationModule } from './orchestration/orchestration.module' ;
4747import { SecurityModule } from './security/security.module' ;
4848import { TenancyModule } from './tenancy/tenancy.module' ;
49- import { CDNModule } from './cdn/cdn.module' ;
49+ import { CdnModule } from './cdn/cdn.module' ;
5050import { AuthModule } from './auth/auth.module' ;
5151import { PaymentsModule } from './payments/payments.module' ;
5252
@@ -65,19 +65,41 @@ export class AppModule {
6565 TypeOrmModule . forRootAsync ( {
6666 imports : [ MonitoringModule ] ,
6767 inject : [ MetricsCollectionService ] ,
68- useFactory : ( metricsService : MetricsCollectionService ) => ( {
69- type : 'postgres' ,
70- host : process . env . DATABASE_HOST || 'localhost' ,
71- port : parseInt ( process . env . DATABASE_PORT || '5432' ) ,
72- username : process . env . DATABASE_USER || 'postgres' ,
73- password : process . env . DATABASE_PASSWORD || 'postgres' ,
74- database : process . env . DATABASE_NAME || 'teachlink' ,
75- autoLoadEntities : true ,
76- synchronize : process . env . NODE_ENV !== 'production' ,
77- logging : true ,
78- logger : new TypeOrmMonitoringLogger ( metricsService ) ,
79- maxQueryExecutionTime : 1000 ,
80- } ) ,
68+ useFactory : ( metricsService : MetricsCollectionService ) => {
69+ // Tune postgres pool to avoid connection exhaustion in high-traffic workloads.
70+ // Values can be overridden with DATABASE_POOL_* environment variables.
71+ const poolMax = parseInt ( process . env . DATABASE_POOL_MAX || '30' , 10 ) ;
72+ const poolMin = parseInt ( process . env . DATABASE_POOL_MIN || '5' , 10 ) ;
73+ const poolAcquireTimeoutMs = parseInt (
74+ process . env . DATABASE_POOL_ACQUIRE_TIMEOUT_MS || '10000' ,
75+ 10 ,
76+ ) ;
77+ const poolIdleTimeoutMs = parseInt (
78+ process . env . DATABASE_POOL_IDLE_TIMEOUT_MS || '30000' ,
79+ 10 ,
80+ ) ;
81+
82+ return {
83+ type : 'postgres' ,
84+ host : process . env . DATABASE_HOST || 'localhost' ,
85+ port : parseInt ( process . env . DATABASE_PORT || '5432' ) ,
86+ username : process . env . DATABASE_USER || 'postgres' ,
87+ password : process . env . DATABASE_PASSWORD || 'postgres' ,
88+ database : process . env . DATABASE_NAME || 'teachlink' ,
89+ autoLoadEntities : true ,
90+ synchronize : process . env . NODE_ENV !== 'production' ,
91+ logging : true ,
92+ logger : new TypeOrmMonitoringLogger ( metricsService ) ,
93+ maxQueryExecutionTime : 1000 ,
94+ extra : {
95+ // pg Pool options used by TypeORM postgres driver
96+ max : poolMax ,
97+ min : poolMin ,
98+ connectionTimeoutMillis : poolAcquireTimeoutMs ,
99+ idleTimeoutMillis : poolIdleTimeoutMs ,
100+ } ,
101+ } ;
102+ } ,
81103 } ) ,
82104 MonitoringModule ,
83105 EventEmitterModule . forRoot ( ) ,
@@ -106,7 +128,7 @@ export class AppModule {
106128 ] ;
107129
108130 // Feature modules - conditionally loaded based on feature flags
109- const featureModules : DynamicModule [ ] = [ ] ;
131+ const featureModules : Array < DynamicModule | Type < unknown > > = [ ] ;
110132
111133 // Auth Module
112134 if ( flags . ENABLE_AUTH ) {
@@ -273,7 +295,7 @@ export class AppModule {
273295 // Assessment Module
274296 if ( flags . ENABLE_ASSESSMENT ) {
275297 const startTime = Date . now ( ) ;
276- featureModules . push ( AssessmentModule ) ;
298+ featureModules . push ( AssessmentsModule ) ;
277299 startupLogger . recordModuleLoaded ( 'AssessmentModule' , startTime ) ;
278300 } else {
279301 startupLogger . recordModuleSkipped ( 'AssessmentModule' , 'ENABLE_ASSESSMENT=false' ) ;
@@ -327,7 +349,7 @@ export class AppModule {
327349 // CDN Module
328350 if ( flags . ENABLE_CDN ) {
329351 const startTime = Date . now ( ) ;
330- featureModules . push ( CDNModule ) ;
352+ featureModules . push ( CdnModule ) ;
331353 startupLogger . recordModuleLoaded ( 'CDNModule' , startTime ) ;
332354 } else {
333355 startupLogger . recordModuleSkipped ( 'CDNModule' , 'ENABLE_CDN=false' ) ;
0 commit comments