# 機能設計書 65-ユーザープロフィール表示

## 概要

本ドキュメントは、Fizzyアプリケーションにおけるユーザーの詳細プロフィールを表示する機能の設計を詳述する。

### 本機能の処理概要

**業務上の目的・背景**：チームメンバーの情報を確認したり、自分のプロフィールを管理するために、ユーザーの詳細プロフィール画面が必要である。この画面から、ユーザー名の編集、アバターの変更、メールアドレスの変更、サインアウトなどの操作にアクセスできる。

**機能の利用シーン**：他のユーザーのプロフィールを確認する場面、自分のプロフィールを確認・編集する場面、関連するカード（アサインされたカード、作成したカード）を検索する場面などで利用される。

**主要な処理内容**：
1. 指定されたユーザーIDからユーザー情報を取得
2. ユーザー名、メールアドレス、アバターを表示
3. 自分のプロフィールの場合は追加設定項目を表示
4. 関連するカードへのリンクを提供
5. 検証済みユーザーの場合はアクティビティタイムラインを表示

**関連システム・外部連携**：ユーザーのアクティビティ表示（Users::EventsController）と連携。Turbo Frameで非同期読み込み。

**権限による制御**：認証必須。同一アカウント内のアクティブなユーザーのみ表示可能。編集操作はcan_change?で制御される。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 38 | ユーザープロフィール画面 | 主画面 | ユーザーのプロフィール・設定を表示 |

## 機能種別

データ参照処理（READ）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| id | UUID | Yes | ユーザーID | Current.account.users.active内に存在すること |

### 入力データソース

- URLパラメータ（id）
- Current.account（現在のアカウント）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| @user | User | 表示対象のユーザーオブジェクト |
| @user.name | String | ユーザー名 |
| @user.identity.email_address | String | メールアドレス |
| @user.avatar | ActiveStorage::Attached | アバター画像 |
| @user.verified? | Boolean | 検証済みかどうか |
| @user.active? | Boolean | アクティブ状態かどうか |

### 出力先

- 画面表示（HTML）
- Turbo Frame（user_events）で非同期にアクティビティを読み込み

## 処理フロー

### 処理シーケンス

```
1. リクエスト受信（GET /users/:id）
   └─ UsersController#show
2. ユーザー取得
   └─ set_user (before_action)
   └─ Current.account.users.active.find(params[:id])
3. ビューレンダリング
   └─ プロフィール情報表示
   └─ 自分の場合は追加設定表示
   └─ 検証済みの場合はアクティビティをTurbo Frameで読み込み
```

### フローチャート

