# 機能設計書 84-Webhook削除

## 概要

本ドキュメントは、Fizzyアプリケーションにおける「Webhook削除」機能の設計仕様を定義する。既存のWebhook設定を完全に削除する機能である。

### 本機能の処理概要

Webhook削除機能は、不要になったWebhook設定をシステムから完全に削除するための機能である。削除すると、関連する配信履歴とDelinquency Trackerも同時に削除される。

**業務上の目的・背景**：外部サービスとの連携が不要になった場合や、URLの変更が必要な場合（URLは編集不可のため）に、古いWebhookを削除する必要がある。また、誤って作成したWebhookをクリーンアップする際にも使用される。

**機能の利用シーン**：管理者が不要なWebhookを削除する場合に使用する。例えば、外部サービスの廃止、URLの変更、テスト用Webhookの削除などのケースで使用される。

**主要な処理内容**：
1. 指定されたWebhookの存在確認
2. Webhookと関連データの削除（カスケード）
3. 削除完了後、Webhook一覧画面へリダイレクト

**関連システム・外部連携**：なし

**権限による制御**：ボードの管理者（admin）権限を持つユーザーのみがWebhookを削除できる。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 64 | Webhook詳細画面 | 参照画面 | 削除操作の起点 |
| 65 | Webhook編集画面 | 参照画面 | 削除ボタンを配置（想定） |
| 62 | Webhook一覧画面 | 結果表示画面 | 削除後のリダイレクト先 |

## 機能種別

CRUD操作（Delete）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| board_id | UUID | Yes | ボードID | URLパラメータ |
| id | UUID | Yes | WebhookID | URLパラメータ |

### 入力データソース

URLパラメータ

## 出力仕様

### 出力データ

なし（削除処理のため）

### 出力先

- データベース（webhooksテーブルからの削除）
- 画面遷移（Webhook一覧画面へリダイレクト）

## 処理フロー

### 処理シーケンス

```
1. リクエスト受信
   └─ DELETE /boards/:board_id/webhooks/:id
2. 認証・認可チェック
   └─ ログインユーザーかつボード管理者権限を確認
3. ボード取得
   └─ Current.userのボードからboard_idで検索
4. Webhook取得
   └─ @board.webhooks.find(params[:id])
5. Webhook削除
   └─ @webhook.destroy!
6. 関連データ削除
   └─ カスケードでdeliveries, delinquency_trackerを削除
7. リダイレクト
   └─ Webhook一覧画面へ遷移
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{ログイン済み?}
    B -->|No| C[ログイン画面へ]
    B -->|Yes| D{管理者権限?}
    D -->|No| E[403 Forbidden]
    D -->|Yes| F[ボード取得]
    F --> G{ボード存在?}
    G -->|No| H[404 Not Found]
    G -->|Yes| I[Webhook取得]
    I --> J{Webhook存在?}
    J -->|No| K[404 Not Found]
    J -->|Yes| L[Webhook削除]
    L --> M[関連データ削除]
    M --> N[一覧画面へリダイレクト]
    N --> O[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-84-01 | カスケード削除 | Webhook削除時に関連する配信履歴も削除される | 常時 |
| BR-84-02 | Delinquency Tracker削除 | Webhook削除時に関連するトラッカーも削除される | 常時 |
| BR-84-03 | 物理削除 | 論理削除ではなく物理削除が行われる | 常時 |

### 計算ロジック

該当なし

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| Webhook取得 | webhooks | SELECT | 指定IDのWebhookを取得 |
| 配信履歴削除 | webhook_deliveries | DELETE | 関連する配信履歴を一括削除 |
| トラッカー削除 | webhook_delinquency_trackers | DELETE | 関連するトラッカーを削除 |
| Webhook削除 | webhooks | DELETE | Webhookレコードを削除 |

### テーブル別操作詳細

#### webhooks

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | 全カラム | id = params[:id] AND board_id = @board.id | 単一レコード取得 |
| DELETE | - | id = @webhook.id | レコード削除 |

#### webhook_deliveries

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | - | webhook_id = @webhook.id | dependent: :delete_allによる一括削除 |

#### webhook_delinquency_trackers

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | - | webhook_id = @webhook.id | dependent: :deleteによる削除 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 401 | Unauthorized | 未ログイン | ログイン画面へリダイレクト |
| 403 | Forbidden | 管理者権限なし | 権限エラー表示 |
| 404 | NotFound | ボードまたはWebhookが存在しない | エラーページ表示 |

### リトライ仕様

該当なし

## トランザクション仕様

ActiveRecordのdependent設定により、Webhook削除時に関連レコード（deliveries, delinquency_tracker）も同一トランザクション内で削除される。

## パフォーマンス要件

- レスポンス時間: 配信履歴の件数に依存するが、通常1秒以内
- 配信履歴が多い場合は削除に時間がかかる可能性あり

## セキュリティ考慮事項

- 管理者権限チェックによる認可制御
- CSRF対策（Railsデフォルト、DELETEメソッド使用）

## 備考

削除は取り消しできないため、確認ダイアログなどのUI上の配慮が推奨される。

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

Webhookモデルの依存関係（dependent設定）を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | webhook.rb | `app/models/webhook.rb` | has_many :deliveries, dependent: :delete_all |
| 1-2 | webhook.rb | `app/models/webhook.rb` | has_one :delinquency_tracker, dependent: :delete |

**読解のコツ**: `dependent: :delete_all`と`dependent: :delete`により、親レコード削除時に関連レコードも自動削除される。`delete_all`は個別のコールバックを呼ばず高速に削除する。

#### Step 2: エントリーポイントを理解する

コントローラーのdestroyアクションが処理の起点となる。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | webhooks_controller.rb | `app/controllers/webhooks_controller.rb` | destroyアクションの処理フロー |

**主要処理フロー**:
1. **4行目**: `before_action :ensure_admin` - 管理者権限チェック
2. **5行目**: `before_action :set_webhook` - Webhook取得
3. **31-34行目**: `destroy`アクション - 削除処理とリダイレクト
4. **32行目**: `@webhook.destroy!` - Webhookと関連データの削除

### プログラム呼び出し階層図

```
WebhooksController#destroy
    │
    ├─ BoardScoped#set_board
    │      └─ Current.user.boards.find(params[:board_id])
    │
    ├─ ApplicationController#ensure_admin
    │      └─ Current.user.admin?
    │
    ├─ set_webhook
    │      └─ @board.webhooks.find(params[:id])
    │
    └─ @webhook.destroy!
           │
           ├─ webhook_deliveries DELETE (dependent: :delete_all)
           │
           └─ webhook_delinquency_trackers DELETE (dependent: :delete)
```

### データフロー図

```
[入力]               [処理]                    [出力]

URLパラメータ ───▶ WebhooksController ───▶ 削除実行
  - board_id              │
  - id                    │
                          ▼
                    webhooksテーブル
                      DELETE
                          │
                          ├─▶ webhook_deliveries DELETE
                          │
                          └─▶ webhook_delinquency_trackers DELETE
                          │
                          ▼
                    リダイレクト ───▶ Webhook一覧画面
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| webhooks_controller.rb | `app/controllers/webhooks_controller.rb` | ソース | destroyアクション実装 |
| webhook.rb | `app/models/webhook.rb` | ソース | Webhookモデル（dependent設定） |
| delivery.rb | `app/models/webhook/delivery.rb` | ソース | 配信履歴モデル |
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義（DELETE） |
