feat(rfa-ai): Complete RFA Approval Refactor and AI Model Revision
CI / CD Pipeline / build (push) Successful in 4m54s
CI / CD Pipeline / deploy (push) Failing after 12m9s

This commit is contained in:
2026-05-16 10:59:53 +07:00
parent 6cb3ae10ee
commit 1a162bf320
105 changed files with 5088 additions and 1083 deletions
@@ -0,0 +1,53 @@
// File: src/modules/ai/dto/create-ai-job.dto.ts
// Change Log
// - 2026-05-15: เพิ่ม DTO สำหรับ enqueue AI jobs ตาม ADR-023A US1.
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import {
IsIn,
IsNotEmpty,
IsObject,
IsOptional,
IsString,
IsUUID,
} from 'class-validator';
export const AI_JOB_TYPES = [
'ai-suggest',
'rag-query',
'ocr',
'extract-metadata',
'embed-document',
] as const;
export type CreateAiJobType = (typeof AI_JOB_TYPES)[number];
/** DTO สำหรับส่งงาน AI เข้า BullMQ โดยใช้ publicId เท่านั้นตาม ADR-019 */
export class CreateAiJobDto {
@ApiProperty({ description: 'Attachment/document publicId สำหรับงาน AI' })
@IsUUID()
documentPublicId!: string;
@ApiProperty({ description: 'Project publicId สำหรับ project isolation' })
@IsUUID()
projectPublicId!: string;
@ApiProperty({
enum: AI_JOB_TYPES,
description: 'ชนิดงาน AI ที่ต้อง enqueue',
})
@IsIn(AI_JOB_TYPES)
jobType!: CreateAiJobType;
@ApiProperty({ description: 'Idempotency key จาก request header/body' })
@IsString()
@IsNotEmpty()
idempotencyKey!: string;
@ApiPropertyOptional({
description: 'Payload เพิ่มเติม เช่น pdfPath, extractedText, question',
})
@IsOptional()
@IsObject()
payload?: Record<string, unknown>;
}
@@ -0,0 +1,33 @@
// File: backend/src/modules/ai/dto/migration-queue-item.dto.ts
// บันทึกการแก้ไข: สร้าง DTO สำหรับ Legacy Migration (T029) ตาม ADR-023A
import { IsString, IsNotEmpty, IsUUID, IsOptional } from 'class-validator';
import { ApiProperty } from '@nestjs/swagger';
export class MigrationQueueItemDto {
@ApiProperty({
description: 'n8n batch identifier',
example: 'batch-2026-05-15',
})
@IsString()
@IsNotEmpty()
batchId!: string;
@ApiProperty({ description: 'ชื่อไฟล์ต้นฉบับ', example: 'INV-2026-001.pdf' })
@IsString()
@IsNotEmpty()
filename!: string;
@ApiProperty({
description: 'เส้นทางไฟล์ชั่วคราวใน storage',
example: 'temp/migration/batch-1/INV-001.pdf',
})
@IsString()
@IsNotEmpty()
tempPath!: string;
@ApiProperty({ description: 'UUID ของโครงการ (ถ้าทราบ)', required: false })
@IsOptional()
@IsUUID()
projectPublicId?: string;
}