import { Module } from '@nestjs/common'; import { JwtModule } from '@nestjs/jwt'; import { PassportModule } from '@nestjs/passport'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { AuthService } from './auth.service'; import { JwtStrategy } from './jwt.strategy'; import { AuthController } from '../controllers/auth.controller'; // Import domain and infrastructure dependencies import { USER_REPOSITORY } from '@domain/ports/out/user.repository'; import { ORGANIZATION_REPOSITORY } from '@domain/ports/out/organization.repository'; import { INVITATION_TOKEN_REPOSITORY } from '@domain/ports/out/invitation-token.repository'; import { TypeOrmUserRepository } from '../../infrastructure/persistence/typeorm/repositories/typeorm-user.repository'; import { TypeOrmOrganizationRepository } from '../../infrastructure/persistence/typeorm/repositories/typeorm-organization.repository'; import { TypeOrmInvitationTokenRepository } from '../../infrastructure/persistence/typeorm/repositories/typeorm-invitation-token.repository'; import { UserOrmEntity } from '../../infrastructure/persistence/typeorm/entities/user.orm-entity'; import { OrganizationOrmEntity } from '../../infrastructure/persistence/typeorm/entities/organization.orm-entity'; import { InvitationTokenOrmEntity } from '../../infrastructure/persistence/typeorm/entities/invitation-token.orm-entity'; import { InvitationService } from '../services/invitation.service'; import { InvitationsController } from '../controllers/invitations.controller'; import { EmailModule } from '../../infrastructure/email/email.module'; import { SubscriptionsModule } from '../subscriptions/subscriptions.module'; @Module({ imports: [ // Passport configuration PassportModule.register({ defaultStrategy: 'jwt' }), // JWT configuration with async factory JwtModule.registerAsync({ imports: [ConfigModule], inject: [ConfigService], useFactory: async (configService: ConfigService) => ({ secret: configService.get('JWT_SECRET'), signOptions: { expiresIn: configService.get('JWT_ACCESS_EXPIRATION', '15m'), }, }), }), // 👇 Add this to register TypeORM repositories TypeOrmModule.forFeature([UserOrmEntity, OrganizationOrmEntity, InvitationTokenOrmEntity]), // Email module for sending invitations EmailModule, // Subscriptions module for license checks SubscriptionsModule, ], controllers: [AuthController, InvitationsController], providers: [ AuthService, JwtStrategy, InvitationService, { provide: USER_REPOSITORY, useClass: TypeOrmUserRepository, }, { provide: ORGANIZATION_REPOSITORY, useClass: TypeOrmOrganizationRepository, }, { provide: INVITATION_TOKEN_REPOSITORY, useClass: TypeOrmInvitationTokenRepository, }, ], exports: [AuthService, JwtStrategy, PassportModule], }) export class AuthModule {}