forked from datawhale/whale-town-end
- 在 AppModule 中统一导入 ZulipAccountsModule.forRoot() - 移除 admin.module、auth.module、zulip.module 中的重复导入 - 添加数据库 charset: utf8mb4 配置,支持中文和 emoji
113 lines
4.0 KiB
TypeScript
113 lines
4.0 KiB
TypeScript
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('*');
|
||
}
|
||
}
|