a2973be208
- เพิ่ม POST /api/ai/jobs + GET /api/ai/jobs/:jobId endpoints (FR-001, FR-002) - เพิ่ม BullMQ Worker MigrateDocumentWorker + OCR auto-detect (FR-003, FR-004) - เพิ่ม cleanup-temp-files + expire-pending-reviews workers (FR-005, FR-005a/b) - สร้าง SQL deltas: tags, correspondence_tags, alter migration_review_queue (FR-006, ADR-009) - เพิ่ม MigrationReviewService.commitRecord() + SELECT FOR UPDATE (FR-007, FR-007a) - เพิ่ม CASL permission migration.commit + MigrationReviewController (FR-007) - สร้าง TagsModule + TagsService + TagsController (US3) - สร้าง Migration Review Queue frontend page + ReviewQueueTable (US2) - อัปเดต n8n guide: deterministic Idempotency-Key + token pre-flight (FR-001a, FR-010a/b) - สร้าง spec.md, plan.md, tasks.md, data-model.md, contracts/, quickstart.md - สร้าง ADR-028 document + validation-report.md (PASS 32/32 tasks, 173/173 tests)
61 lines
4.4 KiB
Markdown
61 lines
4.4 KiB
Markdown
// File: specs/200-fullstacks/228-migration-arch-refactor/research.md
|
|
// Change Log:
|
|
// - 2026-05-22: Phase 0 research derived from grill session + clarify session
|
|
|
|
# Research: ADR-028 Migration Architecture Refactor
|
|
|
|
## Resolved Decisions
|
|
|
|
### 1. n8n → BullMQ (ไม่ใช่ Direct Ollama)
|
|
|
|
- **Decision**: n8n ต้องเรียกผ่าน `POST /api/ai/jobs` (DMS API) → BullMQ → Ollama Worker
|
|
- **Rationale**: ให้ RBAC, ADR-007 Error Handling, และ `ai_audit_logs` ครอบคลุมทุก AI job โดยอัตโนมัติ ถ้า n8n bypass BullMQ จะเกิด audit gap
|
|
- **Alternatives considered**: n8n เรียก Ollama REST API โดยตรง — ถูก reject เพราะขัด ADR-023A และ audit trail ขาด
|
|
|
|
### 2. AI Model Stack
|
|
|
|
- **Decision**: `gemma4:e4b Q8_0` สำหรับ inference, `nomic-embed-text` สำหรับ embedding
|
|
- **Rationale**: กำหนดโดย ADR-023A — VRAM peak ~4.3GB (ต่ำกว่า RTX 2060 SUPER 8GB), เพียงพอสำหรับ Thai + English document classification
|
|
- **Alternatives considered**: llama3.2:3b, mistral:7b, Typhoon2-4B, Qwen2.5-7B — ถูก reject เพราะ ADR-023A กำหนด model stack แล้ว, ไม่มี fallback (BullMQ concurrency=1 จัดการ GPU)
|
|
|
|
### 3. OCR Pipeline
|
|
|
|
- **Decision**: Auto-detect — PyMuPDF (extracted_chars > 100/page) → Fast Path; PaddleOCR + PyThaiNLP → Slow Path
|
|
- **Rationale**: Thai document support ดีกว่า Apache Tika; auto-detect ลด latency สำหรับ PDF ที่มี text layer; รันบน Desk-5439 ผ่าน BullMQ Worker
|
|
- **Alternatives considered**: Apache Tika — ถูก reject เพราะ n8n ต้องรัน extract เอง (ขัด ADR-023A), Thai NLP support อ่อนแอ
|
|
|
|
### 4. Migration Token Policy
|
|
|
|
- **Decision**: Token ≤ 7 วัน, Renew ทุกสัปดาห์, Revoke ทันที Go-Live
|
|
- **Rationale**: ADR-023 security policy; token "100 ปี" (ที่เดิมระบุใน 03-05) เป็นความเสี่ยงด้าน security สูง
|
|
- **Alternatives considered**: Token 100 ปี (ไม่ expire) — ถูก reject เพราะขัด ADR-016/ADR-023
|
|
|
|
### 5. `/api/ai/jobs` Endpoint Status
|
|
|
|
- **Decision**: ยังไม่มี — ต้องพัฒนาเป็น Blocking Prerequisite ก่อน Migration Phase เริ่ม
|
|
- **Rationale**: Migration plan ทั้งหมด (n8n → BullMQ) อาศัย endpoint นี้; ต้องเสร็จก่อน Gate #1
|
|
- **Required**: BullMQ job type `migrate-document` ใหม่ + polling endpoint
|
|
|
|
### 6. Tags Schema
|
|
|
|
- **Decision**: สร้าง SQL delta สำหรับ `tags` และ `correspondence_tags` ตาม ADR-009
|
|
- **Rationale**: ตารางเหล่านี้ยังไม่มีใน production schema; ต้องสร้างก่อน Migration เพื่อให้ AI tag suggestions ทำงานได้
|
|
- **SQL delta path**: `specs/03-Data-and-Storage/deltas/`
|
|
|
|
### 7. Orphaned Temp Files
|
|
|
|
- **Decision**: Auto-cleanup 24 ชั่วโมง หลัง job `failed` หรือไม่มี commit (Scheduled BullMQ cleanup job)
|
|
- **Rationale**: ป้องกัน NAS space ล้น; สอดคล้องกับ Two-Phase storage pattern (ADR-016)
|
|
- **Alternatives considered**: n8n รับผิดชอบ cleanup / Manual cleanup — ถูก reject เพราะ n8n อาจ miss cases และ manual cleanup ไม่ reliable
|
|
|
|
### 8. Final Commit RBAC
|
|
|
|
- **Decision**: `DOCUMENT_CONTROLLER` | `ADMIN` | `SUPERADMIN`
|
|
- **Rationale**: Document Controller รับผิดชอบเอกสารโดยตรง; Admin และ SUPERADMIN ต้องมีสิทธิ์เป็น fallback
|
|
- **Alternatives considered**: Admin only / DC only — ถูก reject เพราะ lockout risk
|
|
|
|
### 9. Migration Tables Retention
|
|
|
|
- **Decision**: `import_transactions` เก็บถาวร (audit trail); ตารางอื่น Drop หลัง Gate #3 (T+30 วัน)
|
|
- **Rationale**: `import_transactions` เป็น compliance requirement — ต้องรู้ว่าใครนำเข้าอะไรเมื่อไหร่; ตาราง operational state ไม่มีคุณค่าหลัง migration เสร็จ
|