# 画面設計書 35-通知設定画面

## 概要

本ドキュメントは、Fizzyアプリケーションにおける通知設定画面の設計仕様を記述したものです。

### 本画面の処理概要

通知設定画面は、ユーザーがメール通知の頻度やボードごとの通知設定を管理する画面です。プッシュ通知の設定も行うことができます。

**業務上の目的・背景**：ユーザーによって通知の受け取り方の好みは異なります。頻繁に通知を受け取りたいユーザーもいれば、まとめて受け取りたいユーザーもいます。また、特定のボードの通知だけを受け取りたいケースもあります。本画面は、これらの個人の好みに合わせて通知設定をカスタマイズできるようにします。

**画面へのアクセス方法**：通知一覧画面の設定アイコン、またはマイメニュー画面から「通知設定」を選択することでアクセスできます。

**主要な操作・処理内容**：
1. ボードごとの通知関与レベルを設定
2. メール通知の頻度を設定（never / every_few_hours / daily / weekly）
3. プッシュ通知の有効化/無効化

**画面遷移**：
- 遷移元：通知一覧画面、マイメニュー画面
- 遷移先：通知解除画面

**権限による表示制御**：ユーザー自身の設定のみが表示・編集可能です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 60 | 通知設定 | 主機能 | メール通知の頻度や配信設定を変更 |

## 画面種別

設定

## URL/ルーティング

- **パス**: `/notifications/settings`
- **HTTPメソッド**: GET（表示）、PATCH（更新）
- **コントローラ**: `Notifications::SettingsController#show` / `#update`

## 入出力項目

| 項目名 | 項目ID | 入出力 | データ型 | 必須 | 最大長 | 説明 |
|--------|--------|--------|----------|------|--------|------|
| メール通知頻度 | bundle_email_frequency | 入力 | Enum | 必須 | - | never / every_few_hours / daily / weekly |

## 表示項目

| 項目名 | 説明 | データ取得元 |
|--------|------|-------------|
| ページタイトル | 「Notification Settings」固定 | - |
| ボード一覧 | ユーザーがアクセス可能なボード | @boards |
| ボードごとの通知設定 | 各ボードの関与レベル設定 | Access.involvement |
| メール通知頻度選択 | メール配信頻度のドロップダウン | @settings.bundle_email_frequency |
| プッシュ通知設定 | プッシュ通知の有効/無効 | - |

## イベント仕様

### 1-ボード関与レベル変更

ボードごとの通知関与レベルを変更します。

- **トリガー**: ボードの関与レベルボタンをクリック
- **処理フロー**:
  1. PATCH `/boards/:board_id/involvement` を送信
  2. Accessレコードのinvolvementを更新
  3. Turbo Streamでボタン表示を更新
- **関与レベル**: access_only / involved / watching

### 2-メール通知頻度変更

メール通知の配信頻度を変更します。

- **トリガー**: 頻度ドロップダウンを変更
- **処理フロー**:
  1. フォームが自動送信（change->form#submit）
  2. PATCH `/notifications/settings` を送信
  3. `User::Settings.bundle_email_frequency` を更新
  4. 通知設定画面にリダイレクト（成功メッセージ付き）
- **データ更新**: user_settings.bundle_email_frequency

### 3-プッシュ通知設定

プッシュ通知を有効化/無効化します。

- **トリガー**: プッシュ通知トグルをクリック
- **処理フロー**:
  1. ブラウザの通知許可をリクエスト
  2. 許可された場合、Service Worker経由でサブスクリプションを登録
  3. POST `/users/:user_id/push_subscriptions` を送信

## データベース更新仕様

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 画面表示 | boards | SELECT | ユーザーがアクセス可能なボードを取得 |
| 画面表示 | user_settings | SELECT | ユーザー設定を取得 |
| 頻度変更 | user_settings | UPDATE | メール通知頻度を更新 |
| ボード関与変更 | accesses | UPDATE | ボードへの関与レベルを更新 |
| プッシュ登録 | push_subscriptions | INSERT | プッシュ購読情報を保存 |

### テーブル別更新項目詳細

#### user_settings

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | bundle_email_frequency | 選択値（0-3） | enumで管理 |
| UPDATE | updated_at | 現在時刻 | 自動更新 |

#### accesses

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | involvement | 選択値 | access_only / involved / watching |
| UPDATE | updated_at | 現在時刻 | 自動更新 |

## メッセージ仕様

