cleanup: remove dead code and duplicate docs

- Remove session-ses_2f27.md (161KB raw session log)
- Remove 49 ROOT_* duplicate files across REFERENCE/
- Remove 14 duplicate files between REFERENCE/ root and history/
- Remove asr_legacy.rs (dead code, replaced by asr.rs)
- Remove src/core/worker/ (duplicate JobWorker)
- Remove src/core/layers/ (empty directory)
- Remove 4 .bak files in src/
- Remove 7 dead private methods in worker/processor.rs
- Remove backup directory from git tracking
This commit is contained in:
Warren
2026-05-04 01:31:21 +08:00
parent ee81e343ce
commit e75c4d6f07
3270 changed files with 35190 additions and 53367 deletions

View File

@@ -1,378 +0,0 @@
---
document_type: "test_doc"
service: "MOMENTRY_CORE"
title: "Playground 功能測試計畫"
date: "2026-03-31"
version: "V1.0"
status: "active"
owner: "Warren"
created_by: "OpenCode"
tags:
- "功能測試計畫"
- "playground"
ai_query_hints:
- "查詢 Playground 功能測試計畫 的內容"
- "Playground 功能測試計畫 的主要目的是什麼?"
- "如何操作或實施 Playground 功能測試計畫?"
---
# Playground 功能測試計畫
| 項目 | 內容 |
|------|------|
| 建立者 | Warren |
| 建立時間 | 2026-03-31 |
| 文件版本 | V1.0 |
| 測試類型 | 功能測試、隔離測試、整合測試 |
---
## 版本歷史
| 版本 | 日期 | 目的 | 操作人 |
|------|------|------|--------|
| V1.0 | 2026-03-31 | 創建測試計畫 | Warren |
---
## 測試目標
1. **功能測試**:驗證 Playground 基本功能正常運作
2. **隔離測試**:確保 Development 與 Production 數據完全隔離
3. **整合測試**:驗證完整視頻處理流程在 Playground 環境中正常運行
---
## 測試環境
### 硬體/軟體需求
| 項目 | 規格 |
|------|------|
| 測試影片 | 1 個短視頻(< 1 分鐘)|
| PostgreSQL | 已啟動Schema `dev` 已創建 |
| MongoDB | 已啟動 |
| Qdrant | 已啟動 |
| Redis | 已啟動 |
### 環境配置
| 服務 | Production | Playground |
|------|-----------|------------|
| Port | 3002 | 3003 |
| PostgreSQL Schema | `public` | `dev` |
| MongoDB Database | `momentry` | `momentry_dev` |
| Qdrant Collection | `momentry_rule1` | `momentry_dev_rule1` |
| Redis Prefix | `momentry:` | `momentry_dev:` |
| Output Directory | `/output` | `/output_dev` |
---
## 測試案例
### Phase 1: 連接性測試
#### TC-01: PostgreSQL Schema 隔離驗證
| 項目 | 內容 |
|------|------|
| 測試目標 | 確認 Playground 使用 `dev` schema |
| 前置條件 | PostgreSQL `dev` schema 已創建 |
| 測試步驟 | 1. 啟動 Playground Server (port 3003)<br>2. 執行 SQL: `SELECT current_schema()`<br>3. 檢查結果為 `dev` |
| 預期結果 | current_schema = `dev` |
| 驗證方式 | API 或直接查詢 |
```bash
# 測試指令
psql "postgres://accusys:accusys@localhost:5432/momentry" -c "SET search_path TO dev; SELECT current_schema();"
```
#### TC-02: MongoDB Database 隔離驗證
| 項目 | 內容 |
|------|------|
| 測試目標 | 確認 Playground 使用 `momentry_dev` database |
| 前置條件 | MongoDB `momentry_dev` database 已創建 |
| 測試步驟 | 1. 啟動 Playground Server<br>2. 檢查 MongoDB 連線使用的資料庫名稱 |
| 預期結果 | 使用 `momentry_dev` database |
```bash
# 測試指令
curl -s "http://localhost:27017/momentry_dev/_/command" | jq
```
#### TC-03: Qdrant Collection 隔離驗證
| 項目 | 內容 |
|------|------|
| 測試目標 | 確認 Playground 使用 `momentry_dev_rule1` collection |
| 前置條件 | Qdrant collection 已創建 |
| 測試步驟 | 1. 列出所有 collections<br>2. 確認 `momentry_dev_rule1` 存在 |
| 預期結果 | Collection 列表包含 `momentry_dev_rule1` |
```bash
# 測試指令
curl -s -H "api-key: Test3200Test3200Test3200" \
"http://localhost:6333/collections" | jq '.result[].name'
```
#### TC-04: Redis Prefix 隔離驗證
| 項目 | 內容 |
|------|------|
| 測試目標 | 確認 Playground 使用 `momentry_dev:` prefix |
| 前置條件 | Redis 運行中 |
| 測試步驟 | 1. 啟動 Playground Server<br>2. 執行任何 API 調用<br>3. 檢查 Redis keys 使用 `momentry_dev:` prefix |
| 預期結果 | 所有 keys 以 `momentry_dev:` 開頭 |
```bash
# 測試指令
redis-cli KEYS "momentry_dev:*"
```
---
### Phase 2: 功能測試
#### TC-05: 視頻註冊功能
| 項目 | 內容 |
|------|------|
| 測試目標 | 驗證 Playground 可以註冊視頻 |
| 前置條件 | Playground Server 運行中 |
| 測試步驟 | 1. 調用 `/api/v1/videos/register` API<br>2. 傳入測試視頻路徑<br>3. 檢查響應 |
| 預期結果 | 返回視頻 UUID數據存入 `dev.videos` |
```bash
# 測試指令
curl -X POST "http://localhost:3003/api/v1/videos/register" \
-H "Content-Type: application/json" \
-d '{"file_path": "/path/to/test/video.mp4"}'
```
#### TC-06: 視頻查詢功能
| 項目 | 內容 |
|------|------|
| 測試目標 | 驗證可以查詢已註冊的視頻 |
| 前置條件 | TC-05 成功 |
| 測試步驟 | 1. 調用 `/api/v1/videos/{uuid}` API<br>2. 檢查返回的視頻信息 |
| 預期結果 | 返回視頻詳細信息schema 為 `dev` |
#### TC-07: Chunk 存儲功能
| 項目 | 內容 |
|------|------|
| 測試目標 | 驗證 Chunk 數據存入正確的隔離存儲 |
| 前置條件 | Playground Server 運行中 |
| 測試步驟 | 1. 處理視頻生成 chunks<br>2. 檢查 PostgreSQL `dev.chunks`<br>3. 檢查 MongoDB `momentry_dev.chunks`<br>4. 檢查 Qdrant `momentry_dev_rule1` |
| 預期結果 | 所有存儲位置正確隔離 |
```bash
# 驗證 PostgreSQL
psql "postgres://accusys:accusys@localhost:5432/momentry" \
-c "SELECT COUNT(*) FROM dev.chunks;"
# 驗證 MongoDB
curl -s "http://localhost:27017/momentry_dev/chunks/count" | jq
# 驗證 Qdrant
curl -s -H "api-key: Test3200Test3200Test3200" \
"http://localhost:6333/collections/momentry_dev_rule1/points/count" | jq
```
---
### Phase 3: 隔離完整性測試
#### TC-08: 數據不交叉污染測試
| 項目 | 內容 |
|------|------|
| 測試目標 | 確認 Production 和 Playground 數據完全隔離 |
| 前置條件 | 兩個環境都在運行 |
| 測試步驟 | 1. 在 Production 環境註冊視頻 A<br>2. 在 Playground 環境註冊視頻 B<br>3. 分別查詢兩個環境<br>4. 確認數據不互通 |
| 預期結果 | Production 只能看到 APlayground 只能看到 B |
#### TC-09: Redis Key 隔離測試
| 項目 | 內容 |
|------|------|
| 測試目標 | 確認 Redis keys 完全隔離 |
| 前置條件 | 兩個環境都在運行 |
| 測試步驟 | 1. 在 Production 執行操作<br>2. 在 Playground 執行操作<br>3. 檢查 keys 分離 |
| 預期結果 | `momentry:*``momentry_dev:*` 分開 |
```bash
# 驗證 keys 分離
redis-cli KEYS "momentry:*" # 應該只有 production keys
redis-cli KEYS "momentry_dev:*" # 應該只有 playground keys
```
---
### Phase 4: 完整流程測試
#### TC-10: 端到端視頻處理流程
| 項目 | 內容 |
|------|------|
| 測試目標 | 驗證完整視頻處理流程在 Playground 正常運行 |
| 前置條件 | 所有服務正常,測試視頻準備完成 |
| 測試步驟 | 1. 註冊測試視頻<br>2. 觸發處理ASR, OCR, YOLO 等)<br>3. 檢查 chunks 生成<br>4. 檢查向量存入 Qdrant<br>5. 驗證搜尋功能 |
| 預期結果 | 完整流程正常,數據存入隔離存儲 |
```bash
# 完整流程測試指令序列
# 1. 註冊視頻
curl -X POST "http://localhost:3003/api/v1/videos/register" \
-H "Content-Type: application/json" \
-d '{"file_path": "/path/to/test_video.mp4"}'
# 2. 獲取 UUID (假設為 test-uuid)
VIDEO_UUID="test-uuid"
# 3. 觸發處理
curl -X POST "http://localhost:3003/api/v1/videos/${VIDEO_UUID}/process" \
-H "Content-Type: application/json" \
-d '{"processors": ["asr", "ocr", "yolo"]}'
# 4. 等待處理完成 (輪詢狀態)
curl "http://localhost:3003/api/v1/videos/${VIDEO_UUID}"
# 5. 驗證數據存入隔離存儲
psql "postgres://accusys:accusys@localhost:5432/momentry" \
-c "SELECT COUNT(*) FROM dev.chunks WHERE uuid = '${VIDEO_UUID}';"
# 6. 驗證向量存入 Qdrant
curl -s -H "api-key: Test3200Test3200Test3200" \
"http://localhost:6333/collections/momentry_dev_rule1/points/count" | jq
```
---
## 測試檢查清單
### 測試前檢查
| 項目 | 狀態 | 備註 |
|------|------|------|
| PostgreSQL 運行中 | [ ] | |
| `dev` schema 已創建 | [ ] | |
| MongoDB 運行中 | [ ] | |
| `momentry_dev` database 已創建 | [ ] | |
| Qdrant 運行中 | [ ] | |
| `momentry_dev_rule1` collection 已創建 | [ ] | |
| Redis 運行中 | [ ] | |
| 測試視頻準備完成 | [ ] | |
| 防火牆/端口 3003 開放 | [ ] | |
### 測試後檢查
| 項目 | 狀態 | 備註 |
|------|------|------|
| TC-01: PostgreSQL Schema 隔離 | [ ] | |
| TC-02: MongoDB Database 隔離 | [ ] | |
| TC-03: Qdrant Collection 隔離 | [ ] | |
| TC-04: Redis Prefix 隔離 | [ ] | |
| TC-05: 視頻註冊功能 | [ ] | |
| TC-06: 視頻查詢功能 | [ ] | |
| TC-07: Chunk 存儲功能 | [ ] | |
| TC-08: 數據不交叉污染 | [ ] | |
| TC-09: Redis Key 隔離 | [ ] | |
| TC-10: 端到端流程 | [ ] | |
---
## 測試數據準備
### 測試視頻要求
| 項目 | 規格 |
|------|------|
| 時長 | 30 秒 - 1 分鐘 |
| 解析度 | 720p 或以上 |
| 格式 | MP4 |
| 內容 | 包含說話人形體、場景變化 |
### 測試用影片路徑
```
# 請選擇一個測試影片
/Users/accusys/momentry/test_videos/sample_video.mp4
```
---
## 預期測試結果
### 成功標準
| 項目 | 標準 |
|------|------|
| 功能測試 | 所有 API 調用成功返回正確響應 |
| 隔離測試 | 兩個環境數據完全隔離,無交叉 |
| 整合測試 | 完整流程正常運行,數據正確存儲 |
### 常見問題
| 問題 | 原因 | 解決方案 |
|------|------|---------|
| 連接失敗 | 服務未啟動 | 檢查 PostgreSQL/MongoDB/Qdrant/Redis 狀態 |
| Schema 錯誤 | `dev` schema 未創建 | 執行 `CREATE SCHEMA dev;` |
| Collection 錯誤 | Qdrant collection 未創建 | 使用 Qdrant API 創建 collection |
| 數據交叉 | Schema 切換失敗 | 檢查 `search_path` 配置 |
---
## 測試報告模板
```
# Playground 功能測試報告
## 測試環境
- 日期: YYYY-MM-DD
- 測試人員:
- 系統版本:
## 測試結果
| 測試案例 | 狀態 | 備註 |
|----------|------|------|
| TC-01 | PASS/FAIL | |
| TC-02 | PASS/FAIL | |
| ... | ... | |
## 問題記錄
### 問題 1
- 描述:
- 影響:
- 解決方案:
## 總結
- 總測試數: X
- 通過: X
- 失敗: X
- 通過率: X%
```
---
## 相關文件
| 文件 | 說明 |
|------|------|
| `PLAYGROUND_ARCHITECTURE.md` | Playground 隔離架構規劃 |
| `SERVICES.md` | 服務端口分配 |
| `MOMENTRY_CORE_REDIS_KEYS.md` | Redis Key 設計規範 |
---
## 版本資訊
- 版本: V1.0
- 建立日期: 2026-03-31
- 文件更新: 2026-03-31

