-- ============================================================================
-- 修复 processed_events 表的幂等键
-- 用于 2.0 服务间 Outbox 事件的 100% exactly-once 语义
-- ============================================================================
--
-- 问题: 原来使用 eventId 作为唯一键，但不同服务的 outbox ID 可能相同
-- 解决: 使用 (sourceService, eventId) 作为复合唯一键
--
-- 唯一键说明:
--   - sourceService: 发送事件的服务名（如 "auth-service", "contribution-service"）
--   - eventId: 发送方 outbox 表的自增 ID（非 UUID，而是数据库自增主键）
--   - 组合后在全局唯一，可用于精确追踪事件来源
-- ============================================================================

-- 先清空已有数据（因为之前的数据可能有冲突）
TRUNCATE TABLE "processed_events";

-- 删除旧的唯一索引（仅 eventId）
DROP INDEX IF EXISTS "processed_events_eventId_key";

-- 删除旧的 sourceService 普通索引
DROP INDEX IF EXISTS "processed_events_sourceService_idx";

-- 创建新的复合唯一索引：(sourceService, eventId)
-- 这个组合保证跨服务的唯一性
CREATE UNIQUE INDEX "processed_events_sourceService_eventId_key" ON "processed_events"("sourceService", "eventId");
