# 通知設計書 6-組織削除成功

## 概要

本ドキュメントは、Liamアプリケーションにおける組織削除成功時のUI通知（トースト）の設計仕様を定義する。組織管理者が組織設定画面で組織を削除し、正常に削除された場合に表示される成功通知について、表示仕様、トリガー条件、処理フローを詳細に記載する。

### 本通知の処理概要

組織削除成功通知は、組織設定画面（General設定）で組織を削除し、削除処理が正常に完了した後、組織一覧ページにリダイレクトされた際に表示されるトースト通知である。

**業務上の目的・背景**：組織の削除は取り消しのできない重大な操作である。削除が確実に完了したことをユーザーに明確にフィードバックすることで、操作の完了を確認させ、誤解を防止する。また、削除後のナビゲーション（組織一覧ページへのリダイレクト）と合わせて、次のアクションをスムーズに取れるようにする。

**通知の送信タイミング**：組織設定画面（`/organizations/{organizationId}/settings/general`）で削除ボタンを押下し、確認ダイアログで組織名を入力して削除を確定した後、サーバーアクション`deleteOrganizationAction`が正常に完了し、組織一覧ページ（`/organizations`）にリダイレクトされた時点で表示される。

**通知の受信者**：組織削除操作を実行した組織管理者本人。リダイレクト後の組織一覧ページでトースト通知が表示される。

**通知内容の概要**：「Deleted」というタイトルと、削除された組織名を含む説明文（`Organization "{organizationName}" has been deleted successfully`）が、成功（success）ステータスのトースト通知として表示される。

**期待されるアクション**：ユーザーは組織の削除が完了したことを確認し、他の組織を選択するか、新しい組織を作成するなどの操作を行う。

## 通知種別

UI通知（トースト）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 非同期（sessionStorageを経由してページ遷移後に表示） |
| 優先度 | 中 |
| リトライ | なし（UI表示のため不要） |

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

組織削除操作を実行したユーザーが組織一覧ページにリダイレクトされた際に、sessionStorageに保存された通知データを検知して表示する。

## 通知テンプレート

### UI通知の場合

| 項目 | 内容 |
|-----|------|
| タイトル | Deleted |
| 説明文 | Organization "{organizationName}" has been deleted successfully |
| ステータス | success |
| 表示位置 | header（ヘッダー下部） |

### 本文テンプレート

```
タイトル: Deleted
説明: Organization "${organizationName}" has been deleted successfully
```

### 添付ファイル

| ファイル名 | 形式 | 条件 | 説明 |
|----------|------|------|------|
| なし | - | - | UI通知のため添付ファイルなし |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| organizationName | 削除された組織の名称 | サーバーアクションのmessageフィールド | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 画面遷移 | 組織一覧ページへのリダイレクト | sessionStorage`organization_deleted`が存在 | 削除成功後のリダイレクト時 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| sessionStorageにデータなし | `organization_deleted`キーが存在しない場合は表示しない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[ユーザーが削除ボタン押下] --> B[確認ダイアログ表示]
    B --> C[組織名入力して確定]
    C --> D[deleteOrganizationAction実行]
    D --> E{削除結果}
    E -->|成功| F[deleteState.success = true]
    E -->|失敗| G[deleteState.error設定]
    F --> H[sessionStorageにトーストデータ保存]
    H --> I[router.pushで組織一覧へ遷移]
    I --> J[OrganizationsPageClient検知]
    J --> K[sessionStorageからデータ取得]
    K --> L[成功トースト表示]
    L --> M[sessionStorageからデータ削除]
    M --> N[終了]
    G --> O[エラートースト表示]
    O --> N
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| organizations | 削除対象の確認、組織名取得 | 削除前に組織名を取得してメッセージに使用 |

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

#### organizations

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| name | 削除成功メッセージへの埋め込み | `WHERE id = ${organizationId}` |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| organizations | DELETE | 組織レコードの削除 |

#### 送信ログテーブル

| 操作 | 項目（カラム名） | 更新値 | 備考 |
|-----|-----------------|-------|------|
| - | - | - | UI通知のため送信ログなし |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| なし | - | 成功通知のためエラーケースなし |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | なし（UI表示のため制限不要） |
| 1日あたり上限 | なし |

### 配信時間帯

特に制限なし。ユーザー操作に応じて即座に表示される。

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

- 組織の削除は認可されたユーザー（組織管理者）のみ実行可能
- 削除前に組織名の入力による確認を必須とし、誤削除を防止
- sessionStorageはブラウザセッション内でのみ有効であり、他のタブやセッションには影響しない
- トースト表示後にsessionStorageからデータを削除し、重複表示を防止

## 備考

