Skip to content

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

ส่วนค่าหลักฐาน
FrameworkNestJS 9 (@nestjs/core ^9.0.0)benefit-api/package.json (branch: prod):30
ORMTypeORM ^0.3.11benefit-api/package.json (branch: prod):59
DatabaseMSSQL (mssql ^9.1.1) — 3 connection pools แยกกันbenefit-api/package.json (branch: prod):47, benefit-api/.env (branch: prod):14-33
AuthPassport JWT (passport-jwt ^4.0.0) แบบ global guardbenefit-api/libs/jwt/jwt-auth.guard.ts (branch: prod):6
PDF/Reportpuppeteer ^19.7.5 (headless Chromium ผ่าน ejs template)benefit-api/package.json (branch: prod):43,52
Excelexceljs ^4.3.0benefit-api/package.json (branch: prod):44
File transferssh2-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.0benefit-api/package.json (branch: prod):33
LanguageTypeScript ^4.7.4benefit-api/package.json (branch: prod):85
Package manageryarn (มี yarn.lock, Dockerfile รัน yarn)benefit-api/Dockerfile (branch: prod):24

Entry point และพอร์ต

  • Entry point: benefit-api/src/main.ts (branch: prod):14bootstrap() สร้าง 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 คือพอร์ตที่ถูกต้อง ไม่ใช่ default 3000 ใน main.ts
  • Swagger UI เปิดที่ ${BASE_PATH}docs (benefit-api/src/main.ts (branch: prod):41) — เปิดใน production ไม่มีการปิดด้วย env flag

Deploy artifact

  • Dockerfile (branch: prod) — base image node: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 nameenv prefixdatabase (ตาม .env)ใช้ทำอะไร
mainDB_*benefitschema หลักของ benefit-api เอง (welfare, disaster, payment, wdHospitals, ...)
vtrcVTRC_DB_*vtrcschema ของ vtrc-api (legacy core) — ใช้ query ตาราง WDHospitals, WDHistories, HospitalBankAccounts, Banks, MasterApprovers ตรง ๆ ด้วย raw SQL
hrmiDB_HRMI_*dbHRMI_Centerschema ของ 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)

สารบัญ

บทหัวข้อ
01Repository map
02Core pipeline — flow เบิกเงินช่วยเหลือภัยพิบัติแบบ end-to-end
03Persistence — entities, ตาราง, ความสัมพันธ์
04Auth model + external integrations
05Cron jobs
06Scorecard + debt register