57 lines
4.0 KiB
SQL
57 lines
4.0 KiB
SQL
-- File: specs/03-Data-and-Storage/deltas/14-add-migration-review-queue.sql
|
|
-- Change Log
|
|
-- - 2026-05-15: เพิ่ม delta สำหรับ migration_review_queue ตาม ADR-023A โดยไม่ลบ/rename column เดิม.
|
|
-- ADR-009: ใช้ SQL delta โดยตรง ห้ามใช้ TypeORM migration
|
|
|
|
SET NAMES utf8mb4;
|
|
|
|
CREATE TABLE IF NOT EXISTS migration_review_queue (
|
|
id INT NOT NULL AUTO_INCREMENT COMMENT 'Internal PK (ห้าม expose ใน API)',
|
|
uuid UUID NOT NULL DEFAULT UUID() COMMENT 'UUID Public Identifier (ADR-019)',
|
|
batch_id VARCHAR(100) NOT NULL COMMENT 'n8n batch identifier',
|
|
idempotency_key VARCHAR(200) NOT NULL COMMENT 'Idempotency-Key สำหรับป้องกัน queue ซ้ำ',
|
|
original_filename VARCHAR(500) NOT NULL COMMENT 'ชื่อไฟล์ต้นฉบับจาก legacy source',
|
|
storage_temp_path VARCHAR(1000) NOT NULL COMMENT 'temp storage path ก่อน import',
|
|
ai_metadata_json JSON NOT NULL COMMENT 'AI suggestion payload เต็มสำหรับ human review',
|
|
confidence_score DECIMAL(5, 4) NOT NULL COMMENT 'AI confidence score 0.0000-1.0000',
|
|
ocr_used TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'ระบุว่าใช้ OCR path หรือไม่',
|
|
status ENUM('PENDING', 'IMPORTED', 'REJECTED') NOT NULL DEFAULT 'PENDING',
|
|
reviewed_by INT NULL COMMENT 'Internal users.user_id ของผู้ review',
|
|
reviewed_at DATETIME NULL COMMENT 'เวลาที่ review record',
|
|
rejection_reason VARCHAR(500) NULL COMMENT 'เหตุผลเมื่อ reject',
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (id),
|
|
UNIQUE KEY uq_migration_review_uuid (uuid),
|
|
UNIQUE KEY uq_migration_review_idempotency (idempotency_key),
|
|
KEY idx_migration_review_status_created (status, created_at),
|
|
KEY idx_migration_review_batch (batch_id),
|
|
KEY idx_migration_review_reviewed_by (reviewed_by)
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'ADR-023A AI migration review staging queue';
|
|
|
|
ALTER TABLE migration_review_queue
|
|
ADD COLUMN IF NOT EXISTS idempotency_key VARCHAR(200) NULL COMMENT 'Idempotency-Key สำหรับป้องกัน queue ซ้ำ',
|
|
ADD COLUMN IF NOT EXISTS original_filename VARCHAR(500) NULL COMMENT 'ชื่อไฟล์ต้นฉบับจาก legacy source',
|
|
ADD COLUMN IF NOT EXISTS storage_temp_path VARCHAR(1000) NULL COMMENT 'temp storage path ก่อน import',
|
|
ADD COLUMN IF NOT EXISTS ai_metadata_json JSON NULL COMMENT 'AI suggestion payload เต็มสำหรับ human review',
|
|
ADD COLUMN IF NOT EXISTS ocr_used TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'ระบุว่าใช้ OCR path หรือไม่',
|
|
ADD COLUMN IF NOT EXISTS reviewed_by INT NULL COMMENT 'Internal users.user_id ของผู้ review',
|
|
ADD COLUMN IF NOT EXISTS reviewed_at DATETIME NULL COMMENT 'เวลาที่ review record',
|
|
ADD COLUMN IF NOT EXISTS rejection_reason VARCHAR(500) NULL COMMENT 'เหตุผลเมื่อ reject';
|
|
|
|
UPDATE migration_review_queue
|
|
SET
|
|
idempotency_key = COALESCE(idempotency_key, CONCAT(batch_id, ':', uuid)),
|
|
original_filename = COALESCE(original_filename, original_file_name),
|
|
ai_metadata_json = COALESCE(ai_metadata_json, extracted_metadata),
|
|
rejection_reason = COALESCE(rejection_reason, error_reason)
|
|
WHERE idempotency_key IS NULL
|
|
OR original_filename IS NULL
|
|
OR ai_metadata_json IS NULL
|
|
OR rejection_reason IS NULL;
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS uq_migration_review_idempotency ON migration_review_queue (idempotency_key);
|
|
CREATE INDEX IF NOT EXISTS idx_migration_review_status_created ON migration_review_queue (status, created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_migration_review_batch ON migration_review_queue (batch_id);
|
|
CREATE INDEX IF NOT EXISTS idx_migration_review_reviewed_by ON migration_review_queue (reviewed_by);
|