app.module.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. /**
  21. * Check if running in production
  22. */
  23. const isProd = process.env.NODE_ENV === 'production';
  24. @Module({
  25. imports: [
  26. // Global config, load from .env.mgnt then .env with validation
  27. ConfigModule.forRoot({
  28. isGlobal: true,
  29. envFilePath: ['.env'],
  30. validate: validateEnvironment,
  31. }),
  32. ConfigModule.forFeature(appConfigFactory),
  33. ScheduleModule.forRoot(),
  34. RedisModule.forRootAsync({
  35. imports: [ConfigModule],
  36. inject: [ConfigService],
  37. useFactory: (config: ConfigService) => ({
  38. host: config.get<string>('REDIS_HOST')!,
  39. port: config.get<number>('REDIS_PORT')!,
  40. password: config.get<string>('REDIS_PASSWORD') || undefined,
  41. db: config.get<number>('REDIS_DB') ?? 0,
  42. keyPrefix: config.get<string>('REDIS_KEY_PREFIX') ?? 'box:',
  43. tls: config.get<boolean>('REDIS_TLS') ?? false,
  44. }),
  45. }),
  46. CacheSyncModule,
  47. CoreModule,
  48. CommonModule,
  49. SharedModule,
  50. LoggerModule.forRoot(pinoConfig),
  51. MgntBackendModule,
  52. ...(isProd ? [] : [DevVideoCacheModule]),
  53. DevtoolsModule.register({
  54. http: process.env.NODE_ENV === 'development',
  55. }),
  56. ],
  57. providers: [],
  58. })
  59. export class AppModule implements OnModuleInit {
  60. onModuleInit() {
  61. dayjs.extend(utc);
  62. dayjs.extend(timezone);
  63. }
  64. }