Skip to content

feat(worker): re-port auto-purge of processed events to WebhookStore DO #234

Description

@liplus-lin-lay

purpose / 目的

DO 移行 (#71) で失われた auto-purge 機能 (#29 / #33 / PR#30) を Durable Objects 版 WebhookStore に再移植し, 処理済み webhook イベントの無制限蓄積による DO ストレージ肥大を止める.

premise / 前提

  • 現状の WebhookStore (worker/src/store.ts) の mark_processedprocessed=1 を立てるだけでイベントを削除しない (DELETE FROM events が存在しない). 処理済み行が永続的に蓄積する.
  • 旧 events.json 版には PR#30 で auto-purge があったが, Tenant routing and data isolation with Durable Objects #71 の DO 移行で移植されず, docs (0-requirements.md の PURGE_AFTER_DAYS / F4.5 の purged 戻り値) も後の書き直しで消滅している.
  • イベントは 1 テナント = 1 DO (store-{account_id}) で, 各 DO 内 SQLite の events テーブルに保存される.
  • 無料枠は DO 1 個あたり 1GB / アカウント合計 5GB. 処理済み死蔵行がこれを食う.
  • 教訓: 当時 purge を守る CI テストが無かったため移行で静かに regression した. 今回はテスト必須.

constraints / 制約

  • purge は mark_processed 実行時に, processed=1 かつ received_at が保持期間 (PURGE_AFTER_DAYS 日) より古いイベントを DELETE する.
  • 保持期間は環境変数 PURGE_AFTER_DAYS で設定可能. 既定 = 7 (日). worker/wrangler.toml の [vars] に追加.
  • DO が env を読むための型は store.ts にローカル最小定義し, index.ts の Env への循環 import を避ける.
  • unprocessed イベントは保持期間に関わらず削除しない.
  • mark_processed の戻り値に削除件数を含める (例: { success, event_id, purged }). 旧 F4.5 と整合.
  • docs/0-requirements.md および docs/0-requirements.ja.md に auto-purge 仕様 (PURGE_AFTER_DAYS, mark_processed の purged 戻り値, 構成テーブル) を同一 PR で復活させる. docs 分割 PR 禁止.
  • 既存テストとの相互作用に注意: store.test.ts の既存 mark-processed テスト (m1 を received_at "2026-01-01" で ingest して mark し /event?id=m1 が processed=true で再取得できることを期待) は, 既定 7 日 purge では mark 時に即削除され 404 になり壊れる. 新挙動 (保持期間超過の処理済みは消える) に合わせて既存テストを更新すること. テストの "now" は実時刻なので received_at を相対的に制御して設計する.

scope out / スコープ外

  • TenantRegistry の quota (events_stored, 上限 10000) の decrement 連動は本 issue で扱わない. purge で行削除しても件数 quota は減らない (lifetime カウンタ) 問題は軸が別. /quota-decrement エンドポイントは既存だが未配線. 別 issue 候補として記録のみ.
  • DO Alarms による定期 purge は任意の将来拡張. 本 issue は feat: purge processed events from events.json #29 に忠実に mark_processed トリガのみ実装する.

target files / 対象ファイル

  • worker/src/store.ts
  • worker/wrangler.toml
  • worker/test/workers/store.test.ts
  • docs/0-requirements.md, docs/0-requirements.ja.md

completion conditions / 完了条件

  • mark_processed 時に保持期間超過の processed イベントが削除される
  • PURGE_AFTER_DAYS で保持期間を設定可能 (既定 7 日)
  • 保持期間内の processed イベントは残る (テストで検証)
  • unprocessed イベントは保持期間に関わらず残る (テストで検証)
  • mark_processed 戻り値に purged 件数が含まれる
  • docs に auto-purge 仕様が復活している
  • 既存 store.test.ts が新挙動に整合して全て green

Refs #29 #33 #71

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestreadybody converged for implementation

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions