Files
whale-town-end/src/app.module.ts
moyin d92a078fc7 refactor:将 ZulipAccountsModule 改为全局单例模块
- 在 AppModule 中统一导入 ZulipAccountsModule.forRoot()
- 移除 admin.module、auth.module、zulip.module 中的重复导入
- 添加数据库 charset: utf8mb4 配置,支持中文和 emoji
2026-01-15 14:58:28 +08:00

113 lines
4.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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('*');
}
}