import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ThrottlerModule } from '@nestjs/throttler'; import configuration from './config/configuration'; import { TenantMiddleware } from './common/tenant/tenant.middleware'; import { RedisModule } from './common/redis/redis.module'; import { I18nModule } from './common/i18n/i18n.module'; import { CacheModule } from './common/cache/cache.module'; import { EntitlementsModule } from './common/entitlements/entitlements.module'; import { PlatformModule } from './common/platform/platform.module'; import { AuditModule } from './common/audit/audit.module'; import { SigningModule } from './common/signing/signing.module'; import { SeedModule } from './common/seed/seed.module'; import { HealthModule } from './modules/health/health.module'; import { TenantsModule } from './modules/tenants/tenants.module'; import { UsersModule } from './modules/users/users.module'; import { AuthModule } from './modules/auth/auth.module'; import { DriversModule } from './modules/drivers/drivers.module'; import { MatchingModule } from './modules/matching/matching.module'; import { LocationsModule } from './modules/locations/locations.module'; import { TariffModule } from './modules/tariff/tariff.module'; import { MapsModule } from './modules/maps/maps.module'; import { TripsModule } from './modules/trips/trips.module'; import { RealtimeModule } from './realtime/realtime.module'; import { FraudModule } from './modules/fraud/fraud.module'; import { ChatModule } from './modules/chat/chat.module'; import { RatingsModule } from './modules/ratings/ratings.module'; import { NabehModule } from './integrations/nabeh/nabeh.module'; import { RideTypesModule } from './modules/ride-types/ride-types.module'; import { DispatchModule } from './modules/dispatch/dispatch.module'; import { WalletModule } from './modules/wallet/wallet.module'; import { CreditModule } from './modules/credit/credit.module'; import { NotificationsModule } from './modules/notifications/notifications.module'; import { PaymentsModule } from './modules/payments/payments.module'; import { StorageModule } from './common/storage/storage.module'; import { DocumentsModule } from './modules/documents/documents.module'; import { GeminiModule } from './integrations/gemini/gemini.module'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, load: [configuration] }), TypeOrmModule.forRootAsync({ inject: [ConfigService], useFactory: (cfg: ConfigService) => ({ type: 'postgres', host: cfg.get('db.host'), port: cfg.get('db.port'), database: cfg.get('db.name'), username: cfg.get('db.user'), password: cfg.get('db.password'), // بركة اتصالات أكبر — يرفع سقف التزامن تحت الحمل العالي extra: { max: parseInt(process.env.DB_POOL_MAX ?? '30', 10) }, // بادئة الجداول (tripz_) لعزل السيرفر المشترك — راجع docs/14 entityPrefix: cfg.get('db.tablePrefix'), synchronize: cfg.get('db.synchronize'), autoLoadEntities: true, }), }), ThrottlerModule.forRoot([{ ttl: 60000, limit: 120 }]), RedisModule, // عالمي — عميل Redis للمطابقة و OTP I18nModule, // عالمي — ترجمة نصوص الإشعارات CacheModule, // عالمي — كاش-جانبي فوق Redis (خط أول قبل القاعدة) EntitlementsModule, // عالمي — استحقاقات الاشتراك + FeatureGuard PlatformModule, // عالمي — حارس السوبر-أدمن (x-platform-secret) AuditModule, // عالمي — سجل التدقيق المالي SigningModule, // عالمي — توقيع HMAC للعمليات المالية NabehModule, // عالمي — إرسال OTP واتساب NotificationsModule, // عالمي — FCM StorageModule, // عالمي — تخزين ملفات الوثائق GeminiModule, // عالمي — رؤية AI (وثائق + وجه) HealthModule, TenantsModule, UsersModule, AuthModule, MapsModule, MatchingModule, LocationsModule, TariffModule, RideTypesModule, DriversModule, RealtimeModule, FraudModule, WalletModule, CreditModule, PaymentsModule, TripsModule, DispatchModule, ChatModule, RatingsModule, DocumentsModule, SeedModule, ], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(TenantMiddleware).forRoutes('*'); } }