WebHooker/migrations/0008_storage_d1.sql
RhenCloud 25ebae4ae5
feat(storage): migrate config, dedup and delivery state to D1
- Move oversized queue payloads from KV to R2 (PAYLOAD binding, webhooks/YYYY/MM/DD/*.json, KV queue:payload:* fallback)
- Persist routes/groups to D1 (d1_routes/d1_groups) with memory -> KV -> D1 three-tier cache, seeded from legacy KV config keys
- Move webhook dedup (dedup_keys), delivery state (delivery_state) and message tracking (message_tracking) to D1 via canUseD1 probe with automatic KV fallback
- Batch send_logs inserts (recordSendBatch) and add group_id/ts index
- Add storage-prune scheduled task for expired dedup/state/tracking rows
- Add TTL to invite:group:{id} index and audit all ephemeral KV keys
- Add D1 indexes for the new tables
- Sync AGENTS.md, README.md/zh and docs/ (en/zh) with the new storage layout
2026-08-17 15:01:20 +08:00

25 lines
No EOL
849 B
SQL

-- D1 tables replacing ephemeral high-frequency KV keys (dedup, delivery state,
-- message tracking). Keeps KV for things that still benefit from key-based
-- access with short TTL; these tables relieve the KV write quota.
CREATE TABLE IF NOT EXISTS dedup_keys (
key TEXT PRIMARY KEY,
claimed_at INTEGER NOT NULL,
expires_at INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_dedup_keys_expires_at ON dedup_keys (expires_at);
CREATE TABLE IF NOT EXISTS delivery_state (
key TEXT PRIMARY KEY,
status TEXT NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS message_tracking (
event_id TEXT NOT NULL,
target_id TEXT NOT NULL,
message_id TEXT NOT NULL,
updated_at INTEGER NOT NULL,
PRIMARY KEY (event_id, target_id)
);
CREATE INDEX IF NOT EXISTS idx_message_tracking_updated_at ON message_tracking (updated_at);