Skip to content

11.1 · API topology

บทนี้วาดภาพรวมว่าระบบ VTRC มี API services กี่ตัว, แต่ละตัวใช้ transport อะไร, ใครเรียกใคร, และควรเลือกใช้ตัวไหนเมื่อไร


ภาพรวม — 3 services

                                  ┌─────────────────────────────┐
                                  │  vtrc-web / vtrc-rc-backoffice │
                                  │  (frontend — ทุก layer)        │
                                  └─────────────────────────────┘

                                                │ HTTPS
                                                │ GraphQL + REST

                                  ┌─────────────────────────────┐
                                  │  vtrc-api                    │
                                  │  port 8081                   │
                                  │  - GraphQL /api/graphql       │
                                  │  - REST (file, PDF, upload)   │
                                  │  - 265 GraphQL ops            │
                                  │  - 30 REST endpoints          │
                                  └─────────────────────────────┘

                                                │ GraphQL via
                                                │ END_POINT_CENTRALIZE
                                                │ (CLIENT_TARGET ตัวอย่าง :8082;
                                                │  CODE_DEFAULT APP_PORT=8080)

                                  ┌─────────────────────────────┐
                                  │  cu-central-api              │
                                  │  APP_PORT default 8080       │
                                  │  - GraphQL /api/graphql       │
                                  │  - REST /auth/* (signin, ...) │
                                  │  - 83 GraphQL ops             │
                                  │  - 5 REST endpoints           │
                                  │  - SourceDB sharding          │
                                  └─────────────────────────────┘

  ┌─────────────────────────────┐
  │  centralize-api (NestJS)    │   ← caller ไม่ยืนยันใน workspace
  │  port 3000                  │      (อาจถูกเรียกจาก vtrc-api
  │  - REST /api/*              │       ผ่าน env อื่น หรือ
  │  - 17 endpoints             │       ถูกเรียกโดย service อื่น
  │  - Swagger /docs            │       นอก workspace นี้)
  └─────────────────────────────┘

1. vtrc-api — service หลัก

ข้อมูลพื้นฐาน

ด้านค่า
ภาษาJavaScript (ESM, Node.js)
FrameworkApollo Server 2 + Express
Port8081 (default APP_PORT)
GraphQL path (prod)/api/graphql
GraphQL path (UAT)/api-uat/graphql
REST pathใต้ root / (env API_PREFIX_PATH)
DBMariaDB (2 schemas: vtrc + vtrc-centralize)
ORMSequelize
API docsไม่มี (ไม่มี Swagger สำหรับ GraphQL)

หน้าที่

  • เป็น service เดียว ที่ frontend ทั้งคู่ (vtrc-web, vtrc-rc-backoffice) คุยด้วยตรง ๆ
  • รับ request จากผู้ใช้ทุกประเภท (พนักงาน, HR, admin)
  • ส่วนใหญ่ forward ไป cu-central-api สำหรับข้อมูล HR master

Entry point

1:121:index.js
import express from 'express'
import routes from './routes'
// ...
const server = new ApolloServer({
  typeDefs,
  resolvers,
  schemaDirectives: { auth },
  context: async ({ req }) => { /* ... */ },
  formatError: graphqlFormatError,
})
server.applyMiddleware({ app, path: API_SERVICE_PATH })  // /api/graphql

ดูรายละเอียดใน Volume 3 บท 3.1


2. cu-central-api — service ที่ vtrc-api เรียก

ข้อมูลพื้นฐาน

