Webhook 仕様書
外部サービスへのイベント送信
ステータス: Draft / 作成日: 2026-05-27 PR #10 — 依存: コア(並行実装可)
1. データモデル
webhooks
webhook_deliveries
2. マイグレーション
CREATE TABLE webhooks (
id UUID PRIMARY KEY,
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
url VARCHAR(2048) NOT NULL,
secret VARCHAR NOT NULL,
events VARCHAR[] NOT NULL,
is_active BOOLEAN NOT NULL DEFAULT true,
created_by UUID NOT NULL REFERENCES users(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE webhook_deliveries (
id UUID PRIMARY KEY,
webhook_id UUID NOT NULL REFERENCES webhooks(id) ON DELETE CASCADE,
event VARCHAR NOT NULL,
payload JSONB NOT NULL,
status_code INT,
attempt SMALLINT NOT NULL DEFAULT 1,
delivered_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
3. イベント一覧
4. ペイロード仕様
リクエストヘッダー:
X-Task-Event: task.created
X-Task-Signature: sha256=<HMAC-SHA256-hex>
Content-Type: application/json
署名検証(受信側):
HMAC-SHA256(secret, raw_request_body) == X-Task-Signature の値
task.created
{
"event": "task.created",
"timestamp": "2026-05-27T10:00:00Z",
"project_id": "uuid",
"task": {
"id": "uuid", "seq_id": 42,
"title": "OAuth 対応を実装する",
"priority": "high",
"status": "Backlog",
"assignees": [{ "user_id": "uuid", "role": "primary" }],
"hard_deadline": "2026-06-10T00:00:00Z",
"created_by": "uuid"
}
}
task.updated(差分のみ)
{
"event": "task.updated",
"timestamp": "2026-05-27T11:30:00Z",
"project_id": "uuid",
"task_id": "uuid",
"updated_by": "uuid",
"changes": [
{ "field": "priority", "old_value": "medium", "new_value": "high" },
{ "field": "status", "old_value": "Backlog", "new_value": "In Progress" }
]
}
task.deleted
{
"event": "task.deleted",
"timestamp": "2026-05-27T12:00:00Z",
"project_id": "uuid",
"task_id": "uuid",
"deleted_by": "uuid"
}
5. リトライ
2xx以外のレスポンス: 指数バックオフで最大 5 回- 1 回目: 即時 / 2 回目: 30s / 3 回目: 5m / 4 回目: 30m / 5 回目: 2h
- 5 回連続失敗:
webhooks.is_active = falseに設定し、テナントオーナーへメール通知 - 配信履歴(
webhook_deliveries)は 90 日後に自動パージ
6. API
POST /webhooks リクエスト:
{
"url": "https://example.com/webhook",
"secret": "my-secret-token",
"events": ["task.created", "task.updated", "task.deleted"]
}
7. フロントエンド(Phase B)
/tenants/{tid}/projects/{pid}/settings/webhooks
一覧・作成・配信履歴確認・手動再送の UI。