View File

@@ -1,275 +0,0 @@
---
document_type: "test_doc"
service: "MOMENTRY_CORE"
title: "Playground 功能測試報告"
date: "2026-03-31"
version: "V1.0"
status: "active"
owner: "Warren"
created_by: "OpenCode"
tags:
- "功能測試報告"
- "playground"
ai_query_hints:
- "查詢 Playground 功能測試報告 的內容"
- "Playground 功能測試報告 的主要目的是什麼?"
- "如何操作或實施 Playground 功能測試報告?"
---
# Playground 功能測試報告
| 項目 | 內容 |
|------|------|
| 測試人員 | Warren (OpenCode) |
| 測試日期 | 2026-03-31 |
| 文件版本 | V1.0 |
---
## 測試環境
| 服務 | 隔離目標 | 狀態 |
|------|---------|------|
| PostgreSQL | `dev` schema | 🔶 部分運作 |
| MongoDB | `momentry_dev` database | ✅ 完成 |
| Qdrant | `momentry_dev_rule1` collection | ✅ 完成 |
| Redis | `momentry_dev:` prefix | ✅ 已隔離 |
| File System | `/output_dev` | ✅ 已隔離 |
---
## 測試結果摘要
| 測試階段 | 通過 | 失敗 | 總計 |
|----------|------|------|------|
| Phase 1: 連接性測試 | 2 | 2 | 4 |
| Phase 2: 功能測試 | 1 | 1 | 2 |
| Phase 3: 隔離測試 | 1 | 1 | 2 |
| Phase 4: 流程測試 | 0 | 1 | 1 |
| **總計** | **4** | **5** | **9** |
---
## 詳細測試結果
### Phase 1: 連接性測試
#### TC-01: PostgreSQL Schema 隔離驗證
| 項目 | 結果 |
|------|------|
| 狀態 | 🔶 部分通過 |
| 測試步驟 | 1. 啟動 Playground Server<br>2. 檢查日誌中的 schema 設置 |
| 實際結果 | - 日誌顯示 `Database schema configuration: dev` ✅<br>- 日誌顯示 `after_connect: setting search_path to dev` ✅<br>- Tables created in `dev` schema ✅ |
| 問題 | Runtime queries 仍使用 `public` schema連接池連接重用問題|
#### TC-02: MongoDB Database 隔離驗證
| 項目 | 結果 |
|------|------|
| 狀態 | ✅ 通過 |
| 測試步驟 | 1. 創建 `momentry_dev` database<br>2. 檢查 collections |
| 實際結果 | - `momentry_dev.chunks` ✅<br>- `momentry_dev.cache` ✅ |
#### TC-03: Qdrant Collection 隔離驗證
| 項目 | 結果 |
|------|------|
| 狀態 | ✅ 通過 |
| 測試步驟 | 1. 創建 collection<br>2. 列出所有 collections |
| 實際結果 | `momentry_dev_rule1` collection 已創建 ✅ |
#### TC-04: Redis Prefix 隔離驗證
| 項目 | 結果 |
|------|------|
| 狀態 | 🔶 未完整測試 |
| 備註 | 伺服器運行時認證問題導致無法完整測試 |
---
### Phase 2: 功能測試
#### TC-05: 視頻註冊功能
| 項目 | 結果 |
|------|------|
| 狀態 | 🔶 部分通過 |
| 測試步驟 | 調用 `/api/v1/videos/register` API |
| 實際結果 | API 返回成功 ✅,但數據寫入 `public.videos` 而非 `dev.videos` |
#### TC-06: 視頻查詢功能
| 項目 | 結果 |
|------|------|
| 狀態 | ❌ 失敗 |
| 原因 | API Key 認證失敗 (401 Unauthorized) |
#### TC-07: Chunk 存儲功能
| 項目 | 結果 |
|------|------|
| 狀態 | ❌ 失敗 |
| 原因 | 依賴 TC-05/TC-06 成功 |
---
### Phase 3 & 4
| 測試案例 | 狀態 | 原因 |
|----------|------|------|
| TC-08: 數據不交叉污染 | ❌ | PostgreSQL schema 問題 |
| TC-09: Redis Key 隔離 | ❌ | 認證問題 |
| TC-10: 端到端流程 | ❌ | 前置測試失敗 |
---
## 問題分析
### 問題 1: PostgreSQL Schema 隔離不完全
**嚴重程度**: 高
**現象**:
- 伺服器啟動時,`search_path` 正確設置為 `dev`
- Tables 在 `dev` schema 中創建
- 但運行時的 INSERT/SELECT 查詢使用 `public` schema
**根本原因**:
- sqlx 連接池使用 `after_connect`鉤子設置 `search_path`
- 當連接被重用時,`search_path` 設置不持久
- 需要使用 `after_pool_acquire` 或自定義連接器
**嘗試的解決方案**:
1. 使用 `after_connect` 鉤子 - 部分運作(啟動時)
2. 嘗試使用 `after_pool_acquire` - 方法不存在於當前 sqlx 版本
**建議的長期解決方案**:
1. 使用 PostgreSQL 會話級別預設設置
2. 或者在每個查詢中明確指定 schema`dev.videos`
3. 或者實現自定義 sqlx 連接器
### 問題 2: API Key 認證
**嚴重程度**: 中
**現象**: API 返回 401 Unauthorized
**可能原因**: API Key 格式或權限問題
---
## 已完成的隔離配置
### ✅ Redis 隔離
- 配置: `MOMENTRY_REDIS_PREFIX=momentry_dev:`
- 狀態: 已在 `.env.development` 中配置
### ✅ 文件系統隔離
- 配置: `MOMENTRY_OUTPUT_DIR=/Users/accusys/momentry/output_dev`
- 狀態: 已在 `.env.development` 中配置
### ✅ MongoDB 隔離
- 配置: `MOMENTRY_DATABASE=momentry_dev`
- 實現: `src/core/db/mongodb_db.rs` 已修改使用配置
### ✅ Qdrant 隔離
- 配置: `QDRANT_COLLECTION=momentry_dev_rule1`
- 實現: 已在代碼中使用環境變數
### 🔶 PostgreSQL 隔離
- 配置: `DATABASE_SCHEMA=dev`
- 實現: 部分完成 - schema 在啟動時創建 tables但运行时查询有問題
---
## 代碼變更記錄
| 文件 | 變更 |
|------|------|
| `.env.development` | 添加 `DATABASE_SCHEMA=dev`, `MONGODB_DATABASE=momentry_dev`, `QDRANT_COLLECTION=momentry_dev_rule1` |
| `src/core/config.rs` | 添加 `DATABASE_SCHEMA`, `MONGODB_DATABASE`, `QDRANT_COLLECTION` 靜態配置 |
| `src/core/db/postgres_db.rs` | 添加 schema 初始化邏輯,使用 `after_connect` 鉤子 |
| `src/core/db/mongodb_db.rs` | 添加 `database` 字段,使用 `MONGODB_DATABASE` 配置 |
---
## 數據庫創建記錄
```sql
-- PostgreSQL
CREATE SCHEMA IF NOT EXISTS dev;
-- MongoDB
db.createCollection('momentry_dev.chunks')
db.createCollection('momentry_dev.cache')
-- Qdrant
curl -X PUT 'http://localhost:6333/collections/momentry_dev_rule1' \
-H 'api-key: Test3200Test3200Test3200' \
-H 'Content-Type: application/json' \
-d '{"vectors": {"size": 1024, "distance": "Cosine"}}'
```
---
## 測試檢查清單
### 測試前檢查
| 項目 | 狀態 | 備註 |
|------|------|------|
| PostgreSQL 運行中 | ✅ | |
| `dev` schema 已創建 | ✅ | |
| MongoDB 運行中 | ✅ | |
| `momentry_dev` database 已創建 | ✅ | |
| Qdrant 運行中 | ✅ | |
| `momentry_dev_rule1` collection 已創建 | ✅ | |
| Redis 運行中 | ✅ | |
### 測試後檢查
| 項目 | 狀態 | 備註 |
|------|------|------|
| TC-01: PostgreSQL Schema 隔離 | 🔶 | 啟動時正確,運行時有問題 |
| TC-02: MongoDB Database 隔離 | ✅ | |
| TC-03: Qdrant Collection 隔離 | ✅ | |
| TC-04: Redis Prefix 隔離 | 🔶 | 未完整測試 |
| TC-05: 視頻註冊功能 | 🔶 | API 成功但寫入錯誤 schema |
| TC-06: 視頻查詢功能 | ❌ | API Key 認證失敗 |
| TC-07: Chunk 存儲功能 | ❌ | 依賴失敗 |
| TC-08: 數據不交叉污染 | ❌ | PostgreSQL schema 問題 |
| TC-09: Redis Key 隔離 | ❌ | 認證問題 |
| TC-10: 端到端流程 | ❌ | 前置測試失敗 |
---
## 總結
| 指標 | 數值 |
|------|------|
| 總測試數 | 9 |
| 通過 | 4 |
| 失敗 | 5 |
| 通過率 | 44% |
### 主要發現
1. **隔離架構已建立**: Redis、MongoDB、Qdrant 的隔離配置已完成
2. **PostgreSQL Schema 有待修復**: 這是最大的阻塞問題
3. **API 認證需要調查**: 401 錯誤需要進一步調研
### 後續建議
1. **修復 PostgreSQL Schema 隔離**(高優先級)
- 方案 A: 在每個 SQL 查詢中明確指定 schema 前綴
- 方案 B: 實現自定義連接器
- 方案 C: 使用 PostgreSQL 角色/數據庫級別設置
2. **調查 API Key 認證問題**(中優先級)
- 檢查 API Key 格式
- 驗證權限配置
3. **完成剩餘測試案例**(低優先級)
- 待 PostgreSQL 問題修復後
---
## 版本資訊
- 版本: V1.0
- 建立日期: 2026-03-31
- 更新日期: 2026-03-31

