Initial WhaleTown V2 backend
This commit is contained in:
133
src/app.module.ts
Normal file
133
src/app.module.ts
Normal file
@@ -0,0 +1,133 @@
|
||||
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 { SkinGenerationModule } from './business/skin_generation/skin_generation.module';
|
||||
import { PlayerModule } from './business/player/player.module';
|
||||
import { MallModule } from './business/mall/mall.module';
|
||||
import { RoomDecorModule } from './business/room_decor/room_decor.module';
|
||||
import { CafeCompanionModule } from './business/cafe_companion/cafe_companion.module';
|
||||
import { CourseResourcesModule } from './business/course_resources/course_resources.module';
|
||||
import { RankingsModule } from './business/rankings/rankings.module';
|
||||
import { PlayerAssetsModule } from './core/db/player_assets/player_assets.module';
|
||||
import { UserWalletsModule } from './core/db/user_wallets/user_wallets.module';
|
||||
import { UserProfilesModule } from './core/db/user_profiles/user_profiles.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(),
|
||||
// ConfigModule.forRoot() 已加载 .env,在根模块统一决定档案存储实现。
|
||||
UserProfilesModule.forRoot(),
|
||||
PlayerAssetsModule.forRoot(),
|
||||
UserWalletsModule.forRoot(),
|
||||
// Zulip账号关联模块 - 全局单例,其他模块无需重复导入
|
||||
ZulipAccountsModule.forRoot(),
|
||||
LoginCoreModule,
|
||||
AuthGatewayModule, // 认证网关模块
|
||||
ChatGatewayModule, // 聊天网关模块
|
||||
ZulipGatewayModule, // Zulip网关模块(HTTP API接口)
|
||||
ZulipModule, // Zulip业务模块(业务逻辑)
|
||||
UserMgmtModule,
|
||||
AdminModule,
|
||||
SecurityCoreModule,
|
||||
LocationBroadcastModule,
|
||||
NoticeModule,
|
||||
SkinGenerationModule,
|
||||
PlayerModule,
|
||||
MallModule,
|
||||
RoomDecorModule,
|
||||
CafeCompanionModule,
|
||||
CourseResourcesModule,
|
||||
RankingsModule,
|
||||
],
|
||||
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('*');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user