gcx/backend/services/auth-service/src/auth.module.ts

108 lines
4.8 KiB
TypeScript

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
// Domain entities
import { User } from './domain/entities/user.entity';
import { RefreshToken } from './domain/entities/refresh-token.entity';
import { SmsVerification } from './domain/entities/sms-verification.entity';
import { SmsLog } from './domain/entities/sms-log.entity';
import { EmailVerification } from './domain/entities/email-verification.entity';
import { EmailLog } from './domain/entities/email-log.entity';
// Domain repository interfaces
import { USER_REPOSITORY } from './domain/repositories/user.repository.interface';
import { REFRESH_TOKEN_REPOSITORY } from './domain/repositories/refresh-token.repository.interface';
import { SMS_VERIFICATION_REPOSITORY } from './domain/repositories/sms-verification.repository.interface';
import { SMS_LOG_REPOSITORY } from './domain/repositories/sms-log.repository.interface';
import { EMAIL_VERIFICATION_REPOSITORY } from './domain/repositories/email-verification.repository.interface';
import { EMAIL_LOG_REPOSITORY } from './domain/repositories/email-log.repository.interface';
// Infrastructure implementations
import { UserRepository } from './infrastructure/persistence/user.repository';
import { RefreshTokenRepository } from './infrastructure/persistence/refresh-token.repository';
import { SmsVerificationRepository } from './infrastructure/persistence/sms-verification.repository';
import { SmsLogRepository } from './infrastructure/persistence/sms-log.repository';
import { EmailVerificationRepository } from './infrastructure/persistence/email-verification.repository';
import { EmailLogRepository } from './infrastructure/persistence/email-log.repository';
import { JwtStrategy } from './infrastructure/strategies/jwt.strategy';
import { TokenBlacklistService } from './infrastructure/redis/token-blacklist.service';
import { SmsCodeService } from './infrastructure/redis/sms-code.service';
import { EmailCodeService } from './infrastructure/redis/email-code.service';
// SMS Provider
import { SMS_PROVIDER } from './infrastructure/sms/sms-provider.interface';
import { ConsoleSmsProvider } from './infrastructure/sms/console-sms.provider';
import { AliyunSmsProvider } from './infrastructure/sms/aliyun-sms.provider';
// Email Provider
import { EMAIL_PROVIDER } from './infrastructure/email/email-provider.interface';
import { ConsoleEmailProvider } from './infrastructure/email/console-email.provider';
import { GmailProvider } from './infrastructure/email/gmail.provider';
// Application services
import { AuthService } from './application/services/auth.service';
import { TokenService } from './application/services/token.service';
import { SmsService } from './application/services/sms.service';
import { EmailService } from './application/services/email.service';
import { EventPublisherService } from './application/services/event-publisher.service';
// Interface controllers
import { AuthController } from './interface/http/controllers/auth.controller';
import { AdminSmsController } from './interface/http/controllers/admin-sms.controller';
@Module({
imports: [
TypeOrmModule.forFeature([User, RefreshToken, SmsVerification, SmsLog, EmailVerification, EmailLog]),
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.register({
secret: process.env.JWT_ACCESS_SECRET || 'dev-access-secret',
signOptions: { expiresIn: process.env.JWT_ACCESS_EXPIRY || '15m' },
}),
],
controllers: [AuthController, AdminSmsController],
providers: [
// Infrastructure -> Domain port binding
{ provide: USER_REPOSITORY, useClass: UserRepository },
{ provide: REFRESH_TOKEN_REPOSITORY, useClass: RefreshTokenRepository },
{ provide: SMS_VERIFICATION_REPOSITORY, useClass: SmsVerificationRepository },
{ provide: SMS_LOG_REPOSITORY, useClass: SmsLogRepository },
{ provide: EMAIL_VERIFICATION_REPOSITORY, useClass: EmailVerificationRepository },
{ provide: EMAIL_LOG_REPOSITORY, useClass: EmailLogRepository },
// SMS Provider: toggle by SMS_ENABLED env var
{
provide: SMS_PROVIDER,
useClass:
process.env.SMS_ENABLED === 'true'
? AliyunSmsProvider
: ConsoleSmsProvider,
},
// Email Provider: toggle by EMAIL_ENABLED env var
{
provide: EMAIL_PROVIDER,
useClass:
process.env.EMAIL_ENABLED === 'true'
? GmailProvider
: ConsoleEmailProvider,
},
// Infrastructure
JwtStrategy,
TokenBlacklistService,
SmsCodeService,
EmailCodeService,
// Application services
AuthService,
TokenService,
SmsService,
EmailService,
EventPublisherService,
],
exports: [AuthService, TokenService, SmsService, EmailService],
})
export class AuthModule {}