user(); // GatewayUser from API Guard if (!$user || !$user->rate_limit_per_hour) { return $next($request); } $key = 'rate_limit:' . $user->user_id; $requests = Cache::get($key, 0); if ($requests >= $user->rate_limit_per_hour) { $ttl = Cache::get($key . ':ttl', 3600); return response()->json([ 'error' => [ 'message' => 'Rate limit exceeded. Please try again later.', 'type' => 'rate_limit_exceeded', 'code' => 429, 'limit' => $user->rate_limit_per_hour, 'current' => $requests, 'retry_after' => $ttl, ] ], 429); } // Increment counter Cache::put($key, $requests + 1, 3600); if ($requests == 0) { Cache::put($key . ':ttl', 3600, 3600); } return $next($request); } }