Volume 6 · Domain Microservices
กลุ่ม "Domain Microservices" ประกอบด้วย 9 repositories ที่แยกออกมาจาก legacy core เพื่อรับผิดชอบงาน HR เฉพาะด้าน ทั้งหมดเป็น NestJS 9 ยกเว้น ai-recruitment-api (Express) และ vtrc-common ที่ทำหน้าที่ต่างจากที่เข้าใจไว้เดิม
ภาพรวม repo ในกลุ่ม
| Repo | Branch canonical | ไฟล์ | หน้าที่จริง (จากโค้ด) | Port |
|---|---|---|---|---|
benefit-api | prod | 172 | เบิกจ่ายสวัสดิการ (เยี่ยมโรงพยาบาล/ฌาปนกิจ/มรดก/ภัยพิบัติ) | 9320 |
recruitment-api | prod | 322 | สรรหาบุคลากร (job request → candidate → contract → HRMI) | 9330 |
ai-recruitment-api | prod | 390 | สร้างสื่อ/กราฟิกด้วย AI สำหรับงานสรรหา (Express ไม่ใช่ NestJS) | 9430 |
pms-api | uat | 376 | บริหารผลการปฏิบัติงาน (ตัวชี้วัด/ประเมิน/อนุมัติ/ปรับเงินเดือน) — repo ใหญ่สุดในกลุ่ม | 9331 |
chat-center-api | prod | 68 | แชท backoffice + LINE OA, real-time ผ่าน Socket.IO | — |
job-scheduler-api | prod | 31 | มี cron job ทำงานจริงเพียง 1 งาน (สรุป incident รายวัน) | — |
workflow-api | uat (default main ว่างเปล่า) | 153 | package name จริงคือ ai-pms-nest — ครอบ AI course embedding + health-checkup benefit + IPD billing | — |
sso-api | master (default main ว่างเปล่า) | 35 | gateway ไปยัง SSO ภายนอกของสภากาชาด — ยังไม่มี Dockerfile/.env/CI | — |
vtrc-common | prod | 58 | ไม่ใช่ shared npm library — standalone HTTP microservice ให้บริการ address/bank/file | 9310 |
การแก้ไขจาก docs/index.md และ canonical-truths.md — vtrc-common ถูกอธิบายไว้เดิมว่าเป็น "shared NestJS library ที่ service อื่น import เป็น npm dependency" แต่จากการตรวจสอบพบว่าไม่มี repo ใดใน workspace ประกาศ vtrc-common เป็น npm dependency เลย มันคือ standalone microservice ของตัวเอง (มี Dockerfile, .env, MSSQL vtrc_common DB, port 9310) — consumer จริงที่เรียกผ่าน HTTP URL ตรง ได้แก่ benefit-api (backend, เฉพาะ /file/*), vtrc-mobile, vtrc-web, vtrc-rc-backoffice ส่วน job-scheduler-api/recruitment-api ประกาศ env var ไว้แต่ไม่เรียกใช้จริง (vestigial)
Cross-repo canonical facts (ยืนยันจากโค้ดทั้ง 9 repo)
- Shared JWT secret ข้ามหลาย service โดยไม่มี central auth —
benefit-api,recruitment-api,ai-recruitment-api,pms-apiมีค่าSECRET_KEY/JWT_SECRETเดียวกันใน.envของตัวเอง (copy กันไว้ ไม่ได้เรียก central service) เช่นเดียวกับ MSSQLsapassword (h@ckm3SA?) ที่ใช้ร่วมกันในchat-center-api,job-scheduler-api,vtrc-common,workflow-api— token/credential ที่หลุดจาก service เดียวกระทบทั้งกลุ่ม - MSSQL คือฐานข้อมูลเดียวที่ใช้ทั้งกลุ่ม — ไม่พบ MongoDB/PostgreSQL ในกลุ่มนี้ (ต่างจาก Meeting Platform ที่ใช้ Mongoose)
- Database coupling ข้าม repo แบบไม่ผ่าน API —
benefit-apiเขียนตรงเข้า schemavtrcของ legacy core ผ่าน TypeORM connection ที่สอง;recruitment-api/ai-recruitment-apishare databaserecruitment_aiโดยไม่มี migration sync ที่ยืนยันได้;workflow-apiเชื่อมตรงกับ 6 database connection รวมvtrc,dbHRMI_Center,dbHRMI_Center_NBC,benefit;pms-apiเชื่อมdbWorkforceจาก 10 module libs/jwt,libs/log,libs/exceptionเหมือนกันไบต์ต่อไบต์ ระหว่างchat-center-api,job-scheduler-api,vtrc-common— เป็น copy-paste ไม่ใช่ shared package- SQL injection จาก raw-query string interpolation พบซ้ำในหลาย repo ด้วยรูปแบบเดียวกัน:
benefit-api,recruitment-api(ผ่าน dynamicEXEC),chat-center-api,vtrc-common workflow-apiเป็นข้อยกเว้นเดียวที่ไม่มี global auth guard บังคับจริง — อีก 4+ repo ที่เป็น NestJS มีJwtAuthGuardเป็น global guard ที่ override ด้วย@Public()เฉพาะจุด แต่workflow-apiไม่มี guard ระดับ global เลย role ถูกอ่านจาก JWT payload ที่ไม่ได้ verify signature- Puppeteer ใช้ร่วมกันใน
benefit-api,recruitment-api,ai-recruitment-apiสำหรับ PDF/image generation — เพิ่ม attack surface และ image size จากchromiumdependency - Port ที่ยืนยันจาก Dockerfile/config:
benefit-api=9320,recruitment-api=9330,pms-api=9331,ai-recruitment-api=9430 (แยก series จาก 93xx — เหตุผล UNVERIFIED),vtrc-common=9310
Scorecard สรุปรวม (69 debt items จาก 9 repo)
| Repo | Critical | High | Medium | Low |
|---|---|---|---|---|
benefit-api | 2 | 3 | 6 | 2 |
recruitment-api | 2 | 2 | 3 | 2 |
ai-recruitment-api | 2 | 2 | 3 | 1 |
pms-api | 2 | 3 | 4 | 2 |
chat-center-api | 2 | 3 | 4 | 0 |
job-scheduler-api | 1 | 0 | 3 | 0 |
sso-api | 0 | 2 | 3 | 0 |
vtrc-common | 2 | 1 | 2 | 0 |
workflow-api | 2 | 2 | 3 | 1 |
รวมทั้ง volume: 15 Critical, 18 High, 31 Medium, 8 Low (69 items) — รายละเอียดเต็มของทุก ID อยู่ใน 06-scorecard.md/04-scorecard.md ของแต่ละ repo และจะถูกรวมเข้า Volume 17 · Technical Debt Register ทั้งหมด (Critical ทุกตัวเข้า Volume 18 · Security Review Findings เพิ่ม) — นับแก้ไขแล้วหลังพบว่า SEC-BENEFIT-03 เป็น High ไม่ใช่ Critical (ยืนยันจาก benefit-api/06-scorecard และ Volume 12 §3)
หมายเหตุเพิ่ม (พบระหว่าง synthesize Volume 11-12) — shared JWT secret cluster ที่เดิมระบุว่าครอบคลุมเฉพาะ 4 domain microservice (benefit-api/recruitment-api/ai-recruitment-api/pms-api) จริง ๆ ครอบคลุมถึง vtrc-api (Legacy Core) ด้วย — token ที่ vtrc-api ออกให้ verify ผ่าน recruitment-api's SECRET_KEY ได้จริง (ยืนยันจาก recruitment-api/04-auth-integrations) ทำให้ blast radius จริงคือ 5 service ไม่ใช่ 4 — ดู Volume 11 §4 สำหรับรายละเอียดเต็ม
อ้างอิงข้าม
- Volume 3 · Legacy Core —
benefit-apiเขียนตรงเข้า schemavtrcของvtrc-api - Volume 5 · 2way Platform — เชื่อมกับ
centralize-api/cu-central-apiด้วยรูปแบบคล้ายกัน - Canonical Truths