# 合規資源庫（Module Frame）— v1 FE 流程 ↔ v2 BE 差異 + 遷移評估

> 同框架那份的方法：v1 FE 實際呼叫/讀寫 ↔ v2 BE 現況逐欄對照。
> **結論先講：資源庫跟框架不同等級 —— 框架是「接 v2 + 舊 URL，畫面沿用」；資源庫的舊模型（profile enrichment + control-defaults/objective-defaults 範本預設值）在 2A 後是 STUBBED/從沒接 v2，新模型改成 clone 三件組 + 編範本 SSP。所以資源庫需要「重構」，不是直接套用。** 但 SSP 子表 tab（B3 已接 v2）可重用。

## 為什麼資源庫不能直接套用（v2 現況硬事實）

| BE 元件 | 現況 | 影響 FE |
|---------|------|---------|
| `module_frame_repo_impl._enrich_with_oscal` | **2A STUBBED**：entities 回傳時無 `oscal_framework_version` / `oscal_profile`；`get_menu` 回 `[]` | 列表讀 `oscal_framework_version.framework.name`、詳情讀 `oscal_profile.include_groups` → **全空** |
| `module_frame_control_default_service` | **STUBBED**：jedi_oscal 拔除，method 回 None | 範本「適用控制項」control-defaults 編輯 **死的** |
| `module_frame_control_objective_default_service` | **STUBBED**：回 None/[] | AO 預設值編輯 **死的** |
| `/oscal/catalog-controls/<uid>/assessments`、`/module-frame/<uid>/template-ssp` | **未註冊** | FE 這兩個呼叫 404 |
| SSP 子表（components/leveraged/inventory/parties/system-characteristic/reference-documents/document-pool） | **B3 已接 v2**（module-frame-scoped + ssp-scoped）| ✅ 可重用 |

> 典範轉移：v2 廢掉「control-defaults / objective-defaults 範本預設值」這套；改成「**資源庫帶一份範本 SSP（template_ssp_id）**，用 SSP 維護介面（control-implementation SoA）編內容」。新建也從「include_controls 控制樹」改成「**選 published framework_version → clone catalog+profile+空SSP範本**」。

---

## 逐畫面比對

### 畫面 1：ModuleFrame.vue（列表 / 新增 / clone）→ 🔧 重構
| FE 動作 | FE 端點 / 欄位 | v2 現況 | 結果 |
|---------|---------|---------|------|
| 列表 | POST `/module-frames`；讀 `oscal_framework_version.framework.name`、`oscal_profile.include_groups`、name/version/group/provider/status | URL 在；但 enrich stubbed → 巢狀 oscal_* 欄**空** | 🟥 框架/控制數欄空白（基本欄位 name/version 還在）|
| 新增 | POST `/module-frame` `{name,version,provider,group,frequency,status,oscal_framework_version_uid,include_controls[]}` | 舊 include_controls 模型；新模型是 `POST /oscal/resource-libraries {framework_version_uid, profile:{include_controls}}` | 🔧 改接新 clone 端點 + 表單改「選版本→clone」 |
| clone | POST `/module-frame/clone` | URL 在；行為待驗 | ⚠️ 待驗 |
| 刪除 | DELETE `/module-frame/<uid>` | URL 在 | ⚠️ 待驗 |

### 畫面 2：ModuleFrameDetail.vue（群組→控制→AO 導覽）→ 🟥 改資料源
- FE 讀 `oscal_profile.include_groups[].controls[].assessments[]`（含 workflow_template_uid）
- v2：`oscal_profile` enrich stubbed → **空**
- → 🔧 改成讀 v2 catalog tree（經 resource-library 的 profile/catalog），或改走新詳情端點

