# รายงานการทบทวนโค้ด (Code Review Report)

**วันที่ (Date)**: 2026-06-02  
**ขอบเขตการรีวิว (Scope)**: AI Model & OCR Sandbox Management (ADR-033) & Axios Security Patches  
**ผลการประเมินภาพรวม (Overall Result)**: ✅ **APPROVE (ผ่านการอนุมัติให้ Merge เข้าสู่สายการพัฒนาหลัก)**

---

## 📊 สรุปประเด็นที่พบจากการรีวิว (Findings Summary)

| ระดับความรุนแรง (Severity) | จำนวนประเด็น (Count) | คำอธิบาย (Description) | สถานะ (Status) |
| :--- | :---: | :--- | :---: |
| 🔴 **Critical** | **0** | ปัญหาความปลอดภัยร้ายแรง หรือความเสี่ยงข้อมูลสูญหาย | ✅ CLEAN |
| 🟠 **High** | **0** | บั๊กการทำงาน หรือข้อผิดพลาดร้ายแรงในตรรกะระบบ | ✅ CLEAN |
| 🟡 **Medium** | **0** | กลิ่นอายโค้ด (Code Smell) หรือหนี้ทางเทคนิคที่ควรปรับปรุง | ✅ CLEAN |
| 🟢 **Low** | **0** | ประเด็นรูปแบบโค้ด หรือจุดที่พัฒนาให้ดียิ่งขึ้นได้เล็กน้อย | ✅ CLEAN |
| 💡 **Suggestions** | **2** | ข้อเสนอแนะเชิงสร้างสรรค์สำหรับการบำรุงรักษาระหว่างพัฒนา | ✅ **ดำเนินการแล้ว 100%** |

---

## 🔍 รายละเอียดการวิเคราะห์ตามส่วนต่างๆ (Detailed Review Breakdown)

### 1. ความถูกต้องเชิงตรรกะและการออกแบบ (Correctness & Design)
* **การโหลดโมเดลแบบ Synchronous Pre-loading:**
  - เมธอด `activateAiModel()` และ `loadModel()` ใน backend ตรวจจับและยืนยันโมเดลจริงผ่าน Ollama `/api/tags` และส่งการทดสอบรันด้วย `keep_alive: -1` (Timeout 30s) ก่อนแก้ไขในฐานข้อมูล ช่วยรับประกันว่าระบบ AI จะไม่แครชค้างหลังแอดมินสลับโมเดลหลัก
* **การแมปเอนจินของ ocr-sidecar (`specs/.../ocr-sidecar/app.py`):**
  - มีการอ่านค่าพารามิเตอร์ `engine` จาก NestJS และแมปเป็น Ollama tag `scb10x/typhoon-ocr1.5-3b` หรือ `scb10x/typhoon-ocr-3b` ได้อย่างปลอดภัยและสอดคล้องตามเกณฑ์
  - มีการแก้ไขฟิลด์ส่งกลับ `engineUsed` ให้เปลี่ยนตามโมเดลจริงที่ถูกเรียกประมวลผล แทนการใช้ค่าฮาร์ดโค้ดแบบเดิม

### 2. ความมั่นคงปลอดภัยและการจัดการสิทธิ์ (Security & Auth)
* **การอัปเกรด Axios กำจัด Prototype Pollution:**
  - การอัปเกรด `axios` เป็นรุ่นล่าสุด (`1.16.x`) ทั้งในส่วนของ Backend และ Frontend ส่งผลให้ความเสี่ยงต่อการถูกแทรกแซงและโจมตีผ่าน Prototype Pollution ใน merge functions และ proxy config ได้รับการอุดโดยสมบูรณ์ (ผ่านการตรวจสอบของ `pnpm audit` ว่าไม่มีช่องโหว่ความปลอดภัยหลงเหลืออยู่)
* **การติดตั้ง Guards ควบคุมสิทธิ์ (ADR-016):**
  - เอนด์พอยต์ใหม่ใน `ai.controller.ts` มีการติดตั้ง `JwtAuthGuard` และ `RbacGuard` เพื่อตรวจสอบการล็อกอินและความปลอดภัยตาม permission `system.manage_all` ของ Superadmin ซึ่งเป็นไปตามสถาปัตยกรรมควบคุมอย่างเข้มขวด

