Files

45 lines
1.2 KiB
PL/PgSQL

-- Rate limiting extras migration
-- Keeps compatibility with existing environments created via prisma db push.
CREATE TABLE IF NOT EXISTS rate_limits (
id SERIAL PRIMARY KEY,
key VARCHAR(255) NOT NULL,
action VARCHAR(50) NOT NULL,
count INTEGER NOT NULL DEFAULT 1,
window_start TIMESTAMP NOT NULL DEFAULT NOW()
);
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM pg_constraint
WHERE conname = 'rate_limits_key_action_key'
) THEN
ALTER TABLE rate_limits
ADD CONSTRAINT rate_limits_key_action_key UNIQUE (key, action);
END IF;
END $$;
CREATE INDEX IF NOT EXISTS idx_rate_limits_key_action ON rate_limits(key, action);
CREATE INDEX IF NOT EXISTS idx_rate_limits_window_start ON rate_limits(window_start);
DO $$
BEGIN
IF EXISTS (
SELECT 1
FROM pg_class
WHERE relname = 'rate_limits'
AND relkind = 'r'
AND relpersistence <> 'u'
) THEN
ALTER TABLE rate_limits SET UNLOGGED;
END IF;
END $$;
CREATE OR REPLACE FUNCTION cleanup_rate_limits() RETURNS void AS $$
BEGIN
DELETE FROM rate_limits WHERE window_start < NOW() - INTERVAL '1 hour';
END;
$$ LANGUAGE plpgsql;