4 · Scorecard + debt register
Legend
- Critical = active security/data-loss/availability risk
- High = correctness/maintainability hazard, real impact
- Medium = friction/hygiene, not yet dangerous
แก้ไขข้อสันนิษฐานเดิม — AntD version
docs/index.md ระบุกลุ่ม Web Frontends ว่าใช้ "AntD v3/v4" รวมกัน — สำหรับ vtrc-backoffice ผลตรวจคือ มี AntD เพียงเวอร์ชันเดียวคือ v4.15.4 (resolve จริงใน package-lock.json; package.json ระบุ range ^4.6.6) ไม่พบ AntD v3 ใน dependency tree ของ repo นี้ AntD v4 เข้าสู่ EOL ตาม policy ของ Ant Design เอง (v4 ไม่ได้รับ security patch ใหม่แล้วนับจากที่ v5 ออก) จึงยังนับเป็น LEG-BO-03 ได้ถูกต้อง แต่ severity ต่างจาก AntD v3 (v3 เก่ากว่าและเสี่ยงกว่า) — ควรแก้ claim ใน docs/index.md ให้ระบุแยกต่อ repo แทนการรวมเป็น "v3/v4"
Debt register
| ID | Severity | คำอธิบาย | หลักฐาน (file:line) | ข้อเสนอการแก้ไข |
|---|---|---|---|---|
CORR-BO-01 | Medium | axios-workforce.js มี unreachable code — บรรทัดสองของ checkLinkURL() (endpoint UAT จริง) ไม่มีทาง execute เพราะ return ก่อนหน้าคืนค่า http://localhost:8083/... เสมอ ปัจจุบันยังไม่พบจุด import ใช้งานไฟล์นี้ใน src/ จึงยังไม่กระทบ production แต่หากมีใครนำไปใช้โดยไม่รู้ตัวจะพังทันที | vtrc-backoffice/src/config/axios-workforce.js:5-8 | ลบ return ที่ผิด หรือลบไฟล์ทั้งไฟล์หากยืนยันว่าไม่มีจุดใช้งานจริงอีกต่อไป |
CORR-BO-02 | High | login flow hardcode isRemember = 1 ที่ทุกครั้งเมื่อ login สำเร็จ พารามิเตอร์ remember ที่ผ่านเข้า onSubmit ไม่ถูกใช้เลย และ LoginForm ไม่ได้ render checkbox "จำฉันไว้" ที่ import มา — ผลคือ token ถูกเก็บใน localStorage เสมอ ไม่มีทาง session-only ตามที่โค้ดออกแบบไว้ | vtrc-backoffice/src/pages/Login/index.js:45-78, vtrc-backoffice/src/components/LoginForm/index.js:1-21 | เพิ่ม Checkbox ในฟอร์มจริง ส่งค่า remember เข้า setToken แทนการ hardcode 1 |
SEC-BO-01 | High | ผลตรงจาก CORR-BO-02 — access token + refresh token คงอยู่ใน localStorage แบบไม่มีวันหมด (จนกว่า logout/invalidate ฝั่ง server) ทำให้พื้นผิวเสี่ยงต่อการขโมย token ผ่าน XSS นานกว่าที่ควร (มี dangerouslySetInnerHTML ใช้อยู่ 20 ไฟล์ใน src/ เป็นพื้นผิว XSS ที่มีอยู่จริง) | vtrc-backoffice/src/utils/auth.js:1-17 (setToken), ดูรายการไฟล์ dangerouslySetInnerHTML เช่น vtrc-backoffice/src/pages/ManageUser/index.js:1, vtrc-backoffice/src/pages/HospitalPaid/Payments/detail.js:1 | sanitize ทุกจุดที่ใช้ dangerouslySetInnerHTML ด้วย DOMPurify และแก้ CORR-BO-02 เพื่อจำกัดอายุการเก็บ token |
QUAL-BO-01 | Medium | routes.js มีบล็อก route ซ้ำที่ comment ปิดทั้งกลุ่มจำนวนมาก (ตัวอย่างช่วง 1118-1546 รวมกว่า 10 module) เป็นซากจากการ redesign เมนู (สอดคล้องกับชื่อ branch redesign-menu ที่มีอยู่จริงใน remote) | vtrc-backoffice/src/config/routes.js:1118-1546 | ลบ block ที่ comment ปิดถ้ายืนยันว่าไม่ต้องใช้อ้างอิงย้อนหลังแล้ว |
QUAL-BO-02 | Medium | มี checkLinkURL() สองตัวคนละไฟล์ (config/apollo.js และ utils/auth.js) ชื่อเดียวกันแต่คืนค่าคนละรูปแบบ (path GraphQL เต็ม vs host เปล่า) ตัวใน auth.js ไม่พบจุดเรียกใช้จริงในรอบตรวจนี้ (UNVERIFIED ว่ามีการ import จริงหรือไม่) | vtrc-backoffice/src/utils/auth.js:50-64 | ยืนยันว่ามีการใช้งานจริงหรือไม่ ถ้าไม่มีให้ลบทิ้งเพื่อลดความสับสน |
QUAL-BO-03 | Medium | ไฟล์ backup/legacy (*_bk*.js, *-prd.js) กระจายอยู่ใน src/pages/ และ src/graphql/, src/config/ อย่างน้อย 41 ไฟล์ (ไม่รวม nginx.default.conf.bak ที่ root) | ตัวอย่าง: vtrc-backoffice/src/pages/HospitalPaid/Payments/index_bk.js:1, generator_bk.js:1, generatorFileDetail_bk-bk.js:1, generatorFileDetail-prd.js:1, vtrc-backoffice/src/graphql/queries_bk.js:1, vtrc-backoffice/src/config/routes_bk.js:1 | จัดเก็บ history ผ่าน git แทนการ commit ไฟล์ backup คู่ขนาน แล้วลบไฟล์เหล่านี้ทีละล็อตหลังยืนยันไม่มีการอ้างอิง |
LEG-BO-01 | Medium | Dockerfile ไม่ build จาก source (FROM nginx:1.18 เท่านั้น) การ deploy จริงพึ่งพา build/ ที่ commit ไว้ล่วงหน้า (~47 MB) ผ่าน docker-compose.yml bind-mount — ไม่มี reproducible build ใน container image เอง | vtrc-backoffice/Dockerfile:1-2, vtrc-backoffice/docker-compose.yml:9-19 | เพิ่ม multi-stage build (npm install && npm run build) ใน Dockerfile ตาม pattern ที่ vtrc-backoffice-new ใช้อยู่แล้ว (ดู volume ของ repo นั้น) แล้วเลิก commit build/ |
LEG-BO-02 | Medium | react-scripts (CRA) คงที่ 3.4.3 — เวอร์ชันเก่ามาก (ปี 2020) ไม่ได้รับ security patch ของ webpack/babel ที่ bundle มาด้วย | vtrc-backoffice/package.json:40 | อัปเกรด CRA เป็นเวอร์ชันใหม่ หรือย้ายไป Vite |
LEG-BO-03 | Medium | AntD คงที่ v4.15.4 — อยู่ใน EOL branch ของ Ant Design (v4 ไม่รับ security patch ใหม่แล้ว) ไม่ใช่ v3 ตามที่เอกสารระดับ volume-index สื่อไว้แบบกว้าง — ต้องแก้ claim ให้เจาะจงต่อ repo | vtrc-backoffice/package.json:11, lockfile antd@4.15.4 | วางแผนอัปเกรดเป็น AntD v5 (breaking change สูง ต้องผ่าน migration guide ของ Ant Design) |
OBS-BO-01 | Medium | console.log/warn/error ถูก override เป็น no-op ทุกครั้งที่ App mount — debug ผ่าน browser console ใน production ไม่ได้เลย ต้องพึ่ง debugger statement หรือ network tab แทน | vtrc-backoffice/src/containers/App/index.js:14 | ลบ override นี้ หรือทำให้ conditional ตาม environment แทนการปิดถาวร |
PERF-BO-01 | Medium | ไม่พบการใช้ React.lazy/route-level code splitting ที่ใดใน src/ — ทุก page bundle เข้า main chunk เดียว ประกอบกับ build/ ที่ commit ไว้มีขนาด ~47 MB (ไม่รวม node_modules) | ผลจาก full-text search React.lazy/lazy( ทั่ว vtrc-backoffice/src (ไม่พบ), ขนาด vtrc-backoffice/build/ ~47 MB | เพิ่ม React.lazy + Suspense ระดับ route ตาม module ใน routes.js |
Scorecard สรุป
| ด้าน | คะแนน | หมายเหตุ |
|---|---|---|
| โครงสร้างโค้ด | 5/10 | 41 ไฟล์ backup ปนอยู่ใน tree, route block ที่ comment ปิดจำนวนมาก |
| การ build | 4/10 | ไม่มี build stage ใน Docker, พึ่งพา build/ ที่ commit ไว้ |
| การจัดการ auth | 4/10 | token ไม่มีวันหมดอายุใน localStorage (bug ไม่ใช่ตั้งใจ), auth gate ตรวจแค่ boolean |
| Security | 4/10 | XSS surface (20 ไฟล์ dangerouslySetInnerHTML) + token persistence bug |
| Performance | 5/10 | ไม่มี code splitting แต่ bundle เดี่ยว (~47 MB build) เล็กกว่า vtrc-rc-backoffice |
| Maintainability | 5/10 | pattern สม่ำเสมอกว่า vtrc-rc-backoffice (ไม่มี MUI ปนแบบสะเปะสะปะ) แต่มีไฟล์ backup มาก |
| Observability | 3/10 | console ปิดหมดใน production |
| Testing | 1/10 | ไม่พบ test จริงใน src/ (ทำเครื่องหมาย UNVERIFIED สำหรับการยืนยัน __tests__ ว่างทั้งหมด — ไม่ได้ไล่ตรวจทุกไฟล์) |
| รวม (โดยประมาณ) | 3.9/10 | ใกล้เคียงกับ vtrc-rc-backoffice (v1: 4.2/10) — มีหนี้ทางเทคนิคเชิงโครงสร้างและ security ใกล้เคียงกัน |
คะแนนนี้เป็นการประเมินเชิงคุณภาพจากหลักฐานที่ตรวจพบในรอบนี้ ไม่ใช่ metric อัตโนมัติ ควร cross-check กับทีมที่ดูแลระบบจริงก่อนใช้ประกอบการตัดสินใจ
ความสัมพันธ์กับ vtrc-backoffice-new
ดูรายละเอียดเต็มใน _partial-index-backoffices.md — สรุปสั้น: เป็น repo คนละตัวใน Bitbucket (i3dev/vtrc-backoffice.git vs i3dev/vtrc-backoffice-new.git) แต่ source code เกือบเหมือนกันทุกไฟล์ (vtrc-backoffice-new มี Dockerfile ที่ build จาก source จริง ต่างจาก repo นี้ที่ยังพึ่ง build/ ที่ commit ไว้ — ดู LEG-BO-01)