# 機能設計書 10-エントリ削除

## 概要

本ドキュメントは、Decap CMSのエントリ削除機能の設計を記載する。エントリの削除処理として、バックエンド（Gitリポジトリ）からのファイル削除とRedux状態の管理を行う。

### 本機能の処理概要

本機能は、CMSのコンテンツエントリをGitリポジトリから削除する。削除処理は非同期で行われ、バックエンドの`deleteEntry()`を呼び出してGitリポジトリからファイルを削除（コミット＆プッシュ）する。成功時にはReduxストアからエントリ情報を削除し、失敗時にはエラー通知を表示する。

**業務上の目的・背景**：CMSで管理するコンテンツの不要なエントリを削除する機能は、コンテンツ管理の基本操作の一つである。削除操作はGitリポジトリへのコミットを伴うため、元に戻すことが可能（Gitの履歴から復元可能）ではあるが、CMSのUI上では不可逆的な操作として扱われる。

**機能の利用シーン**：エントリ編集画面のツールバーにある「削除」ボタン押下時に実行される。通常は確認ダイアログが表示された後に削除処理が実行される。

**主要な処理内容**：
1. `deleteEntry`: エントリ削除のメインアクション
2. `entryDeleting`: 削除開始を示すアクション（ENTRY_DELETE_REQUEST）
3. `entryDeleted`: 削除成功を示すアクション（ENTRY_DELETE_SUCCESS）
4. `entryDeleteFail`: 削除失敗を示すアクション（ENTRY_DELETE_FAILURE）
5. バックエンドの`deleteEntry()`呼び出し

**関連システム・外部連携**：各Gitバックエンド（GitHub, GitLab, Bitbucket等）のファイル削除API。

**権限による制御**：認証済みユーザーのみがエントリを削除できる。コレクションの`publish`設定やOpen Authoringモードの制約を受ける場合がある。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | エントリ編集画面 | 主画面 | エントリの削除処理。確認ダイアログ表示後にdeleteEntryアクションを実行 |

## 機能種別

CRUD操作（Delete）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| collection | Collection (ImmutableMap) | Yes | 対象コレクション | - |
| slug | string | Yes | 削除対象エントリのスラッグ | - |

### 入力データソース

- ユーザー操作（削除ボタン押下 + 確認ダイアログ承認）
- Reduxストア（config: バックエンド設定）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| - | void | 削除成功時の直接的な出力データはない |
| エラー通知 | Notification | 削除失敗時の'ui.toast.onFailToDelete'メッセージ |

### 出力先

- Gitリポジトリ（ファイル削除のコミット＆プッシュ）
- Reduxストア（entries状態スライスからエントリ情報を削除）
- 通知システム（エラー時のトーストメッセージ）

## 処理フロー

### 処理シーケンス

```
1. deleteEntry(collection, slug)が呼び出される
2. Reduxストアから設定を取得
3. currentBackend(config)でバックエンドインスタンスを取得
4. ENTRY_DELETE_REQUESTをディスパッチ
   └─ collectionName, entrySlugをペイロードに含む
5. backend.deleteEntry(state, collection, slug)を呼び出し
6. 成功時:
   └─ ENTRY_DELETE_SUCCESSをディスパッチ
   └─ collectionName, entrySlugをペイロードに含む
7. 失敗時:
   └─ エラー通知（'ui.toast.onFailToDelete'、8000ms）
   └─ コンソールにエラー出力
   └─ ENTRY_DELETE_FAILUREをディスパッチ
   └─ Promise.reject()
```

### フローチャート

