2way-api
2way-api (branch: prod) เป็นบริการ NestJS ที่รองรับฟีเจอร์ "สื่อสารสองทาง" ระหว่างฝ่าย HR/แอดมิน กับพนักงาน — ประกาศ (announcements), แบบสำรวจ (surveys), ข้อเสนอแนะ/เรื่องร้องเรียน (complaints), ทำเนียบพนักงาน (employee directory proxy), และ push notification ผ่าน LINE
ชื่อ package ในไฟล์ package.json คือ vtrc-restfull-v2 (2way-api/package.json:2) — ไม่ตรงกับชื่อ repo ปัจจุบัน เป็นร่องรอยว่า repo นี้ถูก scaffold มาจากโปรเจกต์ตั้งต้นเดียวกับ 2way-batch และ 2way-line-service (ทั้งสาม repo มี package.json:2 เป็นชื่อเดียวกัน)
Stack
| ส่วน | เทคโนโลยี | เวอร์ชัน | อ้างอิง |
|---|---|---|---|
| Framework | NestJS | ^9.0.0 (@nestjs/core) | 2way-api/package.json:34 |
| ภาษา | TypeScript | ^4.7.4 | 2way-api/package.json:79 |
| ORM | TypeORM | ^0.3.11 | 2way-api/package.json:54 |
| Database | MSSQL (mssql driver) | 9.1.1 | 2way-api/package.json:47 |
| Auth | Passport JWT (passport-jwt) | ^4.0.0 | 2way-api/package.json:49 |
| HTTP client | axios (ตรงและผ่าน @nestjs/axios) | ^1.2.5 | 2way-api/package.json:42 |
| Docs | @nestjs/swagger | ^6.1.3 | 2way-api/package.json:38 |
| Cron | @nestjs/schedule | ^2.2.0 | 2way-api/package.json:37 |
| Package manager | yarn (yarn.lock มีอยู่ แต่ workspace convention คือ npm — ดู scorecard) | — | 2way-api/yarn.lock |
Node engine ที่ประกาศไว้คือ >=18.0.0 (2way-api/package.json:27) แต่ Dockerfile.prod build stage ใช้ node:16-alpine ก่อนแล้วค่อยรัน production บน node:18-alpine (2way-api/Dockerfile.prod:1,15) — ดู debt QUAL-2WAYAPI-04
Entrypoint และพอร์ต
Boot เริ่มที่ src/main.ts — สร้าง NestExpressApplication, ตั้ง global prefix เป็น ${BASE_PATH}api/v1, serve static ใน /uploads เป็น URL prefix /2way-api/, ติด global filter/guard/pipe แล้ว mount Swagger ที่ ${BASE_PATH}docs (2way-api/src/main.ts:16-42)
พอร์ตอ่านจาก ConfigService.get('port') (default 3000 ถ้าไม่ตั้ง env, 2way-api/src/main.ts:22) แต่ค่าที่ทีมตั้งจริงใน .env.example คือ 8200 (2way-api/.env.example:5) — ห้ามเขียนว่า "2way-api ฟัง port 3000" แบบไม่มีเงื่อนไข
BASE_PATH ใน .env.example คือ 2way-api/ (2way-api/.env.example:3) จึงได้ full prefix เป็น 2way-api/api/v1/* และ Swagger ที่ 2way-api/docs — ตรงกับที่ frontend 2way-meeting-backoffice ตั้ง APP_CONNECT_API=https://vtrcapi.redcross.or.th/2way-api ใน production (2way-meeting-backoffice/.env.production:6) ยืนยัน route prefix ตรงกัน
Deploy
มี 3 Dockerfile แยกตาม environment: Dockerfile, Dockerfile.prod, Dockerfile.uat (multi-stage build, develop stage บน node:16-alpine แล้ว copy dist/ ไป production stage บน node:18-alpine, 2way-api/Dockerfile.prod:1-27) — CI ใช้ Bitbucket Pipelines (2way-api/bitbucket-pipelines.yml) ไม่ใช่ GitHub Actions
docker-compose.yml และ docker-compose.cloud.yml มีทั้งคู่ ให้ดูไฟล์จริงก่อนสรุปว่า deploy ผ่าน compose ตัวไหนในแต่ละ environment — เอกสารนี้ไม่ยืนยัน mapping port ของ compose เพราะไม่มีหลักฐาน runtime
สารบัญ
| บท | หัวข้อ |
|---|---|
| 01 | Repository map — โครงสร้างโฟลเดอร์ modules/entities/crontab |
| 02 | Core request pipeline — ตัวอย่าง trace เต็มจาก controller ถึง DB |
| 03 | Persistence & integrations — entities, LINE, SSO, centralize-api, vtrc-api, cu-central-api |
| 04 | Scorecard — auth bypass ทั้งระบบ, backdoor login, SQL injection |
ดูภาพรวมกลุ่ม 2way Platform ทั้งหมดที่ Volume 5 index.