Skip to content

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

ส่วนเทคโนโลยีเวอร์ชันอ้างอิง
FrameworkExpress.js^4.16.32way-vtrc-api/package.json:29
ภาษาTypeScript รันผ่าน ts-node ตรง (ไม่มี compile step)^4.5.4package.json:71, script start: ts-node app.ts (package.json:7)
ORM (SQL)Sequelize^5.21.2package.json:48
SQL drivertedious (MSSQL) ^14.5.0; มี mysql/mysql2 ค้างใน dependencies ด้วยpackage.json:51,40,41runtime ใช้ MSSQL ผ่าน util/db.config.ts + util/env.ts (dialect: 'mssql')
ODM (NoSQL)Mongoose^5.8.2package.json:39 — chat feature (chatDB); connection ถูก comment ปิดใน entrypoint
AuthPassport JWT ^4.0.0, jsonwebtoken ^8.5.1, custom bypass middlewarepackage.json:45,34
Realtimesocket.io ^4.5.1package.json:50
LINE@line/bot-sdk ^7.5.0package.json:17
Error tracking@sentry/node + @sentry/tracing ^6.16.1package.json:18-19DSN hardcode ใน app.ts
API docsswagger-jsdoc + swagger-ui-expresspackage.json:66-67title ยังเป็น "JSONPlaceholder" (app.ts:20-42)
Validationexpress-validator ^6.14.1package.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.tsconst port = 8001app.ts:8
docker-compose.yml8001:8001docker-compose.yml:11-12
Dockerfile EXPOSE3000Dockerfile: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


จุดสำคัญที่ต้องรู้ก่อนอ่านบทถัดไป

  1. Master bypass tokencheckBypassTokenMiddleWare และ checkBypassTokenLineMiddleWare ยอมรับ string literal "testnaja" เป็น master key (middleware/checkbypasstoken.ts:24, middleware/checkByPassTokenLine.ts:30)
  2. Unauthenticated PIIPOST /2way/getProfile และ POST /2way/getProfile/cu ไม่มี middleware ป้องกัน (auth ที่เคยมีถูก comment ปิด)
  3. Mock routers ยัง mount/2way/TwoWayAPI และ /2way/MeetingAPI ตอบข้อมูลปลอมสไตล์ JSONPlaceholder
  4. Credential ในซอร์ส — MSSQL ใน util/env.ts, MongoDB ใน util/mongo.config.ts, SSO ใน routes/TwoWayAPI/sso/loginSSO.ts
  5. Mongo connection ปิดrequire('./util/mongo.config.ts') ถูก comment ที่ app.ts:10 แต่ socket.io chat ยัง bind อยู่

สารบัญ

บทหัวข้อ
01Repository map — โครงสร้างโฟลเดอร์, route catalog, models, mock surface
02Core pipeline — boot sequence, auth middleware, traces createIncident / getProfile / SSO / webhook
03Persistence & integrations — MSSQL, MongoDB, cu-central-api, LINE, SSO, Sentry
04Scorecard — bypass token, unauth PII, hardcoded secrets, orphan writes

ดูภาพรวมกลุ่ม 2way Platform ที่ Volume 5 index.