-- Create rate_limits table for persistent rate limiting -- This replaces the in-memory Map-based rate limiter CREATE TABLE IF NOT EXISTS rate_limits ( -- Unique identifier (typically IP address) identifier TEXT NOT NULL, -- Number of requests in the current time window count INTEGER NOT NULL DEFAULT 1, -- Start of the rate limit window (for sliding window algorithm) window_start TIMESTAMPTZ NOT NULL, -- Timestamp when the record was created created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- Timestamp when the record was last updated updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- Primary key ensures one record per identifier per time window PRIMARY KEY (identifier, window_start) ); -- Index for fast lookups by identifier and window_start -- This is critical for rate limiting performance CREATE INDEX IF NOT EXISTS idx_rate_limits_identifier_window ON rate_limits(identifier, window_start DESC); -- Index for cleanup queries (to remove old rate limit records) CREATE INDEX IF NOT EXISTS idx_rate_limits_window_start ON rate_limits(window_start); -- Add a comment to the table COMMENT ON TABLE rate_limits IS 'Stores rate limiting data for API endpoints. Each record tracks request counts within a time window for a specific identifier (typically IP address).'; -- Add comments to columns for documentation COMMENT ON COLUMN rate_limits.identifier IS 'Unique identifier for the client (typically IP address)'; COMMENT ON COLUMN rate_limits.count IS 'Number of requests made in the current time window'; COMMENT ON COLUMN rate_limits.window_start IS 'Start timestamp of the rate limit window'; COMMENT ON COLUMN rate_limits.created_at IS 'Timestamp when this record was first created'; COMMENT ON COLUMN rate_limits.updated_at IS 'Timestamp when this record was last updated';