# 通知設計書 56-サーバープロファイル削除確認

## 概要

本ドキュメントは、InvenTreeアプリにおける「サーバープロファイル削除確認」ダイアログの設計仕様を定義する。サーバープロファイルを削除する前に、ユーザーに対して確認を求めるダイアログを表示する。

### 本通知の処理概要

サーバープロファイルの削除は、ユーザーが登録したInvenTreeサーバーへの接続設定を永続的に削除する操作である。この確認ダイアログは、誤操作によるプロファイル削除を防ぎ、接続設定の安全性を確保するためのセーフティメカニズムとして機能する。

**業務上の目的・背景**：サーバープロファイルには、サーバーURL、認証トークン、ユーザー設定などの重要な情報が保存されている。誤って削除すると、再度サーバーへのログインが必要になり、作業の中断を招く。特に複数のサーバープロファイルを管理している場合、間違ったプロファイルを削除すると混乱が生じる。このため、削除前に確認ダイアログを表示し、ユーザーに最終確認を求めることで、設定の安全性を確保する。

**通知の送信タイミング**：ユーザーがサーバー選択画面でプロファイルを長押しし、表示されるコンテキストメニューから「削除」オプションを選択した時点で、即座に確認ダイアログが表示される。

**通知の受信者**：現在の操作を行っているユーザー自身。すべてのユーザーがサーバープロファイルの削除を実行可能。

**通知内容の概要**：タイトルとして「Delete」を表示し、本文として「Delete profile?」というメッセージを表示する。ダイアログにはゴミ箱アイコン（赤色、TablerIcons.trash）が表示され、承認・キャンセルの2つのボタンが提供される。

**期待されるアクション**：ユーザーは承認ボタンをタップして削除を実行するか、キャンセルボタンをタップして操作をキャンセルする。削除を実行した場合、ローカルデータベースからプロファイルが削除され、画面が更新される。

## 通知種別

アプリ内確認ダイアログ（AlertDialog）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（ユーザー操作による即時表示） |
| 優先度 | 高（モーダルダイアログとしてユーザー操作を遮断） |
| リトライ | 無（ダイアログ表示の失敗は考慮しない） |

### 送信先決定ロジック

- 現在アプリを操作しているユーザー
- 条件：なし（すべてのユーザーが削除可能）

## 通知テンプレート

### ダイアログ構成

| 項目 | 内容 |
|-----|------|
| アイコン | TablerIcons.trash（赤色） |
| タイトル | L10().delete |
| 本文 | L10().profileDelete + "?" |
| 形式 | AlertDialog |

### ボタン構成

| ボタン | テキスト | 動作 |
|-------|---------|------|
| 承認ボタン | L10().ok（デフォルト） | 削除処理を実行 |
| 拒否ボタン | L10().cancel（デフォルト） | ダイアログを閉じる |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| delete | 削除ダイアログのタイトル | L10()（ローカライズ文字列） | Yes |
| profileDelete | プロファイル削除の本文 | L10()（ローカライズ文字列） | Yes |
| ok | 承認ボタンのテキスト | L10()（ローカライズ文字列） | Yes |
| cancel | キャンセルボタンのテキスト | L10()（ローカライズ文字列） | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 画面操作 | プロファイル長押し後、削除メニュー選択 | なし | サーバー選択画面のコンテキストメニューから削除を選択 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| hasContext() == false | アプリコンテキストが利用できない場合（テスト環境等） |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[プロファイル長押し] --> B[SimpleDialog表示]
    B --> C[削除オプション選択]
    C --> D[confirmationDialog表示]
    D --> E{ユーザーの選択}
    E -->|承認| F[_deleteProfile関数呼び出し]
    E -->|キャンセル| G[ダイアログを閉じる]
    F --> H[UserProfileDBManager.deleteProfile]
    H --> I[_reload実行]
    I --> J{接続中のプロファイルか?}
    J -->|Yes| K[disconnectFromServer]
    J -->|No| L[画面更新完了]
    K --> L
    G --> M[終了]
    L --> M
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| UserProfile（ローカルDB） | 削除対象のプロファイル情報 | Sembast NoSQLデータベース |

### テーブル別参照項目詳細

