How to inject repository into nestjs-rate-limiter guard

Viewed 77

I've tried to inject a repository into the guard which extends from RateLimiterGuard nestjs-rate-limiter but I got an error when call super.canActivate(ctx). It said that this.reflector.get is not a function. Is there any mistake that I have?

Here is my code:

    import { RateLimiterGuard, RateLimiterOptions } from 'nestjs-rate-limiter';
    import type { Request } from 'express';
    import config from 'config';
    import { ExecutionContext, Injectable } from '@nestjs/common';
    import { MockAccountRepository } from '../modules/mock/mock-accounts/accounts-mock.repository';
    import { Reflector } from '@nestjs/core';
    import { UserIdentifierType } from 'src/modules/users/user.types';
    
    const ipHeader = config.get<string>('server.ipHeader');
    
    @Injectable()
    export class ForwardedIpAddressRateLimiterGuard extends RateLimiterGuard {
      constructor(
        reflector: Reflector,
        options: RateLimiterOptions,
        private readonly mockAccRepo: MockAccountRepository,
      ) {
        super(options, reflector);
      }
    
      protected getIpFromRequest(request: Request): string {
        return request.get(ipHeader) || request.ip;
      }
    
      async canActivate(ctx: ExecutionContext): Promise<boolean> {
        const req = ctx.switchToHttp().getRequest();
        const phoneNumber = req.body?.phoneNumber || req.params?.phoneNumber;
    
        // If mock phone number, always allow
        if (
          await this.mockAccRepo.findOne({
            identifier: phoneNumber,
            identifierType: UserIdentifierType.PHONE_NUMBER,
          })
        ) {
          return true;
        }
    
        // Otherwise, apply rate limiting
        return super.canActivate(ctx);
      }
    }
0 Answers
Related