it0/packages/shared/database/migrations/007-create-notification-tab...

56 lines
2.9 KiB
SQL

-- ============================================================
-- Migration 007: Notification System Tables
-- All tables in public schema (platform-wide, cross-tenant)
-- ============================================================
-- 1. Notifications — created & managed by platform admins
CREATE TABLE IF NOT EXISTS public.notifications (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
title VARCHAR(200) NOT NULL,
content TEXT NOT NULL,
type VARCHAR(30) NOT NULL DEFAULT 'ANNOUNCEMENT',
-- SYSTEM | MAINTENANCE | FEATURE | ANNOUNCEMENT | BILLING | SECURITY
priority VARCHAR(20) NOT NULL DEFAULT 'NORMAL',
-- LOW | NORMAL | HIGH | URGENT
target_type VARCHAR(20) NOT NULL DEFAULT 'ALL',
-- ALL | SPECIFIC_TENANTS
image_url VARCHAR(500),
link_url VARCHAR(500),
requires_force_read BOOLEAN NOT NULL DEFAULT false,
is_enabled BOOLEAN NOT NULL DEFAULT true,
published_at TIMESTAMPTZ, -- NULL = draft (not yet published)
expires_at TIMESTAMPTZ, -- NULL = never expires
created_by VARCHAR(100),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_notifications_type ON public.notifications (type);
CREATE INDEX IF NOT EXISTS idx_notifications_enabled ON public.notifications (is_enabled);
CREATE INDEX IF NOT EXISTS idx_notifications_published ON public.notifications (published_at);
CREATE INDEX IF NOT EXISTS idx_notifications_target ON public.notifications (target_type);
-- 2. Notification reads — tracks per-user read status
CREATE TABLE IF NOT EXISTS public.notification_reads (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
notification_id UUID NOT NULL REFERENCES public.notifications(id) ON DELETE CASCADE,
user_id VARCHAR(100) NOT NULL,
tenant_id VARCHAR(100) NOT NULL,
read_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE (notification_id, user_id)
);
CREATE INDEX IF NOT EXISTS idx_notification_reads_user ON public.notification_reads (user_id);
CREATE INDEX IF NOT EXISTS idx_notification_reads_notif ON public.notification_reads (notification_id);
CREATE INDEX IF NOT EXISTS idx_notification_reads_tenant ON public.notification_reads (tenant_id);
-- 3. Notification tenant targets — for SPECIFIC_TENANTS targeting
CREATE TABLE IF NOT EXISTS public.notification_tenant_targets (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
notification_id UUID NOT NULL REFERENCES public.notifications(id) ON DELETE CASCADE,
tenant_id VARCHAR(100) NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_notif_tenant_targets_notif ON public.notification_tenant_targets (notification_id);
CREATE INDEX IF NOT EXISTS idx_notif_tenant_targets_tenant ON public.notification_tenant_targets (tenant_id);