rwadurian/backend/services/identity-service/src/app.module.ts

209 lines
6.7 KiB
TypeScript

import { Module, Global } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { JwtModule } from '@nestjs/jwt';
import { HttpModule } from '@nestjs/axios';
import { ScheduleModule } from '@nestjs/schedule';
import { APP_FILTER, APP_INTERCEPTOR, APP_GUARD } from '@nestjs/core';
// Config
import {
appConfig,
databaseConfig,
jwtConfig,
redisConfig,
kafkaConfig,
smsConfig,
walletConfig,
} from '@/config';
// Controllers
import { UserAccountController } from '@/api/controllers/user-account.controller';
import { HealthController } from '@/api/controllers/health.controller';
import { ReferralsController } from '@/api/controllers/referrals.controller';
import { AuthController } from '@/api/controllers/auth.controller';
import { TotpController } from '@/api/controllers/totp.controller';
import { InternalController } from '@/api/controllers/internal.controller';
import { KycController, AdminKycController } from '@/api/controllers/kyc.controller';
import {
PendingActionController,
AdminPendingActionController,
} from '@/api/controllers/pending-action.controller';
// Application Services
import { UserApplicationService } from '@/application/services/user-application.service';
import { TokenService } from '@/application/services/token.service';
import { TotpService } from '@/application/services/totp.service';
import { KycApplicationService } from '@/application/services/kyc-application.service';
import { PendingActionService } from '@/application/services/pending-action.service';
import { BlockchainWalletHandler } from '@/application/event-handlers/blockchain-wallet.handler';
import { MpcKeygenCompletedHandler } from '@/application/event-handlers/mpc-keygen-completed.handler';
import { WalletRetryTask } from '@/application/tasks/wallet-retry.task';
// Domain Services
import {
AccountSequenceGeneratorService,
UserValidatorService,
} from '@/domain/services';
import { USER_ACCOUNT_REPOSITORY } from '@/domain/repositories/user-account.repository.interface';
import { MPC_KEY_SHARE_REPOSITORY } from '@/domain/repositories/mpc-key-share.repository.interface';
// Infrastructure
import { PrismaService } from '@/infrastructure/persistence/prisma/prisma.service';
import { UserAccountRepositoryImpl } from '@/infrastructure/persistence/repositories/user-account.repository.impl';
import { MpcKeyShareRepositoryImpl } from '@/infrastructure/persistence/repositories/mpc-key-share.repository.impl';
import { RedisService } from '@/infrastructure/redis/redis.service';
import { EventPublisherService } from '@/infrastructure/kafka/event-publisher.service';
import { MpcEventConsumerService } from '@/infrastructure/kafka/mpc-event-consumer.service';
import { BlockchainEventConsumerService } from '@/infrastructure/kafka/blockchain-event-consumer.service';
import { SmsService } from '@/infrastructure/external/sms/sms.service';
import { EmailService } from '@/infrastructure/external/email/email.service';
import { BlockchainClientService } from '@/infrastructure/external/blockchain/blockchain-client.service';
import {
MpcClientService,
MpcWalletService,
} from '@/infrastructure/external/mpc';
import { StorageService } from '@/infrastructure/external/storage/storage.service';
import { AliyunKycProvider } from '@/infrastructure/external/kyc/aliyun-kyc.provider';
// Shared
import {
GlobalExceptionFilter,
TransformInterceptor,
} from '@/shared/filters/global-exception.filter';
import { JwtAuthGuard } from '@/shared/guards/jwt-auth.guard';
// ============ Infrastructure Module ============
@Global()
@Module({
imports: [
ConfigModule,
HttpModule.register({
timeout: 300000,
maxRedirects: 5,
}),
],
providers: [
PrismaService,
RedisService,
EventPublisherService,
MpcEventConsumerService,
BlockchainEventConsumerService,
SmsService,
EmailService,
MpcClientService,
MpcWalletService,
BlockchainClientService,
StorageService,
AliyunKycProvider,
{ provide: MPC_KEY_SHARE_REPOSITORY, useClass: MpcKeyShareRepositoryImpl },
],
exports: [
PrismaService,
RedisService,
EventPublisherService,
MpcEventConsumerService,
BlockchainEventConsumerService,
SmsService,
EmailService,
MpcClientService,
MpcWalletService,
BlockchainClientService,
StorageService,
AliyunKycProvider,
MPC_KEY_SHARE_REPOSITORY,
],
})
export class InfrastructureModule {}
// ============ Domain Module ============
@Module({
imports: [InfrastructureModule],
providers: [
{ provide: USER_ACCOUNT_REPOSITORY, useClass: UserAccountRepositoryImpl },
AccountSequenceGeneratorService,
UserValidatorService,
],
exports: [
USER_ACCOUNT_REPOSITORY,
AccountSequenceGeneratorService,
UserValidatorService,
],
})
export class DomainModule {}
// ============ Application Module ============
@Module({
imports: [DomainModule, InfrastructureModule, ScheduleModule.forRoot()],
providers: [
UserApplicationService,
TokenService,
TotpService,
KycApplicationService,
PendingActionService,
// Event Handlers - 通过注入到 UserApplicationService 来确保它们被初始化
BlockchainWalletHandler,
MpcKeygenCompletedHandler,
// Tasks - 定时任务
WalletRetryTask,
],
exports: [UserApplicationService, TokenService, TotpService, KycApplicationService, PendingActionService],
})
export class ApplicationModule {}
// ============ API Module ============
@Module({
imports: [ApplicationModule, InfrastructureModule],
controllers: [
HealthController,
UserAccountController,
ReferralsController,
AuthController,
TotpController,
InternalController,
KycController,
AdminKycController,
PendingActionController,
AdminPendingActionController,
],
providers: [UserAccountRepositoryImpl],
})
export class ApiModule {}
// ============ App Module ============
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
load: [
appConfig,
databaseConfig,
jwtConfig,
redisConfig,
kafkaConfig,
smsConfig,
walletConfig,
],
}),
JwtModule.registerAsync({
global: true,
inject: [ConfigService],
useFactory: (configService: ConfigService) => ({
secret: configService.get<string>('JWT_SECRET'),
signOptions: {
expiresIn: configService.get<string>('JWT_ACCESS_EXPIRES_IN', '2h'),
},
}),
}),
InfrastructureModule,
DomainModule,
ApplicationModule,
ApiModule,
],
providers: [
{ provide: APP_FILTER, useClass: GlobalExceptionFilter },
{ provide: APP_INTERCEPTOR, useClass: TransformInterceptor },
{ provide: APP_GUARD, useClass: JwtAuthGuard },
],
})
export class AppModule {}