#### UserProfile

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| key | プロファイルの識別 | 選択されたプロファイル |
| name | プロファイル名の表示 | ダイアログ表示用 |
| server | サーバーURL | 識別情報 |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| UserProfile（ローカルDB） | DELETE | プロファイルの削除 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 削除失敗 | データベース操作失敗 | エラーは暗黙的に処理される |
| マウント解除 | ウィジェットがアンマウント | mountedチェックで回避 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0回（ダイアログ表示はリトライなし） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし（ユーザー操作による即時表示）

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

- プロファイル削除はローカルのみで完結し、サーバーには影響しない
- 確認ダイアログにより誤操作を防止
- 削除されたプロファイルが接続中の場合、自動的に切断される

## 備考

- 削除成功後、プロファイル一覧が自動的に更新される（_reload呼び出し）
- 接続中のプロファイルを削除した場合、自動的にサーバーから切断される
- ローカライズ対応により多言語での表示が可能

---

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

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

### 推奨読解順序

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

ユーザープロファイルのデータモデルと、ダイアログで使用されるパラメータを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | user_profile.dart | `lib/user_profile.dart` | UserProfileクラスの構造、UserProfileDBManagerの操作 |
| 1-2 | dialogs.dart | `lib/widget/dialogs.dart` | confirmationDialog関数のパラメータと動作 |

**読解のコツ**: Sembast（NoSQL）データベースの使用方法を理解しておくと良い。

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

ユーザーが削除操作を開始する起点となるコードを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | select_server.dart | `lib/settings/select_server.dart` | onLongPressコールバック、SimpleDialogでのメニュー表示、confirmationDialog呼び出し |

**主要処理フロー**:
1. **182-246行目**: プロファイル長押し時のSimpleDialog表示
2. **221-232行目**: 削除オプション選択時のconfirmationDialog呼び出し
3. **126-139行目**: _deleteProfile()メソッドの実装

#### Step 3: ダイアログ表示処理を理解する

確認ダイアログの表示ロジックを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | dialogs.dart | `lib/widget/dialogs.dart` | confirmationDialog()関数（61-114行目）の実装詳細 |

**主要処理フロー**:
- **61-70行目**: 関数シグネチャとデフォルトパラメータ
- **78-113行目**: OneContext().showDialogによるダイアログ表示とボタン処理

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

```
InvenTreeSelectServerWidget (select_server.dart)
    |
    +-- build() [161-278行目]
    |       |
    |       +-- ListTile.onLongPress [182-246行目]
    |               |
    |               +-- OneContext().showDialog() [SimpleDialog]
    |               |       |
    |               |       +-- 削除オプション [220-241行目]
    |               |               |
    |               |               +-- confirmationDialog() [221-232行目]
    |               |                       |
    |               |                       +-- onAccept callback
    |               |                               |
    |               |                               +-- _deleteProfile() [126-139行目]
    |               |                                       |
    |               |                                       +-- UserProfileDBManager.deleteProfile()
    |               |                                       |
    |               |                                       +-- _reload()
    |               |                                       |
    |               |                                       +-- InvenTreeAPI().disconnectFromServer()
```

### データフロー図

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

プロファイル長押し ────> SimpleDialog表示 ────────────> コンテキストメニュー
                                                              |
                                                              v
                                                    削除オプション選択
                                                              |
                                                              v
                                                    confirmationDialog表示
                                                              |
                              +------------------+------------+
                              |                  |
                              v                  v
                           [承認]            [キャンセル]
                              |                  |
                              v                  v
                       ローカルDB削除       ダイアログ閉じる
                              |
                              v
                      +-------+-------+
                      |               |
                      v               v
              接続中のプロファイル  その他
                      |               |
                      v               v
                サーバー切断      画面更新
                      |
                      v
                 画面更新
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| select_server.dart | `lib/settings/select_server.dart` | ソース | サーバー選択画面、削除処理の起点 |
| dialogs.dart | `lib/widget/dialogs.dart` | ソース | confirmationDialog関数の実装 |
| user_profile.dart | `lib/user_profile.dart` | ソース | UserProfileモデル、UserProfileDBManager |
| api.dart | `lib/api.dart` | ソース | InvenTreeAPI.disconnectFromServer()メソッド |
| l10.dart | `lib/l10.dart` | ソース | ローカライズヘルパー関数 |
