# 通知設計書 16-サインアップ成功/失敗通知

## 概要

本ドキュメントは、ユーザーが会員登録（サインアップ）を実行した際の結果を通知するアプリ内通知の設計を定義する。

### 本通知の処理概要

サインアップ画面においてユーザーが必要情報（氏名、メールアドレス、パスワードなど）を入力して会員登録を実行した際、その登録結果（成功または失敗）をリアルタイムでフィードバックするアプリ内オーバーレイ通知機能である。

**業務上の目的・背景**：会員登録はECアプリの利用開始における最初の重要なステップである。登録成功時には歓迎メッセージを表示してユーザーに安心感を与え、失敗時には具体的なエラー内容を提示することで再試行を支援する。既に登録済みのメールアドレス使用やパスワード要件未満など、様々なエラーケースに対応した通知を提供する。

**通知の送信タイミング**：会員登録APIリクエストの結果が返却された直後に通知が表示される。具体的には`FetchSignUpState`がBlocから発行されたタイミングで通知処理が実行される。

**通知の受信者**：会員登録操作を実行したユーザー本人のみ。デバイス上で即座に表示されるローカル通知。

**通知内容の概要**：成功時は緑色背景の成功通知でサーバーからの登録完了メッセージを表示。失敗時は赤色背景のエラー通知でエラーメッセージを表示する。

**期待されるアクション**：成功時はホーム画面へ自動遷移し、アプリの利用を開始する。失敗時は入力内容を修正して再度登録を試行する。

## 通知種別

アプリ内通知（オーバーレイ通知）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（API応答後即時表示） |
| 優先度 | 高 |
| リトライ | 無（表示は1回のみ） |

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

会員登録操作を実行したユーザーのデバイス画面に直接表示される。

## 通知テンプレート

### アプリ内通知の場合

| 項目 | 内容 |
|-----|------|
| 表示位置 | 画面上部オーバーレイ |
| 表示時間 | 約3秒（自動消去） |
| 背景色（成功時） | 緑色（Colors.green.shade400） |
| 背景色（失敗時） | 赤色（Colors.red） |

### 本文テンプレート

**成功時**
```
タイトル: Success
メッセージ: {APIレスポンスのmessage}
アイコン: check_circle_outline（白色）
```