```mermaid
flowchart TD
    A[deleteEntry呼び出し] --> B[currentBackend取得]
    B --> C[ENTRY_DELETE_REQUEST dispatch]
    C --> D[backend.deleteEntry]
    D --> E{成功?}
    E -->|Yes| F[ENTRY_DELETE_SUCCESS dispatch]
    F --> G[完了]
    E -->|No| H[エラー通知 8000ms]
    H --> I[コンソールエラー出力]
    I --> J[ENTRY_DELETE_FAILURE dispatch]
    J --> K[Promise.reject]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 確認ダイアログ | 削除操作は確認ダイアログ承認後に実行される（UIコンポーネント側で制御） | エントリ編集画面の削除ボタン押下時 |
| BR-02 | 削除の非可逆性 | CMSのUI上では削除は不可逆的な操作として扱われる（Git履歴からの復元はCMS外で可能） | 常時 |
| BR-03 | 状態同期 | 削除成功後にReduxストアからエントリ情報が削除される | ENTRY_DELETE_SUCCESS時 |

### 計算ロジック

特になし。

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

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

| 操作 | 対象 | 操作種別 | 概要 |
|-----|------|---------|------|
| エントリ削除 | Gitリポジトリ | DELETE | ファイルの削除コミット＆プッシュ |
| 状態更新（開始） | Reduxストア(entries) | UPDATE | ENTRY_DELETE_REQUEST |
| 状態更新（成功） | Reduxストア(entries) | DELETE | ENTRY_DELETE_SUCCESS: エントリ情報を削除 |
| 状態更新（失敗） | Reduxストア(entries) | UPDATE | ENTRY_DELETE_FAILURE |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ENTRY_DELETE_FAILURE | 削除エラー | backend.deleteEntry()がエラーを返す | 'ui.toast.onFailToDelete'通知（8000ms）、コンソールにエラー出力 |

### リトライ仕様

削除処理のリトライ機構は実装されていない。ユーザーによる再削除操作が必要。

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

バックエンドのdeleteEntry内でGitコミットとプッシュが行われる。これはバックエンド固有のトランザクション制御に依存する。

## パフォーマンス要件

- 削除操作はバックエンドAPI呼び出しを含むため、ネットワーク速度に依存
- エラー通知のdismissAfterは8000ms（8秒）

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

- 削除操作は認証済みバックエンドAPIを介して行われる
- 削除確認ダイアログにより、誤操作を防止する
- Git履歴により、削除されたエントリはリポジトリレベルで復元可能

## 備考

- deleteEntry関数はthunkアクションとして実装されており、getState()でRedux状態を取得する
- 削除成功後のUI遷移（コレクション一覧画面への戻り等）はこのアクション外で制御される
- ENTRY_DELETE_SUCCESSアクションは、entriesリデューサーでエントリの削除に使用される
- エラー発生時はPromise.reject()が返され、呼び出し元でのエラーハンドリングが可能

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | types/redux.ts | `packages/decap-cms-core/src/types/redux.ts` | Collection, State型 |

**読解のコツ**: 削除アクションはシンプルで、collection名とslugのペアでエントリを特定する。Immutable.jsのMapアクセス（`collection.get('name')`）に注意。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | entries.ts (actions) | `packages/decap-cms-core/src/actions/entries.ts` | deleteEntry関数と関連アクションクリエーター |

**主要処理フロー**:
1. **80-82行目**: ENTRY_DELETE_REQUEST/SUCCESS/FAILUREアクションタイプ定数
2. **340-348行目**: entryDeleting - 削除開始アクション
3. **350-358行目**: entryDeleted - 削除成功アクション
4. **360-369行目**: entryDeleteFail - 削除失敗アクション
5. **979-1005行目**: deleteEntry - メインの削除thunkアクション

#### Step 3: deleteEntry関数の詳細

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | entries.ts (actions) | `packages/decap-cms-core/src/actions/entries.ts` | deleteEntry関数 |

**主要処理フロー**:
- **979-980行目**: thunkアクション定義、getState()で状態取得
- **981-982行目**: currentBackend(config)でバックエンド取得
- **984行目**: entryDeleting(collection, slug)をディスパッチ
- **985-986行目**: backend.deleteEntry(state, collection, slug)呼び出し
- **987-988行目**: 成功時 - entryDeleted(collection, slug)をディスパッチ
- **990-1002行目**: 失敗時 - エラー通知、コンソール出力、entryDeleteFail

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

```
deleteEntry(collection, slug)
    |
    +-- currentBackend(state.config)
    +-- entryDeleting(collection, slug)  [dispatch]
    +-- backend.deleteEntry(state, collection, slug)
            |
            +-- [成功]
            |       +-- entryDeleted(collection, slug)  [dispatch]
            |
            +-- [失敗]
                    +-- addNotification('onFailToDelete')  [dispatch]
                    +-- console.error(error)
                    +-- entryDeleteFail(collection, slug, error)  [dispatch]
                    +-- Promise.reject()
```

### データフロー図

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

collection + slug --------> deleteEntry() ---------> Gitリポジトリ
(ユーザー操作)              ENTRY_DELETE_REQUEST        (ファイル削除コミット)
                            backend.deleteEntry()
                                    |
                            [成功] ENTRY_DELETE_SUCCESS --> Reduxストア
                                                           (エントリ削除)
                            [失敗] ENTRY_DELETE_FAILURE --> 通知(エラー)
                                                           コンソール
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| entries.ts (actions) | `packages/decap-cms-core/src/actions/entries.ts` | ソース | deleteEntry、entryDeleting、entryDeleted、entryDeleteFail |
| entries.ts (reducer) | `packages/decap-cms-core/src/reducers/entries.ts` | ソース | ENTRY_DELETE_SUCCESSハンドリング |
| backend.ts | `packages/decap-cms-core/src/backend.ts` | ソース | deleteEntry（バックエンド実装） |
| notifications.ts (actions) | `packages/decap-cms-core/src/actions/notifications.ts` | ソース | addNotification |
