-- ============================================================================
-- 添加事务性幂等消费支持
-- 用于 1.0 -> 2.0 CDC 同步的 100% exactly-once 语义
-- ============================================================================

-- 创建 processed_cdc_events 表（用于 CDC 事件幂等）
-- 唯一键: (source_topic, offset) - Kafka topic 名称 + 消息偏移量
-- 用于保证每个 CDC 事件只处理一次（exactly-once 语义）
CREATE TABLE IF NOT EXISTS "processed_cdc_events" (
    "id" BIGSERIAL NOT NULL,
    "source_topic" VARCHAR(200) NOT NULL,  -- Kafka topic 名称（如 cdc.identity.public.user_accounts）
    "offset" BIGINT NOT NULL,              -- Kafka 消息偏移量（在 partition 内唯一）
    "table_name" VARCHAR(100) NOT NULL,    -- 源表名
    "operation" VARCHAR(10) NOT NULL,      -- CDC 操作类型: c(create), u(update), d(delete), r(snapshot read)
    "processed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "processed_cdc_events_pkey" PRIMARY KEY ("id")
);

-- 复合唯一索引：(source_topic, offset) 保证幂等性
-- 注意：这不是数据库自增 ID，而是 Kafka 消息的唯一标识
CREATE UNIQUE INDEX "processed_cdc_events_source_topic_offset_key" ON "processed_cdc_events"("source_topic", "offset");

-- 时间索引用于清理旧数据
CREATE INDEX "processed_cdc_events_processed_at_idx" ON "processed_cdc_events"("processed_at");
