Skip to content

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.tsx

Pages / routes (หลัง basePath)

ทุก URL จริงขึ้นต้นด้วย /meetingbo (next.config.js:21)

URLไฟล์Data loadingหน้าที่
/meetingbopages/index.tsxgetStaticPropsGET .../secure/group/listgroup (:29-30)รายการกลุ่ม
/meetingbo/listapproverpages/listapprover/index.tsxgetStaticPropsGET .../secure/approver/listApproverรายการผู้อนุมัติ
/meetingbo/creategrouppages/creategroup/index.tsxclient axios ใน event handlerสร้างกลุ่ม + เลือกสมาชิก
/meetingbo/editgrouppages/editgroup/index.tsxclient axiosแก้ไขกลุ่ม
/meetingbo/createapproverpages/createapprover/index.tsxclient axiosเพิ่ม/ลบผู้อนุมัติ
/meetingbo/{token}pages/[token].tsxuseEffect + axios.get redirectbypassทางเข้า auth จากภายนอก

ไม่พบ middleware.ts — ไม่มี Next middleware auth

layouts/Sidebar.tsx:52-59 มีแค่ 2 ลิงก์:

  1. /meetingbo — "สร้างกลุ่มสำหรับเชิญประชุม" (จริง ๆ คือหน้า list แล้วกดไปสร้าง)
  2. /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

การกระทำPageAPI
Listindex.tsxGET /secure/group/listgroup
Createcreategroup/index.tsxPOST /secure/group/creategroup (:349)
Editeditgroup/index.tsxPOST /secure/group/editgroup (:413)
Org dropdownscreate/editGET /secure/finddropdownbyorg/{org,division,department}/
User list by orgcreate/editGET /secure/finduserlistbyorg
Search employeecreatePOST {2WAY_API}/getUserByCondition (creategroup:392)

UI list ใช้ components/listsgroup/Listsgroup.tsx รับ groupList จาก props

Approver admin

การกระทำPageAPI
Listlistapprover/index.tsxGET /secure/approver/listApprover
Addcreateapprover/index.tsxPOST /secure/approver/addNewApprover (:377)
Deletecreateapprover/index.tsx(เรียก deleteapprover ที่ :365)
Search employeecreateapproverPOST {2WAY_API}/getUserByCondition (:415)

UI list ใช้ components/listapprover/ListApprover.tsx


Auth utilities

utils/auth.tsx:

  • setToken / getTokenlocalStorage.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คำสั่งหมายเหตุ
devnext devDocker CMD ใช้ตัวนี้
buildnext build
build:stagingenv-cmd -f .env.staging.local next buildไฟล์ .env.staging.local ไม่พบใน tree ที่ตรวจ
build:productionenv-cmd -f .env next buildอ่าน .env ที่ commit
startenv=production next startไม่ใช่ CMD ใน Dockerfile
testjest watch

next.config.js:13-18 ตั้ง typescript.ignoreBuildErrors: true

Sentry webpack wrap ยัง active:

js
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~706form + 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 บรรทัด)


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