Files
tripz-llc/backend/src/app.module.ts
T

123 lines
6.0 KiB
TypeScript

import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ThrottlerModule, ThrottlerGuard } 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 { PhoneModule } from './common/phone/phone.module';
import { DeviceModule } from './common/device/device.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 { OtpModule } from './integrations/otp/otp.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 { TenantWalletModule } from './modules/tenant-wallet/tenant-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 { VehiclesModule } from './modules/vehicles/vehicles.module';
import { GeminiModule } from './integrations/gemini/gemini.module';
import { BillingModule } from './modules/billing/billing.module';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true, load: [configuration] }),
TypeOrmModule.forRootAsync({
inject: [ConfigService],
useFactory: (cfg: ConfigService) => ({
type: 'postgres',
host: cfg.get<string>('db.host'),
port: cfg.get<number>('db.port'),
database: cfg.get<string>('db.name'),
username: cfg.get<string>('db.user'),
password: cfg.get<string>('db.password'),
// بركة اتصالات أكبر — يرفع سقف التزامن تحت الحمل العالي
extra: { max: parseInt(process.env.DB_POOL_MAX ?? '30', 10) },
// بادئة الجداول (tripz_) لعزل السيرفر المشترك — راجع docs/14
entityPrefix: cfg.get<string>('db.tablePrefix'),
synchronize: cfg.get<boolean>('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 للعمليات المالية
PhoneModule, // عالمي — تطبيع أرقام الهاتف لكل دولة
DeviceModule, // عالمي — ربط الجلسة بالجهاز
NabehModule, // عالمي — إرسال OTP واتساب (سوريا/الأردن)
OtpModule, // عالمي — توجيه OTP متعدد المزوّدين حسب الدولة + failover
NotificationsModule, // عالمي — FCM
StorageModule, // عالمي — تخزين ملفات الوثائق
GeminiModule, // عالمي — رؤية AI (وثائق + وجه)
HealthModule,
TenantsModule,
UsersModule,
AuthModule,
MapsModule,
MatchingModule,
LocationsModule,
TariffModule,
RideTypesModule,
DriversModule,
RealtimeModule,
FraudModule,
WalletModule,
TenantWalletModule, // دفترا المستأجر: إيراد وأمانات (docs/24)
CreditModule,
PaymentsModule,
BillingModule,
TripsModule,
DispatchModule,
ChatModule,
RatingsModule,
DocumentsModule,
VehiclesModule,
SeedModule,
],
providers: [
// ThrottlerModule.forRoot() وحده لا يفعل شيئاً — كان مسجَّلاً منذ البداية
// بلا أي حارس يطبّقه، فتحديد 120/60s لم يكن ساري المفعول إطلاقاً على أي
// نقطة. APP_GUARD يُفعّله عالمياً على كل نقطة تلقائياً (docs/17 — D4).
{ provide: APP_GUARD, useClass: ThrottlerGuard },
],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(TenantMiddleware).forRoutes('*');
}
}