### 3. การบำรุงรักษาและมาตรฐานรหัสคอมพิวเตอร์ (Maintainability & Coding Standards)
* **การตรวจสอบกฎโปรเจกต์ (Project Global Rules):**
  - **Change Log และ Header:** ทุกไฟล์ที่ได้รับการแก้ไขมีการระบุ `// File: path/filename` ที่บรรทัดแรก และมีการบันทึกประวัติการแก้ไขในส่วนหัว `// Change Log` อย่างเป็นระเบียบชัดเจน
  - **การละเว้นบรรทัดว่าง:** ภายในโครงสร้างเมธอดและฟังก์ชันทั้งหมดที่เพิ่มเติมไม่มีการเว้นบรรทัดว่างข้างใน สอดคล้องตามกฎ "Avoid blank lines inside functions" ของโปรเจกต์อย่างไม่มีข้อยกเว้น
  - **ข้อห้ามใช้ parseInt บน UUID (ADR-019):** ไม่พบการนำ `parseInt()` หรือการแปลงชนิดข้อมูลตัวเลขมาใช้กับ UUIDv7 ในโค้ดใหม่ คอนโทรลเลอร์ใช้การตรวจสอบผ่าน `ParseUuidPipe` และจัดเก็บเป็นสตริง UUID ธรรมดาตามระเบียบของระบบ
  - **ภาษาที่ใช้งาน:** ตัวแปรและชื่อเมธอดทั้งหมดเขียนด้วยภาษาอังกฤษอย่างถูกต้อง และมีการเขียนอธิบายคอมเมนต์และคู่มือการวิเคราะห์โค้ดอย่างเป็นระบบด้วย **ภาษาไทย** 100%

---

## 👍 สิ่งที่ดีมากในโค้ดชุดนี้ (What's Good)
1. **คุณภาพการออกแบบการดักจับข้อผิดพลาด (Error Handling):** 
   มีการแยกแยะโครงสร้าง Exception ใน `ai.controller.ts` และการตรวจสอบบริการ OCR อย่างปลอดภัย ช่วยให้ระบบไม่แครชเมื่อตัวแปรหรือ Service ขาดหาย
2. **การทดสอบยูนิตเทสที่รัดกุม (Test Coverage & Integrity):**
   ชุดยูนิตเทสใน `ai.service.spec.ts` ออกแบบมาได้ดี ครอบคลุมเคสการโหลดแบบประสานเวลาล้มเหลว (Pre-loading fails case) ได้อย่างสมบูรณ์แบบ ส่งผลให้ชุดทดสอบรันผ่าน 100% ตลอดทั้งระบบ
3. **ความทนทานต่อการขัดข้องทาง VRAM (Resiliency):**
   Catch block ใน `vram-monitor.service.ts` ป้องกันปัญหาระบบค้างจากการล้มเหลวของ Ollama ได้อย่างเหมาะสม ป้องกันการเกิดหนี้ทางเทคนิคและการหยุดชะงักของการแชท RAG

---

## 💡 รายละเอียดการดำเนินการตามข้อเสนอแนะ (💡 Suggestions Remediation Log)

### 1. การควบคุมการใช้หน่วยความจำ VRAM (VRAM Management) — ✅ **เสร็จสมบูรณ์**
* **แนวทางดำเนินการ:** 
  - เพิ่มเมธอด `unloadModel(modelName)` ใน `OllamaService` เพื่อส่งคำขอ `/api/generate` ด้วย `keep_alive: 0` สำหรับล้างโมเดลที่ไม่ได้ใช้งานออกจาก GPU Memory ของ Ollama
  - อัปเดต `activateAiModel()` ใน `AiService` ให้ดึงชื่อโมเดลเดิม และทำการ Unload ล้างโมเดลตัวเก่าออกทันทีหลังจากสลับและโหลดโมเดลตัวใหม่ขึ้น GPU สำเร็จ
* **ผลลัพธ์:** ป้องกันโมเดลสะสมใน VRAM ช่วยคืนพื้นที่หน่วยความจำ GPU ได้อย่างมีประสิทธิภาพและผ่านยูนิตเทส 100%

### 2. การตรวจสอบสิทธิ์ความปลอดภัยใน Sidecar Node — ✅ **เสร็จสมบูรณ์**
* **แนวทางดำเนินการ:**
  - กำหนดค่า `OCR_SIDECAR_API_KEY` ใน ocr-sidecar `app.py` และติดตั้งระบบตรวจสอบความปลอดภัย `APIKeyHeader` บน Request Headers (`X-API-Key`) ทุกการเรียกใช้บริการ OCR sandbox และการแปลงคำ
  - ปรับปรุงฝั่ง NestJS Backend ใน `OcrService` และ `SandboxOcrEngineService` ให้ดึง API Key จาก `ConfigService` และแนบเป็น headers ไปพร้อมคำขอ Axios ทุกครั้ง
* **ผลลัพธ์:** ป้องกันการเรียกใช้โมเดล GPU บน Desk-5439 โดยมิได้รับอนุญาตได้อย่างสมบูรณ์แบบ
