7.2.1 · Repository map
branch: UAT (72 tracked files)
แผนที่โฟลเดอร์
meeting-backoffice/ (branch: UAT)
├── package.json # name=reportmonitor@5.0.0
├── package-lock.json + yarn.lock # มีทั้งสอง — Docker ใช้ yarn install
├── next.config.js # basePath '/meetingbo', withSentryConfig, ignoreBuildErrors
├── next-i18next.config.js
├── Dockerfile # node:16.14.0, CMD yarn dev
├── docker-compose.yml # meetingbodev1, build: ., 3001:3000
├── .env # COMMITTED — NEXT_PUBLIC_APP_MEETING_API / _2WAY_API
├── sentry.client.config.js # Sentry.init ทั้งก้อน COMMENT OUT
├── sentry.server.config.js # เช่นกัน
├── sentry.properties
├── __test__/ # jest + enzyme (บางส่วนเป็น Readme เปล่า)
├── public/
│ └── locales/{en,de}/*.json # มี de (เยอรมัน) — boilerplate
└── src/
├── pages/
│ ├── index.tsx # list group (getStaticProps)
│ ├── [token].tsx # redirectbypass auth entry
│ ├── listapprover/index.tsx # list approver (getStaticProps)
│ ├── creategroup/index.tsx # สร้างกลุ่ม (client axios)
│ ├── editgroup/index.tsx # แก้กลุ่ม
│ ├── createapprover/index.tsx # เพิ่ม/ลบผู้อนุมัติ
│ ├── _app.tsx / _document.tsx / _error.js / _test.tsx
├── layouts/ # Layout, Navbar, Sidebar
├── components/
│ ├── listsgroup/Listsgroup.tsx
│ ├── listapprover/ListApprover.tsx
│ ├── table/DataGrid*.tsx
│ ├── form/InputSelect.tsx
│ └── button/CommonButton.tsx
├── utils/auth.tsx # localStorage token helpers
├── utils/createEmotionCache.tsx
├── types/ # listGroup, listApprover, form/button types
└── styles/theme.tsxPages / routes (หลัง basePath)
ทุก URL จริงขึ้นต้นด้วย /meetingbo (next.config.js:21)
| URL | ไฟล์ | Data loading | หน้าที่ |
|---|---|---|---|
/meetingbo | pages/index.tsx | getStaticProps → GET .../secure/group/listgroup (:29-30) | รายการกลุ่ม |
/meetingbo/listapprover | pages/listapprover/index.tsx | getStaticProps → GET .../secure/approver/listApprover | รายการผู้อนุมัติ |
/meetingbo/creategroup | pages/creategroup/index.tsx | client axios ใน event handler | สร้างกลุ่ม + เลือกสมาชิก |
/meetingbo/editgroup | pages/editgroup/index.tsx | client axios | แก้ไขกลุ่ม |
/meetingbo/createapprover | pages/createapprover/index.tsx | client axios | เพิ่ม/ลบผู้อนุมัติ |
/meetingbo/{token} | pages/[token].tsx | useEffect + axios.get redirectbypass | ทางเข้า auth จากภายนอก |
ไม่พบ middleware.ts — ไม่มี Next middleware auth
Sidebar navigation
layouts/Sidebar.tsx:52-59 มีแค่ 2 ลิงก์:
/meetingbo— "สร้างกลุ่มสำหรับเชิญประชุม" (จริง ๆ คือหน้า list แล้วกดไปสร้าง)/meetingbo/listapprover— "รายชื่อผู้อนุมัติ"
หน้า editgroup / createapprover ไม่มีในเมนู — เข้าด้วย URL ตรงหรือปุ่มภายในหน้า list
ลิงก์ใช้ <a href="/meetingbo/..."> ตรง ๆ ไม่ใช่ next/link — ถ้าเปลี่ยน basePath ต้องแก้มือ
Layout shell
_app.tsx
└── appWithTranslation(MyApp) (_app.tsx:37)
└── CacheProvider → ThemeProvider → CssBaseline
└── Layout → Navbar + Sidebar + children (_app.tsx:31)- Title:
"Meeting Management Back Office"(_app.tsx:25) - ไม่มี global auth check ใน
_app— ทุกหน้า render ได้โดยไม่ต้องมี token
Group / Approver admin — โมดูลหลัก
Group admin
| การกระทำ | Page | API |
|---|---|---|
| List | index.tsx | GET /secure/group/listgroup |
| Create | creategroup/index.tsx | POST /secure/group/creategroup (:349) |
| Edit | editgroup/index.tsx | POST /secure/group/editgroup (:413) |
| Org dropdowns | create/edit | GET /secure/finddropdownbyorg/{org,division,department}/ |
| User list by org | create/edit | GET /secure/finduserlistbyorg |
| Search employee | create | POST {2WAY_API}/getUserByCondition (creategroup:392) |
UI list ใช้ components/listsgroup/Listsgroup.tsx รับ groupList จาก props
Approver admin
| การกระทำ | Page | API |
|---|---|---|
| List | listapprover/index.tsx | GET /secure/approver/listApprover |
| Add | createapprover/index.tsx | POST /secure/approver/addNewApprover (:377) |
| Delete | createapprover/index.tsx | (เรียก deleteapprover ที่ :365) |
| Search employee | createapprover | POST {2WAY_API}/getUserByCondition (:415) |
UI list ใช้ components/listapprover/ListApprover.tsx
Auth utilities
utils/auth.tsx:
setToken/getToken→localStorage.accessToken(:1-25)clearAllStorage→ clear local + session (:27-29)- sessionStorage path ถูก comment ไว้
getToken ถูก export แต่จากการค้นใน src/pages ไม่พบการ import ไปแนบ Authorization ใน request ของ /secure/* — ใช้จริงเฉพาะใน [token].tsx (import setToken)
Build / scripts
| Script | คำสั่ง | หมายเหตุ |
|---|---|---|
dev | next dev | Docker CMD ใช้ตัวนี้ |
build | next build | |
build:staging | env-cmd -f .env.staging.local next build | ไฟล์ .env.staging.local ไม่พบใน tree ที่ตรวจ |
build:production | env-cmd -f .env next build | อ่าน .env ที่ commit |
start | env=production next start | ไม่ใช่ CMD ใน Dockerfile |
test | jest watch |
next.config.js:13-18 ตั้ง typescript.ignoreBuildErrors: true
Sentry webpack wrap ยัง active:
module.exports = withSentryConfig(moduleExports, sentryWebpackPluginOptions);(next.config.js:38) — แต่ Sentry.init ใน client/server config ถูก comment ทั้งก้อน (sentry.client.config.js:5-17)
.env ที่ commit (UAT)
ค่าที่เกี่ยวกับ meeting (ไม่รวม SMTP/DB remnant):
NEXT_PUBLIC_APP_MEETING_API=https://uat-vtrcapi.redcross.or.th/meeting
NEXT_PUBLIC_APP_2WAY_API=https://uat-vtrcapi.redcross.or.th/2way(.env:13-14)
ยังมี NEXT_PUBLIC_FACEBOOK_ID / SECRET และ DB/SMTP placeholders (.env:5-16) — ไม่พบ usage ใน src/pages ที่ตรวจ
Test surface
__test__/ มีตัวอย่าง Copyright / hello service / pages test — ไม่พบ e2e ของ group/approver CRUD
สิ่งที่ไม่มีใน repo นี้
- ไม่มี route จองประชุม / calendar / PDF
- ไม่มี LIFF / LINE
- ไม่มี GraphQL / Apollo
- ไม่มีไฟล์
build/แบบ CRA (ใช้.nextตอน build — ไม่ commit) - ไม่เชื่อม
2way-meeting-backofficeโดยตรง
UI navigation จาก list → form (ภายในแอป)
แม้ Sidebar จะมีแค่ 2 ลิงก์ แต่หน้า list มีปุ่มพาไปหน้าฟอร์ม:
| จาก | การกระทำ | ไปที่ | หลักฐาน |
|---|---|---|---|
Listsgroup | ปุ่มสร้างกลุ่ม | router.push("/creategroup") | components/listsgroup/Listsgroup.tsx:111-112 |
Listsgroup | ไอคอนแก้ไขแถว | router.push({ pathname: "/editgroup", query: { groupID } }) | Listsgroup.tsx:115-120 |
ListApprover | ปุ่มจัดการผู้อนุมัติ | router.push("/createapprover") | components/listapprover/ListApprover.tsx:101 |
Next.js จะใส่ basePath ให้ router.push อัตโนมัติ — ได้ URL จริง /meetingbo/creategroup ฯลฯ
คอลัมน์ตารางกลุ่ม (Listsgroup.tsx:40-72): ชื่อกลุ่ม, ประกอบไปด้วย (สมาชิก), สำนัก, ฝ่าย, แผนก, จัดการ
มี client-side filter ด้วย groupName.includes(searchText) (Listsgroup.tsx:128-133)
ขนาดไฟล์หน้า mutation (สัญญาณความซับซ้อน)
| ไฟล์ | บรรทัดโดยประมาณ | หมายเหตุ |
|---|---|---|
pages/creategroup/index.tsx | ~706 | form + org dropdown + employee search + submit |
pages/editgroup/index.tsx | ~719 | โหลดกลุ่มเดิม + แก้สมาชิก |
pages/createapprover/index.tsx | ~693 | ลบแล้วเพิ่ม approver ในชุดเดียว |
Types: types/listGroup.tsx (~31 บรรทัด), types/listApprover.tsx (~21 บรรทัด)
Navbar
layouts/Navbar.tsx:7-19 เป็น AppBar สี #D94339 สูง 50px ไม่มีข้อความ/เมนู/ชื่อผู้ใช้ — เป็นแถบสีอย่างเดียว ซ้ายมือเป็น Sidebar ที่ถือเมนูจริง
Package manager บน UAT
มีทั้ง yarn.lock และ package-lock.json ใน tree — Dockerfile:14 ใช้ yarn install ส่วน package-lock.json อาจเป็น remnant จาก npm ช่วงหนึ่ง ควรใช้ yarn ให้สอดคล้อง Docker