Skip to content

8.1 · Repository map + legacy/backup files

บทนี้เจาะโครงสร้างของ vtrc-rc-backoffice/src/ เพื่อให้ค้นหาและแก้ไขโค้ดได้ง่ายขึ้น พร้อมทั้งระบุไฟล์ legacy/backup กว่า 75 ไฟล์ และ typos ที่ติดอยู่ในชื่อไฟล์/โฟลเดอร์จริง (เปลี่ยนไม่ได้)


โครงสร้าง src/ ระดับบน

src/
├── index.js                 33 บรรทัด  — entry point + ApolloProvider + RecoilRoot
├── serviceWorker.js        135 บรรทัด  — CRA default (เรียก unregister)
├── assets/
│   ├── css/                          — main.css 4,644 + work-force.css 794 + theme/*.css
│   ├── sass/                         — main.scss, work-force.scss (source ที่ compile ด้วย Prepros)
│   ├── fonts/                        — Kanit, Kanit-Medium, Kanit-Regular, THSarabun
│   ├── images/, pdf/                 — assets รวม PDF template (couse_pdf, jobReq_pdf)
├── components/             104 ไฟล์   — domain components (41 โฟลเดอร์)
├── config/                 35 ไฟล์    — apollo, axios* 15 ไฟล์, routes, datasets, CSS
│   ├── apollo.js           187 บรรทัด     — Apollo Client หลัก (createUploadLink + setContext + errorLink)
│   ├── apollo-workforce.js 154 บรรทัด     — Apollo Client สำหรับ workforce-api
│   ├── axios-bo.js                       — factory AxiosBO + interceptor
│   ├── axios-workforce.js / axios-workforce-upload.js
│   ├── axios-recruitment.js / axios-recruitment-upload.js
│   ├── axios-benefit.js / axios-benefit-i3.js
│   ├── axios-pms.js / axios-ai.js / axios-payments.js
│   ├── axios-meeting.js / axios-common.js / axios-vtrc.js / axios-i3.js
│   ├── axiosAll.js
│   ├── routes.js          2,550 บรรทัด     — route table 276 paths
│   ├── custom-antd.css   21,189 บรรทัด     — AntD v4 override (compiled)
│   ├── datasets*.js      ~1,610 บรรทัด     — dropdown master data
│   └── refreshToken.js      34 บรรทัด     — refresh ผ่าน Queries.refreshTokenBO (Apollo)
├── containers/
│   └── App/index.js         32 บรรทัด     — root router + isLoggedIn() gate (ไม่มี PrivateRoute)
├── graphql/
│   ├── queries.js         4,108 บรรทัด     — 120 query definitions
│   ├── mutations.js       2,208 บรรทัด     — 94 mutation definitions
│   ├── WorkForce/                      — queries/mutations ของ workforce service
│   ├── graphql-pingpong/               — legacy (เก็บไว้)
│   └── index.js              5 บรรทัด     — re-export Queries, Mutations, Queries_wf, Mutations_wf
├── pages/                  66 โฟลเดอร์  — 871 page files
├── recoil/states/          57 โฟลเดอร์  — atom definitions (~1,251 บรรทัด)
└── utils/                  33 ไฟล์     — helpers (~1,849 บรรทัด)

ไฟล์สำคัญและหน้าที่

ไฟล์LOCหน้าที่
src/index.js:1-3333React root + ApolloProvider + RecoilRoot
src/containers/App/index.js:1-3636BrowserRouter + Switch + isLoggedIn() gate + console override
src/config/apollo.js:1-185185Apollo Client หลัก + errorLink + authLink
src/config/apollo-workforce.js:1-154154Apollo Client สำหรับ /workforce-api/api/graphql
src/config/routes.js:1-25502,550route table + render helpers + permission check
src/utils/auth.js:1-137137token storage + URL resolver + isLoggedIn
src/utils/formatdate.js:1-160160date format พ.ศ. (manual +543)
src/utils/checkError.js:1-2121error code → ข้อความไทย
src/graphql/queries.js:1-41084,108120 queries
src/graphql/mutations.js:1-22082,20894 mutations
src/components/SiderLayout/index.js:1-11681,168shell layout + dynamic menu + role fetch
src/pages/Login/index.js:1-418418login (RSA + loginBackoffice mutation)
src/pages/ManageUser/index.js:1-762762จัดการผู้ใช้ + role
src/pages/OtherWelfare/Form/index.js:1-20752,075ฟอร์มสวัสดิการอื่น (ใหญ่ที่สุดเป็นอันดับ 2)
src/pages/LeaveStudiesPayments/form/index.js:1-18241,824ฟอร์มเบิกค่าเล่าเรียน (multi-tab)

pages 66 โฟลเดอร์ — จัดเป็น cluster

Clusterโฟลเดอร์ตัวอย่าง
Auth / onboardingLogin/, PathLogin/, SetPasswordsFirstTime/, ChangePassword/, ConfirmUserA1/, ConfirmUserA2/, ForgetPassword/
Dashboard / homeDashboard/, News/, DetailNews/, Notification/
Document / policyDocumentGroup/, Document/, DocumentHR/, Policy/, PolicyOfficerDocuments/
ContactContactUS/, ContactUSCategory/
Organization / career / courseOrganization/, OrganizationGroup/, Career/, Course/, System/
User / role managementManageUser/, ManageRole/
Hospital / medical claimHospitalHr/, HospitalPaid/, HospitalFailed/, SicknessName/, BankBranches/
LeaveLeave/, LeaveHR/, LeaveStudies/, LeaveStudiesAdmin/, LeaveStudiesPayments/, LeaveStudiesScholar/, LeaveStudiesScholarAdmin/, Delegate/
Welfare / fundOtherWelfare/, Fund/
WorkForce moduleWorkForce/Employee/, WorkForce/PositionManage/, WorkForce/PositionTechnical/, WorkForce/PerfessionalLicense/, WorkForce/PerfessionalDepartment/, WorkForce/ManpowerManage/, WorkForce/Candidate/, WorkForce/JobRequest/, WorkForce/Learning/, WorkForce/Report/, WorkForce/Dashboard/
RecruitmentRecruitment/Announcement/, Recruitment/Candidate/, Recruitment/PreviewEmail/
PMSPMS/Evaluations/, PMS/PerformanceRecord/, PMS/ReportResults/, PMS/Shared/
AttendanceAttendance/AbstainTimeGroup/
Bank / paymentPayment/ExportPayment/, Payment/Payroll/, Payment/SalaryCert/
MiscAboutUS/, TheamCss/ (typo — ใช้จริง), NotFound/

ไฟล์ legacy/backup — ห้ามแตะ ห้ามใช้เป็นต้นแบบ

vtrc-rc-backoffice มีไฟล์ legacy/backup มากกว่า 75 ไฟล์ รวมถึง โฟลเดอร์ page _bk ทั้งโฟลเดอร์ 4 ชุด

กฎเหล็ก

  1. อย่าแก้ไข — ไฟล์ที่ลงท้ายด้วย _bk, _prd, _copy, _tempFilter, _bk-* หรือไฟล์ที่อยู่ในโฟลเดอร์ _bk ทั้งโฟลเดอร์
  2. อย่าใช้เป็นต้นแบบ — ถ้า copy โค้ดจากไฟล์เหล่านี้ มีโอกาสได้ query ที่ deprecated แล้ว
  3. อย่าลบทิ้งเอง — บางไฟล์เก็บไว้สำหรับ rollback ดู git history ก่อน และถามทีมก่อนลบ

โฟลเดอร์ page _bk ทั้งโฟลเดอร์

โฟลเดอร์จำนวนไฟล์ที่มา
src/pages/Leave_bk/12 ไฟล์snapshot ระบบลาเก่า
src/pages/LeaveHR_bk/13 ไฟล์snapshot ฝั่ง HR
src/pages/LeaveStudies_bk/15 ไฟล์ (รวม Form/Tab0..10/)snapshot การลาศึกษาเก่า
src/pages/OtherWelfare/Form_bk/3 ไฟล์snapshot ฟอร์มสวัสดิการอื่น

ไฟล์ legacy ที่พบบ่อย

รูปแบบชื่อตัวอย่างที่มา
_bk.jspages/Login/index_bk.js, components/SiderLayout/index_bk.js, components/LoginForm/index_bk.jssnapshot ก่อน refactor
_bak.js, _bk-prd.js, _bk_uat_*.js, _bk_up_prd_*.jsconfig/routes_bak.js, config/routes_bk-prd.js, config/routes_bk_uat_100423.js, config/routes_bk_up_prd_100423.jssnapshot ของ route table แยกตาม env
_bk-061265.js, _bk-061254.jsgraphql/queries_bk-061265.js, graphql/mutations_bk-061254.jssnapshot queries/mutations ลงวันที่
_bk copy.js (มี space ในชื่อ!)pages/LeaveStudies/Form/Tab7/index_bk copy.jssnapshot ที่ตั้งชื่อผิด
_bk-bk.js, _bk-send.js, _prd.jspages/HospitalPaid/Payments/generatorFileDetail_bk-bk.js, detailDarf_bk-send.js, generatorFileDetail-prd.jssnapshot ซ้อน snapshot
index-axios.js, index-axio.jspages/LeaveStudiesPayments/form/index-axios.js, pages/OtherWelfare/Form/index-axio.jsทดลอง impl ด้วย axios แทน apollo
routes_gql_payments.js, routes_payments_axios.jsconfig/ทดลอง impl ระบบ payment 2 แบบ

ตัวอย่างที่ต้องระวังมากเป็นพิเศษ

src/config/
├── routes.js                  ← ตัวจริง (2,550 บรรทัด)
├── routes_bak.js              ← snapshot
├── routes_bk-prd.js           ← snapshot prod
├── routes_bk_uat_100423.js    ← snapshot UAT ลงวันที่ 10/04/2023
├── routes_bk_up_prd_100423.js ← snapshot update-prod ลงวันที่ 10/04/2023
├── routes_bk-mapgroup.js      ← snapshot สำหรับ map group
├── routes_payments_axios.js   ← ทดลอง payment ด้วย axios
└── routes_gql_payments.js     ← ทดลอง payment ด้วย GraphQL

src/graphql/
├── queries.js                 ← ตัวจริง (4,108 บรรทัด, 120 queries)
├── queries_bk.js              ← snapshot
├── queries_bk-061265.js       ← snapshot 06/12/2565
├── mutations.js               ← ตัวจริง (2,208 บรรทัด, 94 mutations)
├── mutations_bk.js            ← snapshot
└── mutations_bk-061254.js     ← snapshot 06/12/2565

src/components/SiderLayout/
├── index.js                   ← ตัวจริง (1,168 บรรทัด)
├── index_bk.js                ← snapshot
└── index_menu.js              ← snapshot เฉพาะส่วน menu

วิธีตรวจสอบว่าไฟล์ที่จะแก้เป็นของจริง

  1. ชื่อไฟล์ไม่มี _bk, _bak, _prd, _copy, _tempFilter, _bk-*, index-axios, index-axio
  2. ไม่ได้อยู่ในโฟลเดอร์ที่ลงท้ายด้วย _bk (เช่น Leave_bk/, LeaveHR_bk/)
  3. ถ้าเป็น query/mutation — ต้องเป็น queries.js หรือ mutations.js ตัวเดียวเท่านั้น ไม่ใช่ variant

Typos ที่ติดอยู่ในชื่อไฟล์/โฟลเดอร์จริง (เปลี่ยนไม่ได้)

เพราะเป็นชื่อที่ใช้ใน import path ทั้งระบบ + route entry + recoil atom name — การแก้ชื่อทำให้ไฟล์พังทั้งระบบ

Typoควรเป็นที่พบ
PerfessionalLicenseProfessionalLicensepages/WorkForce/PerfessionalLicense/, recoil/states/PerfessionalLicense/, config/routes.js:114,696-700
PerfessionalDepartmentProfessionalDepartmentpages/WorkForce/PerfessionalDepartment/, recoil/states/PerfessionalDepartment/
TheamCssThemeCsspages/TheamCss/, config/routes.js:8, containers/App/index.js:8 (route /TheamCss)
AboutUSAboutUscomponents/AboutUS/, pages/AboutUS/
announmentannouncementpages/Recruitment/Announcement/announment/
managgeAssignmanageAssignpages/WorkForce/ManpowerManage/info/managgeAssign.js
HospitalHrHospitalHRpages/HospitalHr/ (Hr ตัวเล็ก)
couse_pdfcourse_pdfassets/couse_pdf/ (PDF template ของ course)
AlldataShowAllDataShowcomponents/AlldataShow/
ModalshowAllImageModalShowAllImagecomponents/ModalshowAllImage/
ImageFileNewtabImageFileNewTabcomponents/ImageFileNewtab/
FormContactUSFormContactUscomponents/FormContactUS/
time_attendace.csstime_attendance.cssassets/css/theme/time_attendace.css (d หาย)
themeplate.css, themplate.csstemplate.cssassets/css/theme/ — มี 3 ไฟล์ใกล้เคียงกัน (template.css, themeplate.css, themplate.css)
refundScholashiprefundScholarshipgraphql/queries.js:3799 — query name (เป็น schema ฝั่ง server ด้วย เปลี่ยนไม่ได้)

กฎเหล็กเมื่อเจอ typo

  • อย่าแก้ชื่อโฟลเดอร์/ไฟล์/query — เพราะจะทำให้ไฟล์อื่นที่ import พัง
  • ถ้าสร้างไฟล์ใหม่ในโฟลเดอร์ที่มี typo ให้ใช้ชื่อโฟลเดอร์เดิม
  • ถ้าทนไม่ได้ ให้ plan refactor เป็น batch (เปลี่ยนทุก import + route entry + recoil atom พร้อมกัน)

utils/ — 33 ไฟล์ helper

ไฟล์หน้าที่
auth.js:1-137token storage + URL resolver + isLoggedIn + appVersion
apiKey.js:1-25คืน apiKey UUID ตาม origin (hardcode)
formatdate.js:1-160date format พ.ศ. (manual +543)
checkError.js:1-21แมป error → ข้อความไทย
message.js:1-30alertMessage(type, msg) wrapper
eventLog.js:5-45ส่ง log event ผ่าน axios
cryptoJs.js:1-32AES encrypt/decrypt (ใช้ REACT_APP_PRIVATE_KEY)
fetchApiAxios.js:1-85helper axios ที่ใส่ Authorization อัตโนมัติ
work-force.service.js:1-194WorkForce localStorage helpers (currentId, viewOnly, searchList)
storage.js:1-29setWithExpiry / getWithExpiry
string.js:1-35capitalizeFirstLetter + toGqlTypes/Args/Fields (หลังไม่ได้ใช้)
markDown.js:1-14markdown → HTML
pdfDownloader.js:1-28downloadPdf(base64, filename)
downloadLink.js:1-19trigger browser download
base64.js:1-11getBase64(file) ผ่าน FileReader
menuBar.js:1-93SVG → Icon component factory
modal.js:1-68AntD modal helpers
settingInput.js:1-44form input rules
dropDownList.js:1-106สร้าง dropdown option array
fetchImage.js:1-56ดึง binary image → base64
leave.js:1-168leave calculation helpers
hospital.js:1-150hospital/sickness dropdown helpers
fund.js:1-55fund dropdown/formatting
delegate.js:1-16delegate approver helpers
payments.js:1-18payment status mapping
changestring.js:1-33convertstatus, converttypenews
number.js:1-15parseFloatStringToNumber
checkType.js:1-21type validators
checkOrganization.js:1-83org-code parsing
LeaveStudies.js:1-42study-leave status helper
youtube.js:1-7YouTube URL parser
variables.js:1-41 constant
service.js:1-7placeholder

ข้อควรระวังเกี่ยวกับ utils

  • toGqlTypes, toGqlArgs, toGqlFields ใน utils/string.js ถูก import ใน queries.js แต่ไม่ได้ใช้จริง — เป็น helper ที่ค้างจากการวางแผน refactor ในอดีต
  • cryptoJs.js ใช้ REACT_APP_PRIVATE_KEY จาก .env — เป็น AES key ที่ expose ใน bundle (ดู บท 7.9)

เคล็ดลับตอนทำงานจริง

ตอนค้นหา "ฟีเจอร์นี้อยู่ที่ไฟล์ไหน"

  1. เริ่มที่ src/config/routes.js — ค้นหาชื่อเมนูหรือ path
  2. ดู component field ใน route entry — เป็นชื่อ component ที่ import จาก pages/
  3. ถ้าไม่เจอใน routes.js อาจเป็นเพราะเมนู dynamic — ค้นหาใน backend fetchsidemenu response
  4. จากนั้นเปิดไฟล์ใน pages/<Feature>/index.js

ตอนเจอชื่อโฟลเดอร์แปลก ๆ

  • pages/TheamCss/ — typo จาก ThemeCss แต่เป็น route จริง (/TheamCss) ห้ามแก้
  • pages/WorkForce/PerfessionalLicense/ — typo จาก Professional แต่เป็นโฟลเดอร์จริง ห้ามแก้
  • pages/Leave_bk/ — snapshot ทั้งโฟลเดอร์ ห้ามใช้

ตอน grep ไม่เจอ symbol ที่คาดไว้

  • ถ้า grep <Query, <Mutation, useQuery, useMutation ใน module เก่า — ไม่เจอเพราะใช้ withApollo + this.props.client.query/mutate
  • ถ้า grep ใน module ใหม่ (WorkForce, PMS) — อาจเจอ useRecoilState แทน this.state

ตอนเจอ route entry ที่ import โฟลเดอร์ _bk

บาง route entry อาจ import จากโฟลเดอร์ _bk โดยไม่ได้ตั้งใจ (เช่น LeaveStudies_bk/Form/Tab0/) — ให้ตรวจก่อนว่า route นั้นเปิดใช้งานจริงหรือเป็น fallback


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

ไป บท 7.2 Bootstrap + CRA build