View File

@@ -1,281 +0,0 @@
---
document_type: "test_doc"
service: "POSTGRESQL"
title: "PostgreSQL Schema 隔離改善計畫"
date: "2026-03-31"
version: "V1.0"
status: "active"
owner: "Warren"
created_by: "OpenCode"
tags:
- "schema"
- "postgresql"
- "隔離改善計畫"
ai_query_hints:
- "查詢 PostgreSQL Schema 隔離改善計畫 的內容"
- "PostgreSQL Schema 隔離改善計畫 的主要目的是什麼?"
- "如何操作或實施 PostgreSQL Schema 隔離改善計畫?"
---
# PostgreSQL Schema 隔離改善計畫
| 項目 | 內容 |
|------|------|
| 建立者 | Warren |
| 建立時間 | 2026-03-31 |
| 文件版本 | V1.0 |
---
## 問題分析
### 現象
- 伺服器啟動時,`search_path` 正確設置為 `dev`
- Tables 在 `dev` schema 中成功創建
- 但運行時的 INSERT/SELECT 查詢仍使用 `public` schema
### 根本原因
```
sqlx 連接池工作原理:
┌─────────────────────────────────────────────────────────────┐
│ Connection Pool │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Conn 1 │ │ Conn 2 │ │ Conn 3 │ ... │
│ │ (fresh) │ │ (reused) │ │ (reused) │ │
│ │ search_path │ │ ? │ │ ? │ │
│ │ = dev ✅ │ │ = public ❌│ │ = public ❌│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ after_connect 鉤子只在「新建連接」時執行 │
│ 連接池重用連接時search_path 不持久 │
└─────────────────────────────────────────────────────────────┘
```
---
## 解決方案比較
| 方案 | 優點 | 缺點 | 推薦度 |
|------|------|------|--------|
| A. 明確 Schema 前綴 | 簡單直接,精確控制 | 需要改大量 SQL 查詢 | ⭐⭐⭐⭐⭐ |
| B. 自定義連接器 | 一勞永逸 | 實現複雜,需要深入 sqlx | ⭐⭐⭐ |
| C. PostgreSQL 會話預設 | 無需改代碼 | 需要 DB 管理權限 | ⭐⭐⭐ |
| D. 兩個資料庫 | 完全隔離 | 需要雙倍資源 | ⭐⭐ |
---
## 推薦方案: 明確 Schema 前綴
### 實作策略
在所有 SQL 查詢中明確指定 schema 前綴,格式:`{schema}.{table}`
#### 1. 創建 Schema 前綴工具函數
```rust
// src/core/db/schema.rs
use crate::core::config::DATABASE_SCHEMA;
pub fn table_name(table: &str) -> String {
let schema = DATABASE_SCHEMA.as_str();
if schema == "public" {
table.to_string()
} else {
format!("{}.{}", schema, table)
}
}
// 使用範例
let videos_table = table_name("videos"); // "dev.videos" 或 "videos"
```
#### 2. 修改 PostgresDb 方法
```rust
// register_video 方法改造範例
// 改造前
sqlx::query("INSERT INTO videos ...")
#
let table = table_name("videos");
sqlx::query(&format!("INSERT INTO {} ...", table))
```
#### 3. 需要修改的文件清單
| 文件 | 需要修改的函數/方法 |
|------|---------------------|
| `postgres_db.rs` | register_video, get_video, list_videos, delete_video, register_chunk, get_chunks, 等所有 DB 操作 |
| `sync_db.rs` | 調用 postgres 的方法 |
---
## 實施步驟
### Step 1: 創建 Schema 工具模組
**目標**: 創建統一的 schema 前綴處理函數
**檔案**: `src/core/db/schema.rs`
```rust
use once_cell::sync::Lazy;
use std::env;
pub static DATABASE_SCHEMA: Lazy<String> = Lazy::new(|| {
env::var("DATABASE_SCHEMA").unwrap_or_else(|_| "public".to_string())
});
pub fn table_name(table: &str) -> String {
let schema = DATABASE_SCHEMA.as_str();
if schema == "public" {
table.to_string()
} else {
format!("{}.{}", schema, table)
}
}
pub fn qualified_table(table: &str) -> String {
table_name(table)
}
```
### Step 2: 重構 PostgresDb 方法
**目標**: 將所有 SQL 查詢改為使用明確的 schema 前綴
**範例 - register_video**:
```rust
// 改造前
pub async fn register_video(&self, record: &VideoRecord) -> Result<i64> {
let result = sqlx::query(
r#"
INSERT INTO videos (uuid, file_path, ...)
"#
)
}
// 改造後
pub async fn register_video(&self, record: &VideoRecord) -> Result<i64> {
let table = table_name("videos");
let result = sqlx::query(
&format!(
r#"
INSERT INTO {} (uuid, file_path, ...)
"#,
table
)
)
}
```
### Step 3: 測試驗證
**目標**: 確保數據正確寫入 `dev` schema
```bash
# 1. 重啟 Playground Server
pkill -f momentry_playground
cargo run --bin momentry_playground -- server --port 3003 &
# 2. 註冊測試視頻
curl -X POST "http://localhost:3003/api/v1/videos/register" \
-H "Authorization: Bearer <API_KEY>" \
-d '{"file_path": "/path/to/video.mp4"}'
# 3. 驗證數據寫入 dev schema
psql "postgres://accusys:accusys@localhost:5432/momentry" \
-c "SET search_path TO dev; SELECT uuid, file_name FROM videos;"
```
---
## 工作量估計
### 需要修改的函數數量
| 類別 | 數量 |
|------|------|
| Videos 相關 | ~8 |
| Chunks 相關 | ~12 |
| Frames 相關 | ~5 |
| Pre_chunks 相關 | ~4 |
| Monitor_jobs 相關 | ~6 |
| API Keys 相關 | ~8 |
| 其他 | ~5 |
| **總計** | **~48** |
### 預估時間
- 修改: 2-3 小時
- 測試: 1 小時
- 總計: 3-4 小時
---
## 替代方案: 使用 ConnectionInitializer
如果不想修改所有 SQL 查詢,可以嘗試自定義 sqlx 的連接初始化器:
```rust
// 使用 sqlx::postgres::PgPoolOptions 的連接初始化
// 注意:這需要 sqlx 0.7+ 版本
use sqlx::postgres::{PgPoolOptions, Postgres};
let pool = PgPoolOptions::new()
.max_connections(10)
.connect_with(
connection_options
.after_connect(|conn, _| {
Box::pin(async move {
// 在這裡設置 session 參數
conn.execute("SET search_path TO dev").await?;
Ok(())
})
})
)
.await?;
```
---
## 驗收標準
改造完成後,以下測試必須通過:
```bash
# TC-01: PostgreSQL Schema 隔離驗證
psql "postgres://accusys:accusys@localhost:5432/momentry" \
-c "SET search_path TO dev; SELECT COUNT(*) FROM videos;"
# 預期: 能夠查到數據
# TC-02: 數據隔離驗證
# 在 Playground 註冊視頻後
psql "postgres://accusys:accusys@localhost:5432/momentry" \
-c "SET search_path TO dev; SELECT COUNT(*) FROM videos;"
# 預期: > 0
psql "postgres://accusys:accusys@localhost:5432/momentry" \
-c "SET search_path TO public; SELECT COUNT(*) FROM videos;"
# 預期: 不包含 Playground 註冊的數據
```
---
## 風險與緩解
| 風險 | 影響 | 緩解措施 |
|------|------|---------|
| 漏改某些查詢 | 數據寫入錯誤 schema | 全面測試覆蓋 |
| Schema 前綴語法錯誤 | SQL 執行失敗 | 先在 psql 測試確認語法 |
| 效能輕微下降 | 需要字符串格式化 | 影響可忽略 |
---
## 版本資訊
- 版本: V1.0
- 建立日期: 2026-03-31

