# 画面設計書 66-Webhookイベント画面

## 概要

本ドキュメントは、FizzyアプリケーションにおけるWebhookイベント画面の設計仕様を定義するものである。

### 本画面の処理概要

この画面は、Webhookで送信されるイベントの内容をプレビュー表示するための画面である。イベントの説明テキストと、関連オブジェクト（カードなど）へのリンクを表示する。主にWebhook配信時のペイロード生成や、Slack/Campfire/Basecamp連携時のメッセージフォーマット生成に使用される内部テンプレートである。

**業務上の目的・背景**：Webhook配信時に外部サービスへ送信されるペイロードを生成するためのテンプレートを提供する。Slack、Campfire、Basecampなど異なるサービスに対応したフォーマットで、イベント情報を整形して送信できるようにする。

**画面へのアクセス方法**：この画面は主に内部処理（Webhook配信処理）から呼び出されるテンプレートであり、直接ユーザーがアクセスすることは想定されていない。Webhook::Deliveryクラスのrender_payload メソッドから呼び出される。

**主要な操作・処理内容**：
1. イベントの説明テキスト（プレーンテキスト形式）を表示
2. 関連オブジェクト（eventable）が存在する場合、そのURLへのリンクを表示

**画面遷移**：
- 遷移元：Webhook配信処理（内部処理）
- 遷移先：イベント関連オブジェクトの詳細画面（リンク経由）

**権限による表示制御**：内部処理用テンプレートのため、直接のアクセス制御は不要。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 82 | Webhook詳細表示 | 主機能 | Webhookイベントの詳細を表示 |

## 画面種別

詳細（内部テンプレート）

## URL/ルーティング

直接アクセス用のルートは定義されていない。内部でレンダリングされるテンプレート。

## 入出力項目

（入力項目なし）

## 表示項目

| 項目名 | 説明 |
|--------|------|
| イベント説明 | イベントの内容をプレーンテキストで表示 |
| リンク | イベント関連オブジェクトへのリンク（存在する場合のみ） |

## イベント仕様

### 1-リンク押下

関連オブジェクト（カード、コメントなど）の詳細画面に遷移する。

## データベース更新仕様

（データベース更新なし - 表示のみ）

## メッセージ仕様

（メッセージなし）

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| eventableがnil | リンクを表示しない |

## 備考

- このテンプレートはWebhook配信処理で以下の形式で使用される：
  - JSON形式：標準的なWebhook受信サーバー向け
  - HTML形式：Campfire、Basecamp Campfire向け
  - Slack形式：Slack Webhook向け（mrkdwn形式に変換）
- description_for メソッドにはユーザーオブジェクトを渡すが、Slack向けの場合はnilが渡される
- eventableはポリモーフィック関連で、Card、Commentなど様々なモデルを指す

---

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

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

### 推奨読解順序

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

イベントモデルとその関連を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | event.html.erb | `app/views/webhooks/event.html.erb` | テンプレートの構造（非常にシンプル） |

**読解のコツ**:
- `@event.description_for(Current.user).to_plain_text` でイベント説明をプレーンテキスト化
- `polymorphic_url(@event.eventable)` で関連オブジェクトのURLを生成

#### Step 2: 呼び出し元を理解する

このテンプレートがどのように呼び出されるかを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | delivery.rb | `app/models/webhook/delivery.rb` | render_payload メソッド、payload メソッド |

**主要処理フロー**:
1. **129-138行目**: payloadメソッド - サービス種別に応じてペイロード形式を選択
2. **141-143行目**: render_payloadメソッド - テンプレートをレンダリング
3. **119-127行目**: content_typeメソッド - サービス種別に応じてContent-Typeを設定

#### Step 3: Webhook配信フローを理解する

配信全体のフローを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | triggerable.rb | `app/models/webhook/triggerable.rb` | triggerメソッド |
| 3-2 | delivery_job.rb | `app/jobs/webhook/delivery_job.rb` | 非同期配信ジョブ |

**主要処理フロー（triggerable.rb）**:
- **9-11行目**: triggerメソッド - deliveriesを作成して配信を開始

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

```
[イベント発生]
    │
    ├─ Event.create!
    │
    ├─ Webhook.triggered_by(event)
    │      │
    │      └─ webhook.trigger(event)
    │             │
    │             └─ deliveries.create!(event: event)
    │                    │
    │                    └─ after_create_commit :deliver_later
    │                           │
    │                           └─ Webhook::DeliveryJob.perform_later
    │
    └─ Webhook::Delivery#deliver
           │
           ├─ perform_request
           │      │
           │      └─ payload
           │             │
           │             ├─ for_basecamp? → render_payload(formats: :html)
           │             │
           │             ├─ for_campfire? → render_payload(formats: :html)
           │             │
           │             ├─ for_slack? → slack_payload
           │             │
           │             └─ else → render_payload(formats: :json)
           │
           └─ render "webhooks/event"
```

### データフロー図

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

Event ─────────────────▶ Webhook::Delivery ───────────────▶ 外部サービス
  │                              │
  ├─ action                      ├─ render_payload
  │                              │      │
  ├─ eventable                   │      └─ webhooks/event.html.erb
  │                              │             │
  └─ description                 │             ├─ description_for.to_plain_text
                                 │             │
                                 │             └─ polymorphic_url(eventable)
                                 │
                                 └─ HTTP POST → Slack / Campfire / その他
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| event.html.erb | `app/views/webhooks/event.html.erb` | ビュー | イベントペイロードテンプレート |
| delivery.rb | `app/models/webhook/delivery.rb` | モデル | 配信処理、ペイロード生成 |
| triggerable.rb | `app/models/webhook/triggerable.rb` | Concern | Webhookトリガー処理 |
| delivery_job.rb | `app/jobs/webhook/delivery_job.rb` | ジョブ | 非同期配信ジョブ |
| webhook.rb | `app/models/webhook.rb` | モデル | Webhookデータの管理 |
