# 機能設計書 74-アカウント名変更

## 概要

本ドキュメントは、Fizzyアプリケーションにおけるアカウント名の変更機能の設計を記述する。

### 本機能の処理概要

アカウントの表示名を変更する機能である。アカウント設定画面から管理者が実行可能であり、変更は即座に反映される。

**業務上の目的・背景**：組織名の変更、チーム名の更新、プロジェクト名の変更など、アカウントを識別する名前を柔軟に変更できる必要がある。この機能により、アカウントの用途や所有者の状況変化に応じて適切な名前を設定できる。

**機能の利用シーン**：
- 会社名や組織名が変更された場合
- プロジェクトの目的や範囲が変わった場合
- より分かりやすい名前に更新したい場合

**主要な処理内容**：
1. アカウント設定画面でアカウント名を入力
2. フォーム送信時にバリデーション実行
3. バリデーション成功時にアカウント名を更新
4. アカウント設定画面にリダイレクト

**関連システム・外部連携**：特になし

**権限による制御**：管理者（admin）ロールを持つユーザーのみがアカウント名を変更可能。一般メンバーはアカウント名を閲覧のみ可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 53 | アカウント設定画面 | 主画面 | アカウント名の表示・編集フォーム |

## 機能種別

データ更新（CRUD: Update）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| account[name] | String | Yes | 新しいアカウント名 | presence: true |

### 入力データソース

- 画面入力：アカウント名入力フォーム（_name.html.erb）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| リダイレクト | URL | アカウント設定画面（account_settings_path） |

### 出力先

- 画面遷移：アカウント設定画面へリダイレクト

## 処理フロー

### 処理シーケンス

```
1. 管理者がアカウント名を編集
   └─ テキストフィールドに新しい名前を入力

2. フォーム送信
   └─ PATCHリクエストでupdateアクションを呼び出し

3. 権限チェック
   └─ ensure_adminコールバックで管理者権限を確認
   └─ 非管理者の場合は403 Forbiddenを返却

4. アカウント更新
   └─ @account.update!(account_params)
   └─ バリデーション失敗時は例外発生

5. リダイレクト
   └─ アカウント設定画面にリダイレクト
```

### フローチャート

```mermaid
flowchart TD
    A[開始: アカウント名変更] --> B{管理者権限あり?}
    B -->|No| C[403 Forbidden]
    B -->|Yes| D[アカウント情報取得]
    D --> E[アカウント名を更新]
    E --> F{バリデーション成功?}
    F -->|No| G[422 Unprocessable Entity]
    F -->|Yes| H[アカウント設定画面にリダイレクト]
    H --> I[終了]
    C --> I
    G --> I
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-74-01 | 管理者権限必須 | アカウント名の変更は管理者のみ実行可能 | updateアクション実行時 |
| BR-74-02 | 名前必須 | アカウント名は空にできない | バリデーション時 |
| BR-74-03 | 即時反映 | 変更は即座に全ユーザーに反映される | 更新成功時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| アカウント更新 | accounts | UPDATE | アカウント名を更新 |

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

#### accounts

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | name | 入力されたアカウント名 | validates :name, presence: true |
| UPDATE | updated_at | 現在時刻 | 自動更新 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 403 | 権限エラー | 非管理者による更新試行 | Forbiddenエラー（ensure_adminで制御） |
| 422 | バリデーションエラー | アカウント名が空 | 例外発生（update!使用） |

### リトライ仕様

特になし

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

単一レコードの更新のため、明示的なトランザクション管理は不要。ActiveRecordのデフォルトのトランザクションが適用される。

## パフォーマンス要件

- レスポンス時間：1秒以内
- 単純なUPDATE操作のため、パフォーマンス上の問題は想定されない

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

- before_action :ensure_adminによる権限チェック
- Strong Parameters（account_params）による許可パラメータの制限
- CSRFトークンによるリクエスト検証（Rails標準）

## 備考

- アカウント名はアプリケーション内でアカウントを識別するために使用される
- URLスラッグはexternal_account_idを基に生成されるため、アカウント名の変更はURLに影響しない

---

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

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

### 推奨読解順序

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

アカウントのデータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Account | `app/models/account.rb` | バリデーションとカラム定義を確認 |

**読解のコツ**: `validates :name, presence: true`（21行目）でアカウント名の必須バリデーションを確認。

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

処理の起点となるコントローラーを確認する。

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

**主要処理フロー**:
1. **2行目**: `before_action :ensure_admin, only: :update` - 管理者権限チェック
2. **3行目**: `before_action :set_account` - アカウント取得
3. **9-11行目**: updateアクション
4. **10行目**: `@account.update!(account_params)` - 更新実行（失敗時は例外）
5. **11行目**: アカウント設定画面にリダイレクト
6. **19-20行目**: Strong Parametersでnameのみ許可

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

画面表示の実装を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | _name.html.erb | `app/views/account/settings/_name.html.erb` | アカウント名編集フォーム |

**主要処理フロー**:
- **2行目**: form_with model: account - フォーム定義
- **3行目**: text_field :name - アカウント名入力フィールド
- **3行目**: readonly: !Current.user.admin? - 非管理者は読み取り専用

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

```
Account::SettingsController#update
    │
    ├─ ensure_admin (before_action)
    │      └─ 非管理者の場合は403 Forbidden
    │
    ├─ set_account (before_action)
    │      └─ @account = Current.account
    │
    ├─ @account.update!(account_params)
    │      │
    │      ├─ バリデーション実行
    │      │      └─ validates :name, presence: true
    │      │
    │      └─ accountsテーブルUPDATE
    │
    └─ redirect_to account_settings_path
```

### データフロー図

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

account[name] ───▶ Account::SettingsController#update ───▶ リダイレクト
(フォーム入力)          │                                    (account_settings_path)
                        │
                        ├──▶ 権限チェック
                        │
                        ├──▶ バリデーション
                        │
                        └──▶ accountsテーブル ───────────▶ UPDATE accounts
                                                            SET name = '...'
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| SettingsController | `app/controllers/account/settings_controller.rb` | コントローラー | アカウント設定の更新 |
| Account | `app/models/account.rb` | モデル | アカウント情報管理・バリデーション |
| _name.html.erb | `app/views/account/settings/_name.html.erb` | ビュー（パーシャル） | アカウント名編集フォーム |
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義（8行目） |
