feat(message): add comprehensive message system with database migrations and health checks
- Add database migrations for message base table with indexes for efficient querying - Implement rich content support with attachment, embed, and poll tables - Create social features including reactions, bookmarks, mentions, and read states - Add thread management with participant tracking and resolution capabilities - Include article posts with title, cover image, tags, and engagement metrics - Support scheduled messages, stickers, forwards, and interactive components - Fix UUID defaults and ensure proper uniqueness constraints for drafts - Add gRPC health server for imks and health check client for appks connectivity - Replace non-connectable 0.0.0.0 addresses with localhost in service discovery - Normalize addresses during RPC configuration to handle bind address issues
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
-- ============================================================
|
||||
-- Migration: 005_message_misc.sql
|
||||
-- Tables: message_notification, message_scheduled, message_sticker,
|
||||
-- message_forward, message_component
|
||||
-- ============================================================
|
||||
|
||||
BEGIN;
|
||||
|
||||
-- models/message_notification.rs → message_notification
|
||||
CREATE TABLE IF NOT EXISTS message_notification (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
message_id UUID NOT NULL REFERENCES message(id) ON DELETE CASCADE,
|
||||
channel_id UUID NOT NULL,
|
||||
user_id UUID NOT NULL,
|
||||
reason TEXT NOT NULL,
|
||||
status TEXT NOT NULL DEFAULT 'pending',
|
||||
delivery_channel TEXT NULL,
|
||||
delivered_at TIMESTAMPTZ NULL,
|
||||
read_at TIMESTAMPTZ NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_message_notification_user_id
|
||||
ON message_notification (user_id, created_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_message_notification_status
|
||||
ON message_notification (status);
|
||||
|
||||
-- models/message_scheduled.rs → message_scheduled
|
||||
CREATE TABLE IF NOT EXISTS message_scheduled (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
channel_id UUID NOT NULL,
|
||||
author_id UUID NOT NULL,
|
||||
thread_id UUID NULL REFERENCES message_thread(id) ON DELETE SET NULL,
|
||||
reply_to_message_id UUID NULL REFERENCES message(id) ON DELETE SET NULL,
|
||||
body TEXT NOT NULL,
|
||||
metadata JSONB NULL,
|
||||
scheduled_at TIMESTAMPTZ NOT NULL,
|
||||
status TEXT NOT NULL DEFAULT 'pending',
|
||||
sent_message_id UUID NULL REFERENCES message(id) ON DELETE SET NULL,
|
||||
error TEXT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_message_scheduled_status_at
|
||||
ON message_scheduled (status, scheduled_at);
|
||||
|
||||
-- models/message_sticker.rs → message_sticker
|
||||
CREATE TABLE IF NOT EXISTS message_sticker (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
message_id UUID NOT NULL REFERENCES message(id) ON DELETE CASCADE,
|
||||
sticker_id UUID NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
image_url TEXT NOT NULL,
|
||||
format_type TEXT NOT NULL DEFAULT 'png',
|
||||
pack_name TEXT NULL,
|
||||
tags TEXT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_message_sticker_message_id
|
||||
ON message_sticker (message_id);
|
||||
|
||||
-- models/message_forward.rs → message_forward
|
||||
CREATE TABLE IF NOT EXISTS message_forward (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
message_id UUID NOT NULL REFERENCES message(id) ON DELETE CASCADE,
|
||||
source_message_id UUID NOT NULL REFERENCES message(id) ON DELETE CASCADE,
|
||||
source_channel_id UUID NOT NULL,
|
||||
forwarded_by UUID NOT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_message_forward_message_id
|
||||
ON message_forward (message_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_message_forward_source_message_id
|
||||
ON message_forward (source_message_id);
|
||||
|
||||
-- models/message_component.rs → message_component
|
||||
CREATE TABLE IF NOT EXISTS message_component (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
message_id UUID NOT NULL REFERENCES message(id) ON DELETE CASCADE,
|
||||
row INTEGER NOT NULL DEFAULT 0,
|
||||
position INTEGER NOT NULL DEFAULT 0,
|
||||
component_type TEXT NOT NULL,
|
||||
custom_id TEXT NOT NULL,
|
||||
label TEXT NULL,
|
||||
emoji TEXT NULL,
|
||||
style TEXT NULL,
|
||||
url TEXT NULL,
|
||||
disabled BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
placeholder TEXT NULL,
|
||||
min_values INTEGER NULL,
|
||||
max_values INTEGER NULL,
|
||||
options JSONB NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_message_component_message_id
|
||||
ON message_component (message_id);
|
||||
|
||||
COMMIT;
|
||||
Reference in New Issue
Block a user