```mermaid
flowchart TD
    A[GET /users/:id] --> B[set_user でユーザー取得]
    B --> C{ユーザーが存在?}
    C -->|No| D[404 Not Found]
    C -->|Yes| E[プロフィール情報を表示]
    E --> F{Current.user == @user?}
    F -->|Yes| G[編集リンク・設定項目を表示]
    F -->|No| H[閲覧のみ]
    G --> I{@user.verified?}
    H --> I
    I -->|Yes| J[アクティビティタイムラインをTurbo Frame読み込み]
    I -->|No| K[検証待ちメッセージ表示]
    J --> L[表示完了]
    K --> L
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-65-01 | アクティブユーザーのみ | active = trueのユーザーのみ表示可能 | 常に |
| BR-65-02 | 自己プロフィール拡張 | 自分のプロフィールの場合は追加設定項目を表示 | Current.user == @user |
| BR-65-03 | 検証済みユーザー制限 | アクティビティは検証済みユーザーのみ表示 | @user.verified? |
| BR-65-04 | 関連カードリンク | 検証済みの場合のみ関連カードへのリンクを表示 | @user.verified? |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| ユーザー取得 | users | SELECT | 指定IDのユーザーを取得 |
| Identity取得 | identities | SELECT | メールアドレス取得 |

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

#### users

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | * | id = params[:id], account_id = Current.account.id, active = true | findで取得 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 404 | ActiveRecord::RecordNotFound | 指定IDのユーザーが存在しないまたは非アクティブ | Rails標準の404ページ |

### リトライ仕様

読み取り専用のため、リトライ仕様は不要。

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

読み取り専用のため、トランザクション制御は不要。

## パフォーマンス要件

- レスポンス時間：500ms以内
- アクティビティはTurbo Frameで非同期読み込みのため、初期表示は高速

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

- 認証必須
- 同一アカウント内のユーザーのみ表示
- メールアドレスは同一アカウントメンバーには表示される

## 備考

- 非アクティブユーザーは「no longer on this account」と表示
- 未検証ユーザーは「Unverified」と表示
- 自分のプロフィールでは以下の追加項目が表示される:
  - テーマ設定
  - セッション転送設定
  - アクセストークン管理
  - データエクスポート
  - サインアウトボタン

---

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

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

### 推奨読解順序

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

Userモデルの構造と関連を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | user.rb | `app/models/user.rb` | Userモデルの基本構造、verified?メソッド |
| 1-2 | schema.rb | `db/schema.rb` | usersテーブルの定義（777-789行目） |

**読解のコツ**: user.rbの31-33行目でverified?メソッドが定義されている。verified_atカラムの有無で検証状態を判定。

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

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

**主要処理フロー**:
1. **2行目**: before_action :set_userでindexアクション以外で実行
2. **9-10行目**: showアクションは空（set_userで設定された@userを使用）
3. **39-41行目**: set_userでCurrent.account.users.active.findを実行

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | show.html.erb | `app/views/users/show.html.erb` | プロフィール表示ビュー |

**主要処理フロー**:
- **1行目**: @page_titleに@user.nameを設定
- **7-11行目**: 自分のプロフィールの場合は編集リンクを表示
- **21-29行目**: 非アクティブ/未検証/通常の状態に応じて異なるメッセージを表示
- **32-39行目**: 検証済みの場合は関連カードへのリンクを表示
- **41-47行目**: 自分のプロフィールの場合はサインアウトボタンを表示
- **51-57行目**: 自分の場合は追加設定パーシャルを表示
- **61-63行目**: 検証済みの場合はTurbo Frameでアクティビティを読み込み

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

```
UsersController#show
    │
    ├─ before_action :set_user
    │      └─ Current.account.users.active.find(params[:id])
    │
    └─ render "users/show"
           │
           ├─ user_avatar_path(@user) ───▶ Users::AvatarsController#show
           │
           ├─ (自分の場合)
           │      ├─ render "users/theme"
           │      ├─ render "users/transfer"
           │      ├─ render "users/access_tokens"
           │      └─ render "users/data_export"
           │
           └─ (検証済みの場合)
                  └─ turbo_frame_tag "user_events"
                         └─ Users::EventsController#show
```

### データフロー図

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

params[:id]     ───▶ Current.account.users.active.find ───▶ @user
                              │
                              ▼
                    ┌─────────┴─────────┐
                    ▼                   ▼
              @user情報            アバター画像
                    │                   │
                    ▼                   ▼
              ┌─────┴─────┐      user_avatar_path
              ▼           ▼
          通常表示    自分の場合
                         │
                    ┌────┴────┐
                    ▼         ▼
              設定項目   サインアウト
                              │
                              ▼
                    Turbo Frame (user_events)
                              │
                              ▼
                    Users::EventsController#show
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| users_controller.rb | `app/controllers/users_controller.rb` | コントローラー | プロフィール表示のエントリーポイント |
| user.rb | `app/models/user.rb` | モデル | ユーザーエンティティ |
| show.html.erb | `app/views/users/show.html.erb` | ビュー | プロフィール表示画面 |
| _theme.html.erb | `app/views/users/_theme.html.erb` | ビュー（パーシャル） | テーマ設定 |
| _transfer.html.erb | `app/views/users/_transfer.html.erb` | ビュー（パーシャル） | セッション転送設定 |
| _access_tokens.html.erb | `app/views/users/_access_tokens.html.erb` | ビュー（パーシャル） | アクセストークン管理 |
| _data_export.html.erb | `app/views/users/_data_export.html.erb` | ビュー（パーシャル） | データエクスポート |
| events_controller.rb | `app/controllers/users/events_controller.rb` | コントローラー | ユーザーアクティビティ |
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義（13行目） |
