diff --git a/docs_v1.0/M4_workspace/2026-07-19_file_status_sync_api.md b/docs_v1.0/M4_workspace/2026-07-19_file_status_sync_api.md new file mode 100644 index 0000000..34174ad --- /dev/null +++ b/docs_v1.0/M4_workspace/2026-07-19_file_status_sync_api.md @@ -0,0 +1,180 @@ +# File Status Sync API - 交付文件 + +**日期**: 2026-07-19 +**作者**: Core API Team +**狀態**: 已完成 + +--- + +## 一、問題描述 + +### 1.1 現象 + +- 部分檔案在 `/face` 列表看不到 +- 需要到 `/library` 等待幾秒後才會出現 +- 原因:檔案實際已完成處理,但 DB `status` 仍為 `processing` + +### 1.2 根本原因 + +| 問題 | 說明 | +|------|------| +| Worker 未運行 | `update_video_status(Completed)` 未執行 | +| 狀態不一致 | Processor 檔案存在,但 DB status 未更新 | + +--- + +## 二、解決方案 + +### 2.1 新增端點 + +``` +POST /api/v1/file/:file_uuid/sync-status +``` + +### 2.2 功能說明 + +1. 檢查 5 個必要 processor 檔案: + - `face.json` + - `asrx.json` + - `ocr.json` + - `pose.json` + - `appearance.json` + +2. 如果全部存在 → 更新 `status = 'completed'` +3. 否則 → 保持 `status = 'processing'` + +### 2.3 Response 範例 + +```json +{ + "success": true, + "file_uuid": "9f6a9cd55a5809f977f5a6589b9045c5", + "status": "completed", + "processors_complete": 5, + "processors_total": 5 +} +``` + +--- + +## 三、Studio 整合建議 + +### 3.1 API Builder + +**檔案**: `/Users/accusys/momentry_studio/src/api/index.ts` + +```typescript +case 'sync_file_status': { + return { + url: `/api/v1/file/${a.fileUuid}/sync-status`, + method: 'POST' + } +} +``` + +### 3.2 Store Function + +**檔案**: `/Users/accusys/momentry_studio/src/store.ts` + +```typescript +export async function syncFileStatus(fileUuid: string): Promise { + const result = await apiCall('sync_file_status', { fileUuid }) + + // 更新 filesCache + const f = filesCache.value.find((x: any) => x.file_uuid === fileUuid) + if (f && result.status) { + f.status = result.status + } + + return result +} +``` + +### 3.3 使用時機 + +#### 選項 A:進入 /face 時批次同步 + +```typescript +// PeopleView.vue - onMounted +async function loadFiles() { + await ensureFiles() + + // 批次同步狀態 + for (const f of filesCache.value) { + if (f.status === 'processing') { + await syncFileStatus(f.file_uuid) + } + } +} +``` + +#### 選項 B:單一檔案選擇時同步 + +```typescript +// 選擇檔案前先確認狀態 +async function selectFile(fileUuid: string) { + const result = await syncFileStatus(fileUuid) + if (result.status !== 'completed') { + // 顯示提示:檔案尚未處理完成 + return + } + selectedFileUuid.value = fileUuid +} +``` + +--- + +## 四、測試驗證 + +### 4.1 測試指令 + +```bash +# 同步單一檔案 +curl -X POST "http://localhost:3002/api/v1/file/{file_uuid}/sync-status" \ + -H "X-API-Key: $KEY" + +# 驗證狀態 +curl -s "http://localhost:3002/api/v1/file/{file_uuid}" \ + -H "X-API-Key: $KEY" | jq '.status' +``` + +### 4.2 已驗證案例 + +| 檔案 | 處理前 | 處理後 | +|------|--------|--------| +| Accusys-WD_FilmRiot_test.mp4 | `processing` | `completed` | +| Charade_YouTube_24fps.mp4 | `processing` | `processing`(正確,未完成)| + +--- + +## 五、相關檔案路徑 + +### Core API + +| 檔案 | 完整路徑 | +|------|----------| +| Endpoint 實現 | `/Users/accusys/momentry_core/src/api/files.rs` | +| API 文檔 | `/Users/accusys/momentry_core/docs_v1.0/doc_wasm/modules/18_profile.md` | + +### Studio (需修改) + +| 檔案 | 完整路徑 | +|------|----------| +| API Builder | `/Users/accusys/momentry_studio/src/api/index.ts` | +| Store | `/Users/accusys/momentry_studio/src/store.ts` | +| PeopleView | `/Users/accusys/momentry_studio/src/views/PeopleView.vue` | + +--- + +## 六、注意事項 + +1. **效能考量**:若檔案數量多,建議使用選項 B(單一檔案同步) +2. **快取更新**:`syncFileStatus` 會同時更新 `filesCache` +3. **權限**:需要有效的 API Key + +--- + +**Core API Team**: 如有問題,請透過 `M4_workspace/` 文檔回覆。 + +*Document Version: 1.0* +*Last Updated: 2026-07-19* \ No newline at end of file