# 削除

| 要件 | 値 |
|----|----|
| ログインの有無 | True |
| エンドポイント | /v1/folders/:id |
| メソッド | DELETE |

## 概要

指定 ID のフォルダーを論理削除する。`folders.owner_id` がセッションの `user_id` と一致する場合のみ許可する。

物理削除・DB 行の DELETE は行わない。`is_deleted = true` および `deleted_at` の設定で論理削除とする（[データベース設計](../../guide/database.md)の方針に準拠）。

## 必要なデータ

**Headers**

| ヘッダー | 必須 |
|---------|------|
| `Cookie` | はい |

**Path parameters**

| キー | 値の種類 | 必須 | 説明 |
|------|---------|------|------|
| `id` | UUID | はい | フォルダー ID |

**Query parameters**

| キー | 値の種類 | 必須 | デフォルト | 説明 |
|------|---------|------|-----------|------|
| `to_home` | boolean | いいえ | `false` | 子要素の扱い（後述） |

## レスポンス

| ステータス | 条件 |
|-----------|------|
| `204 No Content` | 削除成功（ボディなし） |

## エラーケース

| HTTP | code | 条件 |
|------|------|------|
| 400 | `INVALID_INPUT` | `id` / `to_home` 不正 |
| 401 | `UNAUTHORIZED` | 未認証 |
| 404 | `NOT_FOUND` | 対象なし・既に削除済み・他ユーザーのフォルダー（存在秘匿のため 403 は返さない） |

## 子要素の扱い（`to_home`）

| `to_home` | サブフォルダー | 配下ファイル（`files.folder_id`） |
|-----------|---------------|----------------------------------|
| `false`（既定） | **再帰論理削除** — 子孫フォルダーも `is_deleted=true` | **再帰論理削除** — 配下ファイルもゴミ箱扱い |
| `true` | **直接の子フォルダーのみ** `folder_id` を `NULL`（ルートへ移動）。孫以下は親フォルダー（直接の子）に残る | **直接の子ファイルのみ** `folder_id` を `NULL`（ルートへ移動）。孫フォルダー配下のファイルはそのまま |

> 既定（`to_home=false`）ではフォルダー木ごと論理削除する。`to_home=true` のときのみ子をルートにばらまく。

## 再帰削除の方針

| 操作 | 再帰 | 説明 |
|------|------|------|
| DELETE `to_home=false` | **あり** | 子孫フォルダー・配下ファイルをまとめて論理削除 |
| DELETE `to_home=true` | **なし**（移動のみ） | 対象フォルダーの直接の子（サブフォルダー・ファイル）のみルートへ移動。孫以下は直接の子フォルダーに残る |

論理削除 API では DB の FK `ON DELETE` 制約に頼らず、トランザクション内で `is_deleted` / `folder_id` / `files` を明示更新する。

## 実装要件

- `to_home=true` 時: 子フォルダー・配下ファイルの `folder_id` を `NULL` に更新してから対象フォルダーを論理削除
- `to_home=false` 時: 子孫フォルダーと配下ファイルを再帰的に論理削除
- `files.folder_id` への FK は物理削除時 `ON DELETE SET NULL`（`apps/api/src/entities/files.rs`）— 論理削除ではアプリ層で制御
- エラー形式: [エラーレスポンス](../common/errors.md)に準拠
- 必要コンポーネント: PostgreSQL