### 畫面 3：ModuleFrameTemplateEditView.vue（範本編輯，核心）
| Tab | FE 端點 | v2 現況 | 結果 |
|-----|---------|---------|------|
| **適用控制項（control-defaults）** | `GET/PUT/DELETE /module-frame/<uid>/control-defaults[/<ci>]` 讀寫 `implementation_status/description/remarks/responsible_role/control_origination` | **service STUBBED 回 None** | 🟥 死 → **改走「編範本 SSP 的 control-implementation SoA」**（B3 v2，對 template_ssp_uid 操作）|
| **AO 預設值（objective-defaults）** | `GET/PUT/DELETE /module-frame/<uid>/objective-defaults` 複合鍵 `(control_identifier, statement_identifier)` | **STUBBED** | 🟥 死 → 改走 SSP SoA 的 objective 編輯 |
| AO 清單 | `GET /oscal/catalog-controls/<uid>/assessments` | **未註冊** | 🟥 404 → 改從 v2 catalog parts 取 |
| 受評標的 system-characteristic | `GET/PUT /module-frame/<uid>/system-characteristic` | B3 v2 | ✅ 可重用 |
| 元件/授權/資產 | `/module-frame/<uid>/{components,leveraged,inventory}` | B3 v2 | ✅ 可重用 |
| 負責組織/人員 parties | `/module-frame/<uid>/parties` | B3 v2 | ✅ 可重用（但 party 欄位對映待驗，可能同 AO 那類問題）|
| 程序書池 reference-documents | `/module-frame/<uid>/reference-documents` + 附掛 control/AO | 程序書池 B3 v2；但附掛到 control-defaults/objective-defaults 那兩個 mapping 依賴 stubbed default → 待釐清 | ⚠️ 池可用、附掛待驗 |
| control-defaults 匯入匯出 | `control-defaults/{export,import,template,validate,verify}` | 依賴 stubbed default service | 🟥 待驗（恐死）|
| SSP 樣板下載 / SSP 文件匯出 | `ssp-import-template`、`ssp-export` | 接 v2（import-ssp / 匯出統一 loader）| ✅ 可重用 |

### 畫面 4：ImportDocx / ImportExcel（SSP 匯入到資源庫）→ ✅ 大致可用
- `POST /ssp-excel-imports/parse {source_type:'module_frame', source_uid}`、docx 同 → **import-ssp 已接 v2**
- → ✅ 流程接上（細節欄位待實點）

---

## 遷移結論

**資源庫是「中型重構」**，介於框架（小改）和專案/稽核（大重構）之間：

| 類別 | 畫面/功能 |
|------|----------|
| ✅ 可重用（B3 已 v2） | 範本編輯的 SSP 子表 tab（system-characteristic / components / leveraged / inventory / parties / 程序書池）、SSP 匯入匯出 |
| 🔧 需重構 | 列表/詳情（改讀 v2 resource-library/catalog，非 stubbed profile）、新增（include_controls → clone 三件組）、**適用控制項編輯（control-defaults/objective-defaults 典範廢除 → 改編範本 SSP 的 SoA）** |
| 🟥 死/未接 | control-defaults / objective-defaults service、`catalog-controls/<uid>/assessments`、`template-ssp` 端點、control-defaults 匯入匯出 |

**核心決策點（同先前討論的「編範本 SSP」）**：
資源庫範本內容的編輯，要從舊的「control-defaults/objective-defaults 預填表」**改成「資源庫帶一份範本 SSP，沿用 SSP 維護的 control-implementation SoA 介面，對 template_ssp_uid 操作」**。這是 v2 的設計意圖，也是 BE 已備好的路（B3 的 ssp control-implementation 對任何 ssp_uid 都能用）。

## 與框架對照（給你排優先序）
| | 合規框架 | 合規資源庫 |
|---|---------|-----------|
| BE 現況 | 我重建 v2 + 舊 URL，幾乎可用 | 舊模型 stubbed、未接 v2；新模型 clone+範本SSP |
| FE 工 | 小（畫面沿用、改 API 欄位對映，如 AO description）| 中（列表/新增/適用控制項重構，SSP 子表可留）|
| 直接套用? | 大致可以 | **否,需重構** |

## 待釐清（給你決策）
1. **適用控制項編輯**確定改走「編範本 SSP 的 SoA」嗎?(取代 control-defaults/objective-defaults)
2. 列表/詳情的「控制數 / 框架名」改從 v2 resource-library 端點取(`resolved_control_count` 等)?
3. control-defaults Excel 匯入匯出還要不要?(整套依賴已廢的 default service)
