2way-meeting-backoffice
2way-meeting-backoffice (branch: prod, 521 tracked files) เป็น Next.js frontend สอง persona ในแอปเดียว:
- Backoffice แอดมิน — path ใต้
/2wayfrontend/2waybackoffice/...ผ่านsrc/features/BackOffice/* - LINE LIFF ฝั่งพนักงาน — path ใต้
/line/...และ/line-cu/...ผ่านsrc/features/2way/*
ชื่อ package จริงคือ reportmonitor เวอร์ชัน 5.0.0 (2way-meeting-backoffice/package.json:2-3) ไม่ตรงกับชื่อ repo — ร่องรอยว่าต่อยอดจากโปรเจกต์ตั้งต้นอื่น (pattern เดียวกับ 2way-api / 2way-batch / 2way-line-service)
ชื่อ "meeting" ใน repo ทำให้เข้าใจผิด — จากโค้ดจริง ไม่มีความเกี่ยวข้องกับ Meeting Platform / meeting-vtrc-api เลย ยืนยันจากรายชื่อ feature folder ทั้งหมดใน src/features/2way/ และ src/features/BackOffice/ (Announce, Survey, Complaint, Incident, Problem, ChatCenter, Question, Feedback, Satisfaction — ไม่มี Meeting) และ next.config.js ตั้ง basePath: "/2way-backoffice" (2way-meeting-backoffice/next.config.js:38-39)
Stack
| ส่วน | เทคโนโลยี | เวอร์ชัน | อ้างอิง |
|---|---|---|---|
| Framework | Next.js (Pages Router) | 12.0.7 | package.json:44 |
| UI | React 17, MUI v5 + Material-UI v4 (ปนกัน) | 17.0.2, 5.2.4, ^4.12.3 | package.json:47,25,23 |
| State | Recoil | ^0.5.2 | package.json:53 |
| i18n | next-i18next (th/en, default th) | ^10.0.1 | package.json:45, next-i18next.config.js:2-6 |
| Realtime | socket.io-client | ^4.5.1 | package.json:56 |
| LINE | @line/liff | ^2.18.2 | package.json:22 |
| Error tracking | @sentry/nextjs | ^6.16.1 | package.json:29 |
| HTTP | axios (wrapper เอง — ไม่ใช้ SWR/React Query) | ^0.24.0 | package.json:34 |
| Package manager | yarn | — | Dockerfile:7 (yarn install --frozen-lockfile) |
Entrypoint / พอร์ต
| Script | คำสั่ง | พอร์ต | อ้างอิง |
|---|---|---|---|
dev | ENV_STAGE=development next dev -p 8002 | 8002 | package.json:7 |
start | next start -p 8002 | 8002 | package.json:9 |
build | next build | — | package.json:8 |
out / export | next build && next export | static export | package.json:9,14 |
| Docker | next start, EXPOSE 8002 | 8002 | Dockerfile:34-37 |
Next.js mount ทั้งแอปใต้ basePath / assetPrefix = /2way-backoffice (next.config.js:38-39) ดังนั้น URL จริงใน browser คือ /2way-backoffice/... ก่อน path ของ Pages Router
Backend ที่เชื่อมจริง (ยืนยันจากโค้ด)
| Backend | env (shell) → process.env.* (client) | ค่า production | หลักฐานฝั่ง client |
|---|---|---|---|
2way-api (NestJS) | APP_CONNECT_API → appConnectAPI | https://vtrcapi.redcross.or.th/2way-api (.env.production:6) | Login POST .../api/v1/auth (Login/components/Form.tsx:99); verifyToken (withAuthVerify.tsx:27); surveys/announces/employee/complaints ผ่าน fetchAPI |
chat-center-api | APP_CONNECT_API_CHAT → appConnectChatCenterAPI และ chatCenterPath | .../chat-center-api/api/v1 (.env.production:7); path สั้น chat-center-api/api/v1 (next.config.js:73) | utils/chatCenterApi.tsx + ChatCenter/index.tsx:88,109,131 |
2way-vtrc-api (Express legacy) | APP_CONNECT_API_BASIC → appConnectChatAPI | https://vtrcapi.redcross.or.th/2way (.env.production:9) | LIFF pages: /getProfile, /verifyUserLine, /getListFAQs ฯลฯ |
| incident-management-api | APP_CONNECT_API_INCIDENT → appConnectIncidentAPI | .../incident-management-api (.env.production:8) | services/line/incidents.tsx; ChatCenter problem list — repo ไม่มีใน workspace → UNVERIFIED |
| WebSocket | APP_WEBSOCKET → appConnectWebSocket | wss://vtrcapi.redcross.or.th (.env.production:11) | io.connect(..., { path: "/chat-center-ws/socket.io" }) (ChatCenter/index.tsx:173-176) |
| RedCross host (chat-center via fetchRedCrossAPI) | APP_PATH → appConnectRedCross | https://vtrcapi.redcross.or.th (.env.production:10) | fetchRedCrossAPI ประกอบ ${appConnectRedCross}/${chatCenterPath}/... (fetchApiWithAxios.tsx:85) |
UAT ใช้ host uat-vtrcapi.redcross.or.th แทน (/.env.uat:6-11)
ข้อค้นพบสำคัญเรื่อง data flow
- ฝั่งพนักงาน (LIFF) พึ่ง
2way-vtrc-api(appConnectChatAPI) เป็นหลัก — ไม่ใช่ NestJS2way-api - ฝั่งแอดมิน ใช้
2way-apiสำหรับ auth / surveys / announces / employee / complaints และใช้chat-center-apiสำหรับ ChatCenter + Satisfaction - env ชื่อ
appConnectChatAPIไม่ได้ ชี้ chat-center — ชี้2way-vtrc-api— ดู 03-persistence-integrations และ 04-scorecard OBS-2WAYMTBO-01
Deploy
- Docker multi-stage (
Dockerfile) —yarn buildแล้ว copy.next+.env.productionเข้า runner image - Bitbucket Pipelines (
bitbucket-pipelines.yml) — build/test, Docker push ไป GCP Artifact Registry, Terraform apply บน branchcicd/prod(ดูรายละเอียดในบท 01) - Sentry config files มีอยู่ (
sentry.client.config.js,sentry.server.config.js,_error.tsx) แต่withSentryConfig(...)ในnext.config.jsถูก comment ออก (next.config.js:79-80) — source map upload ผ่าน webpack plugin จึงไม่ทำงานใน config ปัจจุบัน
สารบัญ
| บท | หัวข้อ |
|---|---|
| 01 | Repository map — โครงสร้าง, pages/routes, layouts, CI |
| 02 | Core pipeline — auth, login, LIFF, route guard, API wrappers |
| 03 | Integrations — backends, ChatCenter team admin, Sentry |
| 04 | Scorecard |
ดูภาพรวมกลุ่ม 2way Platform ที่ Volume 5 index.