# 機能設計書 35-比較リスト全削除

## 概要

本ドキュメントは、比較リスト内のすべての商品を一括削除する機能の設計を記述する。

### 本機能の処理概要

本機能は、ユーザーが比較画面で比較リスト内のすべての商品を一度に削除するための機能である。

**業務上の目的・背景**：比較検討が終了した後や、新しい商品セットで比較をやり直したい場合に、1件ずつ削除するのは手間がかかる。本機能により、ワンタップで比較リストをクリアし、新たな比較を開始できる。これにより、ユーザーの操作効率を向上させる。

**機能の利用シーン**：ユーザーが比較画面でフローティングアクションボタン（ゴミ箱アイコン）をタップした際に本機能が実行される。

**主要な処理内容**：
1. フローティングアクションボタン（削除）をタップ
2. GraphQL APIで全削除リクエストを送信
3. 削除成功時に成功通知を表示し、空のリスト状態に更新
4. 失敗時にエラー通知を表示

**関連システム・外部連携**：GraphQL APIを介したBagistoバックエンドとの通信

**権限による制御**：自身の比較リストのみ削除可能

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 11 | 商品比較画面 | 主画面 | 比較リストの全商品一括削除 |

## 機能種別

データ一括削除処理（DELETE操作）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| - | - | - | パラメータなし（ユーザーセッションで識別） | - |

### 入力データソース

- フローティングアクションボタンからのユーザー操作

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| success | bool | 処理成功フラグ |
| message | String | 結果メッセージ |

### 出力先

- 画面表示: 成功/失敗通知トースト
- 比較リスト: 空のリスト状態（EmptyDataView表示）

## 処理フロー

### 処理シーケンス

```
1. ユーザーがフローティングアクションボタンをタップ
   └─ FloatingActionButton.onPressed実行
2. ローディング表示開始
   └─ OnClickCompareLoaderEvent発火
3. RemoveAllCompareListEventを発火
   └─ CompareScreenBloc.add実行
4. BlocがAPIを呼び出し
   └─ CompareScreenRepository.removeAllCompareProducts実行
5. ApiClient.removeAllCompareProductsでGraphQL通信
   └─ removeAllCompareProducts mutationを実行
6. レスポンス処理
   └─ 成功: 成功通知表示、一覧再取得（空リスト表示）
   └─ 失敗: エラー通知表示
```

### フローチャート

```mermaid
flowchart TD
    A[FABタップ] --> B[ローディング表示]
    B --> C[RemoveAllCompareListEvent発火]
    C --> D[GraphQL API呼び出し]
    D --> E{API結果}
    E -->|成功| F[成功通知表示]
    E -->|失敗| G[エラー通知表示]
    F --> H[ページング初期化]
    H --> I[比較一覧再取得]
    I --> J[EmptyDataView表示]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-35-01 | 自己所有確認 | 自身の比較リストのみ全削除可能 | 削除処理時 |
| BR-35-02 | FAB表示条件 | 比較リストが空の場合はFAB非表示 | 画面表示時 |
| BR-35-03 | 一覧再取得 | 削除成功後、ページを1に戻して再取得 | 削除成功時 |

### 計算ロジック

特になし。

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 全削除 | compare_items | DELETE | 該当ユーザーの全商品削除 |

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

#### compare_items

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | customer_id | 現在のユーザーID | バックエンドで処理 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | graphqlErrors | API通信失敗 | エラー通知表示 |

### リトライ仕様

自動リトライなし。

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

バックエンドAPIでトランザクション管理。全件削除は単一トランザクションで処理。

## パフォーマンス要件

- API応答時間: 3秒以内
- 大量データ削除時の考慮必要

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

- 認証トークンまたはセッションでユーザー識別
- 自身のデータのみ削除可能

## 備考

- 確認ダイアログなしで即削除される（現在の実装）
- FABは比較リストに1件以上ある場合のみ表示

---

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

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

### 推奨読解順序

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

削除ボタン（FAB）のUI部分を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | compare_screen.dart | `lib/screens/compare/view/compare_screen.dart` | FloatingActionButton.onPressed処理 |

**主要処理フロー**:
- **84-106行目**: FABの表示制御と削除イベント発火

#### Step 2: Bloc（状態管理層）を理解する

イベント処理の流れを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | compare_screen_event.dart | `lib/screens/compare/bloc/compare_screen_event.dart` | RemoveAllCompareListEventの定義 |
| 2-2 | compare_screen_bloc.dart | `lib/screens/compare/bloc/compare_screen_bloc.dart` | イベント処理 |

**主要処理フロー**:
- **142-156行目**: RemoveAllCompareListEventの処理

#### Step 3: Repository（データアクセス層）を理解する

API呼び出しの実装を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | compare_screen_repository.dart | `lib/screens/compare/bloc/compare_screen_repository.dart` | removeAllCompareProductsメソッド |

**主要処理フロー**:
- **82-87行目**: removeAllCompareProducts呼び出し

#### Step 4: APIクライアントを理解する

GraphQL通信の実装を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | api_client.dart | `lib/services/api_client.dart` | removeAllCompareProductsメソッド |

**主要処理フロー**:
- **1183-1195行目**: removeAllCompareProducts mutation実行

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

```
CompareScreen (UI)
    │
    ├─ FloatingActionButton.onPressed
    │      │
    │      ├─ OnClickCompareLoaderEvent（ローディング表示）
    │      │
    │      └─ RemoveAllCompareListEvent
    │             │
    │             └─ CompareScreenRepository.removeAllCompareProducts()
    │                    │
    │                    └─ ApiClient.removeAllCompareProducts()
    │                           │
    │                           └─ GraphQL mutation: removeAllCompareProducts
    │
    └─ 状態更新
           ├─ RemoveAllCompareProductState.success
           │      └─ CompareScreenFetchEvent（一覧再取得）
           │
           └─ 通知表示
```

### データフロー図

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

FABタップ ──────────▶ CompareScreenBloc ──────▶ 成功通知
                          │
                    CompareScreenRepository
                          │
                    ApiClient
                          │
                    GraphQL Server ───────────▶ 比較リストクリア
                                                  │
                                            EmptyDataView表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| compare_screen.dart | `lib/screens/compare/view/compare_screen.dart` | ソース | FAB含む画面本体 |
| compare_screen_bloc.dart | `lib/screens/compare/bloc/compare_screen_bloc.dart` | ソース | 状態管理Bloc |
| compare_screen_event.dart | `lib/screens/compare/bloc/compare_screen_event.dart` | ソース | イベント定義 |
| compare_screen_repository.dart | `lib/screens/compare/bloc/compare_screen_repository.dart` | ソース | リポジトリ層 |
| api_client.dart | `lib/services/api_client.dart` | ソース | API通信クライアント |
