// apps/box-mgnt-api/src/app.module.ts import { Module, OnModuleInit } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { DevtoolsModule } from '@nestjs/devtools-integration'; import { ScheduleModule } from '@nestjs/schedule'; import dayjs from 'dayjs'; import timezone from 'dayjs/plugin/timezone.js'; import utc from 'dayjs/plugin/utc.js'; import { CommonModule } from '@box/common/common.module'; import { SharedModule } from '@box/db/shared.module'; import { appConfigFactory } from './app.config'; import { validateEnvironment } from './config/env.validation'; import { LoggerModule } from 'nestjs-pino'; import { MgntBackendModule } from './mgnt-backend/mgnt-backend.module'; import pinoConfig from '@box/common/config/pino.config'; import { CacheSyncModule } from './cache-sync/cache-sync.module'; import { DevVideoCacheModule } from './dev/dev-video-cache.module'; import { RedisModule } from '@box/db/redis/redis.module'; import { CoreModule } from '@box/core/core.module'; /** * Check if running in production */ const isProd = process.env.NODE_ENV === 'production'; @Module({ imports: [ // Global config, load from .env.mgnt then .env with validation ConfigModule.forRoot({ isGlobal: true, envFilePath: ['.env'], validate: validateEnvironment, }), ConfigModule.forFeature(appConfigFactory), ScheduleModule.forRoot(), RedisModule.forRootAsync({ imports: [ConfigModule], inject: [ConfigService], useFactory: (config: ConfigService) => ({ host: config.get('REDIS_HOST')!, port: config.get('REDIS_PORT')!, password: config.get('REDIS_PASSWORD') || undefined, db: config.get('REDIS_DB') ?? 0, keyPrefix: config.get('REDIS_KEY_PREFIX') ?? 'box:', tls: config.get('REDIS_TLS') ?? false, }), }), CacheSyncModule, CoreModule, CommonModule, SharedModule, LoggerModule.forRoot(pinoConfig), MgntBackendModule, ...(isProd ? [] : [DevVideoCacheModule]), DevtoolsModule.register({ http: process.env.NODE_ENV === 'development', }), ], providers: [], }) export class AppModule implements OnModuleInit { onModuleInit() { dayjs.extend(utc); dayjs.extend(timezone); } }