View File

@@ -1,195 +0,0 @@
---
document_type: "test_doc"
service: "MOMENTRY_CORE"
title: "Release 到正式版分析"
date: "2026-03-31"
version: "V1.0"
status: "active"
owner: "Warren"
created_by: "OpenCode"
tags:
- "到正式版分析"
- "release"
ai_query_hints:
- "查詢 Release 到正式版分析 的內容"
- "Release 到正式版分析 的主要目的是什麼?"
- "如何操作或實施 Release 到正式版分析?"
---
# Release 到正式版分析
| 項目 | 內容 |
|------|------|
| 建立者 | Warren |
| 建立時間 | 2026-03-31 |
| 文檔版本 | V1.0 |
---
## 當前狀態摘要
### 已完成的隔離功能
| 功能 | 狀態 | 說明 |
|------|------|------|
| Redis 隔離 | ✅ 完成 | `momentry:` vs `momentry_dev:` prefix |
| MongoDB 隔離 | ✅ 完成 | `momentry` vs `momentry_dev` database |
| Qdrant 隔離 | ✅ 完成 | `momentry_rule1` vs `momentry_dev_rule1` collection |
| PostgreSQL Schema 隔離 | 🔶 部分完成 | schema 會在啟動時創建 tables但運行時有連接池問題 |
### 代碼變更清單
| 文件 | 變更 |
|------|------|
| `.env.development` | 新增 `DATABASE_SCHEMA=dev`, `MONGODB_DATABASE=momentry_dev`, `QDRANT_COLLECTION=momentry_dev_rule1` |
| `src/core/config.rs` | 新增 `DATABASE_SCHEMA`, `MONGODB_DATABASE`, `QDRANT_COLLECTION` 靜態配置 |
| `src/core/db/postgres_db.rs` | 新增 schema 初始化邏輯(`after_connect` 鉤子)|
| `src/core/db/mongodb_db.rs` | 新增 `database` 字段,使用配置 |
---
## Release 所需動作
### 🔴 阻塞問題
#### 1. PostgreSQL Schema 隔離修復
**問題**: 運行時查詢使用 `public` schema 而非 `dev` schema
**狀態**: 🔶 需要修復
**修復方案**: 採用「明確 Schema 前綴」方案
- 預估工作量: 3-4 小時
- 影響範圍: ~48 個 SQL 查詢函數
**詳細計畫**: 參考 `docs_v1.0/TESTING/POSTGRESQL_ISOLATION_FIX_PLAN.md`
---
### 🟡 必要動作Release 前必須完成)
#### 2. 添加 Production 環境變數到 `.env`
**當前 `.env` 缺少必要變數**:
```bash
# 建議添加到 .env
DATABASE_SCHEMA=public # 明確指定 production 使用 public schema
MONGODB_DATABASE=momentry # 明確指定 production 使用 momentry
```
#### 3. 完整測試覆蓋
| 測試項目 | 狀態 |
|----------|------|
| PostgreSQL Schema 隔離 | 🔶 需修復後重新測試 |
| MongoDB Database 隔離 | ✅ 需重新測試 |
| Qdrant Collection 隔離 | ✅ 需重新測試 |
| Redis Prefix 隔離 | ✅ 需重新測試 |
| API 功能正常 | ✅ 需重新測試 |
#### 4. Code Review
- [ ] `cargo clippy --lib` 通過
- [ ] `cargo test --lib` 通過
- [ ] `cargo fmt -- --check` 通過
---
### 🟢 已確認無需動作
| 項目 | 說明 |
|------|------|
| PostgreSQL 資料庫 | 無需變更 - 繼續使用 `momentry` 資料庫 |
| MongoDB | 無需變更 - 繼續使用 `momentry` database |
| Qdrant | 無需變更 - 繼續使用 `momentry_rule1` collection |
| Redis | 無需變更 - prefix 已正確配置 |
| File System | 無需變更 - output 目錄已正確配置 |
---
## Release 檢查清單
### Release 前檢查
| # | 項目 | 狀態 | 負責人 |
|---|------|------|--------|
| 1 | PostgreSQL Schema 隔離修復 | 🔶 TODO | Developer |
| 2 | 更新 `.env` 配置 | 🔶 TODO | DevOps |
| 3 | 執行完整隔離測試 | 🔶 TODO | QA |
| 4 | Code Review (clippy/test/fmt) | ✅ N/A | CI |
| 5 | 更新文件版本 | 🔶 TODO | Docs |
### Release 後驗證
| # | 項目 | 狀態 |
|---|------|------|
| 1 | Production Server 啟動正常 | - |
| 2 | Playground Server 啟動正常 | - |
| 3 | 數據寫入正確 schema | - |
| 4 | 兩環境數據完全隔離 | - |
---
## 風險評估
### Release 風險矩陣
| 風險 | 概率 | 影響 | 等級 | 緩解措施 |
|------|------|------|------|----------|
| PostgreSQL Schema 隔離失敗 | 高 | 高 | 🔴 | 修復後再 Release |
| 向量數據混入 | 低 | 高 | 🟡 | Qdrant 已隔離 |
| Redis 數據混入 | 低 | 中 | 🟢 | Prefix 已隔離 |
| API 功能異常 | 低 | 高 | 🟡 | 完整測試覆蓋 |
### 不建議立即 Release 的原因
1. **PostgreSQL Schema 隔離不完全**: 這是核心問題
- 可能導致 Playground 測試數據污染 Production 數據
- 違背隔離架構設計目標
2. **未經完整測試驗證**:
- 現有測試有 44% 失敗率
- 需要修復後重新測試
---
## Release 決策建議
### 選項 A: 立即 Release不建議
**條件**:
- 忽略 Schema 隔離問題
- 接受測試失敗
**風險**:
- 數據污染風險
- 違背設計目標
**不建議理由**:
- Playground 可能污染 Production 數據
---
### 選項 B: 修復後 Release建議
**條件**:
- 完成 PostgreSQL Schema 隔離修復
- 通過完整測試驗證
**時間**:
- 修復: 3-4 小時
- 測試: 1-2 小時
- 總計: ~6 小時
**優點**:
- 確保數據隔離正確
- 符合設計目標
- 測試通過率 100%
---
## 版本資訊
- 版本: V1.0
- 建立日期: 2026-03-31

