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)
3.6 KiB
3.6 KiB
// File: specs/200-fullstacks/228-migration-arch-refactor/quickstart.md // Change Log: // - 2026-05-22: Phase 1 quickstart for ADR-028 Migration Architecture Refactor
Quickstart: ADR-028 Migration Architecture Refactor
Pre-requisites Checklist (ก่อนเริ่ม implement)
- Branch
228-migration-arch-refactorถูก checkout แล้ว - Staging DB พร้อม (MariaDB ตาม docker-compose)
- Redis พร้อม (BullMQ)
- Ollama บน Desk-5439 online —
curl http://192.168.20.100:11434/api/tags→ ได้gemma4:e4b+nomic-embed-text - OCR Service (PaddleOCR container) บน Desk-5439 online
Scenario 1: Test POST /api/ai/jobs (MVP — US1)
# 1. ทดสอบ submit migration job
curl -X POST http://localhost:3000/api/ai/jobs \
-H "Authorization: Bearer <MIGRATION_TOKEN>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: test-001" \
-d '{
"type": "migrate-document",
"payload": {
"tempAttachmentId": "<uuid-ของ-temp-file>",
"documentNumber": "LCP-GEN-COR-001-001",
"title": "หนังสือทดสอบ",
"existingTags": [],
"systemCategories": ["Correspondence", "Drawing"],
"batchId": "test_batch_001"
}
}'
# Expected: { "data": { "jobId": "...", "status": "queued" } }
# 2. Poll ผลลัพธ์
curl http://localhost:3000/api/ai/jobs/<jobId> \
-H "Authorization: Bearer <MIGRATION_TOKEN>"
# Expected (after ~30s): { "data": { "status": "completed", "result": { "confidence": ..., "category": ... } } }
Scenario 2: Test Execute Import (US2)
# 1. ดึงรายการ PENDING จาก review queue
curl http://localhost:3000/api/ai/migration/review \
-H "Authorization: Bearer <DC_OR_ADMIN_JWT>"
# 2. Execute Import
curl -X POST http://localhost:3000/api/ai/migration/review \
-H "Authorization: Bearer <DC_OR_ADMIN_JWT>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: commit-001" \
-d '{
"reviewQueueId": 1,
"action": "approve",
"overrideTags": []
}'
# Expected: { "data": { "correspondencePublicId": "...", "tagsLinked": 2 } }
# 3. ตรวจสอบ RBAC (ต้อง 403)
curl -X POST http://localhost:3000/api/ai/migration/review \
-H "Authorization: Bearer <VIEWER_JWT>" \
...
# Expected: 403 Forbidden
Scenario 3: Apply SQL Deltas (US3)
# Apply tags tables
mysql -h <DB_HOST> -u root -p lcbp3_production \
< specs/03-Data-and-Storage/deltas/2026-05-22-create-tags-tables.sql
# Apply ai_job_id column
mysql -h <DB_HOST> -u root -p lcbp3_production \
< specs/03-Data-and-Storage/deltas/2026-05-22-alter-migration-review-queue.sql
# Verify
mysql -e "DESCRIBE tags; DESCRIBE correspondence_tags; SHOW COLUMNS FROM migration_review_queue LIKE 'ai_job_id';" lcbp3_production
Scenario 4: Verify Temp File Auto-Cleanup
# ดู BullMQ scheduled jobs (admin UI หรือ Redis CLI)
redis-cli KEYS "bull:ai-batch:*cleanup*"
# ตรวจ temp files ที่ครบ 24h (สำหรับ test ปรับ interval เป็น 5 นาที)
mysql -e "SELECT id, created_at FROM attachments WHERE is_temporary=1 AND created_at < NOW() - INTERVAL 24 HOUR;" lcbp3_production
Reference Docs
| ทำอะไร | อ่านที่ |
|---|---|
| API contracts | contracts/ai-jobs-api.md |
| Data model / Schema | data-model.md |
| Architecture decisions | research.md |
| Full task list | tasks.md |
| Migration docs | specs/03-Data-and-Storage/03-04-legacy-data-migration.md |