Skip to content

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-backofficeredirect แลก token + ตั้งค่า Approver / UserGroupGET /meeting/redirectbypass (app.ts:212-213), /meeting/secure/approver, /meeting/secure/group
cron / manual triggerส่งอีเมล + push ตาม ScheduleJobcorn-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, .envprod DIALECT = mssql)

รายละเอียดเต็มอยู่ที่ 7.1.3 Persistence & integrations

Stack และเวอร์ชัน

ส่วนค่าหลักฐาน
ภาษา/runtimeTypeScript บน Node.js, รันด้วย ts-node (dev)package.json:7-8
Web frameworkExpress ^4.16.3package.json:29
ORMSequelize ^6.3.5package.json:55
Database จริงMSSQL ผ่าน mssql / tediouspackage.json:43,57, .envprod DIALECT = mssql
MongoDB (ประกาศไว้แต่ไม่ใช้งาน)mongoose ^5.8.2package.json:42, util/mongo.config.ts:1-14
Auth / JWTjsonwebtoken, passport, passport-jwtpackage.json:36-37,49-50
PDFhtml-pdf-node, puppeteer, pdf-merger-js, ejspackage.json:28,34,52-53
Emailnodemailer, ical-generatorpackage.json:35,47
Cronnode-cronpackage.json:46
Error tracking@sentry/node + @sentry/tracingpackage.json:18-19, app.ts:79-89
Testjest + ts-jestpackage.json:70,74
Container basenode:16.19.0-alpine + ChromiumDockerfile: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.tspackage.json:7
  • Listen port: 8000 (hardcoded) — app.ts:6,232-234
  • Route prefix ทั้งหมดขึ้นต้นด้วย /meeting/... — คงชื่อ path สำหรับ reverse proxy ร่วมกับระบบเดิม — app.ts:147-231
  • Swagger UI: /docsapp.ts:78 (definition ยังอ้าง JSONPlaceholder เป็น placeholder — app.ts:50-71)

Deploy artifact

  • Dockerfile มีอยู่จริง ที่ root (Dockerfile:1-28) — แก้ความเข้าใจเดิมที่ว่าไม่มี
    • COPY ".env${ENV}" .env (Dockerfile:24) — CI ต้องส่ง build-arg ENV=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 — service meetingservice, port 8000: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

ธีมสำคัญของชุดเอกสารนี้

  1. Sequelize models — 14 ตารางจาก 4 ไฟล์ model (ดู 7.1.3)
  2. ทุก REST route — inventory ครบใน 7.1.1 + flow หลักใน 7.1.2
  3. Push notification bridgesendNoti → mutation sendNotificationFrom3Party บน vtrc-api (ไม่ยิง FCM เอง)
  4. Mock endpoint leakGET /meeting/mockuser/one คืน PII จริงโดยไม่มี auth

Auth reality check (อ่านก่อนทำงานกับ route)

Global middleware ที่ควรครอบ /meeting/secure/* ถูก comment ออกทั้งก้อน ที่ app.ts:104-120 — คำว่า secure ใน path จึงไม่ใช่สัญญาว่ามี auth

Middleware ที่ยังถูก mount จริงมีน้อยมาก:

PathMiddlewareหลักฐาน
GET /meeting/redirectbypasscheckBypassWhenRedirectMiddleWare + checkApiKeyMiddleWareroutes/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.1Repository mapโฟลเดอร์, boot, inventory ทุก route, auth surface
7.1.2Core pipelineสร้าง/cron email/อนุมัติ/delegate + push bridge
7.1.3Persistence & integrationsSequelize models ทุกตาราง + outbound clients
7.1.4ScorecardSEC/CORR/QUAL/OBS debt register

สิ่งที่เอกสารชุดนี้ไม่ครอบคลุม

  • Schema DDL จริงบน MSSQL (ไม่มี migration ใน repo — UNVERIFIED)
  • พฤติกรรม reverse proxy / TLS termination หน้า service
  • โค้ดฝั่ง meeting-backoffice ยกเว้นจุดที่เรียก redirectbypass (ดู Vol 7.2)