| 種別 | メッセージID | メッセージ内容 | 表示条件 |
|------|------------|---------------|---------|
| 成功 | settings_updated | Settings updated | 設定更新成功時 |
| ラベル | boards_header | Boards | ボードセクションヘッダー |
| ラベル | email_notifications | Email Notifications | メール設定セクション |
| 説明 | email_description | Get a single email with all your notifications every few hours, daily, or weekly. | メール設定の説明文 |

## 例外処理

| 例外 | 発生条件 | 処理内容 |
|-----|---------|---------|
| 認証エラー | 未ログイン状態 | ログイン画面へリダイレクト |
| ValidationError | 不正な頻度値 | エラーメッセージを表示 |

## 備考

- ボードは`alphabetically`スコープでアルファベット順に表示
- メール頻度選択はStimulusのform#submitでonchange時に自動送信
- bundle_email_frequencyのenum値: never(0), every_few_hours(1), daily(2), weekly(3)
- 設定変更時にpending_bundlesの処理が行われる

---

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

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

### 推奨読解順序

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

ユーザー設定のデータモデルを理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | settings.rb | `app/models/user/settings.rb` | User::Settingsモデル、bundle_email_frequencyのenum定義 |
| 1-2 | schema.rb | `db/schema.rb` | user_settingsテーブル（765-775行目）の構造 |

**読解のコツ**: `enum :bundle_email_frequency`で通知頻度を管理。`bundling_emails?`メソッドで通知バンドルの対象かを判定。

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

コントローラのshow/updateアクションを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | settings_controller.rb | `app/controllers/notifications/settings_controller.rb` | show/updateアクションの実装 |

**主要処理フロー**:
1. **3行目**: `before_action :set_settings` で`@settings = Current.user.settings`を設定
2. **5-6行目**: showアクションでボード一覧を取得
3. **8-10行目**: updateアクションで設定を更新、リダイレクト

#### Step 3: ビューレイヤーを理解する

通知設定画面のテンプレート構造を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | show.html.erb | `app/views/notifications/settings/show.html.erb` | メイン画面テンプレート |
| 3-2 | _board.html.erb | `app/views/notifications/settings/_board.html.erb` | ボード設定パーシャル |
| 3-3 | _email.html.erb | `app/views/notifications/settings/_email.html.erb` | メール設定パーシャル |

**主要処理フロー**:
- **show.html.erb 12行目**: ボードコレクションをレンダリング
- **show.html.erb 19行目**: メール設定パーシャルをレンダリング
- **_email.html.erb 10行目**: selectのonchangeでform#submitを発火

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

```
Notifications::SettingsController#show
    │
    ├─ set_settings
    │      │
    │      └─ @settings = Current.user.settings
    │
    ├─ @boards = Current.user.boards.alphabetically
    │
    └─ render show.html.erb
           │
           ├─ render _board.html.erb (collection)
           │      │
           │      └─ access_involvement_advance_button
           │
           ├─ render _push_notifications.html.erb
           │
           └─ render _email.html.erb
                  │
                  └─ form_with + select :bundle_email_frequency

Notifications::SettingsController#update
    │
    ├─ set_settings
    │
    ├─ @settings.update!(settings_params)
    │      │
    │      └─ User::Settings#bundle_email_frequency=
    │             │
    │             └─ review_pending_bundles (callback)
    │
    └─ redirect_to notifications_settings_path, notice: "Settings updated"
```

### データフロー図

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

GET /settings            SettingsController#show
                              │
                        @settings取得
                        @boards取得
                              │
                              ▼
                        show.html.erb
                              │
                        ┌─────┼─────┐
                        │     │     │
                   ボード一覧  プッシュ  メール設定
                        │           │
                        ▼           ▼
                   関与設定   bundle_email_frequency

フォーム送信             SettingsController#update
  bundle_email_frequency ──▶ @settings.update!
                              │
                        review_pending_bundles
                              │
                        redirect (notice: "Settings updated")
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| settings_controller.rb | `app/controllers/notifications/settings_controller.rb` | コントローラ | 通知設定の表示・更新 |
| show.html.erb | `app/views/notifications/settings/show.html.erb` | テンプレート | メイン画面 |
| _board.html.erb | `app/views/notifications/settings/_board.html.erb` | パーシャル | ボード設定 |
| _email.html.erb | `app/views/notifications/settings/_email.html.erb` | パーシャル | メール設定 |
| settings.rb | `app/models/user/settings.rb` | モデル | ユーザー設定定義 |
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義（108行目） |
| schema.rb | `db/schema.rb` | スキーマ | user_settingsテーブル定義 |
