# 機能設計書 73-データストア削除

## 概要

本ドキュメントは、Giselleワークフローシステムにおけるデータストア削除機能の設計を記述する。この機能は、既存のデータストア（外部PostgreSQLデータベース接続）の設定を削除する。

### 本機能の処理概要

**業務上の目的・背景**：ワークフロー運用において、使用しなくなったデータストア接続を適切にクリーンアップする必要がある。不要な接続設定を残しておくことは、管理上の混乱やセキュリティリスクにつながる可能性がある。この機能は、データストア設定を安全に削除し、システムリソースの適切な管理を支援する。

**機能の利用シーン**：データストア設定画面において、不要になったデータストア接続を削除する際に利用される。また、ワークスペースのクリーンアップ処理の一部としても呼び出される可能性がある。

**主要な処理内容**：
1. 入力されたデータストアIDからストレージパスを生成
2. ストレージ上にデータストア設定ファイルが存在するか確認
3. 存在する場合は設定を読み込み（削除前の情報として返却用）
4. ストレージからファイルを削除
5. 削除されたDataStoreオブジェクトを返却（存在しなかった場合はundefined）

**関連システム・外部連携**：GiselleStorageを介したファイルストレージとの連携を行う。

**権限による制御**：本機能自体には直接的な権限チェックは含まれないが、呼び出し元のAPI層でワークスペースへのアクセス権限および削除権限が確認される。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 33 | データストア設定画面 | 主機能 | データストア接続の削除処理 |

## 機能種別

データ削除処理（Delete操作）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| context | GiselleContext | Yes | Giselleの実行コンテキスト | - |
| dataStoreId | DataStoreId | Yes | 削除対象のデータストアID | `ds-`プレフィックス形式の文字列 |

### 入力データソース

- 画面（データストア設定画面）からの入力

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| DataStore | DataStore \| undefined | 削除されたデータストア設定オブジェクト（存在しなかった場合はundefined） |
| DataStore.id | DataStoreId | データストアの一意識別子 |
| DataStore.provider | DataStoreProvider | プロバイダ種別 |
| DataStore.configuration | Record<string, unknown> | プロバイダ固有の設定 |

### 出力先

- ストレージ（GiselleStorage）からファイルを削除
- 呼び出し元関数への戻り値として削除されたオブジェクトを返却

## 処理フロー

### 処理シーケンス

```
1. ストレージパス生成
   └─ dataStorePath(dataStoreId)を呼び出し

2. ファイル存在確認
   └─ context.storage.exists(path)で対象ファイルの存在をチェック

3. 存在しない場合の処理
   └─ undefinedを返却して終了

4. 既存設定の読み込み
   └─ context.storage.getJson({path, schema: DataStore})で削除前の情報を取得

5. ファイル削除
   └─ context.storage.remove(path)でファイルを削除

6. 削除済みオブジェクトの返却
   └─ 読み込んだDataStoreオブジェクトを返却
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[ストレージパス生成]
    B --> C{ファイル存在確認}
    C -->|存在しない| D[undefined返却]
    C -->|存在する| E[既存設定読み込み]
    E --> F[ファイル削除]
    F --> G[削除済みオブジェクト返却]
    D --> H[終了]
    G --> H
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 冪等性保証 | 存在しないデータストアの削除はエラーとせずundefinedを返却 | 常時 |
| BR-02 | 削除前読み込み | 削除前にデータを読み込み、呼び出し元に削除された内容を通知可能にする | ファイルが存在する場合 |
| BR-03 | 物理削除 | 削除はストレージからの物理削除（論理削除ではない） | 常時 |

### 計算ロジック

該当なし

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

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

本機能はデータベースを直接操作しない。ストレージからのファイル削除を行う。

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| - | - | - | データベース操作なし |

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

該当なし（ストレージファイル削除のみ）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ストレージ読み込みエラー | ファイルの読み込みに失敗 | ストレージ設定を確認 |
| - | ストレージ削除エラー | ファイルの削除に失敗 | ストレージ権限を確認 |

### リトライ仕様

本関数自体にはリトライロジックは含まれない。ストレージアクセスエラーの場合は呼び出し元でのリトライを検討。

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

本機能はファイルストレージを使用するため、データベースレベルのトランザクション管理は行わない。読み込み→削除の間に競合が発生する可能性があるが、削除操作は冪等であるため、実用上の問題は少ない。

## パフォーマンス要件

- 単一ファイルの読み込み・削除のため、通常150ms以内に完了すること
- ストレージがリモートの場合はネットワークレイテンシに依存

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

- データストア設定の削除は、関連するワークフローに影響を与える可能性がある
- 削除操作は復元不可能であるため、呼び出し元で確認ダイアログの表示を推奨
- 関連するシークレット（接続文字列）は本機能では削除されない（別途シークレット管理で対応）
- 呼び出し元でワークスペースへの削除権限確認が必要

## 備考

- 削除操作は冪等性を持ち、存在しないデータストアを削除しようとしてもエラーにならない
- 削除されたデータストアを参照するノードは、実行時にエラーとなる

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | index.ts | `packages/protocol/src/data-store/index.ts` | DataStore型定義 |

**読解のコツ**: 削除操作では型定義は変更されないが、返却値の型を理解するために必要。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | delete-data-store.ts | `packages/giselle/src/data-stores/delete-data-store.ts` | メイン関数の全体構造 |

**主要処理フロー**:
1. **5-11行目**: 関数シグネチャ - context、dataStoreIdを受け取り、DataStore | undefinedを返却
2. **12行目**: dataStorePath関数でストレージパスを生成
3. **14-17行目**: ファイル存在確認、存在しない場合はundefinedを返却
4. **19-22行目**: 削除前にgetJsonで設定を読み込み
5. **24行目**: context.storage.remove(path)でファイルを削除
6. **26行目**: 削除されたDataStoreオブジェクトを返却

#### Step 3: ストレージ操作を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | paths.ts | `packages/giselle/src/data-stores/paths.ts` | パス生成ロジック |

**読解のコツ**: GiselleStorageのremoveメソッドは、指定されたパスのファイルを削除する。

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

```
deleteDataStore()
    │
    ├─ dataStorePath(dataStoreId)
    │      └─ パス文字列を生成
    │
    ├─ context.storage.exists(path)
    │      └─ ファイル存在確認
    │
    ├─ context.storage.getJson({path, schema})
    │      └─ 削除前の設定読み込み
    │
    └─ context.storage.remove(path)
           └─ ファイル削除
```

### データフロー図

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

dataStoreId ───▶ dataStorePath() ───▶ ストレージパス
                                              │
                                              ▼
                           context.storage.exists()
                                              │
                               ┌──────────────┴──────────────┐
                               │                              │
                          [存在しない]                    [存在する]
                               │                              │
                               ▼                              ▼
                          undefined              context.storage.getJson()
                                                              │
                                                              ▼
                                              context.storage.remove()
                                                              │
                                                              ▼
                                                    DataStoreオブジェクト
                                                  （削除された内容）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| delete-data-store.ts | `packages/giselle/src/data-stores/delete-data-store.ts` | ソース | メイン関数 |
| paths.ts | `packages/giselle/src/data-stores/paths.ts` | ソース | ストレージパス生成 |
| index.ts | `packages/protocol/src/data-store/index.ts` | ソース | DataStore型定義 |