ด้านค่า
ภาษาJavaScript (ESM, Node.js 12)
FrameworkApollo Server 2 + Express
PortCODE_DEFAULT APP_PORT=8080 (CLIENT_TARGET ใน vtrc .env.example อาจเป็น 8082; compose มัก 8000; EXPOSE 9000 ≠ listen)
GraphQL path/api/graphql
REST path/auth/* (signin, signout, token, signinbypass)
DBMSSQL (5 connections, แต่ละ connection เป็น schema ต่างกัน)
ORMSequelize (dialect tedious)
Auth เสริมLDAP/Active Directory (ldapjs)
CacheRedis (session + short-lived)
API docsไม่มี

หน้าที่

  • เป็น legacy CU auth/HR service ที่ vtrc-api forward ไปผ่าน END_POINT_CENTRALIZE
  • จัดการ authentication (LDAP bind, JWT issue, session)
  • ให้ข้อมูล HR master (พนักงาน, ตำแหน่ง, สาขา, payroll, leave balance) จาก HRMI MSSQL
  • มี SourceDB sharding — แยกข้อมูลตามหน่วยงาน (โรงพยาบาลจุฬา, สภากาชาดฯ, ...)

ทำไม frontend ไม่คุยตรง

  • เพราะ vtrc-api เป็น gateway ที่แปลงข้อมูล, เพิ่ม business logic, และคุม auth ของระบบ VTRC
  • frontend ไม่รู้จัก cu-central-api และไม่รู้ SourceDB ของผู้ใช้

ดูรายละเอียดใน Volume 4


3. centralize-api — NestJS facade

ข้อมูลพื่นฐาน

ด้านค่า
ภาษาTypeScript
FrameworkNestJS 9
Port3000 (default PORT)
Global prefixapi → ทุก path เริ่มด้วย /api/
REST path/api/* (17 endpoints)
GraphQLไม่มี
DBMSSQL (2 connections: center + nbc)
ORMTypeORM 0.3
Validationclass-validator + class-transformer
API docsSwagger/OpenAPI ที่ /docs

หน้าที่

  • เป็น read-mostly facade สำหรับ HRMI MSSQL
  • ให้ข้อมูล employee, organization, position, payroll — คล้าย cu-central-api แต่เป็น NestJS
  • ใช้ raw SQL เกือบทั้งหมด ไม่ได้ใช้ ORM feature เต็มที่

Caller ไม่ยืนยัน

  • ใน workspace นี้ ไม่พบหลักฐาน ว่าใครเรียก centralize-api
  • END_POINT_CENTRALIZE ใน vtrc-api ชี้ไป cu-central-api (CLIENT_TARGET ตัวอย่าง 8082; CODE_DEFAULT 8080) ไม่ใช่ centralize-api (port 3000)
  • ทีมงานระบุว่าอาจถูกเรียกผ่าน env NEW_CENTRAIL_API หรือ CENTRALIZE_SERVER ใน benefit-api — แต่ repo เหล่านั้นไม่อยู่ใน workspace

ดูรายละเอียดใน Volume 5


Transport comparison — GraphQL vs REST

ด้านGraphQLREST
vtrc-apiใช้ (265 ops)ใช้ (30 endpoints — file, PDF, export)
cu-central-apiใช้ (83 ops)ใช้ (5 endpoints — auth เท่านั้น)
centralize-apiไม่มีใช้ (17 endpoints)

ทำมีทั้งคู่

  • GraphQL ใช้สำหรับ query/mutation ทั่วไป — ยืดหยุ่น, frontend เลือก field
  • REST ใช้สำหรับ binary data (file, PDF, Excel) ที่ GraphQL ไม่เหมาะ

เลือกใช้ตัวไหนเมื่อไร

ต้องการใช้
ดึง/แก้ข้อมูลทั่วไปGraphQL
ดาวน์โหลด PDF (payslip, tax)REST
อัปโหลดไฟล์GraphQL Upload scalar หรือ REST multer
Export Excel/ZIPREST
ดึงรายงานสรุปREST
Authentication (login, refresh)cu-central-api REST /auth/*

Endpoint count ต่อ service

vtrc-api       GraphQL 265 ops   REST 30 endpoints   รวม 295
cu-central-api GraphQL  83 ops   REST  5 endpoints   รวม  88
centralize-api                       REST 17 endpoints  รวม  17
                                                    ระบบรวม 400 API surface

Path convention

vtrc-api

EnvironmentGraphQLREST
Productionhttps://vtrcapi.redcross.or.th/api/graphqlhttps://vtrcapi.redcross.or.th/<path>
UAThttps://uat-vtrcapi.redcross.or.th/api-uat/graphqlhttps://uat-vtrcapi.redcross.or.th/<path>

API_PREFIX_PATH env กำหนด prefix ของ REST — ค่า default คือ string ว่าง (prod) ทำให้ path เป็น /file/:id, /upload, ...

cu-central-api

EnvironmentGraphQLREST
(CLIENT_TARGET ตัวอย่างใน vtrc .env.example)http://localhost:8082/api/graphqlhttp://localhost:8082/auth/signin
(CODE_DEFAULT APP_PORT=8080)http://localhost:8080/api/graphqlhttp://localhost:8080/auth/signin

cu-central-api ไม่เปิดสู่ internet โดยตรง — เรียกผ่าน vtrc-api เท่านั้น (compose มัก map 8000; Dockerfile EXPOSE 9000 ≠ listen)

centralize-api

EnvironmentRESTDocs
Productionhttp://10.188.128.160:3000/api/*http://10.188.128.160:3000/docs
Localhttp://localhost:3000/api/*http://localhost:3000/docs

centralize-api อยู่ใน intranet (LAN) เท่านั้น


ใครเรียกใคร — call graph

vtrc-web ─────┐
              ├─► vtrc-api ──► cu-central-api (GraphQL + REST auth)
vtrc-rc-      │                  │
backoffice ───┘                  ├─► LDAP/AD (auth)
                                 ├─► MSSQL shards (HRMI data)
                                 ├─► Redis (session)
                                 ├─► SSO HTTP API
                                 ├─► HRMI HTTP API (external REST)
                                 ├─► SMTP/SMS gateway
                                 └─► Conicle SFTP

centralize-api ─► MSSQL (center + nbc)
                 (caller ภายนอก workspace)

สำคัญ

  • frontend ทั้งคู่คุย vtrc-api อย่างเดียว — ไม่มีการเรียก cu-central-api หรือ centralize-api โดยตรง
  • vtrc-api → cu-central-api เป็นการ forward ที่ซับซ้อน (retry, refresh token) — ดู บท 10.9
  • centralize-api เป็นเกาะ ใน workspace นี้ — caller ยังไม่ยืนยัน

Port summary

ServicePortTransportเปิดสู่ internet?
vtrc-api8081HTTPSใช่ (ผ่าน reverse proxy)
cu-central-apiCODE_DEFAULT 8080 (CLIENT_TARGET ตัวอย่าง 8082; compose มัก 8000)HTTP (internal)ไม่ (เรียกจาก vtrc-api เท่านั้น)
centralize-api3000HTTP (intranet)ไม่ (เฉพาะ LAN)

Tech stack comparison

ด้านvtrc-apicu-central-apicentralize-api
ภาษาJS (ESM)JS (ESM)TypeScript
FrameworkApollo 2 + ExpressApollo 2 + ExpressNestJS 9
Node14+1216+
ORMSequelizeSequelizeTypeORM
DBMariaDBMSSQLMSSQL
CacheRedis (optional)Redisไม่มี
AuthJWT (HS256) + apiKeyJWT (HS256) + apiKey + LDAPJWT guard (bypassed)
ValidationGraphQL schemaGraphQL schemaclass-validator
Docsไม่มีไม่มีSwagger
Testไม่มีไม่มีไม่มี (มี config แต่ไม่มี spec)

ขั้นตอนถัดไป

ไป บท 10.2 Auth & headers reference