- ページ遷移を伴う操作のため、sessionStorageを使用してトーストデータを一時保存
- OrganizationsPageClientコンポーネントがuseEffectでsessionStorageを監視
- JSON.parse/stringifyでオブジェクトの保存・復元を行う
- urlgen関数を使用して一貫したURL生成を実現

---

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

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

### 推奨読解順序

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

まず、sessionStorageに保存されるトーストデータの構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | GeneralPageClient.tsx | `frontend/apps/app/components/GeneralPage/components/GeneralPageClient/GeneralPageClient.tsx` | sessionStorageへの保存形式（57-63行目）を理解する |

**読解のコツ**: `{ title, description, status }`の形式でJSON.stringifyして保存している。

#### Step 2: 削除処理の起点を理解する

処理の起点となる削除ボタンとアクションを特定。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | GeneralPageClient.tsx | `frontend/apps/app/components/GeneralPage/components/GeneralPageClient/GeneralPageClient.tsx` | useActionStateでdeleteOrganizationAction（31-35行目）、useEffect（54-75行目）を理解する |

**主要処理フロー**:
1. **31-35行目**: useActionStateでdeleteOrganizationActionをラップ
2. **54-75行目**: useEffectでdeleteStateを監視
3. **55-67行目**: deleteState.success時にsessionStorageに保存してリダイレクト
4. **68-73行目**: deleteState.error時にエラートースト表示

#### Step 3: リダイレクト先でのトースト表示を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | OrganizationsPageClient.tsx | `frontend/apps/app/components/OrganizationsPage/OrganizationsPageClient.tsx` | sessionStorageからの復元とトースト表示（9-27行目）を理解する |

**主要処理フロー**:
- **11行目**: `sessionStorage.getItem('organization_deleted')`でデータ取得
- **13行目**: `JSON.parse(storedToast)`でオブジェクト復元
- **14-22行目**: トースト表示
- **25行目**: `sessionStorage.removeItem()`でデータ削除

#### Step 4: サーバーアクションを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | organizationClientActions.ts | `frontend/apps/app/components/GeneralPage/components/GeneralPageClient/actions/organizationClientActions.ts` | deleteOrganizationAction関数（70-124行目）を理解する |

**主要処理フロー**:
- **97-98行目**: 組織情報の取得と名前の保存
- **103-108行目**: 確認テキストと組織名の一致確認
- **120-123行目**: 成功レスポンスに組織名を含むメッセージを設定

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

```
GeneralPageClient.tsx
    │
    ├─ DeleteOrganizationButtonClient (確認ダイアログ)
    │      │
    │      └─ deleteAction (formに渡す)
    │
    └─ useEffect([deleteState])
           │
           ├─ [success時] sessionStorage.setItem()
           │                   │
           │                   └─ router.push('/organizations')
           │
           └─ [error時] toast({ title: 'Error', ... })

OrganizationsPageClient.tsx
    │
    └─ useEffect([])
           │
           ├─ sessionStorage.getItem()
           │
           ├─ toast({ title, description, status })
           │
           └─ sessionStorage.removeItem()
```

### データフロー図

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

削除確定                 ───▶ deleteOrganizationAction    ───▶ deleteState更新
(organizationId,              │                               │
 confirmText)                 │                               ▼
                              └─▶ DB削除                  useEffect検知
                                                               │
                                                               ▼
                                                          sessionStorage保存
                                                               │
                                                               ▼
                                                          /organizations遷移
                                                               │
                                                               ▼
OrganizationsPageClient ───▶ sessionStorage読取        ───▶ トースト表示
                              │                               │
                              └─▶ sessionStorage削除          終了
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| GeneralPageClient.tsx | `frontend/apps/app/components/GeneralPage/components/GeneralPageClient/GeneralPageClient.tsx` | ソース | 削除処理・sessionStorage保存 |
| OrganizationsPageClient.tsx | `frontend/apps/app/components/OrganizationsPage/OrganizationsPageClient.tsx` | ソース | sessionStorage読取・トースト表示 |
| organizationClientActions.ts | `frontend/apps/app/components/GeneralPage/components/GeneralPageClient/actions/organizationClientActions.ts` | ソース | 組織削除サーバーアクション |
| DeleteOrganizationButtonClient.tsx | `frontend/apps/app/components/GeneralPage/components/GeneralPageClient/components/DeleteOrganizationButtonClient.tsx` | ソース | 削除確認ダイアログ |
| Toast.tsx | `frontend/packages/ui/src/components/Toast/Toast.tsx` | ソース | トースト通知UIコンポーネント |
| useToast.tsx | `frontend/packages/ui/src/components/Toast/useToast.tsx` | ソース | トーストフック |
