benefit-api Deep Dive
benefit-api (branch: prod) เป็น NestJS 9 service ที่จัดการสวัสดิการ (welfare) และการเบิกจ่ายเงิน (withdrawal/disbursement) ของพนักงานสภากาชาดไทย ครอบคลุมเงินช่วยเหลือค่ารักษาพยาบาล (WdHospitals), เงินช่วยเหลือภัยพิบัติ (Disaster), เงินฌาปนกิจ (Funeral), เงินมรดกตกทอด (Inheritance), ค่าธรรมเนียมการศึกษา (StudyLeave) และการจ่ายเงินสด/โอนเงินผ่านธนาคาร (Payments/Disbursement/FMIS export)
หลักฐานชื่อ project จริงใน package.json คือ vtrc-restfull-v2 (benefit-api/package.json (branch: prod):2) — ชื่อ repo benefit-api เป็นชื่อที่ทีม deploy ใช้เรียก ไม่ตรงกับชื่อใน package.json
Stack
| ส่วน | ค่า | หลักฐาน |
|---|---|---|
| Framework | NestJS 9 (@nestjs/core ^9.0.0) | benefit-api/package.json (branch: prod):30 |
| ORM | TypeORM ^0.3.11 | benefit-api/package.json (branch: prod):59 |
| Database | MSSQL (mssql ^9.1.1) — 3 connection pools แยกกัน | benefit-api/package.json (branch: prod):47, benefit-api/.env (branch: prod):14-33 |
| Auth | Passport JWT (passport-jwt ^4.0.0) แบบ global guard | benefit-api/libs/jwt/jwt-auth.guard.ts (branch: prod):6 |
| PDF/Report | puppeteer ^19.7.5 (headless Chromium ผ่าน ejs template) | benefit-api/package.json (branch: prod):43,52 |
| Excel | exceljs ^4.3.0 | benefit-api/package.json (branch: prod):44 |
| File transfer | ssh2-sftp-client ^10.0.3 + sftp-upload ^1.0.4 (FMIS export ไป external SFTP) | benefit-api/package.json (branch: prod):57-58 |
| Cron | @nestjs/schedule ^2.2.0 | benefit-api/package.json (branch: prod):33 |
| Language | TypeScript ^4.7.4 | benefit-api/package.json (branch: prod):85 |
| Package manager | yarn (มี yarn.lock, Dockerfile รัน yarn) | benefit-api/Dockerfile (branch: prod):24 |
Entry point และพอร์ต
- Entry point:
benefit-api/src/main.ts (branch: prod):14—bootstrap()สร้าง NestJS app, ตั้ง global prefix${BASE_PATH}api/v1, เปิด static asset ที่/benefit-api/สำหรับไฟล์ในuploads/ - พอร์ต runtime อ่านจาก
ConfigService.get('port')fallback เป็น3000(benefit-api/src/main.ts (branch: prod):21) — ค่าจริงจาก.envคือPORT=9320(benefit-api/.env (branch: prod):5) - Dockerfile ประกาศ
EXPOSE 9320(benefit-api/Dockerfile (branch: prod):28) — ตรงกับค่า.envจึงถือว่า 9320 คือพอร์ตที่ถูกต้อง ไม่ใช่ default3000ในmain.ts - Swagger UI เปิดที่
${BASE_PATH}docs(benefit-api/src/main.ts (branch: prod):41) — เปิดใน production ไม่มีการปิดด้วย env flag
Deploy artifact
Dockerfile(branch: prod) — base imagenode:20-alpine, ติดตั้งchromium+ font libs สำหรับ puppeteer (benefit-api/Dockerfile (branch: prod):7-16), build ด้วยyarn buildแล้วCMD ["yarn","start:prod"]- มี
docker-compose.ymlที่ root แต่ไม่ได้อ่านเนื้อหาโดยละเอียดในรอบนี้ — UNVERIFIED ว่า compose ตรงกับ Dockerfile หรือไม่
Database topology (สำคัญ)
benefit-api ต่อ MSSQL 3 connection pool พร้อมกัน ผ่าน TypeORM named connections — นี่คือจุดที่ทำให้ persistence ของ repo นี้ซับซ้อนกว่า microservice อื่นในกลุ่มเดียวกัน
| Connection name | env prefix | database (ตาม .env) | ใช้ทำอะไร |
|---|---|---|---|
main | DB_* | benefit | schema หลักของ benefit-api เอง (welfare, disaster, payment, wdHospitals, ...) |
vtrc | VTRC_DB_* | vtrc | schema ของ vtrc-api (legacy core) — ใช้ query ตาราง WDHospitals, WDHistories, HospitalBankAccounts, Banks, MasterApprovers ตรง ๆ ด้วย raw SQL |
hrmi | DB_HRMI_* | dbHRMI_Center | schema ของ HR master (HRMI) — cron ดึงข้อมูล funeral/inheritance และ query โปรไฟล์พนักงาน |
หลักฐาน — benefit-api/config/configuration.ts (branch: prod):8-61, benefit-api/src/app.module.ts (branch: prod):40-57
ข้อสังเกตสำคัญ — benefit-api เขียนเข้า schema vtrc ของ legacy core โดยตรงด้วย raw SQL (ไม่ผ่าน vtrc-api GraphQL) ในหลาย flow เช่น cancel/update WDHospitals (ดู 03 Persistence และ 02 Core pipeline) — เป็น cross-service database coupling ที่ไม่ผ่าน API boundary ใด ๆ
สิ่งที่ควรรู้ก่อนอ่านบทถัดไป
- โฟลเดอร์
uploads/มีไฟล์จริง (รูป PNG) commit อยู่ใน repo (benefit-api/uploads/disaster/2023-02-27/*.png) — ข้อมูลผู้ใช้ (เอกสารประกอบการเบิกภัยพิบัติ) หลุดเข้า git history - ไฟล์
.envที่ commit อยู่ใน repo มี credential ของ production MSSQL และ SFTP เซิร์ฟเวอร์เป็น plaintext — ดูรายละเอียดใน 06 Scorecard (SEC-BENEFIT-01)
สารบัญ
| บท | หัวข้อ |
|---|---|
| 01 | Repository map |
| 02 | Core pipeline — flow เบิกเงินช่วยเหลือภัยพิบัติแบบ end-to-end |
| 03 | Persistence — entities, ตาราง, ความสัมพันธ์ |
| 04 | Auth model + external integrations |
| 05 | Cron jobs |
| 06 | Scorecard + debt register |