102 lines
3.3 KiB
TypeScript
102 lines
3.3 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 { LoginCoreModule } from './core/login_core/login_core.module';
|
||
import { AuthModule } from './business/auth/auth.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 { 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,
|
||
// 添加连接超时和重试配置
|
||
connectTimeout: 10000,
|
||
retryAttempts: 3,
|
||
retryDelay: 3000,
|
||
}),
|
||
] : []),
|
||
// 根据数据库配置选择用户模块模式
|
||
isDatabaseConfigured() ? UsersModule.forDatabase() : UsersModule.forMemory(),
|
||
LoginCoreModule,
|
||
AuthModule,
|
||
ZulipModule,
|
||
UserMgmtModule,
|
||
AdminModule,
|
||
SecurityCoreModule,
|
||
LocationBroadcastModule,
|
||
],
|
||
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('*');
|
||
}
|
||
}
|