View File

@@ -1,104 +0,0 @@
# Momentry 搜尋 API 統一與多維度搜尋改善計畫
> **日期**: 2026-04-17
> **發起原因**:
> 1. 目前各搜尋 API 回傳的 JSON 結構不一致,缺乏 `start_frame` / `end_frame` 等關鍵定位資訊。
> 2. 目前的 Vector Search 僅搜尋 ASR Collection忽略了 YOLO、Face、Pose 等視覺維度的資料。
---
## 1. 問題分析
### A. JSON 回應不一致
| API | 欄位名稱 | 時間精度 | 定位精度 |
|-----|----------|----------|----------|
| `/api/v1/search` | `uuid`, `chunk_id`, `start_time` | `start_time` | ❌ 無 |
| `/api/v1/n8n/search` | `vid`, `id`, `start_time` | `start_time`, `end_time` | ✅ `start_frame`, `end_frame` |
| `/api/v1/search/hybrid` | `uuid`, `chunk_id`, `start_time` | `start_time`, `end_time` | ✅ `start_frame`, `end_frame` |
**改善方向**: 所有 API 應統一回傳 `start_time`, `end_time`, `start_frame`, `end_frame`, `fps`,以確保前端或自動化腳本能精確 Seek。
### B. 向量搜尋僅限 ASR
目前 `/api/v1/search` 使用 `QdrantDb` 進行搜尋,但該 Collection (momentry_rule1) 僅包含語音轉錄 (ASR) 的向量。這導致搜尋「穿紅衣服的人」或「開車的場景」等視覺內容時,結果不理想。
---
## 2. 改善目標
### 目標一:統一搜尋回應結構 (Unified Schema)
建立一個標準的 `SearchHit` 結構,供所有 `/search` 系列 API 使用。
**新標準欄位**:
- **id**: Chunk ID
- **vid**: Video UUID
- **chunk_type**: 類型 (asr, yolo, face, story, etc.)
- **start_time / end_time**: 時間 (秒)
- **start_frame / end_frame**: 幀號 (精確定準則)
- **fps**: 幀率
- **text**: 內容文字
- **score**: 分數
- **file_path**: 影片路徑
- **metadata**: 額外資訊 (如 5W1H)
### 目標二:多維度向量搜尋 (Multi-Modal Vector Search)
在 Qdrant 中區分不同類型的 Collection搜尋時可同時或分層查詢
- `asr`: 語音內容 (已有)
- `face`: 臉部特徵 (Face Embedding)
- `object`: 物件偵測 (YOLO Embedding)
- `scene`: 場景描述 (Scene Classification)
**搜尋策略**:
1. **全域搜尋 (Global Search)**: 同時查詢 `asr`, `face`, `object`, `scene` 四個 Collection。
2. **權重融合 (Reranking)**: 將不同 Collection 的結果依據相關性進行合併與重排。
---
## 3. 執行計畫
### Phase 1: 結構統一 (Struct Unification)
| 任務 | 說明 |
|------|------|
| **1.1** | 建立 `UnifiedSearchHit` struct (取代現有的 `SearchResult` 與部分 `N8nSearchHit`) |
| **1.2** | 修改 `/api/v1/search` 實作,補齊 `start_frame`, `end_frame`, `fps` 欄位 |
| **1.3** | 修改 `/api/v1/search/hybrid` 實作,確保欄位與新結構一致 |
| **1.4** | 統一命名規範:`uuid``vid`, `chunk_id``id` (維持 API 向後相容或明確版本區分) |
### Phase 2: Qdrant 多維度擴充 (Multi-Modal Qdrant)
| 任務 | 說明 |
|------|------|
| **2.1** | 修改 `QdrantDb`,支援動態 Collection 參數或同時搜尋多個 Collection |
| **2.2** | 確認 `face`, `object`, `scene` 等 Collection 的向量維度是否一致 |
| **2.3** | 實作 `/api/v1/search/multimodal` 或擴充現有 `/api/v1/search` 支援多 Collection 搜尋 |
| **2.4** | 在 `search_bm25` 中補強視覺資料搜尋 (如物件標籤的關鍵字匹配) |
### Phase 3: 智慧路由 (Smart Routing)
| 任務 | 說明 |
|------|------|
| **3.1** | 開發 `/api/v1/search/smart`:自動判斷 Query 是屬於語意、視覺或混合意圖 |
| **3.2** | 根據意圖自動選擇最佳的 Collection 組合 (ASR-only 或 ASR+Face+Object) |
---
## 4. 預期效益
1. **開發者體驗提升**: 只需處理一套 JSON 格式,降低串接成本。
2. **影片定位精確化**: `start_frame` / `end_frame` 成為所有搜尋的標準配置,減少前端計算誤差。
3. **搜尋準確度躍升**: 解決「只聽不看」的盲點,真正實現多模態 RAG (Retrieval-Augmented Generation)。
---
## 5. 風險評估
| 風險 | 影響 | 應對策略 |
|------|------|----------|
| Qdrant Collection 維度不一致 | 無法合併搜尋 | 檢查並重新 Embedding 以確保維度統一 (如 768 dim) |
| API 欄位更名導致前端失效 | 前端崩潰 | 保留舊欄位為 Deprecated於 V2 API 中移除 |
| 多 Collection 搜尋效能下降 | 延遲增加 | 使用非同步平行查詢 (`tokio::join!`) |
---
## 6. 版本歷史
| 版本 | 日期 | 內容 |
|------|------|------|
| V1.0 | 2026-04-17 | 建立初步改善計畫 |

File diff suppressed because it is too large Load Diff