import { Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { APP_GUARD } from '@nestjs/core'; import { JwtModule } from '@nestjs/jwt'; import { PassportModule } from '@nestjs/passport'; import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler'; import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard'; import { PrivilegesGuard } from '../../common/guards/privileges.guard'; import { PrivilegesModule } from '../privileges/privileges.module'; import { UsersModule } from '../users/users.module'; import { AuthController } from './auth.controller'; import { AuthService } from './auth.service'; import { RefreshTokensRepository } from './refresh-tokens.repository'; import { RevokedAccessTokensRepository } from './revoked-access-tokens.repository'; import { JwtStrategy } from './strategies/jwt.strategy'; @Module({ imports: [ UsersModule, PrivilegesModule, PassportModule.register({ defaultStrategy: 'jwt' }), JwtModule.registerAsync({ imports: [ConfigModule], inject: [ConfigService], useFactory: (config: ConfigService) => ({ secret: config.getOrThrow('JWT_ACCESS_SECRET'), signOptions: { expiresIn: config.getOrThrow( 'JWT_ACCESS_EXPIRES_IN', ) as `${number}${'s' | 'm' | 'h' | 'd'}`, }, }), }), ThrottlerModule.forRoot({ skipIf: () => process.env.NODE_ENV === 'test', throttlers: [{ ttl: 60_000, limit: 100 }], }), ], controllers: [AuthController], providers: [ AuthService, RefreshTokensRepository, RevokedAccessTokensRepository, JwtStrategy, // Registration order = execution order: JWT before privileges. { provide: APP_GUARD, useClass: JwtAuthGuard }, { provide: APP_GUARD, useClass: PrivilegesGuard }, { provide: APP_GUARD, useClass: ThrottlerGuard }, ], exports: [AuthService], }) export class AuthModule {}