# 機能設計書 56-フィルター削除

## 概要

本ドキュメントは、Fizzyアプリケーションにおけるフィルター削除機能の詳細設計を記述する。

### 本機能の処理概要

保存したフィルターを削除することで、不要になったフィルター条件を整理する機能である。

**業務上の目的・背景**：時間の経過とともに使用しなくなったフィルターが増加すると、フィルター一覧の視認性が低下する。本機能により、不要なフィルターを削除してフィルター一覧を整理し、よく使うフィルターへのアクセスを容易にする。

**機能の利用シーン**：カード一覧画面のフィルター設定パネルにおいて、保存済みフィルターの一覧から削除したいフィルターを選択し、削除ボタンをクリックして実行する。プロジェクト完了後や担当変更後など、以前のフィルター条件が不要になった場合に使用される。

**主要な処理内容**：
1. ユーザーがフィルターの削除ボタンをクリック
2. 指定されたフィルターIDでフィルターを取得
3. フィルターレコードをデータベースから削除
4. Turbo Streamでフィルター一覧を更新

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

**権限による制御**：ユーザーが作成した自分自身のフィルターのみが削除可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 18 | カード一覧画面 | 主画面 | 保存したフィルターを削除 |

## 機能種別

CRUD操作（DELETE）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| id | UUID | Yes | 削除対象フィルターのID | フィルターIDとして存在すること |

### 入力データソース

画面操作（削除ボタンクリック）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| @filter | Filter | 削除されたフィルターオブジェクト |
| @filters | Array | 削除後のフィルター一覧 |

### 出力先

- 画面表示（Turbo Stream - 要素削除）

## 処理フロー

### 処理シーケンス

```
1. リクエスト受信
   └─ DELETE /filters/:id
2. フィルター取得
   └─ Current.user.filters.find(params[:id])
3. フィルター削除
   └─ @filter.destroy!
4. レスポンス返却
   └─ Turbo Streamでフィルター一覧から要素を削除
```

### フローチャート

```mermaid
flowchart TD
    A[リクエスト受信] --> B[フィルター取得]
    B --> C{フィルター存在?}
    C -->|No| D[404 Not Found]
    C -->|Yes| E[フィルター削除]
    E --> F[Turbo Stream更新]
    F --> G[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-56-01 | 削除権限 | ユーザーが作成した自分のフィルターのみ削除可能 | 常時 |
| BR-56-02 | 物理削除 | フィルターは物理削除される（論理削除ではない） | フィルター削除時 |
| BR-56-03 | 関連データ削除 | 中間テーブル（boards_filters等）の関連レコードも削除 | フィルター削除時 |

### 計算ロジック

該当なし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| フィルター削除 | filters | DELETE | フィルターレコードを物理削除 |
| 関連削除 | boards_filters | DELETE | ボード関連を削除 |
| 関連削除 | filters_tags | DELETE | タグ関連を削除 |
| 関連削除 | assignees_filters | DELETE | 担当者関連を削除 |
| 関連削除 | creators_filters | DELETE | 作成者関連を削除 |
| 関連削除 | closers_filters | DELETE | クローズ者関連を削除 |

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

#### filters

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | id | パラメータで指定されたID | 主キーで特定 |
| DELETE | creator_id | Current.user.id | ユーザー制限 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 404 | Not Found | フィルターが存在しないか、他ユーザーのフィルター | エラーページ表示 |

### リトライ仕様

リトライは不要

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

destroy!は単一トランザクションで実行される。関連テーブルの削除も同一トランザクション内で完了（HABTM関連の自動削除）。

## パフォーマンス要件

- レスポンス時間: 200ms以内

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

- ログイン必須（ApplicationControllerで制御）
- Current.user.filtersスコープにより自分のフィルターのみ削除可能
- CSRFトークン検証（Railsデフォルト）

## 備考

- 削除されたフィルターは復元できない
- 削除後、Turbo Streamにより画面から即座にフィルターが消える
- 関連する中間テーブルのレコードはRailsのHABTM関連により自動削除

---

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

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

### 推奨読解順序

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

まず、フィルターのデータモデルと関連テーブルを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | filter.rb | `app/models/filter.rb` | Filterモデル、belongs_to関連 |
| 1-2 | resources.rb | `app/models/filter/resources.rb` | HABTM関連（boards, tags, assignees等） |

**読解のコツ**:
- `belongs_to :creator`でフィルター作成者を特定
- HABTM（has_and_belongs_to_many）で中間テーブルとの関連を定義
- destroy時にHABTM関連のレコードは自動削除される

**主要処理フロー（filter.rb）**:
- **4行目**: belongs_to :creator（作成者との関連）

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

リクエストを受け取るコントローラーの処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | filters_controller.rb | `app/controllers/filters_controller.rb` | destroyアクションの処理フロー |

**主要処理フロー**:
- **2行目**: before_actionでset_filtersを実行
- **8-10行目**: destroyアクション（フィルター取得と削除）
- **14-15行目**: set_filtersメソッド

**読解のコツ**:
- `Current.user.filters.find(params[:id])`で自分のフィルターのみ取得
- `destroy!`で例外付き削除（失敗時は例外発生）

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

```
FiltersController#destroy
    │
    ├─ [before_action] #set_filters
    │      └─ @filters = Current.user.filters
    │
    ├─ Current.user.filters.find(params[:id])
    │      └─ @filter に削除対象フィルターを設定
    │
    └─ @filter.destroy!
           │
           ├─ [HABTM削除] boards_filters
           ├─ [HABTM削除] filters_tags
           ├─ [HABTM削除] assignees_filters
           ├─ [HABTM削除] creators_filters
           └─ [HABTM削除] closers_filters
```

### データフロー図

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

id（フィルターID）───▶ filters.find        ───▶ @filter
                       │
                       ▼
                 @filter.destroy!
                       │
                       ├─ filters (DELETE)
                       ├─ boards_filters (DELETE)
                       ├─ filters_tags (DELETE)
                       ├─ assignees_filters (DELETE)
                       ├─ creators_filters (DELETE)
                       └─ closers_filters (DELETE)
                       │
                       ▼
                 Turbo Stream       ───▶ ブラウザ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| filters_controller.rb | `app/controllers/filters_controller.rb` | コントローラー | フィルターのCRUD処理 |
| filter.rb | `app/models/filter.rb` | モデル | フィルターのデータモデル |
| resources.rb | `app/models/filter/resources.rb` | コンサーン | HABTM関連定義 |
| destroy.turbo_stream.erb | `app/views/filters/destroy.turbo_stream.erb` | ビュー | Turbo Streamレスポンス |
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義 |
| schema.rb | `db/schema.rb` | スキーマ | filters、中間テーブル定義 |
