diff --git a/src/common/throttle/redis-throttler.storage.ts b/src/common/throttle/redis-throttler.storage.ts index 2513d36..9e05693 100644 --- a/src/common/throttle/redis-throttler.storage.ts +++ b/src/common/throttle/redis-throttler.storage.ts @@ -1,13 +1,22 @@ import { Injectable } from '@nestjs/common'; import { ThrottlerStorage } from '@nestjs/throttler'; +import { ThrottlerStorageRecord } from '@nestjs/throttler/dist/throttler-storage-record.interface'; import { RedisService } from '../../infrastructure/redis/redis.service'; @Injectable() export class RedisThrottlerStorage implements ThrottlerStorage { constructor(private readonly redis: RedisService) {} - async increment(key: string, ttl: number) { - const redisKey = `throttle:${key}`; - try { const hits = await this.redis.incr(redisKey); await this.redis.expire(redisKey, Math.ceil(ttl / 1000)); return { totalHits: hits, timeToExpire: ttl }; } - catch { return { totalHits: 1, timeToExpire: ttl }; } + + async increment(key: string, ttl: number, limit: number, blockDuration: number, throttlerName: string): Promise { + const redisKey = `throttle:${throttlerName}:${key}`; + try { + const hits = await this.redis.incr(redisKey); + await this.redis.expire(redisKey, Math.ceil(ttl / 1000)); + const isBlocked = hits > limit; + const timeToBlockExpire = isBlocked ? blockDuration : 0; + return { totalHits: hits, timeToExpire: ttl, isBlocked, timeToBlockExpire }; + } catch { + return { totalHits: 1, timeToExpire: ttl, isBlocked: false, timeToBlockExpire: 0 }; + } } }