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)
4.4 KiB
4.4 KiB
// 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 เสร็จ