# 機能設計書 35-トリガー削除

## 概要

本ドキュメントは、Giselleワークフローエンジンにおける「トリガー削除」機能の設計を記述する。本機能は、設定済みのトリガーを削除し、関連するリソース（GitHub連携インデックス等）をクリーンアップするAPIを提供する。

### 本機能の処理概要

本機能は、指定されたトリガーID（TriggerId）に対応するトリガー設定データをストレージから削除する。GitHubトリガーの場合は、関連するリポジトリ連携インデックスも同時に削除する。

**業務上の目的・背景**：ワークフローのトリガーを解除・再構成する際に、既存のトリガー設定を削除する必要がある。また、不要になったトリガーを適切にクリーンアップすることで、ストレージの整合性を保つ。

**機能の利用シーン**：
- ワークフローエディタでトリガー設定を解除する場合
- トリガー種別を変更するために既存設定を削除する場合
- ワークスペース削除時の関連リソースクリーンアップ

**主要な処理内容**：
1. トリガーID（TriggerId）を受け取る
2. ストレージから対象トリガーデータを取得（存在確認）
3. トリガーが存在しない場合はエラーをスロー
4. ストレージからトリガーファイルを削除
5. GitHubトリガーの場合はリポジトリ連携インデックスを削除

**関連システム・外部連携**：
- GiselleStorageを介したファイルストレージとの連携
- GitHub連携インデックスの削除

**権限による制御**：ワークスペースへの編集権限を持つユーザーのみがトリガー削除を実行可能

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 17 | ワークフローエディタ画面 | 主画面 | トリガー設定の解除（暗黙的） |

## 機能種別

データ削除（DELETE操作）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| context | GiselleContext | Yes | Giselle実行コンテキスト（ストレージ参照を含む） | - |
| triggerId | TriggerId | Yes | 削除対象のトリガーID | `fltg-`プレフィックス付きID形式 |

### 入力データソース

- API呼び出しによるトリガーID

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| (なし) | void | 正常終了時は戻り値なし |

### 出力先

- ストレージ: `flow-triggers/{triggerId}.json`を削除
- GitHub連携インデックス: 削除（GitHubトリガーの場合）

## 処理フロー

### 処理シーケンス

```
1. トリガーIDからトリガーデータを取得
   └─ getTrigger()で現在の設定を取得

2. 存在チェック
   └─ トリガーが存在しない場合: エラーをスロー

3. ストレージからトリガーファイルを削除
   └─ storage.remove()で削除

4. プロバイダー種別の確認
   └─ provider === "github" の場合のみ追加処理

5. GitHubトリガーの場合: リポジトリ連携インデックスを削除
   └─ removeGitHubRepositoryIntegrationIndex()
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[triggerIdを受け取る]
    B --> C[getTrigger呼び出し]
    C --> D{トリガー存在?}
    D -->|No| E[エラーをスロー]
    D -->|Yes| F[triggerPath計算]
    F --> G[storage.remove実行]
    G --> H{GitHubトリガー?}
    H -->|Yes| I[removeGitHubRepositoryIntegrationIndex]
    H -->|No| J[終了]
    I --> J
    E --> K[異常終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-35-001 | 存在確認必須 | 削除前にトリガーの存在を確認 | 常時 |
| BR-35-002 | 不在時エラー | トリガーが存在しない場合はエラーをスロー | 常時 |
| BR-35-003 | 連携インデックス削除 | GitHubトリガーの場合はリポジトリ連携インデックスも削除 | provider === "github" |

### 計算ロジック

- ストレージパス: `flow-triggers/{triggerId}.json`

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| トリガー取得 | ストレージ（ファイル） | SELECT | 存在確認のための読み込み |
| トリガー削除 | ストレージ（ファイル） | DELETE | flow-triggers/{id}.jsonの削除 |
| 連携インデックス削除 | ストレージ（ファイル） | UPDATE | GitHubリポジトリ連携インデックスの更新 |

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

#### ストレージ（flow-triggers/{triggerId}.json）

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | ファイル全体 | triggerIdでパス指定 | ファイル削除 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | NotFound | 指定IDのトリガーが存在しない | `Flow trigger with ID ${id} not found`エラーをスロー |

### リトライ仕様

該当なし

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

- トリガーファイル削除後にリポジトリ連携インデックス削除を実行
- 途中でエラーが発生した場合、ロールバックなし（部分削除の可能性あり）

## パフォーマンス要件

- レスポンス時間：200ms以内

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

- GiselleContextを通じてアクセス制御
- ワークスペース境界を超えた削除は不可

## 備考

- 削除操作は冪等ではない（存在しないトリガーの削除はエラー）
- ノード状態の更新は本機能の範囲外

---

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

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

### 推奨読解順序

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

まず、Trigger型とGitHubトリガーの構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | index.ts | `packages/protocol/src/trigger/index.ts` | Trigger型、configurationのprovider判定を理解 |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | delete-trigger.ts | `packages/giselle/src/triggers/delete-trigger.ts` | 公開API関数（シンプルな委譲） |

**主要処理フロー**:
1. **5-8行目**: 引数の型定義（context, triggerId）
2. **9-12行目**: systemDeleteTrigger（utils.ts）への委譲

#### Step 3: ユーティリティ層を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | utils.ts | `packages/giselle/src/triggers/utils.ts` | deleteTrigger関数実装（45-68行目） |

**主要処理フロー**:
- **52-55行目**: getTrigger()でトリガーデータを取得
- **56-58行目**: トリガーが存在しない場合はエラーをスロー
- **59行目**: triggerPath()でストレージパスを生成
- **60行目**: storage.remove()でファイル削除
- **61-67行目**: GitHubトリガーの場合はremoveGitHubRepositoryIntegrationIndex()を呼び出し

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

```
deleteTrigger (delete-trigger.ts)
    │
    └─ systemDeleteTrigger (utils.ts)
           │
           ├─ getTrigger() - 存在確認
           │
           ├─ triggerPath() - パス生成
           │
           ├─ storage.remove() - ファイル削除
           │
           └─ removeGitHubRepositoryIntegrationIndex()
                  └─ [GitHubトリガーの場合のみ]
```

### データフロー図

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

triggerId ───▶ getTrigger() ───▶ Trigger取得
                       │
                       ▼
              {存在しない場合} ───▶ Error throw
                       │
                       ▼
              triggerPath() ───▶ ストレージパス
                       │
                       ▼
              storage.remove() ───▶ ファイル削除
                       │
                       ▼
              {GitHubトリガー?}
                       │
                       ▼
removeGitHubRepositoryIntegrationIndex() ───▶ インデックス削除
                       │
                       ▼
                     完了
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| delete-trigger.ts | `packages/giselle/src/triggers/delete-trigger.ts` | ソース | 公開API関数 |
| utils.ts | `packages/giselle/src/triggers/utils.ts` | ソース | deleteTrigger内部実装 |
| utils.ts | `packages/giselle/src/integrations/utils.ts` | ソース | removeGitHubRepositoryIntegrationIndex |
| index.ts | `packages/protocol/src/trigger/index.ts` | ソース | Trigger型定義 |
