# 機能設計書 177-メール確認再送

## 概要

本ドキュメントは、Chatwootにおけるメール確認再送機能の設計仕様を定義する。この機能は、未確認のメールアドレスに対して確認メールを再送信するためのAPIを提供する。

### 本機能の処理概要

**業務上の目的・背景**：
Chatwootでは、ユーザー登録やメールアドレス変更時にメールアドレスの確認が必要である。確認メールが届かなかった場合や、確認リンクの有効期限が切れた場合に、ユーザーが確認メールを再送信できる機能が必要である。これにより、ユーザーは自力でアカウントの確認を完了できる。

**機能の利用シーン**：
- ユーザーが登録後に確認メールを受信できなかった場合
- 確認メールがスパムフォルダに入っていて気づかなかった場合
- 確認リンクの有効期限が切れた場合
- メールアドレスを変更し、新しいアドレスの確認が必要な場合

**主要な処理内容**：
1. 認証済みユーザーの確認
2. メールアドレスが未確認であるか確認
3. 未確認の場合のみ確認メールを送信
4. 200 OK レスポンス返却

**関連システム・外部連携**：
- Devise: 確認メール送信機能
- メール配信サービス: 確認メールの実際の送信

**権限による制御**：
認証済みユーザーのみが自身の確認メールを再送信可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 89 | プロフィール設定画面 | 主画面 | 確認メールの再送 |

## 機能種別

メール送信 / ユーザー確認

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| なし | - | - | 認証トークンのみで識別 | - |

### 入力データソース

- 認証トークンからのユーザー識別

## 出力仕様

### 出力データ

レスポンスボディは空（200 OK）

### 出力先

- HTTPステータスコード 200 OK（head :ok）
- メール配信（確認メール）

## 処理フロー

### 処理シーケンス

```
1. リクエスト受信
   └─ POST /api/v1/profile/resend_confirmation
2. 認証検証
   └─ current_userから@userを設定
3. 確認状態チェック
   └─ @user.confirmed? で確認済みか判定
4. メール送信
   └─ 未確認の場合のみsend_confirmation_instructions呼び出し
5. レスポンス返却
   └─ head :ok（200 OK）
```

### フローチャート

```mermaid
flowchart TD
    A[POST /api/v1/profile/resend_confirmation] --> B{認証済み?}
    B -->|No| C[401 Unauthorized]
    B -->|Yes| D{メール確認済み?}
    D -->|Yes| E[何もしない]
    D -->|No| F[確認メール送信]
    F --> G[200 OK]
    E --> G
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-177-01 | 未確認チェック | 確認済みの場合はメールを送信しない | confirmed?がtrueの場合 |
| BR-177-02 | Devise連携 | Deviseのsend_confirmation_instructionsメソッドを使用 | メール送信時 |
| BR-177-03 | 非同期送信 | メールはdeliver_laterで非同期送信 | メール送信時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 確認状態取得 | users | SELECT | confirmed_atの確認 |
| 確認トークン更新 | users | UPDATE | confirmation_tokenとconfirmation_sent_atの更新 |

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

#### users

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | confirmed_at | id = current_user.id | 確認済みか判定 |
| UPDATE | confirmation_token | Deviseが生成 | 新しい確認トークン |
| UPDATE | confirmation_sent_at | 現在時刻 | 送信日時 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 401 | Unauthorized | 認証トークンが無効 | 再ログイン |

### リトライ仕様

特になし

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

Deviseの確認メール送信処理は内部でトランザクションを管理する。

## パフォーマンス要件

- レスポンス時間: 300ms以内（メール送信は非同期）

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

- 認証トークンによるアクセス制御
- 確認トークンはDeviseにより暗号学的に安全な値が生成される
- レート制限を検討（スパム防止）

## 備考

- メール確認済みの場合は何もせずに200 OKを返却
- メール送信はDeviseMailerのdeliver_laterにより非同期実行

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | user.rb | `app/models/user.rb` | Userモデルのconfirmable関連カラム（確認トークン、確認日時等） |

**読解のコツ**: Userモデルのスキーマコメント（8-9行目）を参照し、`confirmation_sent_at`、`confirmation_token`、`confirmed_at`の各カラムを確認する。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | profiles_controller.rb | `app/controllers/api/v1/profiles_controller.rb` | resend_confirmationアクションの実装 |

**主要処理フロー**:
1. **36行目**: `resend_confirmation`アクション定義
2. **37行目**: `@user.send_confirmation_instructions unless @user.confirmed?` - 未確認時のみメール送信
3. **38行目**: `head :ok` - 200 OKを返却

#### Step 3: Devise連携を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | user.rb | `app/models/user.rb` | devise :confirmableの設定 |

**主要処理フロー**:
- **65行目**: `:confirmable` - Deviseの確認機能を有効化
- **127-129行目**: `send_devise_notification` - devise_mailer経由でメール送信

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

```
Api::V1::ProfilesController#resend_confirmation
    │
    ├─ @user.confirmed?
    │      └─ Devise::Models::Confirmable#confirmed?
    │
    └─ @user.send_confirmation_instructions (unless confirmed)
           └─ Devise::Models::Confirmable#send_confirmation_instructions
                  └─ User#send_devise_notification
                         └─ devise_mailer.send(:confirmation_instructions, ...)
                                └─ deliver_later
```

### データフロー図

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

POST リクエスト ───────▶ ProfilesController#resend_confirmation ───────▶ 200 OK
                              │
                              ├─ confirmed? チェック
                              │
                              └─ send_confirmation_instructions
                                    │
                                    ├─▶ users UPDATE (confirmation_token, confirmation_sent_at)
                                    │
                                    └─▶ DeviseMailer (deliver_later)
                                           │
                                           └─▶ [確認メール]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| profiles_controller.rb | `app/controllers/api/v1/profiles_controller.rb` | コントローラー | resend_confirmationアクションの定義（36-39行目） |
| user.rb | `app/models/user.rb` | モデル | Devise confirmable設定、send_devise_notification |
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義（374行目） |
