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 {}