app.module.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // apps/box-mgnt-api/src/app.module.ts
  2. import { Module, OnModuleInit } from '@nestjs/common';
  3. import { ConfigModule, ConfigService } from '@nestjs/config';
  4. import { DevtoolsModule } from '@nestjs/devtools-integration';
  5. import { ScheduleModule } from '@nestjs/schedule';
  6. import dayjs from 'dayjs';
  7. import timezone from 'dayjs/plugin/timezone.js';
  8. import utc from 'dayjs/plugin/utc.js';
  9. import { CommonModule } from '@box/common/common.module';
  10. import { SharedModule } from '@box/db/shared.module';
  11. import { appConfigFactory } from './app.config';
  12. import { validateEnvironment } from './config/env.validation';
  13. import { LoggerModule } from 'nestjs-pino';
  14. import { MgntBackendModule } from './mgnt-backend/mgnt-backend.module';
  15. import pinoConfig from '@box/common/config/pino.config';
  16. import { CacheSyncModule } from './cache-sync/cache-sync.module';
  17. import { DevVideoCacheModule } from './dev/dev-video-cache.module';
  18. import { RedisModule } from '@box/db/redis/redis.module';
  19. import { CoreModule } from '@box/core/core.module';
  20. import { StatsAdsCacheService } from './cache-sync/stats-ads-cache.service';
  21. import path from 'path';
  22. /**
  23. * Check if running in production
  24. */
  25. const isProd = process.env.NODE_ENV === 'production';
  26. @Module({
  27. imports: [
  28. // Global config, load from .env.mgnt then .env with validation
  29. ConfigModule.forRoot({
  30. isGlobal: true,
  31. envFilePath: [path.resolve(process.cwd(), '.env')],
  32. validate: validateEnvironment,
  33. }),
  34. ConfigModule.forFeature(appConfigFactory),
  35. ScheduleModule.forRoot(),
  36. RedisModule.forRootAsync({
  37. imports: [ConfigModule],
  38. inject: [ConfigService],
  39. useFactory: (config: ConfigService) => ({
  40. host: config.get<string>('REDIS_HOST')!,
  41. port: config.get<number>('REDIS_PORT')!,
  42. password: config.get<string>('REDIS_PASSWORD') || undefined,
  43. db: config.get<number>('REDIS_DB') ?? 0,
  44. keyPrefix: config.get<string>('REDIS_KEY_PREFIX') ?? 'box:',
  45. tls: config.get<boolean>('REDIS_TLS') ?? false,
  46. }),
  47. }),
  48. CacheSyncModule,
  49. CoreModule,
  50. CommonModule,
  51. SharedModule,
  52. LoggerModule.forRoot(pinoConfig),
  53. MgntBackendModule,
  54. ...(isProd ? [] : [DevVideoCacheModule]),
  55. DevtoolsModule.register({
  56. http: process.env.NODE_ENV === 'development',
  57. }),
  58. ],
  59. providers: [StatsAdsCacheService],
  60. })
  61. export class AppModule implements OnModuleInit {
  62. onModuleInit() {
  63. dayjs.extend(utc);
  64. dayjs.extend(timezone);
  65. }
  66. }