mirror of
https://github.com/yusufipk/OpenFrame.git
synced 2026-09-11 17:46:06 +00:00
45 lines
1.2 KiB
PL/PgSQL
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;
|