app.module.ts 2.3 KB

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