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, 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 }; } } }