Skip to content

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

ส่วนค่าหลักฐาน
FrameworkNestJS 9 (@nestjs/core ^9.0.0)chat-center-api/package.json (branch: prod):27-29
ภาษาTypeScript ^4.7.4, decorator-basedchat-center-api/package.json (branch: prod):78
ORM (SQL)TypeORM ^0.3.10 บน MSSQL — named connections main และ centerchat-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-wschat-center-api/src/modules/chat/chat.gateway.ts (branch: prod):19-26
Cron (Nest)@nestjs/schedule ^3.0.0chat-center-api/package.json (branch: prod):34
Cron (in-memory)cron ^2.0.1 — ใช้ใน appointment reminderchat-center-api/package.json (branch: prod):40, chat-center-api/src/modules/appointment/appointment.service.ts (branch: prod):7,37
AuthPassport JWT (passport-jwt ^4.0.0) ผ่าน global JwtAuthGuardchat-center-api/libs/jwt/jwt-auth.guard.ts (branch: prod):6, chat-center-api/src/main.ts (branch: prod):34
HTTP clientaxios ^1.3.4 — ยิง LINE Messaging APIchat-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 manageryarn (Dockerfile รัน yarn)chat-center-api/Dockerfile (branch: prod):9

Entry point และพอร์ต

  • Entry point: chat-center-api/src/main.ts (branch: prod):15bootstrap() สร้าง NestExpressApplication, ตั้ง global prefix เป็น `${BASE_PATH}api/v1`, เปิด static assets ที่ /chat-center-api/ สำหรับไฟล์ใน uploads/, ผูก JwtAuthGuard เป็น global guard, และผูก Socket.IO adapter (IoAdapter)
  • พอร์ต runtime อ่านจาก ConfigService.get('port') fallback 3000 (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 / storeenvdatabaseใช้ทำอะไร
TypeORM mainDB_*2way (MSSQL)schema หลักของ chat — chatRoom, teamAdmin, tags, appointment, notifications, satisfactionSurvey
TypeORM centerDB_HRMI_*dbHRMI_Center (MSSQL)อ่านโปรไฟล์พนักงานจาก temp_pee_na_table / vw_EmployeeProfileWithImage แบบ cross-database — ไม่ผ่าน API กลาง
Mongoose (default)MONGODBchatDBประวัติข้อความ (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 . .yarnyarn buildCMD 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

สิ่งที่ควรรู้ก่อนอ่านบทถัดไป

  1. มี 2 pipeline แยกกัน — HTTP/REST (ผ่าน Express + JWT guard) และ WebSocket (Socket.IO, ไม่ผ่าน JWT guard) — ดู 02 Core pipeline
  2. LINE webhook จริงเข้าที่ POST /webhook (@Public()) ใน AppController — ไม่ใช่ผ่าน WebSocket โดยตรง แต่ webhook จะเรียก ChatGateway.handleMessage() ต่อ (chat-center-api/src/app.service.ts (branch: prod):91-95)
  3. การกรองสิทธิ์เห็นห้องแชท (super admin level === 1 เห็นทุกห้อง / staff อื่นเห็นตาม tag) ทำใน business logic ของ service — ไม่มี role decorator ระดับ HTTP แบบ @auth(accessRole:...) ของ vtrc-api
  4. ไฟล์ src/app.service.ts_bk เป็น backup เก่า — ตาม workspace rule ห้ามแก้/ลบโดยไม่ตรวจสอบก่อน

สารบัญ

บทหัวข้อ
01Repository map — โครงสร้างไฟล์, module, endpoint
02Core pipeline — HTTP, Socket.IO, LINE webhook, cron
03Persistence & integrations — entities, Mongo schemas, LINE API
04Scorecard + debt register (SQL injection, webhook, secrets)