2way-vtrc-api
2way-vtrc-api (branch: prod, ~158 tracked files) เป็นบริการ Express.js + TypeScript (ts-node) + Sequelize + MSSQL ที่รองรับฟีเจอร์ 2way ฝั่งพนักงานเกือบทั้งหมด — ประกาศ, แบบสำรวจ, ร้องเรียน/feedback, แจ้งปัญหา (incident), FAQ/auto-reply, ลงทะเบียน LINE (RC + CU), SSO สำหรับ non-employee, และ LINE webhook
จากการตรวจสอบ 2way-meeting-backoffice พบว่า นี่คือ backend หลักที่หน้าจอฝั่งพนักงาน (LIFF) เรียกใช้จริงในปัจจุบัน ไม่ใช่ 2way-api (NestJS) — 2way-api ถูกออกแบบเป็นคู่ขนาน/รุ่นใหม่ แต่ consumer ฝั่ง LIFF ยังชี้มาที่ repo นี้
ชื่อ package ใน package.json คือ "express" เวอร์ชัน 1.0.0 (2way-vtrc-api/package.json:2-3) — boilerplate ที่ไม่เคยถูกเปลี่ยนชื่อให้ตรงกับ repo ตั้งแต่ scaffold
Stack
| ส่วน | เทคโนโลยี | เวอร์ชัน | อ้างอิง |
|---|---|---|---|
| Framework | Express.js | ^4.16.3 | 2way-vtrc-api/package.json:29 |
| ภาษา | TypeScript รันผ่าน ts-node ตรง (ไม่มี compile step) | ^4.5.4 | package.json:71, script start: ts-node app.ts (package.json:7) |
| ORM (SQL) | Sequelize | ^5.21.2 | package.json:48 |
| SQL driver | tedious (MSSQL) ^14.5.0; มี mysql/mysql2 ค้างใน dependencies ด้วย | package.json:51,40,41 | runtime ใช้ MSSQL ผ่าน util/db.config.ts + util/env.ts (dialect: 'mssql') |
| ODM (NoSQL) | Mongoose | ^5.8.2 | package.json:39 — chat feature (chatDB); connection ถูก comment ปิดใน entrypoint |
| Auth | Passport JWT ^4.0.0, jsonwebtoken ^8.5.1, custom bypass middleware | package.json:45,34 | |
| Realtime | socket.io ^4.5.1 | package.json:50 | |
| LINE | @line/bot-sdk ^7.5.0 | package.json:17 | |
| Error tracking | @sentry/node + @sentry/tracing ^6.16.1 | package.json:18-19 | DSN hardcode ใน app.ts |
| API docs | swagger-jsdoc + swagger-ui-express | package.json:66-67 | title ยังเป็น "JSONPlaceholder" (app.ts:20-42) |
| Validation | express-validator ^6.14.1 | package.json:30 | ใช้เฉพาะบาง route (เช่น create/update incident) |
Entrypoint / พอร์ต
app.ts เป็น entrypoint เดียว รันด้วย ts-node app.ts (package.json:7) ฟังที่ port 8001 hardcode ในโค้ด (2way-vtrc-api/app.ts:8,267) — ไม่ได้อ่านจาก env
ความไม่สอดคล้องเรื่องพอร์ต:
| แหล่ง | ค่า | อ้างอิง |
|---|---|---|
app.ts | const port = 8001 | app.ts:8 |
docker-compose.yml | 8001:8001 | docker-compose.yml:11-12 |
Dockerfile EXPOSE | 3000 | Dockerfile:13 — ไม่ตรงกับ listen จริง |
Swagger server URL ก็ชี้ http://localhost:8001/ (app.ts:36-40)
Deploy
Dockerfile เดียว ใช้ node:18-alpine3.15, ติดตั้งด้วย yarn install, รัน yarn start (2way-vtrc-api/Dockerfile:1-16) — ไม่มี multi-stage build (รัน ts-node ใน container ตรง)
docker-compose.yml ตั้งชื่อ container 2way-vtrc-api-uat, mount volume /home/hrappladmin/storage/2way → /usr/src/express/storage/2way, ต่อ network vtrc-api_default แบบ external (docker-compose.yml:1-18)
มีไฟล์ env หลายชุดใน repo: .env, .env.prod, .env.uat, .envdev — ค่า LINE / JWT / API key อ่านผ่าน dotenv ที่ path .env เท่านั้นตอน boot (app.ts:70-72) ดังนั้นการสลับ environment ต้อง copy/rename ไฟล์ หรือ mount ทับ .env
จุดสำคัญที่ต้องรู้ก่อนอ่านบทถัดไป
- Master bypass token —
checkBypassTokenMiddleWareและcheckBypassTokenLineMiddleWareยอมรับ string literal"testnaja"เป็น master key (middleware/checkbypasstoken.ts:24,middleware/checkByPassTokenLine.ts:30) - Unauthenticated PII —
POST /2way/getProfileและPOST /2way/getProfile/cuไม่มี middleware ป้องกัน (auth ที่เคยมีถูก comment ปิด) - Mock routers ยัง mount —
/2way/TwoWayAPIและ/2way/MeetingAPIตอบข้อมูลปลอมสไตล์ JSONPlaceholder - Credential ในซอร์ส — MSSQL ใน
util/env.ts, MongoDB ในutil/mongo.config.ts, SSO ในroutes/TwoWayAPI/sso/loginSSO.ts - Mongo connection ปิด —
require('./util/mongo.config.ts')ถูก comment ที่app.ts:10แต่ socket.io chat ยัง bind อยู่
สารบัญ
| บท | หัวข้อ |
|---|---|
| 01 | Repository map — โครงสร้างโฟลเดอร์, route catalog, models, mock surface |
| 02 | Core pipeline — boot sequence, auth middleware, traces createIncident / getProfile / SSO / webhook |
| 03 | Persistence & integrations — MSSQL, MongoDB, cu-central-api, LINE, SSO, Sentry |
| 04 | Scorecard — bypass token, unauth PII, hardcoded secrets, orphan writes |
ดูภาพรวมกลุ่ม 2way Platform ที่ Volume 5 index.