from fastapi import HTTPException, Request from redis import Redis from ..core.config import settings import time class RateLimiter: def __init__(self, redis_client: Redis): self.redis = redis_client self.rate_limit = 100 # requests self.time_window = 60 # seconds async def check_rate_limit(self, request: Request): client_ip = request.client.host key = f"rate_limit:{client_ip}" current = int(time.time()) window_start = current - self.time_window pipeline = self.redis.pipeline() pipeline.zremrangebyscore(key, 0, window_start) pipeline.zadd(key, {str(current): current}) pipeline.zcard(key) pipeline.expire(key, self.time_window) _, _, request_count, _ = pipeline.execute() if request_count > self.rate_limit: raise HTTPException( status_code=429, detail="Too many requests. Please try again later." ) rate_limiter = RateLimiter(Redis( host=settings.REDIS_HOST, port=settings.REDIS_PORT, decode_responses=True ))