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

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions