From 754d609399ad6ef28508b788de48fa17271ae25c Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 2 Jun 2026 15:49:39 +0700 Subject: [PATCH] fix(ai): correct double-wrap in OCR engine endpoints causing e.map error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Controller was returning { data: engines } which TransformInterceptor wrapped again into { data: { data: engines } }. extractData() only peeled one layer, leaving an object instead of the array — causing .map() to fail in OcrEngineSelector. - Return data directly from getOcrEngines() and selectOcrEngine() - Add Array.isArray guard in OcrEngineSelector as defensive layer --- backend/src/modules/ai/ai.controller.ts | 13 ++++--------- frontend/components/admin/ai/OcrEngineSelector.tsx | 2 +- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/backend/src/modules/ai/ai.controller.ts b/backend/src/modules/ai/ai.controller.ts index e241eed9..cb5ce996 100644 --- a/backend/src/modules/ai/ai.controller.ts +++ b/backend/src/modules/ai/ai.controller.ts @@ -1041,12 +1041,11 @@ export class AiController { @ApiOperation({ summary: 'OCR Engines — ดึงรายการเอนจิน OCR ทั้งหมดที่มีในระบบ (T003)', }) - async getOcrEngines(): Promise<{ data: OcrEngineResponseDto[] }> { + async getOcrEngines(): Promise { if (!this.ocrService) { throw new SystemException('OcrService not injected in AiController'); } - const engines = await this.ocrService.getOcrEngines(); - return { data: engines }; + return this.ocrService.getOcrEngines(); } @Post('ocr-engines/:engineId/select') @@ -1064,14 +1063,10 @@ export class AiController { async selectOcrEngine( @Param('engineId', ParseUuidPipe) engineId: string, @CurrentUser() user: User - ): Promise<{ data: OcrEngineConfiguration }> { + ): Promise { if (!this.ocrService) { throw new SystemException('OcrService not injected in AiController'); } - const engine = await this.ocrService.selectOcrEngine( - engineId, - user.user_id - ); - return { data: engine }; + return this.ocrService.selectOcrEngine(engineId, user.user_id); } } diff --git a/frontend/components/admin/ai/OcrEngineSelector.tsx b/frontend/components/admin/ai/OcrEngineSelector.tsx index b2e3fb5e..a6458f8a 100644 --- a/frontend/components/admin/ai/OcrEngineSelector.tsx +++ b/frontend/components/admin/ai/OcrEngineSelector.tsx @@ -22,7 +22,7 @@ export default function OcrEngineSelector() { try { setIsLoading(true); const data = await adminAiService.getOcrEngines(); - setEngines(data); + setEngines(Array.isArray(data) ? data : []); } catch (_err: unknown) { toast.error('ไม่สามารถดึงข้อมูล OCR Engines ได้'); } finally {