# 機能設計書 7-ボード作成

## 概要

本ドキュメントは、Fizzyアプリケーションにおける新しいカンバンボードを作成する機能の設計書である。名前とアクセス権限を設定して新しいボードを作成できる。

### 本機能の処理概要

**業務上の目的・背景**：プロジェクトやチームごとにタスク管理を行うため、カンバンボードの作成機能が必要である。ボード単位でタスク（カード）を整理し、チームメンバーとの共有や進捗管理を実現する。

**機能の利用シーン**：新しいプロジェクトを開始する際や、チーム内で新しいタスク管理領域が必要な場合に、ボード作成画面から新規ボードを作成する。

**主要な処理内容**：
1. ボード作成画面の表示
2. ボード名とアクセス権限の入力
3. ボードレコードの作成
4. 作成者へのアクセス権付与（ウォッチング状態）
5. all_accessの場合は全員にアクセス権付与
6. 作成したボード詳細画面へリダイレクト

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

**権限による制御**：認証済みユーザーは誰でもボードを作成可能。作成者は自動的にボードの管理者権限を持つ。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 11 | ボード新規作成画面 | 主画面 | 新しいカンバンボードを作成 |

## 機能種別

CRUD操作 / データ作成

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| name | String | Yes | ボード名 | 必須 |
| all_access | Boolean | No | 全員アクセス可能フラグ | デフォルト: true |
| auto_postpone_period | Integer | No | 自動延期期間 | - |
| public_description | Text | No | 公開用説明文 | - |

### 入力データソース

- 画面入力（ボード作成フォーム）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| @board | Board | 作成されたボードレコード |
| access | Access | 作成者のアクセス権レコード |

### 出力先

- データベース（boards, accessesテーブル）
- リダイレクト（作成したボードの詳細画面）

## 処理フロー

### 処理シーケンス

```
1. ボード作成画面表示（BoardsController#new）
   └─ Board.newでフォームオブジェクト初期化
2. ボード作成（BoardsController#create）
   └─ Board.create!でボード作成
   └─ with_defaults(all_access: true)でデフォルト値設定
   └─ after_create: grant_access_to_creatorで作成者にアクセス権付与
   └─ after_save_commit: grant_access_to_everyoneでall_access時に全員付与
3. リダイレクト
   └─ HTML: ボード詳細画面へ
   └─ JSON: 201 Created + Locationヘッダー
```

### フローチャート

```mermaid
flowchart TD
    A[ボード作成画面] --> B[ボード名入力]
    B --> C[アクセス権限設定]
    C --> D[作成ボタン]
    D --> E[Board.create!]
    E --> F[grant_access_to_creator]
    F --> G{all_access?}
    G -->|Yes| H[grant_access_to_everyone]
    G -->|No| I[作成者のみアクセス可能]
    H --> J[ボード詳細画面へリダイレクト]
    I --> J
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | all_accessデフォルト | 新規作成時はall_access=trueがデフォルト | ボード作成時 |
| BR-002 | 作成者アクセス権 | 作成者に自動的にwatchingアクセス権を付与 | ボード作成後 |
| BR-003 | 全員アクセス付与 | all_access=trueの場合、全アクティブユーザーにアクセス権付与 | ボード作成後 |
| BR-004 | creator自動設定 | 作成者はCurrent.userが自動設定 | ボード作成時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| ボード作成 | boards | INSERT | 新規ボードレコード作成 |
| 作成者アクセス権 | accesses | INSERT | 作成者のアクセス権レコード作成 |
| 全員アクセス権 | accesses | INSERT | all_access時に全ユーザーのアクセス権作成 |

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

#### boards

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | name | 入力されたボード名 | |
| INSERT | all_access | true（デフォルト）または入力値 | |
| INSERT | auto_postpone_period | 入力された期間（任意） | |
| INSERT | creator_id | Current.user.id | default: -> { Current.user } |
| INSERT | account_id | Current.user.account.id | default: -> { creator.account } |

#### accesses

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | board_id | 作成されたボードのID | |
| INSERT | user_id | 作成者のID（またはall_access時は全ユーザー） | |
| INSERT | account_id | ボードのaccount_id | |
| INSERT | involvement | :watching（作成者）、:access_only（他ユーザー） | |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 422 | バリデーションエラー | ボード名未入力 | エラーメッセージ表示 |
| 401 | 認証エラー | 未認証状態でアクセス | ログイン画面へリダイレクト |

### リトライ仕様

該当なし

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

- Board.create!はActiveRecordの自動トランザクション
- after_createコールバックも同一トランザクション内で実行
- grant_access_to_everyoneはafter_save_commitで別トランザクション

## パフォーマンス要件

- all_access時のAccess一括作成: insert_allで効率化

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

- 認証必須: 認証済みユーザーのみボード作成可能
- creator自動設定: Current.userを使用し、改竄不可

## 備考

- creator_idはdefault: -> { Current.user }で自動設定
- account_idはcreator.accountから自動設定
- has_rich_text :public_descriptionでリッチテキスト対応

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | board.rb | `app/models/board.rb` | Boardモデルの構造、belongs_to、has_rich_text |
| 1-2 | accessible.rb | `app/models/board/accessible.rb` | アクセス権管理、after_createコールバック |

**読解のコツ**: Boardモデルのcreator, account関連はdefaultで自動設定される。Accessibleモジュールでアクセス権の自動付与が実装されている。

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

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

**主要処理フロー**:
1. **24-26行目**: newアクションでBoard.new
2. **28-35行目**: createアクションでBoard.create!とリダイレクト
3. **29行目**: with_defaults(all_access: true)でデフォルト値設定
4. **94-96行目**: board_paramsでStrong Parameters

#### Step 3: アクセス権付与を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | accessible.rb | `app/models/board/accessible.rb` | grant_access_to_creator, grant_access_to_everyoneコールバック |

**主要処理フロー**:
- **27行目**: after_create :grant_access_to_creator
- **28行目**: after_save_commit :grant_access_to_everyone
- **57-59行目**: grant_access_to_creatorの実装
- **61-63行目**: grant_access_to_everyoneの実装

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

```
BoardsController#create
    │
    └─ Board.create!(board_params.with_defaults(all_access: true))
           │
           ├─ [after_create] grant_access_to_creator
           │      └─ accesses.create(user: creator, involvement: :watching)
           │
           └─ [after_save_commit] grant_access_to_everyone
                  └─ [all_access?] accesses.grant_to(account.users.active)
                         └─ Access.insert_all([...])
```

### データフロー図

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

name ─────────────────▶ BoardsController#create
all_access                    │
auto_postpone_period          ├──▶ Board.create! ────────────▶ Board（DB）
public_description            │                                   │
                              │                                   ├──▶ Access（creator）
                              │                                   │
                              └──▶ [all_access] ─────────────────▶ Access（全ユーザー）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| boards_controller.rb | `app/controllers/boards_controller.rb` | コントローラー | ボード作成処理 |
| board.rb | `app/models/board.rb` | モデル | ボードモデル |
| accessible.rb | `app/models/board/accessible.rb` | コンサーン | アクセス権管理 |
| access.rb | `app/models/access.rb` | モデル | アクセス権モデル |
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義 |
