Files
unified-media-manager/internal/db/migrations/009_notifications.sql
2026-04-24 10:45:19 -07:00

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;