chat-center-api Deep Dive
chat-center-api (branch: prod, ~68 tracked files) เป็น NestJS 9 backend สำหรับฟีเจอร์แชทของ 2way-meeting-backoffice — ครอบคลุม (1) แชทระหว่างเจ้าหน้าที่ (care taker / super admin) กับพนักงานผ่าน widget ภายใน backoffice, (2) แชทที่ผูกกับ LINE Official Account (webhook เข้า + Messaging API push ออก), (3) นัดหมาย (appointment) พร้อม in-memory reminder, (4) แบบสำรวจความพึงพอใจหลังปิดห้อง (satisfaction survey), และ (5) จัดทีม/tag สำหรับควบคุมว่า staff คนไหนเห็นห้องแชทใด
ชื่อใน package.json คือ rest-structure (chat-center-api/package.json (branch: prod):2) — ชื่อ repo chat-center-api เป็นชื่อที่ทีม deploy ใช้เรียก ไม่ตรงกับชื่อใน package.json (pattern เดียวกับ benefit-api ที่ชื่อจริงคือ vtrc-restfull-v2)
Stack
| ส่วน | ค่า | หลักฐาน |
|---|---|---|
| Framework | NestJS 9 (@nestjs/core ^9.0.0) | chat-center-api/package.json (branch: prod):27-29 |
| ภาษา | TypeScript ^4.7.4, decorator-based | chat-center-api/package.json (branch: prod):78 |
| ORM (SQL) | TypeORM ^0.3.10 บน MSSQL — named connections main และ center | chat-center-api/package.json (branch: prod):55, chat-center-api/src/app.module.ts (branch: prod):33-44 |
| ODM (NoSQL) | Mongoose ^7.2.2 บน MongoDB (chatDB) | chat-center-api/package.json (branch: prod):47, chat-center-api/src/app.module.ts (branch: prod):45-51 |
| Realtime | @nestjs/websockets + @nestjs/platform-socket.io — path /chat-center-ws | chat-center-api/src/modules/chat/chat.gateway.ts (branch: prod):19-26 |
| Cron (Nest) | @nestjs/schedule ^3.0.0 | chat-center-api/package.json (branch: prod):34 |
| Cron (in-memory) | cron ^2.0.1 — ใช้ใน appointment reminder | chat-center-api/package.json (branch: prod):40, chat-center-api/src/modules/appointment/appointment.service.ts (branch: prod):7,37 |
| Auth | Passport JWT (passport-jwt ^4.0.0) ผ่าน global JwtAuthGuard | chat-center-api/libs/jwt/jwt-auth.guard.ts (branch: prod):6, chat-center-api/src/main.ts (branch: prod):34 |
| HTTP client | axios ^1.3.4 — ยิง LINE Messaging API | chat-center-api/package.json (branch: prod):42 |
| CRUD scaffolding | @nestjsx/crud + @nestjsx/crud-typeorm (อยู่ใน dependencies แต่ ไม่พบ @Crud() decorator ในโค้ด — controller เขียนมือทั้งหมด) | chat-center-api/package.json (branch: prod):38-39 |
| Package manager | yarn (Dockerfile รัน yarn) | chat-center-api/Dockerfile (branch: prod):9 |
Entry point และพอร์ต
- Entry point:
chat-center-api/src/main.ts (branch: prod):15—bootstrap()สร้างNestExpressApplication, ตั้ง global prefix เป็น`${BASE_PATH}api/v1`, เปิด static assets ที่/chat-center-api/สำหรับไฟล์ในuploads/, ผูกJwtAuthGuardเป็น global guard, และผูก Socket.IO adapter (IoAdapter) - พอร์ต runtime อ่านจาก
ConfigService.get('port')fallback3000(chat-center-api/src/main.ts (branch: prod):23) — ค่าจริงจาก.envคือPORT=8200(chat-center-api/.env (branch: prod):5) BASE_PATH=chat-center-api/(chat-center-api/.env (branch: prod):3) → HTTP path จริงคือ/chat-center-api/api/v1/*SERVER_URL=https://vtrcapi.redcross.or.th/(chat-center-api/.env (branch: prod):4) — รวมกับBASE_PATHเป็นhostServerใน config (chat-center-api/config/configuration.ts (branch: prod):6)- Swagger UI เปิดที่
`${BASE_PATH}docs`(chat-center-api/src/main.ts (branch: prod):45) — ไม่มีการปิดด้วย env flag ใน production - WebSocket path:
/chat-center-ws(chat-center-api/src/modules/chat/chat.gateway.ts (branch: prod):23) — อยู่นอก global HTTP prefix
รวมกันแล้ว service นี้ถูกเข้าถึงจากภายนอกผ่าน https://vtrcapi.redcross.or.th/chat-center-api/api/v1/* (pattern nginx path-based routing ของแพลตฟอร์ม)
Database topology
chat-center-api ใช้ 3 data stores พร้อมกัน:
| Connection / store | env | database | ใช้ทำอะไร |
|---|---|---|---|
TypeORM main | DB_* | 2way (MSSQL) | schema หลักของ chat — chatRoom, teamAdmin, tags, appointment, notifications, satisfactionSurvey |
TypeORM center | DB_HRMI_* | dbHRMI_Center (MSSQL) | อ่านโปรไฟล์พนักงานจาก temp_pee_na_table / vw_EmployeeProfileWithImage แบบ cross-database — ไม่ผ่าน API กลาง |
| Mongoose (default) | MONGODB | chatDB | ประวัติข้อความ (Conversation) และโน้ตภายใน (ChatNote) |
หลักฐาน — chat-center-api/src/app.module.ts (branch: prod):33-55, chat-center-api/config/configuration.ts (branch: prod):7-38
main ตั้ง synchronize: true (chat-center-api/config/configuration.ts (branch: prod):14) — TypeORM auto-alter schema ทุกครั้งที่ boot (ดู CORR-CHAT-02 ใน 04 Scorecard)
Deploy artifact
Dockerfile(branch: prod) — single-stage บนnode:18-alpine:ADD . .→yarn→yarn build→CMD yarn start:prod(chat-center-api/Dockerfile (branch: prod):1-13)- ไม่มี
EXPOSEใน Dockerfile - ไม่มี
docker-compose.ymlใน repo (ต่างจากjob-scheduler-api/vtrc-common) — วิธี orchestrate จริงใน production UNVERIFIED จากในโค้ดของ repo นี้ (ดู OBS-CHAT-01) .env/.env.prod/.env.uatถูก commit เข้า git พร้อม credential จริง — ดู SEC-CHAT-04
สิ่งที่ควรรู้ก่อนอ่านบทถัดไป
- มี 2 pipeline แยกกัน — HTTP/REST (ผ่าน Express + JWT guard) และ WebSocket (Socket.IO, ไม่ผ่าน JWT guard) — ดู 02 Core pipeline
- LINE webhook จริงเข้าที่
POST /webhook(@Public()) ในAppController— ไม่ใช่ผ่าน WebSocket โดยตรง แต่ webhook จะเรียกChatGateway.handleMessage()ต่อ (chat-center-api/src/app.service.ts (branch: prod):91-95) - การกรองสิทธิ์เห็นห้องแชท (super admin
level === 1เห็นทุกห้อง / staff อื่นเห็นตาม tag) ทำใน business logic ของ service — ไม่มี role decorator ระดับ HTTP แบบ@auth(accessRole:...)ของvtrc-api - ไฟล์
src/app.service.ts_bkเป็น backup เก่า — ตาม workspace rule ห้ามแก้/ลบโดยไม่ตรวจสอบก่อน
สารบัญ
| บท | หัวข้อ |
|---|---|
| 01 | Repository map — โครงสร้างไฟล์, module, endpoint |
| 02 | Core pipeline — HTTP, Socket.IO, LINE webhook, cron |
| 03 | Persistence & integrations — entities, Mongo schemas, LINE API |
| 04 | Scorecard + debt register (SQL injection, webhook, secrets) |