**失敗時**
```
タイトル: Failed
メッセージ: {エラーメッセージ}
アイコン: cancel_outlined（白色）
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| message | 登録成功メッセージ | signUpModel.message | Yes（成功時） |
| error | エラーメッセージ | state.error | Yes（失敗時） |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 画面操作 | FetchSignUpEvent発行 | FetchSignUpState.success受信時 | 会員登録成功 |
| 画面操作 | FetchSignUpEvent発行 | FetchSignUpState.fail受信時 | 会員登録失敗 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| バリデーションエラー | クライアント側バリデーションでエラーの場合はAPI呼び出し前に処理 |
| 利用規約未同意 | agreementがfalseの場合はフォームエラー表示 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[アカウント作成ボタンタップ] --> B{バリデーション}
    B -->|NG| C[フォームエラー表示]
    B -->|OK| D[FetchSignUpEvent発行]
    D --> E[SignUpBloc処理]
    E --> F[repository登録API呼び出し]
    F --> G{API結果}
    G -->|success=true| H[FetchSignUpState.success発行]
    G -->|success=false| I[FetchSignUpState.fail発行]
    H --> J[successNotification表示]
    I --> K[errorNotification表示]
    J --> L[ユーザー情報保存]
    L --> M[ホーム画面へ遷移]
    K --> N[ダイアログ閉じる]
    N --> O[サインアップ画面に留まる]
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| customers | メールアドレス重複チェック | 既存ユーザー確認 |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| customers | INSERT | 新規ユーザー登録 |
| customer_sessions | INSERT | セッション作成 |

#### ローカルストレージ更新（成功時）

| キー | 操作 | 値 |
|-----|------|-----|
| customerLoggedIn | SET | true |
| customerName | SET | ユーザー名 |
| customerEmail | SET | メールアドレス |
| customerToken | SET | 認証トークン |
| customerId | SET | ユーザーID |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| メールアドレス重複 | 既に登録済みのメールアドレス | エラー通知表示、別のメールアドレスを促す |
| パスワード要件不満 | パスワードが要件を満たさない | エラー通知表示、要件を満たすパスワードを促す |
| 必須項目未入力 | 必須フィールドが空 | クライアント側バリデーション表示 |
| ネットワークエラー | インターネット接続なし | エラー通知表示 |
| サーバーエラー | サーバー側エラー | エラー通知表示 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0回（自動リトライなし） |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

## 配信設定

### レート制限

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

### 配信時間帯

制限なし（ユーザー操作に応じて即時表示）

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

- パスワードはサーバーへの送信時にHTTPS暗号化される
- サーバー側でパスワードはハッシュ化されて保存される
- 認証トークンはセキュアに保存される
- メールアドレス確認メールがサーバーから送信される可能性あり

## 備考

- overlay_supportパッケージを使用してオーバーレイ通知を実装
- 成功時は1秒後にホーム画面へ遷移（Future.delayed）
- 失敗時は2秒後にダイアログが閉じられる
- ニュースレター購読オプションあり（isNewsLetterSelected）
- 利用規約同意チェックボックスが必須（agreement）

---

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

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

### 推奨読解順序

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

まず、会員登録レスポンスのデータモデルを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sign_up_state.dart | `lib/screens/sign_up/bloc/sign_up_state.dart` | FetchSignUpStateの構造を確認 |

**読解のコツ**: FetchSignUpStateのstatus、signUpModel、errorプロパティが登録成否の判定と通知メッセージに使用される。

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

処理の起点となるサインアップ画面のUIコードを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sign_up.dart | `lib/screens/sign_up/view/sign_up.dart` | BlocConsumerのlistener内でFetchSignUpStateの処理を確認 |

**主要処理フロー**:
1. **行72-93**: FetchSignUpState処理
2. **行74-78**: 失敗時のerrorNotification呼び出しとダイアログ閉じる処理
3. **行79-92**: 成功時のsuccessNotification呼び出しとホーム画面遷移

#### Step 3: Bloc処理層を理解する

会員登録ビジネスロジックを処理するBlocの実装を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sign_up_bloc.dart | `lib/screens/sign_up/bloc/sign_up_bloc.dart` | FetchSignUpEventのハンドリングを確認 |

#### Step 4: 通知表示層を理解する

通知の実際の表示処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | show_message.dart | `lib/widgets/show_message.dart` | successNotification、errorNotificationメソッドの実装を確認 |

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

```
SignUpScreen (sign_up.dart)
    │
    ├─ _onPressCreateAccount (行308-357)
    │      │
    │      ├─ バリデーション
    │      │
    │      └─ FetchSignUpEvent発行
    │
    └─ BlocConsumer<SignUpBloc, SignUpBaseState>
           │
           └─ listener (行72-93)
                  │
                  ├─ FetchSignUpState.fail処理 (行74-78)
                  │      │
                  │      ├─ ShowMessage.errorNotification
                  │      │
                  │      └─ Navigator.pop (2秒後)
                  │
                  └─ FetchSignUpState.success処理 (行79-92)
                         │
                         ├─ ShowMessage.successNotification
                         │
                         ├─ _updateSharedPreferences
                         │
                         └─ Navigator.pushNamedAndRemoveUntil (1秒後)
```

### データフロー図

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

登録情報入力         FetchSignUpEvent           FetchSignUpState
 + 登録タップ   ───▶   発行            ───▶    (success/fail)
                           │                         │
                           ▼                         ▼
                      SignUpBloc              BlocConsumer
                           │                    listener
                           ▼                         │
                     repository                      ▼
                    登録API呼び出し           ShowMessage
                           │               .successNotification
                           ▼               .errorNotification
                      API Response                   │
                           │                         ▼
                           ▼               オーバーレイ通知表示
                    SignInModel                      │
                 (token, message)                    ▼
                                          ホーム画面遷移(成功時)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sign_up.dart | `lib/screens/sign_up/view/sign_up.dart` | ソース | サインアップ画面UI、通知表示トリガー |
| sign_up_bloc.dart | `lib/screens/sign_up/bloc/sign_up_bloc.dart` | ソース | 会員登録ビジネスロジック |
| sign_up_event.dart | `lib/screens/sign_up/bloc/sign_up_event.dart` | ソース | 会員登録イベント定義 |
| sign_up_state.dart | `lib/screens/sign_up/bloc/sign_up_state.dart` | ソース | 会員登録状態定義 |
| show_message.dart | `lib/widgets/show_message.dart` | ソース | 通知表示ウィジェット |
| app_storage_pref.dart | `lib/utils/app_storage_pref.dart` | ソース | ローカルストレージ管理 |
