7.1 · meeting-vtrc-api — ภาพรวม (V1 depth)
ทุก path ในเอกสารนี้ถือว่าอยู่บน branch
prod-meeting-vtrc-apiของmeeting-vtrc-api(ยืนยันด้วยgit branch --show-current=prod-meeting-vtrc-api,git ls-files= 180 tracked files)
meeting-vtrc-api เป็น Express + TypeScript REST API สำหรับระบบจองและบริหารการประชุมของ VTRC — สร้างการประชุม, เชิญผู้เข้าร่วม (ภายใน/ภายนอก), ขออนุมัติ, มอบหมายตัวแทน (delegate), สร้าง PDF หนังสือเชิญ/ลายเซ็น, ส่งอีเมลพร้อม iCalendar, และส่ง push notification โดยฝากผ่าน mutation ของ legacy vtrc-api
จุดประสงค์ของ service
| ผู้เรียก | บทบาท | หลักฐาน |
|---|---|---|
| พนักงาน / แอปประชุม (token จาก vtrc-api) | สร้าง/ตอบรับ/ดูรายการประชุม | route ใต้ /meeting/secure/* ใน app.ts:148-231 |
meeting-backoffice | redirect แลก token + ตั้งค่า Approver / UserGroup | GET /meeting/redirectbypass (app.ts:212-213), /meeting/secure/approver, /meeting/secure/group |
| cron / manual trigger | ส่งอีเมล + push ตาม ScheduleJob | corn-job/email.corn.ts, GET /meeting/secure/corn-email |
ข้อพึงระวัง — ชื่อ stack ในเอกสารเดิมไม่ตรงกับโค้ดจริง
เอกสารอ้างอิงเดิมระบุว่า service นี้เป็น "Express + Mongoose" แต่จากการตรวจโค้ดจริง ไม่พบการเชื่อมต่อ MongoDB ที่ทำงานอยู่
mongooseเป็น dependency ในpackage.json:42และถูกrequire()ที่app.ts:8- เนื้อไฟล์
util/mongo.config.ts:1-14ถูก comment ทั้งหมด — ไม่มีmongoose.connect() - persistence จริงคือ Sequelize → MSSQL (
util/db.config.ts:1-25,.envprodDIALECT = mssql)
รายละเอียดเต็มอยู่ที่ 7.1.3 Persistence & integrations
Stack และเวอร์ชัน
| ส่วน | ค่า | หลักฐาน |
|---|---|---|
| ภาษา/runtime | TypeScript บน Node.js, รันด้วย ts-node (dev) | package.json:7-8 |
| Web framework | Express ^4.16.3 | package.json:29 |
| ORM | Sequelize ^6.3.5 | package.json:55 |
| Database จริง | MSSQL ผ่าน mssql / tedious | package.json:43,57, .envprod DIALECT = mssql |
| MongoDB (ประกาศไว้แต่ไม่ใช้งาน) | mongoose ^5.8.2 | package.json:42, util/mongo.config.ts:1-14 |
| Auth / JWT | jsonwebtoken, passport, passport-jwt | package.json:36-37,49-50 |
html-pdf-node, puppeteer, pdf-merger-js, ejs | package.json:28,34,52-53 | |
nodemailer, ical-generator | package.json:35,47 | |
| Cron | node-cron | package.json:46 |
| Error tracking | @sentry/node + @sentry/tracing | package.json:18-19, app.ts:79-89 |
| Test | jest + ts-jest | package.json:70,74 |
| Container base | node:16.19.0-alpine + Chromium | Dockerfile:1-8 |
Entry point และพอร์ต
- Entry:
app.ts(root) —package.json:5("main": "app.ts") - Dev start:
env TZ='Asia/Bangkok' NODE_ENV=dev ts-node app.ts—package.json:7 - Listen port: 8000 (hardcoded) —
app.ts:6,232-234 - Route prefix ทั้งหมดขึ้นต้นด้วย
/meeting/...— คงชื่อ path สำหรับ reverse proxy ร่วมกับระบบเดิม —app.ts:147-231 - Swagger UI:
/docs—app.ts:78(definition ยังอ้าง JSONPlaceholder เป็น placeholder —app.ts:50-71)
Deploy artifact
- Dockerfile มีอยู่จริง ที่ root (
Dockerfile:1-28) — แก้ความเข้าใจเดิมที่ว่าไม่มีCOPY ".env${ENV}" .env(Dockerfile:24) — CI ต้องส่ง build-argENV=dev|uat|prod- Chromium + PhantomJS ติดตั้งใน image สำหรับ PDF (
Dockerfile:4-20) CMD [ "npm", "start" ]→NODE_ENV=devเสมอตาม script (package.json:7) — เสี่ยง config drift ใน prod
docker-compose.yml:1-15— servicemeetingservice, port8000:8000, volume/home/hrappladmin/storage/meeting:/app/storage/meeting- Env ที่ commit ใน repo:
.envdev,.envuat,.envprod— ไม่ได้ถูก gitignore (ดู 7.1.4 scorecard)
สถาปัตยกรรมแบบย่อ
Client (web / backoffice / mobile)
│ REST /meeting/...
▼
meeting-vtrc-api :8000 (Express)
│
├── Sequelize ──► MSSQL (Meeting, Guest, ScheduleJob, …)
├── vtrcConnector ──► vtrc-api GraphQL (token verify + push)
├── cdbConnector ──► "TwoWay"/centralize GraphQL (employee lookup)
├── nodemailer ──► smtp-mail.outlook.com:587
└── puppeteer/html-pdf-node ──► PDF ใน containerธีมสำคัญของชุดเอกสารนี้
- Sequelize models — 14 ตารางจาก 4 ไฟล์ model (ดู 7.1.3)
- ทุก REST route — inventory ครบใน 7.1.1 + flow หลักใน 7.1.2
- Push notification bridge —
sendNoti→ mutationsendNotificationFrom3Partyบนvtrc-api(ไม่ยิง FCM เอง) - Mock endpoint leak —
GET /meeting/mockuser/oneคืน PII จริงโดยไม่มี auth
Auth reality check (อ่านก่อนทำงานกับ route)
Global middleware ที่ควรครอบ /meeting/secure/* ถูก comment ออกทั้งก้อน ที่ app.ts:104-120 — คำว่า secure ใน path จึงไม่ใช่สัญญาว่ามี auth
Middleware ที่ยังถูก mount จริงมีน้อยมาก:
| Path | Middleware | หลักฐาน |
|---|---|---|
GET /meeting/redirectbypass | checkBypassWhenRedirectMiddleWare + checkApiKeyMiddleWare | routes/auth/redirectbypass.ts:22 |
เกือบทุก /meeting/secure/* | ไม่มี | app.ts:104-120 commented; route handlers ไม่ใส่ middleware |
GET /meeting/mockuser/one | ไม่มี | app.ts:209-210, routes/mockdelatlast/mockuser.ts:29 |
checkBypassMiddleWare / checkApiKeyMiddleWare จาก middleware/checkbypass.ts ถูก import แต่ไม่ apply ใน createpdfinvitemeeting.ts และ attacment.ts — dead import
สารบัญ
| บท | หัวข้อ | เนื้อหาหลัก |
|---|---|---|
| 7.1.1 | Repository map | โฟลเดอร์, boot, inventory ทุก route, auth surface |
| 7.1.2 | Core pipeline | สร้าง/cron email/อนุมัติ/delegate + push bridge |
| 7.1.3 | Persistence & integrations | Sequelize models ทุกตาราง + outbound clients |
| 7.1.4 | Scorecard | SEC/CORR/QUAL/OBS debt register |
สิ่งที่เอกสารชุดนี้ไม่ครอบคลุม
- Schema DDL จริงบน MSSQL (ไม่มี migration ใน repo — UNVERIFIED)
- พฤติกรรม reverse proxy / TLS termination หน้า service
- โค้ดฝั่ง
meeting-backofficeยกเว้นจุดที่เรียกredirectbypass(ดู Vol 7.2)