# 機能設計書 3-サインアウト

## 概要

本ドキュメントは、Fizzyアプリケーションにおけるサインアウト機能の設計書である。現在のセッションを終了し、ユーザーをログアウト状態にする機能を提供する。

### 本機能の処理概要

**業務上の目的・背景**：セキュリティの観点から、ユーザーが明示的にログアウトできる機能は必須である。共有端末の使用後や、セキュリティ上の懸念がある場合に、ユーザー自身でセッションを終了できることで、不正アクセスのリスクを軽減する。また、アカウントの切り替えを行う際にも使用される。

**機能の利用シーン**：ユーザーがFizzyの使用を終了する際、または別のアカウントに切り替える際に、プロフィール画面やメニューからサインアウトを実行する。

**主要な処理内容**：
1. ユーザーがサインアウトボタンをクリック
2. 現在のセッションレコードをデータベースから削除
3. セッションCookieを削除
4. ログイン画面またはセッションメニューにリダイレクト

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

**権限による制御**：サインアウトは認証済みユーザーのみが実行可能。destroyアクションは認証が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 38 | ユーザープロフィール画面 | 主画面 | 現在のセッションを終了しログアウト |

## 機能種別

セッション管理 / データ削除

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| - | - | - | 入力パラメータなし | - |

### 入力データソース

- Cookie（セッショントークン）- 現在のセッションを特定

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| - | - | なし（セッションとCookieが削除される） |

### 出力先

- データベース（sessionsテーブルからレコード削除）
- Cookie（セッショントークン削除）
- リダイレクト（ログイン画面またはセッションメニュー）

## 処理フロー

### 処理シーケンス

```
1. サインアウトリクエスト受信（SessionsController#destroy）
   └─ DELETEメソッドでリクエスト
2. セッション終了処理（terminate_session）
   └─ Current.session.destroyでセッションレコード削除
   └─ cookies.delete(:session_token)でCookie削除
3. リダイレクト処理
   └─ HTML: redirect_to_logout_url（セッションメニュー）
   └─ JSON: head :no_content（204レスポンス）
```

### フローチャート

```mermaid
flowchart TD
    A[サインアウトリクエスト] --> B[terminate_session呼び出し]
    B --> C[Current.session.destroy]
    C --> D[cookies.delete :session_token]
    D --> E{レスポンス形式}
    E -->|HTML| F[セッションメニューへリダイレクト]
    E -->|JSON| G[204 No Content]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | セッション即座削除 | ログアウト時にセッションレコードを即座に削除 | サインアウト実行時 |
| BR-002 | Cookie即座削除 | ログアウト時にセッションCookieを即座に削除 | サインアウト実行時 |
| BR-003 | 認証必須 | destroyアクションは認証済みユーザーのみ実行可能 | サインアウト実行時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| セッション削除 | sessions | DELETE | 現在のセッションレコードを削除 |

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

#### sessions

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | id | Current.sessionのID | destroyメソッドで削除 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 401 | 認証エラー | 未認証状態でサインアウト試行 | ログイン画面へリダイレクト |

### リトライ仕様

リトライは不要（冪等性のある操作）

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

- セッション削除: 単一レコード操作のため自動トランザクション

## パフォーマンス要件

- 即座にセッション終了（同期処理）
- リダイレクトまでの遅延なし

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

- セッションレコード削除: サーバーサイドでセッション無効化
- Cookie削除: クライアントサイドでもセッショントークン削除
- 二重削除防止: destroyは冪等性あり（既に削除済みの場合もエラーにならない）

## 備考

- JSON形式のリクエストの場合は204 No Contentを返し、フロントエンドアプリケーションでの利用を考慮
- HTML形式の場合はセッションメニュー（redirect_to_logout_url）にリダイレクト

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | session.rb | `app/models/session.rb` | セッションモデルの構造（identity_idとの関連） |

**読解のコツ**: Sessionモデルは非常にシンプルで、identity_idでIdentityに紐づいている。

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

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

**主要処理フロー**:
1. **21行目**: destroyアクションの定義
2. **22行目**: terminate_session呼び出し
3. **24-27行目**: respond_toでHTML/JSON分岐

#### Step 3: 認証基盤を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | authentication.rb | `app/controllers/concerns/authentication.rb` | terminate_sessionメソッドの実装 |

**主要処理フロー**:
- **99-102行目**: terminate_sessionでセッション削除とCookie削除

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

```
SessionsController#destroy
    │
    └─ terminate_session (Authentication concern)
           │
           ├─ Current.session.destroy
           │      └─ Session.destroy (ActiveRecord)
           │
           └─ cookies.delete(:session_token)
```

### データフロー図

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

Cookie                    SessionsController              セッション削除（DB）
(session_token) ────▶         │                              │
                              └──▶ terminate_session ────────▶ Cookie削除
                                                               │
                                                               └──▶ リダイレクト
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sessions_controller.rb | `app/controllers/sessions_controller.rb` | コントローラー | サインアウト処理 |
| session.rb | `app/models/session.rb` | モデル | セッション管理 |
| authentication.rb | `app/controllers/concerns/authentication.rb` | コンサーン | terminate_sessionメソッド |
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義 |
