-- Admin-authored announcements for normal users. CREATE TABLE IF NOT EXISTS user_announcements ( id BIGSERIAL PRIMARY KEY, title TEXT NOT NULL, content TEXT NOT NULL, level TEXT NOT NULL DEFAULT 'info', status TEXT NOT NULL DEFAULT 'published', audience TEXT NOT NULL DEFAULT 'all', starts_at TEXT, ends_at TEXT, created_at TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP::TEXT), updated_at TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP::TEXT), published_at TEXT ); CREATE INDEX IF NOT EXISTS user_announcements_status_created_at_idx ON user_announcements (status, created_at); CREATE INDEX IF NOT EXISTS user_announcements_active_window_idx ON user_announcements (starts_at, ends_at); CREATE TABLE IF NOT EXISTS user_announcement_reads ( announcement_id BIGINT NOT NULL, user_id BIGINT NOT NULL, read_at TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP::TEXT), PRIMARY KEY (announcement_id, user_id), FOREIGN KEY (announcement_id) REFERENCES user_announcements(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); CREATE INDEX IF NOT EXISTS user_announcement_reads_user_id_idx ON user_announcement_reads (user_id);