46 lines
1.6 KiB
SQL
46 lines
1.6 KiB
SQL
-- Notification system schema
|
|
CREATE TYPE NOTIFICATION_CHANNEL_TYPE AS ENUM ('webhook', 'telegram');
|
|
CREATE TYPE NOTIFICATION_STATUS AS ENUM ('pending', 'delivering', 'delivered', 'failed', 'dead');
|
|
|
|
CREATE TABLE notification_channels (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
type NOTIFICATION_CHANNEL_TYPE NOT NULL,
|
|
enabled BOOLEAN DEFAULT true,
|
|
config JSONB NOT NULL DEFAULT '{}',
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE notification_subscriptions (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
channel_id BIGINT NOT NULL REFERENCES notification_channels(id) ON DELETE CASCADE,
|
|
event_type EVENT_TYPE NOT NULL,
|
|
UNIQUE(channel_id, event_type)
|
|
);
|
|
|
|
CREATE TABLE notification_queue (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
channel_id BIGINT NOT NULL REFERENCES notification_channels(id) ON DELETE CASCADE,
|
|
event_type EVENT_TYPE NOT NULL,
|
|
title TEXT NOT NULL,
|
|
message JSONB NOT NULL DEFAULT '{}',
|
|
status NOTIFICATION_STATUS DEFAULT 'pending',
|
|
attempts INT DEFAULT 0,
|
|
max_attempts INT DEFAULT 5,
|
|
last_error TEXT,
|
|
next_retry_at TIMESTAMPTZ,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
delivered_at TIMESTAMPTZ
|
|
);
|
|
|
|
CREATE TABLE notification_state (
|
|
id INT PRIMARY KEY DEFAULT 1 CHECK (id = 1),
|
|
last_event_id BIGINT DEFAULT 0,
|
|
last_event_created_at TIMESTAMPTZ
|
|
);
|
|
|
|
CREATE INDEX idx_notification_queue_status ON notification_queue (status, next_retry_at);
|
|
|
|
INSERT INTO notification_state (id) VALUES (1) ON CONFLICT DO NOTHING;
|