import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { APP_INTERCEPTOR } from '@nestjs/core'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { LoggerModule } from './core/utils/logger/logger.module'; import { UsersModule } from './core/db/users/users.module'; import { ZulipAccountsModule } from './core/db/zulip_accounts/zulip_accounts.module'; import { LoginCoreModule } from './core/login_core/login_core.module'; import { AuthGatewayModule } from './gateway/auth/auth.gateway.module'; import { ChatGatewayModule } from './gateway/chat/chat.gateway.module'; import { ZulipGatewayModule } from './gateway/zulip/zulip.gateway.module'; import { ZulipModule } from './business/zulip/zulip.module'; import { RedisModule } from './core/redis/redis.module'; import { AdminModule } from './business/admin/admin.module'; import { UserMgmtModule } from './business/user_mgmt/user_mgmt.module'; import { SecurityCoreModule } from './core/security_core/security_core.module'; import { LocationBroadcastModule } from './business/location_broadcast/location_broadcast.module'; import { NoticeModule } from './business/notice/notice.module'; import { MaintenanceMiddleware } from './core/security_core/maintenance.middleware'; import { ContentTypeMiddleware } from './core/security_core/content_type.middleware'; /** * 检查数据库配置是否完整 by angjustinl 2025-12-17 * * @returns 是否配置了数据库 */ function isDatabaseConfigured(): boolean { const requiredEnvVars = ['DB_HOST', 'DB_PORT', 'DB_USERNAME', 'DB_PASSWORD', 'DB_NAME']; return requiredEnvVars.every(varName => process.env[varName]); } /** * 应用主模块 * * 功能描述: * - 整合所有功能模块 * - 配置全局服务和中间件 * - 支持数据库和内存存储的自动切换 * * 存储模式选择: * - 如果配置了数据库环境变量,使用数据库模式 * - 如果未配置数据库,自动回退到内存模式 * - 内存模式适用于快速开发和测试 */ @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, envFilePath: '.env', }), LoggerModule, RedisModule, // 条件导入TypeORM模块 ...(isDatabaseConfigured() ? [ TypeOrmModule.forRoot({ type: 'mysql', host: process.env.DB_HOST, port: parseInt(process.env.DB_PORT), username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, entities: [__dirname + '/**/*.entity{.ts,.js}'], synchronize: false, // 字符集配置 - 支持中文和emoji charset: 'utf8mb4', // 添加连接超时和重试配置 connectTimeout: 10000, retryAttempts: 3, retryDelay: 3000, }), ] : []), // 根据数据库配置选择用户模块模式 isDatabaseConfigured() ? UsersModule.forDatabase() : UsersModule.forMemory(), // Zulip账号关联模块 - 全局单例,其他模块无需重复导入 ZulipAccountsModule.forRoot(), LoginCoreModule, AuthGatewayModule, // 认证网关模块 ChatGatewayModule, // 聊天网关模块 ZulipGatewayModule, // Zulip网关模块(HTTP API接口) ZulipModule, // Zulip业务模块(业务逻辑) UserMgmtModule, AdminModule, SecurityCoreModule, LocationBroadcastModule, NoticeModule, ], controllers: [AppController], providers: [ AppService, // 注意:全局拦截器现在由SecurityModule提供 ], }) export class AppModule implements NestModule { /** * 配置中间件 * * @param consumer 中间件消费者 */ configure(consumer: MiddlewareConsumer) { // 1. 维护模式中间件 - 最高优先级 consumer .apply(MaintenanceMiddleware) .forRoutes('*'); // 2. 内容类型检查中间件 consumer .apply(ContentTypeMiddleware) .forRoutes('*'); } }