Skip to content

1 · Master register

ตารางนี้รวมทุก debt item ที่พบในทุก *scorecard*.md ของ Volume 3-9 (29 ไฟล์ scorecard จาก 30 repo ที่มีโค้ด — interns_playground ไม่มี scorecard เพราะเป็น playground ที่ยังไม่มี business logic ให้ตรวจ, centralize-api ไม่มี scorecard แยกเพราะเนื้อหา debt ของมันถูกรวมไว้ในการเปรียบเทียบของ cu-central-api/04-integrations-scorecard.md) ID คงตามต้นฉบับทุกตัว ไม่มีการเปลี่ยนแปลง — บาง repo (vtrc-web, vtrc-rc-backoffice) เขียน scorecard ก่อนที่ debt ID scheme ของ v2 จะ finalize จึงใช้ ID รูปแบบอื่น (S-1, C1, H1, M1, P-1) แทน SEC-XXX-01 — เก็บไว้ตามต้นฉบับและระบุ repo ในคอลัมน์ Repo เพื่อไม่ให้กำกวม

เรียงตาม Category (ตามลำดับใน style guide: SEC → PERF → CORR → LEG → QUAL → OBS) จากนั้นเรียงตาม Severity (Critical → High → Medium → Low)

รวมทั้งหมด 275 รายการ — ดูสรุปตัวเลขที่ index


SEC — Security (89 รายการ: Critical 44, High 30, Medium 14, Low 1)

IDRepoSeverityคำอธิบายfile:lineSource
SEC-VTRC-API-01vtrc-apiCriticalCommand injection ผ่าน execSync ใน PDF pipeline (qpdf) 5 จุดvtrc-api/api/src/routes.js:73,120,227,277,355Vol 3 · vtrc-api
SEC-VTRC-API-02vtrc-apiCriticalDefault JWT_SECRET = 'secret' — forge token ได้ถ้า env ไม่ overridevtrc-api/api/src/config.js:12Vol 3 · vtrc-api
SEC-VTRC-API-03vtrc-apiCritical/webdeployment รัน shell binary โดยไม่มี authvtrc-api/api/src/routes.js:975-984Vol 3 · vtrc-api
SEC-VTRC-API-04vtrc-apiCritical/file/:id/download ไม่มี apiKey checkvtrc-api/api/src/routes.js:464Vol 3 · vtrc-api
SEC-CU-01cu-central-apiCriticalJWT_SECRET default เป็น empty stringcu-central-api/main-api/src/config.js, jwtToken.jsVol 3 · cu-central-api
SEC-CU-02cu-central-apiCriticalapiKeys hardcoded ในโค้ด 2 keyscu-central-api/main-api/src/lib/auth/auth.controller.jsVol 3 · cu-central-api
SEC-CU-03cu-central-apiCritical.env.develop-test (UAT secrets) commit อยู่ในโค้ดrepo rootVol 3 · cu-central-api
SEC-CU-04cu-central-apiCritical/auth/signinbypass passwordless signin live ใน productioncu-central-api/main-api/src/routes.jsVol 3 · cu-central-api
SEC-CU-05cu-central-apiCriticalignoreAuth bypass — apiKey อย่างเดียวพอผ่าน authcu-central-api/main-api/src/directives/auth.js, searchProfile.jsVol 3 · cu-central-api
SEC-CU-06cu-central-apiCriticalrejectUnauthorized: false ใน LDAP connectioncu-central-api/main-api/src/activeDirectory.connector.jsVol 3 · cu-central-api
C1vtrc-rc-backofficeCritical.env committed ลง git มี secret จริง (AES key, MSSQL connection string)vtrc-rc-backoffice/.envVol 4 · vtrc-rc-backoffice
C2vtrc-rc-backofficeCriticalREACT_APP_STIMUL_CONN_STRING (MSSQL conn string) ฝังใน bundle ที่ browser โหลดได้CRA env inliningVol 4 · vtrc-rc-backoffice
C3vtrc-rc-backofficeCriticalSSO bypass /pathLogin/:token/:refreshToken รับ token ใน URLvtrc-rc-backoffice/src/containers/App/index.js:24Vol 4 · vtrc-rc-backoffice
SEC-BONEW-01vtrc-backoffice-newCriticalLogin ส่ง access+refresh token เป็น URL path segment ข้าม originvtrc-backoffice-new/src/pages/Login/index.js:93-103 (branch: uat)Vol 4 · vtrc-backoffice-new
SEC-PMS-01pms-apiCriticalGET /budget/getEmployeeSalary เป็น @Public() คืนเงินเดือนพนักงานpms-api/src/modules/budget/budget.controller.ts:49-53 (branch: uat)Vol 6 · pms-api
SEC-PMS-02pms-apiCriticalCredential (UAT) + JWT secret ที่ share กับ prod ของ 3 service อื่น หลุดเข้า gitpms-api/.env:12,19,26,33,41,45, vtrc-gcp-sa-key.json (branch: uat)Vol 6 · pms-api
SEC-AIRECRUIT-01ai-recruitment-apiCriticalProduction credential + OpenAI/remove.bg/HCTI API key ที่มีค่าใช้จ่ายจริง หลุดเข้า gitai-recruitment-api/.env:2,5,7,9-10,11 (branch: prod)Vol 6 · ai-recruitment-api
SEC-AIRECRUIT-02ai-recruitment-apiCriticalไม่มี authorization ระดับ role/scope — JWT ที่ verify ผ่านเรียก AI generation ได้ไม่จำกัดai-recruitment-api/middleware/verifyJWT.js:7-40 (branch: prod)Vol 6 · ai-recruitment-api
SEC-WORKFLOW-01workflow-apiCriticalไม่มี JWT guard ระดับ global/module ใดเลย role ถูกอนุมานจาก payload ที่ปลอมได้workflow-api/src/main.ts:9-82, jwt-actor.util.ts:1-4,33-47, ipd-user.util.ts:20-65 (branch: uat)Vol 6 · workflow-api
SEC-WORKFLOW-02workflow-apiCritical.env.example มีรหัสผ่านจริงฝังอยู่workflow-api/.env.example:11,31,44 (branch: uat)Vol 6 · workflow-api
SEC-COMMON-01vtrc-commonCriticalทุก controller ที่มีจริงถูก mark @Public() — file/address/bank เข้าถึงได้ไม่ต้อง authvtrc-common/src/modules/file/file.controller.ts:18,24, address.controller.ts, bank.controller.ts, .env:12Vol 6 · vtrc-common
SEC-COMMON-03vtrc-commonCritical.env commit เข้า git พร้อมรหัสผ่าน MSSQL sa จริง + SECRET_KEY ที่ share กับ repo อื่นvtrc-common/.env:11,17Vol 6 · vtrc-common
SEC-JOBSCHED-01job-scheduler-apiCritical.env commit เข้า git พร้อมรหัสผ่าน MSSQL sa จริง + RSA secret key ที่ share ข้าม repojob-scheduler-api/.env:9-11,18Vol 6 · job-scheduler-api
SEC-CHAT-01chat-center-apiCriticalRaw SQL string interpolation จาก query param ผู้ใช้ตรง — SQL injectionchat-center-api/src/modules/chat/chat.service.ts:103-157, tags.service.ts:55-61 (branch: prod)Vol 6 · chat-center-api
SEC-CHAT-04chat-center-apiCritical.env commit เข้า git พร้อมรหัสผ่านจริง (MSSQL, MongoDB, LINE secret)chat-center-api/.env:10-11,26,28-29 (branch: prod)Vol 6 · chat-center-api
SEC-RCWEB-01recruitment-webCritical.env/.env.dev/.env.uat track ใน git มี AES key จริงสำหรับเข้ารหัส PIIrecruitment-web/.env:2,9, .env.uat:2,7, cryptoJs.js:1-32 (branch: prod)Vol 9 · recruitment-web
SEC-REPORTLOG-01report-logCriticalไฟล์ request_*.log commit จริง 50 ไฟล์ มี citizenId/birthDate/empCode plaintextreport-log/request_2023-02-17.log และอื่น ๆVol 9 · report-log
SEC-RECRUIT-01recruitment-apiCriticalProduction credential หลุดเข้า git (MSSQL, JWT×2, SMTP, reCAPTCHA, GCP key)recruitment-api/.env:11,18,25,32,44,45,52,55, vtrc-gcp-sa-key.json (branch: prod)Vol 6 · recruitment-api
SEC-RECRUIT-02recruitment-apiCriticalSQL injection ผ่าน dynamic EXEC stored procedure stringrecruitment-api/src/modules/candidate/candidate.repositories.ts:1324-1338 (branch: prod)Vol 6 · recruitment-api
SEC-BENEFIT-01benefit-apiCriticalProduction credential หลุดเข้า git (MSSQL×3, JWT, SFTP)benefit-api/.env:18,25,32,64, exportpaymentreport.service.ts:5271,5824,6151 (branch: prod)Vol 6 · benefit-api
SEC-BENEFIT-02benefit-apiCriticalRaw SQL string interpolation ข้าม 2 database — SQL injection surface ขนาดใหญ่benefit-api/src/modules/payments/payments.service.ts:415-573,640-720,1032-1183,1185-1435, approvedisaster.service.ts:415-417 (branch: prod)Vol 6 · benefit-api
SEC-2WAYVTRC-012way-vtrc-apiCriticalMaster bypass token static string "testnaja" ข้าม auth ทั้งหมด2way-vtrc-api/middleware/checkbypasstoken.ts:24 (branch: prod)Vol 5 · 2way-vtrc-api
SEC-2WAYVTRC-022way-vtrc-apiCriticalPOST /2way/getProfile ไม่มี middleware คืน PII จาก lineID ตรง2way-vtrc-api/routes/TwoWayAPI/userLine/getProfile.ts:34-63,79-134 (branch: prod)Vol 5 · 2way-vtrc-api
SEC-2WAYVTRC-032way-vtrc-apiCriticalCredential MongoDB production commit ตรงในซอร์ส2way-vtrc-api/util/mongo.config.ts:8 (branch: prod)Vol 5 · 2way-vtrc-api
SEC-2WAYLINE-012way-line-serviceCriticalทุก endpoint ของ LineController เป็น @Public()2way-line-service/src/modules/line/line.controller.ts:13,19,25,31Vol 5 · 2way-line-service
SEC-2WAYAPI-012way-apiCriticalBackdoor login hardcode i3admin/aA123456! ออก JWT admin 48 ชม.2way-api/src/modules/auth/auth.service.ts:184-240 (branch: prod)Vol 5 · 2way-api
SEC-2WAYAPI-022way-apiCriticalSSO/JWT secret มี default fallback ฝังในซอร์ส2way-api/src/modules/auth/auth.service.ts:20-26 (branch: prod)Vol 5 · 2way-api
SEC-2WAYAPI-032way-apiCriticalSQL injection จาก string interpolation หลายโมดูล2way-api/src/modules/announces/announces.service.ts:164-296,297-463, surveys.service.ts, complaints.service.ts (branch: prod)Vol 5 · 2way-api
SEC-2WAYAPI-042way-apiCriticalGlobal JwtAuthGuard ถูก bypass ด้วย @Public() บนแทบทุก endpoint เขียนข้อมูล2way-api/src/modules/announces/announces.controller.ts:45,56,79,85, line.controller.ts (branch: prod)Vol 5 · 2way-api
SEC-MOBILE-01vtrc-mobileCriticalRSA private key เต็ม hardcode ในซอร์ส compile เข้า JS bundlevtrc-mobile/src/utils/login.js:16-42Vol 8 · vtrc-mobile
SEC-MOBILE-02vtrc-mobileCriticalAndroid release keystore path + password plaintext commit เข้า gitvtrc-mobile/android/app/build.gradle:174-179Vol 8 · vtrc-mobile
SEC-NEW-01new-vtrc-mobileCriticalRSA private key เดียวกับ vtrc-mobile ถูก copy มา hardcode ซ้ำnew-vtrc-mobile/src/constants/RSAKey.ts:11-38Vol 8 · new-vtrc-mobile
SEC-MTVTRC-01meeting-vtrc-apiCritical.envdev/.envuat/.envprod commit plaintext มี secret จริงmeeting-vtrc-api/.envprod:1-9 (branch: prod-meeting-vtrc-api)Vol 7 · meeting-vtrc-api
SEC-MTVTRC-02meeting-vtrc-apiCritical/meeting/mockuser/one ไม่มี auth คืน PII hardcodemeeting-vtrc-api/routes/mockdelatlast/mockuser.ts:29-60 (branch: prod-meeting-vtrc-api)Vol 7 · meeting-vtrc-api
SEC-VTRC-API-05vtrc-apiHighcheckMenuAuth อ่าน role ผิดตัว เปิดช่อง cross-role escalation ในทางทฤษฎีvtrc-api/api/src/session/session.js:50-70Vol 3 · vtrc-api
SEC-VTRC-API-06vtrc-apiHighCORS misconfiguration — typo corss ทำให้ allowlist ไม่ทำงาน, เปิดทุก originvtrc-api/api/src/index.js:76-91Vol 3 · vtrc-api
SEC-VTRC-API-07vtrc-apiHighSQL injection ผ่าน string concat ใน statLog cronvtrc-api/api/src/lib/controllers/statLog/statLog.jsVol 3 · vtrc-api
SEC-BO-01vtrc-backofficeHighToken ไม่มีวันหมดอายุใน localStorage + XSS surface 20 ไฟล์ dangerouslySetInnerHTMLvtrc-backoffice/src/utils/auth.js:1-17Vol 4 · vtrc-backoffice
H1vtrc-rc-backofficeHighdangerouslySetInnerHTML 30 ไฟล์ ไม่มี sanitizerVol 4 · vtrc-rc-backoffice
H2vtrc-rc-backofficeHighAES key จาก REACT_APP_PRIVATE_KEY expose ใน bundleutils/cryptoJs.jsVol 4 · vtrc-rc-backoffice
H3vtrc-rc-backofficeHighToken เก็บใน localStorage/sessionStorage ทั้งหมดVol 4 · vtrc-rc-backoffice
H4vtrc-rc-backofficeHighapiKeyNews() hardcode UUID ตาม origin (prod/UAT)utils/apiKey.jsVol 4 · vtrc-rc-backoffice
S-1vtrc-webHighToken เก็บใน localStorage/sessionStorageutils/auth.js:4-35Vol 4 · vtrc-web
S-3vtrc-webHighAES key+IV เดียวกัน hardcoded สำหรับ "remember password"utils/auth.js:37-47Vol 4 · vtrc-web
S-4vtrc-webHighdangerouslySetInnerHTML ไม่มี sanitizer 20+ ไฟล์Vol 4 · vtrc-web
SEC-COMMON-02vtrc-commonHighSQL injection ผ่าน string interpolation ใน AddressRepositoryvtrc-common/src/modules/address/address.repository.ts:82-94,117-130Vol 6 · vtrc-common
SEC-CHAT-02chat-center-apiHighWebSocket chat event ไม่มี guard, flag fromline เชื่อจาก client ตรงchat-center-api/src/modules/chat/chat.gateway.ts:19-26,49-67Vol 6 · chat-center-api
SEC-CHAT-03chat-center-apiHighPOST /webhook (LINE) เป็น @Public() ไม่ verify signaturechat-center-api/src/app.controller.ts:18-22Vol 6 · chat-center-api
SEC-RCWEB-02recruitment-webHighPII ที่ decrypt แล้วเก็บใน localStorage ไม่มีวันหมดอายุ (expiry ถูก comment ปิด)recruitment-web/src/utils/localStorage.js:1-28Vol 9 · recruitment-web
SEC-RCWEB-03recruitment-webHighhandleLogin bypass OTP ด้วยค่าคงที่ 111111 — check ผูกกับ prod bundlerecruitment-web/src/components/header/index.js:230-231Vol 9 · recruitment-web
SEC-REPORTLOG-02report-logHigh.gitignore *.log ถูก comment ปิดโดยตั้งใจ — อนุญาตให้ commit log ซ้ำได้report-log/.gitignore:16-17Vol 9 · report-log
SEC-BENEFIT-03benefit-apiHighEndpoint เบิกค่ารักษาพยาบาลเป็น @Public() ทั้งชุดbenefit-api/src/modules/wdhospitals/wdhospitals.controller.ts:24-40 (branch: prod)Vol 6 · benefit-api
SEC-2WAYVTRC-042way-vtrc-apiHighJWT secret hardcoded ไม่มี env override, มี secret 2 ตัวไม่ตรงกันในระบบเดียว2way-vtrc-api/util/jwt.config.ts:2, checkbypasstoken.ts:65Vol 5 · 2way-vtrc-api
SEC-2WAYVTRC-052way-vtrc-apiHighSequelize dialect ตั้ง encrypt: false — เชื่อมต่อ MSSQL แบบไม่เข้ารหัส2way-vtrc-api/util/db.config.ts:8-11Vol 5 · 2way-vtrc-api
SEC-2WAYMTBO-012way-meeting-backofficeHighJWT เก็บที่ localStorage ไม่ใช่ httpOnly cookiesrc/utils/fetchApiWithAxios.tsx:8, src/HOC/withAuth.tsx:22Vol 5 · 2way-meeting-backoffice
SEC-2WAYMTBO-022way-meeting-backofficeHighRoute guard เป็น client-side check ล้วน ไม่ป้องกันก่อน bundle โหลดsrc/HOC/withAuth.tsx:19-73Vol 5 · 2way-meeting-backoffice
SEC-2WAYLINE-022way-line-serviceHighService ถูกเรียกจาก 2way-api ผ่าน hardcoded IP ไม่มี TLS/service discovery.env.example:5 (เทียบ 2way-api/src/modules/line/line.service.ts:76,86)Vol 5 · 2way-line-service
SEC-2WAYAPI-052way-apiHighverifyJwt() ตั้ง ignoreExpiration: true เสมอ — token ไม่หมดอายุจริงในการตรวจสอบ2way-api/src/modules/auth/auth.service.ts:31-40,339-357,290 (branch: prod)Vol 5 · 2way-api
SEC-2WAYAPI-062way-apiHighMSSQL connection ตั้ง encrypt: false2way-api/src/app.module.ts:39-42 (branch: prod)Vol 5 · 2way-api
SEC-MOBILE-03vtrc-mobileHighapiKey (device key) production hardcode ซ้ำ 3 จุดในซอร์ส พร้อม apiKey UAT ที่ comment ทิ้งไว้src/utils/fetch.js:43-45, src/constants/Authen.js:1-5, src/utils/login.js:49-52Vol 8 · vtrc-mobile
SEC-NEW-02new-vtrc-mobileHighaccessToken/refreshToken เก็บผ่าน AsyncStorage แบบ plain — regression จาก encrypted storage ของ vtrc-mobilesrc/redux/store.ts:13,20-25Vol 8 · new-vtrc-mobile
SEC-MTVTRC-03meeting-vtrc-apiHigh/meeting/secure/health-check/email อยู่ใต้ path "secure" แต่ไม่มี auth ส่งอีเมลจริงroutes/secure/meeting/health-check.ts:9-17Vol 7 · meeting-vtrc-api
SEC-MTBO-01meeting-backofficeHighX-API-Key hardcode ในซอร์ส frontend ที่ browser โหลดได้pages/[token].tsx:14-21Vol 7 · meeting-backoffice
SEC-MTBO-02meeting-backofficeHigh.env (URL จริงของ UAT backend) commit เข้า git.env:1-16Vol 7 · meeting-backoffice
SEC-VTRC-API-08vtrc-apiMediumJWT verify ไม่ระบุ algorithms — เปิดช่อง alg-confusion attackvtrc-api/api/src/lib/repositories/auth/auth.js:259-285Vol 3 · vtrc-api
M1vtrc-rc-backofficeMediumcheckLinkURL() ใช้ .includes() แทนการ parse origin จริงVol 4 · vtrc-rc-backoffice
M2vtrc-rc-backofficeMediumerrorLink (Apollo) ไม่มี queue/singleton สำหรับ token refreshVol 4 · vtrc-rc-backoffice
M3vtrc-rc-backofficeMediumไม่มี Content-Security-Policy meta/headerVol 4 · vtrc-rc-backoffice
M4vtrc-rc-backofficeMediumไม่มี CSRF tokenVol 4 · vtrc-rc-backoffice
M5vtrc-rc-backofficeMediumไม่มี Subresource Integrity (SRI) สำหรับสคริปต์ CDN ภายนอกVol 4 · vtrc-rc-backoffice
S-2vtrc-webMediumapiKey เข้ารหัส base64 ในบันเดิล ถอดได้ทันทีด้วย atob()utils/apiKey.js:1-12Vol 4 · vtrc-web
S-5vtrc-webMediumisShow เป็นเพียง UI flag ไม่ใช่ auth gate จริงconfig/routes.jsVol 4 · vtrc-web
S-6vtrc-webMediumConsole override ปิดการ debug productioncontainers/App/index.js:15Vol 4 · vtrc-web
S-8vtrc-webMediumไม่มี Content Security Policynginx-config/default.confVol 4 · vtrc-web
SEC-RCWEB-04recruitment-webMediumEmail/OTP ส่งผ่าน query string ของ GET request — ค่าถูก log ใน access logform-otp.js:51-52, header/index.js:74,232,266Vol 9 · recruitment-web
SEC-2WAYVTRC-062way-vtrc-apiMediumCORS wildcard * พร้อม Access-Control-Allow-Credentials: true ขัดแย้งกันในตัว2way-vtrc-api/app.ts:87-99Vol 5 · 2way-vtrc-api
SEC-OCRAPI-01vtrc-ocr-apiMediumCORS เปิดกว้างด้วยค่า default — config.cors ไม่ถูกใช้จริงvtrc-ocr-api/app.js:16Vol 9 · vtrc-ocr-api
SEC-MTVTRC-04meeting-vtrc-apiMediumTinify API key hardcode ในซอร์ส (จุดเรียกใช้ถูก comment)lib/Uploadimage.class.ts:5,29-30Vol 7 · meeting-vtrc-api
S-7vtrc-webLowGoogle Analytics ID เปิดเผยใน public HTMLpublic/index.html:33-38Vol 4 · vtrc-web

PERF — Performance (11 รายการ: High 1, Medium 10)

IDRepoSeverityคำอธิบายfile:lineSource
PERF-2WAYBATCH-012way-batchHighCron ทุก 10 วินาทีทำงานจริงแค่ log ข้อความเปล่า logic แจ้งเตือนจริงถูก comment ปิดsrc/crontab/survey/survey.task.service.ts:32-41Vol 5 · 2way-batch
PERF-VTRC-API-01vtrc-apiMediumexecSync block event loop ระหว่างสร้าง PDFvtrc-api/api/src/routes.js (5 call sites)Vol 3 · vtrc-api
PERF-CU-01cu-central-apiMediumไม่มี timeout/retry/circuit breaker ในทุก external integrationทุกไฟล์ integrationVol 3 · cu-central-api
PERF-BO-01vtrc-backofficeMediumไม่พบการใช้ React.lazy/route-level code splitting ที่ใดใน src/vtrc-backoffice/srcVol 4 · vtrc-backoffice
P-1vtrc-webMediumBundle ~12MB ไม่มี code splitting, PDF library ซ้อนกัน 4 ตัวVol 4 · vtrc-web
P-2vtrc-webMediumfetchPolicy: 'no-cache' เป็น default ทุก queryVol 4 · vtrc-web
P-3vtrc-webMediumSiderLayout query profile ทุกครั้งที่ reloadVol 4 · vtrc-web
P-4vtrc-webMediumไม่มี lazy loading รูปภาพVol 4 · vtrc-web
P-5vtrc-webMediumWebpack 4 (ไม่มี webpack 5 features)Vol 4 · vtrc-web
P-6vtrc-webMediumconsole.log กระจายหลายสิบจุดเพิ่มขนาดบันเดิลVol 4 · vtrc-web
P-7vtrc-webMediumPDF.js โหลด worker แยกเพิ่ม 1 requestVol 4 · vtrc-web

CORR — Correctness / data integrity (30 รายการ: Critical 1, High 20, Medium 8, Low 1)

IDRepoSeverityคำอธิบายfile:lineSource
CORR-CU-01cu-central-apiCriticallib/httpRequest.js import axios จริงแต่ package.json มีแต่ axois (typo) — crash ถ้า code path ถึงcu-central-api/main-api/src/lib/httpRequest.jsVol 3 · cu-central-api
CORR-VTRC-API-01vtrc-apiHighTransaction pattern ทั่วระบบไม่ทำงานจริง — {transaction: t} เป็น arg ที่ 3 ที่ Sequelize ไม่รับ (ซ้ำ 20+ ที่)vtrc-api/api/src/session/session.js:101-124Vol 3 · vtrc-api
CORR-VTRC-API-02vtrc-apiHighgetCurrentRoleUser signature mismatch — device argument ถูก dropvtrc-api/api/src/session/session.js:126Vol 3 · vtrc-api
CORR-VTRC-API-03vtrc-apiHighlimit cap ใน clouse.js ไม่ทำงาน (let limit ไม่มีค่าเริ่มต้น) — เปิดช่อง DoSvtrc-api/api/src/clouse.js:21-27Vol 3 · vtrc-api
CORR-CU-02cu-central-apiHighOTP inconsistency — hrAddress ปิด OTP, hrPhoneNumber ยังเปิดcu-central-api/main-api/src/resolvers/hr/hrAddress.jsVol 3 · cu-central-api
CORR-BO-02vtrc-backofficeHighLogin flow hardcode isRemember = 1 เสมอ — token ทุกตัวเก็บใน localStorage ไม่มีวันหมดvtrc-backoffice/src/pages/Login/index.js:45-78, LoginForm/index.js:1-21Vol 4 · vtrc-backoffice
CORR-BONEW-01vtrc-backoffice-newHighLogin flow hardcode isRemember = 1 เสมอ (สืบทอด bug จาก vtrc-backoffice)src/pages/Login/index.js:79 (branch: uat)Vol 4 · vtrc-backoffice-new
CORR-PMS-01pms-apiHighCron sync ทุก 1 นาทีไม่มีการป้องกัน overlapping executionusagePermission.service.ts:1928-1936 (branch: uat)Vol 6 · pms-api
CORR-AIRECRUIT-01ai-recruitment-apiHighSync mechanism ระหว่าง recruitment.jobReqPosition กับ recruitment_ai.jobReqPosition ไม่ปรากฏในโค้ดทั้งสอง repoดู 03-persistence (branch: prod)Vol 6 · ai-recruitment-api
CORR-WORKFLOW-01workflow-apiHighTypeORM ต่อตรงไปฐานข้อมูลของ service อื่น (vtrc, dbHRMI_Center, dbHRMI_Center_NBC, benefit) — distributed-monolithdatabase.module.ts:51-199 (branch: uat)Vol 6 · workflow-api
CORR-SSO-01sso-apiHighsignIn() ไม่ออก JWT ของตัวเอง (sign ถูก comment), JwtService ไม่ได้ injectapp.service.ts:27,143-191,220-223Vol 6 · sso-api
CORR-CHAT-01chat-center-apiHighนัดหมายแจ้งเตือนเป็น in-memory CronJob ต่อรายการ หายเมื่อ process restartappointment.service.ts:33-67 (branch: prod)Vol 6 · chat-center-api
CORR-CHAT-02chat-center-apiHighconnection main (MSSQL 2way) ตั้ง synchronize: true — auto-migrate ทุก bootconfig/configuration.ts:7-21Vol 6 · chat-center-api
CORR-RECRUIT-01recruitment-apiHighRace condition ตอนลด remainingManpower (read-then-write ไม่ atomic)contract.service.ts:740-763 (branch: prod)Vol 6 · recruitment-api
CORR-BENEFIT-01benefit-apiHighข้อมูล WdHospitals ซ้ำกัน 2 schema (benefit/vtrc) ไม่มี sync mechanism ที่ตรวจสอบได้wdHospitals.entity.ts, payments.service.ts:493-573 (branch: prod)Vol 6 · benefit-api
CORR-2WAYVTRC-012way-vtrc-apiHighInsert หลายตารางต่อเนื่อง (createIncident) ไม่มี Sequelize transactionroutes/TwoWayAPI/incident/createIncident.ts:38-151 (branch: prod)Vol 5 · 2way-vtrc-api
CORR-2WAYVTRC-022way-vtrc-apiHighMongoDB connection comment ปิดใน entrypoint แต่ chat feature ยังพึ่งพา Mongoose schemaapp.ts:10 (branch: prod)Vol 5 · 2way-vtrc-api
CORR-MOBILE-01vtrc-mobileHighConfig.MEETING_API hardcode ชี้ host UAT เสมอ ไม่มี branch สำหรับ prodsrc/config/index.js:12Vol 8 · vtrc-mobile
CORR-MTVTRC-01meeting-vtrc-apiHighrefreshtoken.ts route ไม่ถูก mount ใน app.ts (dead endpoint) + createToken() ไม่ persist ลง DBroutes/auth/refreshtoken.ts:5-19Vol 7 · meeting-vtrc-api
CORR-MTBO-01meeting-backofficeHighBASE_PATH env ตั้งใน compose แต่ next.config.js hardcode basePath: '/meetingbo' — env ไม่มีผลdocker-compose.yml:8, next.config.js:11-22Vol 7 · meeting-backoffice
CORR-MTBONEW-01meeting-backoffice-newHighทุกหน้าอ่าน env var REACT_APP_MEETING_API/REACT_APP_2WAY_API แต่ไม่มีไฟล์ .env/.env.example — fetch ไป undefined แบบเงียบsrc/pages/index.tsx:19Vol 7 · meeting-backoffice-new
CORR-VTRC-API-04vtrc-apiMediumgetCurrentProfileSession fallback ข้าม user — cross-user session leak ในกรณี edge casevtrc-api/api/src/session/session.js:214-228Vol 3 · vtrc-api
CORR-BO-01vtrc-backofficeMediumaxios-workforce.js มี unreachable code — return ผิดคืน endpoint localhost เสมอvtrc-backoffice/src/config/axios-workforce.js:5-8Vol 4 · vtrc-backoffice
CORR-SSO-02sso-apiMediumcatch block เข้าถึง error.response.data โดยไม่เช็ค error.response ก่อนapp.service.ts:184-189Vol 6 · sso-api
CORR-RCWEB-01recruitment-webMediumDockerfile ประกาศ ENV REACT_APP_* ที่ stage 2 (nginx) ซึ่งไม่มีผลจริง เพราะ CRA inline ตอน stage 1Dockerfile:1-21Vol 9 · recruitment-web
CORR-MTVTRC-02meeting-vtrc-apiMediumaddNewMeeting insert 4 ตาราง (bulkCreate แยกกัน) ไม่มี sequelize.transaction()routes/secure/meeting/meeting.ts:187-243Vol 7 · meeting-vtrc-api
CORR-MTVTRC-03meeting-vtrc-apiMediumsendMailToDelegate() มีอยู่แต่จุดเรียกใช้ถูก comment ออก — ตัวแทนไม่ได้รับแจ้งเตือนroutes/secure/meeting/acceptancemeeting.ts:125,342-370Vol 7 · meeting-vtrc-api
CORR-MTVTRC-04meeting-vtrc-apiMediumcron แจ้งเตือน (checkScheduleJob) ดึงเฉพาะงานของ "วันนี้" — พลาด backlog จากวันก่อนหน้าutil/helper/corn.email.helper.ts:19-47Vol 7 · meeting-vtrc-api
CORR-MTBO-02meeting-backofficeMediumหน้า index.tsx/listapprover ใช้ getStaticProps (SSG) ไม่มี revalidate — ข้อมูลค้างpages/index.tsx:29-49, pages/listapprover/index.tsx:29-49Vol 7 · meeting-backoffice
CORR-WORKFLOW-02workflow-apiLowenum ค่าคงที่ผสมเข้า raw SQL ด้วย string interpolation ปนกับ parameterized valueipd-batch.service.ts:1942-1948 (branch: uat)Vol 6 · workflow-api

LEG — Legacy / EOL / dependency (22 รายการ: Critical 1, High 8, Medium 12, Low 1)

IDRepoSeverityคำอธิบายfile:lineSource
LEG-CU-01cu-central-apiCriticalaxois typosquat ของ axios ใน package.json — npm reserve 0.0.1-security สำหรับ typosquat นี้cu-central-api/main-api/package.jsonVol 3 · cu-central-api
LEG-CU-02cu-central-apiHigherror-ex pin ไปที่ git URL แทน npm version — mutable ref ไม่มี hash protectionpackage.jsonVol 3 · cu-central-api
LEG-CU-03cu-central-apiHighldapjs ^2.2.0 — archived project ตั้งแต่ 2023package.jsonVol 3 · cu-central-api
LEG-CU-04cu-central-apiHighjsonwebtoken@8.5.1 — EOL, CVE-2022-23529 family มี patch ใน v9+package.jsonVol 3 · cu-central-api
LEG-CU-05cu-central-apiHighNode 12.18.3 + esm shim — Node 12 EOL เม.ย. 2022Dockerfile:1, package.jsonVol 3 · cu-central-api
LEG-CU-06cu-central-apiHighxlsx ^0.16.9 — SheetJS community มี prototype pollution CVE historypackage.jsonVol 3 · cu-central-api
LEG-MOBILE-01vtrc-mobileHighReact Native 0.63.2 + React 16.13.1 — เก่ากว่า 5 ปี ไม่ได้รับ security patch แล้วpackage.json:63-64Vol 8 · vtrc-mobile
LEG-MOBILE-02vtrc-mobileHighไม่มี runtime endpoint resolver — endpoint ประกาศซ้ำ 3 ไฟล์ที่ค่าไม่ตรงกันจริงsrc/config/index.js:1-15, src/constants/HostApi.js:1-36, src/utils/hostUrl.js:1-6Vol 8 · vtrc-mobile
LEG-FRONT-01vtrc-application-frontHighไฟล์ติดตั้ง iOS ที่ compile แล้ว (VTRC.ipa, binary) commit ตรงเข้า git โดยไม่มี build pipelinerepo root (git ls-files)Vol 8 · vtrc-application-front
LEG-VTRC-API-01vtrc-apiMediumPlayground + introspection เปิดใน productionvtrc-api/api/src/index.js:68-69Vol 3 · vtrc-api
LEG-BO-01vtrc-backofficeMediumDockerfile ไม่ build จาก source (FROM nginx:1.18 เท่านั้น) — พึ่งพา build/ ที่ commit ไว้ล่วงหน้าvtrc-backoffice/Dockerfile:1-2, docker-compose.yml:9-19Vol 4 · vtrc-backoffice
LEG-BO-02vtrc-backofficeMediumreact-scripts (CRA) คงที่ 3.4.3 — เก่ามาก (ปี 2020)vtrc-backoffice/package.json:40Vol 4 · vtrc-backoffice
LEG-BO-03vtrc-backofficeMediumAntD คงที่ v4.15.4 — อยู่ใน EOL branch ของ Ant Designvtrc-backoffice/package.json:11Vol 4 · vtrc-backoffice
LEG-BONEW-01vtrc-backoffice-newMediumreact-scripts (CRA) คงที่ 3.4.3 เหมือน vtrc-backofficepackage.json:40 (branch: uat)Vol 4 · vtrc-backoffice-new
LEG-BONEW-02vtrc-backoffice-newMediumAntD คงที่ v4.15.4 — EOL branchpackage.json:11 (branch: uat)Vol 4 · vtrc-backoffice-new
LEG-OCRAPI-01vtrc-ocr-apiMediumไม่มี test suite ใด ๆ — npm test เป็น placeholder ที่ exit 1package.json:9Vol 9 · vtrc-ocr-api
LEG-RCWEB-01recruitment-webMediumไฟล์แนบแปลงเป็น base64 ฝัง JSON แทน multipart upload แยก ตรวจ type/ขนาดเฉพาะ clientuploadForm.js:22-30, content.js:654-668,677-696Vol 9 · recruitment-web
LEG-BENEFIT-01benefit-apiMediumsftp-upload + ssh2-sftp-client สอง package ทำงานเดียวกัน (sftp-upload อาจไม่ได้ใช้แล้ว)package.json:57-58 (branch: prod)Vol 6 · benefit-api
LEG-2WAYVTRC-012way-vtrc-apiMediumรันด้วย ts-node app.ts ตรงใน production — ไม่มี build/compile steppackage.json:7Vol 5 · 2way-vtrc-api
LEG-2WAYMTBO-012way-meeting-backofficeMediumNext.js 12 (EOL), React 17 (EOL security patch ตามรอบ Next.js)package.json:44,47,49Vol 5 · 2way-meeting-backoffice
LEG-2WAYBATCH-012way-batchMediumDockerfile build ด้วย node:16-alpine ทั้งสองสเตจ — Node 16 EOL กันยายน 2023Dockerfile:1,15Vol 5 · 2way-batch
LEG-AIRECRUIT-01ai-recruitment-apiLowNode.js 18 (EOL กำลังใกล้) ต่างจาก Node 20 ที่ repo อื่นในกลุ่มใช้Dockerfile:1 (branch: prod)Vol 6 · ai-recruitment-api

QUAL — Code quality (99 รายการ: High 8, Medium 84, Low 7)

IDRepoSeverityคำอธิบายfile:lineSource
QUAL-CU-01cu-central-apiHighrequires directive arg ถูก comment ออก — ไม่มี RBAC จริงdirectives/auth.jsVol 3 · cu-central-api
QUAL-PMS-01pms-apiHighเอกสารระบบแจ้งเตือน (PMS-Period-Notification-System.md) ไม่ตรงกับโค้ดจริงdocs/PMS-Period-Notification-System.md (branch: uat)Vol 6 · pms-api
QUAL-AIRECRUIT-01ai-recruitment-apiHighDead code หลายไฟล์ที่ไม่ถูก mount เป็น routecontrollers/module2_1_get_background_v2.js และอื่น ๆ (branch: prod)Vol 6 · ai-recruitment-api
QUAL-OCRAPI-01vtrc-ocr-apiHighEndpoint หลัก (POST /api/ocr/process) ไม่มี OCR engine จริง คืน mock คงที่เสมอservices/ocr.service.js:26-34Vol 9 · vtrc-ocr-api
QUAL-OCRAPI-02vtrc-ocr-apiHighผลลัพธ์เก็บใน in-memory Map เท่านั้น — หายเมื่อ restartmodels/ocr.model.js:5, config/database.js:5-25Vol 9 · vtrc-ocr-api
QUAL-RECRUIT-01recruitment-apiHighTypeORM connection 2 ชุด (vtrc, workforce) ประกาศไว้แต่ไม่มีการใช้งานจริงapp.module.ts:42-53 (branch: prod)Vol 6 · recruitment-api
QUAL-BENEFIT-01benefit-apiHighLogic SQL builder ซ้ำกันหลายร้อยบรรทัดใน payments.service.ts (copy-paste 3 รอบ)payments.service.ts:488-573,640-720,1341-1427 (branch: prod)Vol 6 · benefit-api
QUAL-NEW-01new-vtrc-mobileHighrefreshToken() ยิงไปที่ URL ตัวอย่างจาก boilerplate ที่ยังไม่ถูกแทนที่src/utils/Auth.ts:8-17Vol 8 · new-vtrc-mobile
QUAL-VTRC-API-01vtrc-apiMediumOp.like บน JSON/TEXT column หลายจุด — substring collision risksession/session.js:31, centralize/controllers/graphql.js:31Vol 3 · vtrc-api
QUAL-VTRC-API-02vtrc-apiMediumDynamic model/table access (Models[table]) — injection risk ทางทฤษฎีexcel/excel.js, lib/model.jsVol 3 · vtrc-api
QUAL-VTRC-API-03vtrc-apiMediumFire-and-forget cron jobs — ไม่มี error handling, ไม่มี awaitcrons.js:20-22, fund/fund.js:926-928Vol 3 · vtrc-api
QUAL-VTRC-API-04vtrc-apiMediumawait arr.map(async ...) แบบไม่ Promise.all — parallel write ที่ไม่ถูก awaitdocument/documentDivision.js, career/careerDivision.jsVol 3 · vtrc-api
QUAL-VTRC-API-05vtrc-apiMediumDebug artifact ค้างในโค้ด — hardcoded path เครื่อง developer, artificial delayfile/zip.js:4, slip/slip.jsVol 3 · vtrc-api
QUAL-CU-02cu-central-apiMediumclockTolerance misuse — ใส่เป็น payload claim ไม่มีผลjwtToken.jsVol 3 · cu-central-api
QUAL-CU-03cu-central-apiMediumsignInDomains hardcoded 26-row org list — เพิ่ม org ต้อง deploy code ใหม่resolvers/authentication.jsVol 3 · cu-central-api
QUAL-BO-01vtrc-backofficeMediumroutes.js มีบล็อก route ซ้ำที่ comment ปิดทั้งกลุ่มจำนวนมาก (10+ module)vtrc-backoffice/src/config/routes.js:1118-1546Vol 4 · vtrc-backoffice
QUAL-BO-02vtrc-backofficeMediumมี checkLinkURL() สองตัวคนละไฟล์ชื่อเดียวกันแต่คืนค่าคนละรูปแบบvtrc-backoffice/src/utils/auth.js:50-64Vol 4 · vtrc-backoffice
QUAL-BO-03vtrc-backofficeMediumไฟล์ backup/legacy (*_bk*.js, *-prd.js) กระจายอยู่อย่างน้อย 41 ไฟล์src/pages/HospitalPaid/Payments/index_bk.js และอื่น ๆVol 4 · vtrc-backoffice
QUAL-BONEW-01vtrc-backoffice-newMediumDockerfile มี multi-stage build จริงแต่ docker-compose.yml ไม่ได้อ้างถึงเลยDockerfile:1-11, docker-compose.yml:1-19 (branch: uat)Vol 4 · vtrc-backoffice-new
QUAL-BONEW-02vtrc-backoffice-newMediumชื่อ network ใน compose ไม่มีคำ uat สลับกับที่คาดตามชื่อ repodocker-compose.yml:19 (branch: uat)Vol 4 · vtrc-backoffice-new
QUAL-BONEW-03vtrc-backoffice-newMediumไฟล์ src/config/appllo_bk.js มีอยู่ใน git แต่เนื้อหาเปล่า (0 บรรทัด)src/config/appllo_bk.js (branch: uat)Vol 4 · vtrc-backoffice-new
QUAL-PMS-02pms-apiMediumDockerfile build โดยไม่ล็อค lockfile (yarn install ไม่มี --frozen-lockfile)Dockerfile:19 (branch: uat)Vol 6 · pms-api
QUAL-PMS-03pms-apiMedium5 module ปรับเงินเดือนชื่อคล้ายกันมาก ไม่มีเอกสารอธิบายความสัมพันธ์salaryRange, salaryPercentage, salaryAdjust, salaryAdjustment, salaryAdjustToHRMI (branch: uat)Vol 6 · pms-api
QUAL-PMS-04pms-apiMediumThird-party AI service บน domain ภายนอก (vtrcsupport.com) รับข้อมูลผลประเมินcreateForm.service.ts:408 (branch: uat)Vol 6 · pms-api
QUAL-AIRECRUIT-02ai-recruitment-apiMediumHardcode สมมติฐานประชากร (ethnicity/age) ใน AI prompt โดยไม่มี configmodule2_2_controller.js:31-44 (branch: prod)Vol 6 · ai-recruitment-api
QUAL-WORKFLOW-01workflow-apiMediumAuditLogService มี fallback query หลายชุดจาก schema drift ระหว่าง environmentaudit-log.service.ts:120-160,232-266 (branch: uat)Vol 6 · workflow-api
QUAL-WORKFLOW-02workflow-apiMediumชื่อ repo (workflow-api) กับชื่อ package จริง (ai-pms-nest) ไม่ตรงกัน ครอบ 3 domain ที่ไม่เกี่ยวกันpackage.json:2,4 (branch: uat)Vol 6 · workflow-api
QUAL-WORKFLOW-03workflow-apiMediumdatabase/schema.sql ไม่ตรงกับ entity จริงที่ประกาศใน src/modules/embedding/entities/database/schema.sql:1-50 (branch: uat)Vol 6 · workflow-api
QUAL-WORKFLOW-04workflow-apiMediumไฟล์ service ขนาดใหญ่เกินจัดการ (2,753 / 2,527 / 1,398 บรรทัด)ipd-batch.service.ts, embedding.service.ts, health-program-config.service.ts (branch: uat)Vol 6 · workflow-api
QUAL-COMMON-01vtrc-commonMedium/testTumbol, /testTumbol2 ชื่อบอกว่าทดลองแต่เป็น production path จริงaddress.controller.ts:32-41Vol 6 · vtrc-common
QUAL-COMMON-02vtrc-commonMediumlibs/jwt, libs/log เหมือนกันไบต์ต่อไบต์กับ chat-center-api/job-scheduler-api (copy-paste ข้าม repo)เทียบ libs/jwt/jwt-auth.guard.tsVol 6 · vtrc-common
QUAL-SSO-01sso-apiMediumverifySession() เป็น stub คืนค่า { body } ตรง ไม่มี logic ตรวจสอบจริงapp.service.ts:220-223Vol 6 · sso-api
QUAL-SSO-02sso-apiMediumssoEndpoint/ssoUsername/ssoPassword/ssoAppId อ่านจาก process.env ตรง ไม่สม่ำเสมอกับ ConfigServiceapp.service.ts:22-25Vol 6 · sso-api
QUAL-JOBSCHED-01job-scheduler-apiMediumTypeOrmModule import แต่ไม่เคยถูกเรียกใช้ใน @Module({imports})app.module.ts:6,11-19Vol 6 · job-scheduler-api
QUAL-JOBSCHED-02job-scheduler-apiMedium.env ตั้ง BASE_PATH=benefit-api/, DB_NAME=benefit — copy จาก benefit-api ไม่ได้แก้.env:3,11Vol 6 · job-scheduler-api
QUAL-JOBSCHED-03job-scheduler-apiMediumไฟล์ log จริงจาก dev environment commit เข้า gitlogs/30-01-2023.logVol 6 · job-scheduler-api
QUAL-CHAT-01chat-center-apiMediumlibs/jwt, libs/log, libs/exception เหมือนกันไบต์ต่อไบต์กับ vtrc-common, job-scheduler-apiเทียบ libs/jwt/jwt-auth.guard.tsVol 6 · chat-center-api
QUAL-CHAT-02chat-center-apiMediumconsole.log debug + บล็อกโค้ด comment ทิ้งไว้จำนวนมากในระดับ servicechat.gateway.ts:59,73-74, chat.service.ts:38,54,100Vol 6 · chat-center-api
QUAL-OCRAPI-03vtrc-ocr-apiMediummiddleware/error.middleware.js export ครบแต่ app.js ไม่ import ใช้ — เขียน error handler ซ้ำ inlinemiddleware/error.middleware.js:2-29, app.js:57-64Vol 9 · vtrc-ocr-api
QUAL-OCRAPI-04vtrc-ocr-apiMediumutils/response.js helper มีให้ใช้แต่ controller ทุกตัวเขียน response เองตรงutils/response.js:1-27Vol 9 · vtrc-ocr-api
QUAL-OCRAPI-05vtrc-ocr-apiMediumไม่มี .env.example ใน repo — ไม่มีหลักฐานยืนยันชื่อ/ค่า env variable ทั้งหมดVol 9 · vtrc-ocr-api
QUAL-RCWEB-01recruitment-webMediumDead code src/api/login.js, src/api/index.js — ไม่มี component ใด import ใช้src/api/login.js:1-53, src/api/index.js:1-6Vol 9 · recruitment-web
QUAL-RCWEB-02recruitment-webMediumutils/axios.js interceptor ตั้งชื่อพารามิเตอร์ผิด + CORS header ที่ไม่มีผล (dead code)src/utils/axios.js:8-15Vol 9 · recruitment-web
QUAL-RCWEB-03recruitment-webMediumtypo env var REACT_APP_RECAPTCHA_SITE_KET (ควรเป็น KEY) สอดคล้องกันทั้ง 3 จุด.env:13, .env.uat:8, content.js:1355Vol 9 · recruitment-web
QUAL-RCWEB-04recruitment-webMediumLogic decrypt PII ~25 field เขียนซ้ำแทบคำต่อคำใน 2 ที่header/index.js:104-148, content.js:492-537Vol 9 · recruitment-web
QUAL-REPORTLOG-01report-logMediumusers.json array UUID 9,485 รายการไม่มี header/context อธิบายusers.json:1-9485, app.js:111,124Vol 9 · report-log
QUAL-REPORTLOG-02report-logMediumapp.js เป็นสคริปต์เฉพาะกิจ hardcode ช่วงวันที่/path output, export code comment ปิดapp.js:4,211,221-229Vol 9 · report-log
QUAL-RECRUIT-02recruitment-apiMediumWORKFORCE_COMMON_SERVER/VTRC_COMMON_SERVER ชี้ dev URL ใน production .env.env:41 (branch: prod)Vol 6 · recruitment-api
QUAL-RECRUIT-03recruitment-apiMediumBusiness rule ผูกกับ client string โดยไม่มี TypeScript enum บังคับcandidate.service.ts:456,491-504 (branch: prod)Vol 6 · recruitment-api
QUAL-BENEFIT-02benefit-apiMediumvalidateData() เป็น stub คืนค่า true เสมอ ไม่ตรวจสอบอะไรจริงdisaster.service.ts:361-366 (branch: prod)Vol 6 · benefit-api
QUAL-BENEFIT-03benefit-apiMediumdocType เป็น magic number (1-5) ไม่มี enum กลาง กระจายทั่ว 3 servicepayments.service.ts, approvedisaster.service.ts, disbursement.service.ts (branch: prod)Vol 6 · benefit-api
QUAL-2WAYVTRC-012way-vtrc-apiMediumโค้ดตัวอย่าง/mock สไตล์ tutorial ยัง mount อยู่ที่ path production จริงapp.ts:110-113, routes/TwoWayAPI/index.ts:196-259 (branch: prod)Vol 5 · 2way-vtrc-api
QUAL-2WAYVTRC-022way-vtrc-apiMediumชื่อ package คือ "express" v1.0.0 ไม่เคยถูกแก้ไขให้ตรงกับ repopackage.json:2-3 (branch: prod)Vol 5 · 2way-vtrc-api
QUAL-2WAYMTBO-012way-meeting-backofficeMediumชื่อ repo ("meeting-backoffice") ทำให้เข้าใจผิดว่าเกี่ยวกับระบบประชุม — จริงคือ backoffice ของ 2wayยืนยันจาก src/features/2way/*Vol 5 · 2way-meeting-backoffice
QUAL-2WAYMTBO-022way-meeting-backofficeMediumฟังก์ชันเรียก API ทุกไฟล์ catch error แล้ว console.log เฉย ๆ ไม่ throw ต่อservices/surveys.tsx:8-10,17-19,44-45, utils/fetchApiWithAxios.tsx:35-40Vol 5 · 2way-meeting-backoffice
QUAL-2WAYMTBO-032way-meeting-backofficeMediumgetChatDetail() hardcode roomEmpCode เป็นค่าคงที่ ไม่รับพารามิเตอร์จริงservices/chat-center.tsx:6Vol 5 · 2way-meeting-backoffice
QUAL-2WAYMTBO-042way-meeting-backofficeMediumMaterial-UI v4 และ MUI v5 ใช้ปนกันในโปรเจกต์เดียวpackage.json:23,25Vol 5 · 2way-meeting-backoffice
QUAL-2WAYLINE-012way-line-serviceMediumdependency + entity/DTO ของ TypeORM/MSSQL ครบชุดแต่ AppModule ไม่ได้ตั้ง TypeOrmModule เลยapp.module.ts:9-16Vol 5 · 2way-line-service
QUAL-2WAYLINE-022way-line-serviceMediumenv CENTRALIZE_SERVER ประกาศแต่ไม่มีการเรียกใช้ในซอร์สโค้ดเลย.env.example:16Vol 5 · 2way-line-service
QUAL-2WAYLINE-032way-line-serviceMediumไฟล์ scratch/note (endpoint.txt, lineText.text) commit ไว้ใน root repoendpoint.txt, lineText.textVol 5 · 2way-line-service
QUAL-2WAYBATCH-012way-batchMediumโฟลเดอร์ module มีไฟล์ controller/service ครบชุดแต่ไม่ได้ import เข้า AppModuleapp.module.ts:37-42Vol 5 · 2way-batch
QUAL-2WAYBATCH-022way-batchMediumไม่มีไฟล์ .env.example ใน repo (ผิดกับ repo อื่นในกลุ่มเดียวกัน)Vol 5 · 2way-batch
QUAL-2WAYAPI-012way-apiMediumมีโมดูลซ้ำที่สร้างไว้แต่ไม่ได้ต่อสายเข้า AppModule (โค้ดค้างจาก refactor)app.module.ts:1-19 (branch: prod)Vol 5 · 2way-api
QUAL-2WAYAPI-022way-apiMediumAppModule (root) import ตัวเองเข้าไปใน imports array ของตัวเองapp.module.ts:46 (branch: prod)Vol 5 · 2way-api
QUAL-2WAYAPI-032way-apiMediumconsole.log ปนกับ I3GatewayLogger กระจายทั่ว service layer รวม log ที่อาจมี PIIannounces.service.ts:56,94,112,289 (branch: prod)Vol 5 · 2way-api
QUAL-2WAYAPI-042way-apiMediumNode engine ที่ประกาศ (>=18.0.0) ไม่ตรงกับ Dockerfile.prod ที่ใช้ node:16-alpinepackage.json:27, Dockerfile.prod:1Vol 5 · 2way-api
QUAL-2WAYAPI-052way-apiMediumPackage manager ไม่สอดคล้อง — มีทั้ง yarn.lock และ package-lock-prod.jsonyarn.lock, package-lock-prod.jsonVol 5 · 2way-api
QUAL-2WAYAPI-062way-apiMediumLineService เรียก IP-address ตรงแทนอ่านจาก config/envline.service.ts:76,86 (branch: prod)Vol 5 · 2way-api
QUAL-MOBILE-01vtrc-mobileMediumชื่อไฟล์ typo Merdical/witchdraw ฝังลงชื่อไฟล์/route/function 20+ จุดsrc/containers/MerdicalExpensesApprove.js, src/components/witchdraw/Vol 8 · vtrc-mobile
QUAL-MOBILE-02vtrc-mobileMediumAutomated test มีเพียงไฟล์ default smoke test จาก RN CLI template__tests__/App-test.js:1-14Vol 8 · vtrc-mobile
QUAL-MOBILE-03vtrc-mobileMediumNavigation library (react-native-router-flux) ไม่มี release ใหม่มาหลายปีpackage.json:99, App.js:227-1062Vol 8 · vtrc-mobile
QUAL-MOBILE-04vtrc-mobileMediumชื่อ internal package (rn_redcross) เป็นชื่อตอน scaffold ที่ไม่เคยถูกเปลี่ยนpackage.json:2, app.json:1-4Vol 8 · vtrc-mobile
QUAL-MOBILE-05vtrc-mobileMediumมี async-action สอง pattern คู่ขนาน (features/*Slice.js จริง กับ actions/*Slice.js ที่ไม่ใช่ slice จริง)authSlice.js:79-252, actions/ssoSlice.js:1-30Vol 8 · vtrc-mobile
QUAL-NEW-02new-vtrc-mobileMediumค่า host default เป็น UAT ไม่ใช่ prod พร้อม prod ที่ comment ทิ้งไว้src/constants/HostAPI.ts:1-18Vol 8 · new-vtrc-mobile
QUAL-NEW-03new-vtrc-mobileMediumรหัสผ่านผู้ใช้ (เข้ารหัส RSA) ถูกเก็บไว้ใน redux state ที่ persist โดยไม่จำเป็นชัดเจนsrc/features/auth/authSlice.ts:11-22,28-35Vol 8 · new-vtrc-mobile
QUAL-NEW-04new-vtrc-mobileMediumชื่อ internal package/app (MyNewProject) เป็นชื่อ scaffold เริ่มต้นที่ไม่เคยถูกเปลี่ยนapp.json:1-4, package.json:2Vol 8 · new-vtrc-mobile
QUAL-NEW-05new-vtrc-mobileMediumCheckEmpCode screen มีไฟล์ครบแต่ import ถูก comment ปิดใน AuthNavigatorsrc/navigation/AuthNavigator.tsx:5,12Vol 8 · new-vtrc-mobile
QUAL-FRONT-01vtrc-application-frontMediumเลขเวอร์ชันที่แสดงในหน้าเว็บเป็นข้อความ hardcode ต้องแก้มือทุกครั้งที่ปล่อยเวอร์ชันใหม่index.html:47Vol 8 · vtrc-application-front
QUAL-FRONT-02vtrc-application-frontMediumQR code image 3 ไฟล์ยังอยู่ใน repo แต่ tag ที่อ้างถึงถูก comment ปิดindex.html:66-69Vol 8 · vtrc-application-front
QUAL-MTVTRC-01meeting-vtrc-apiMediummongoose dependency ประกาศ+require แต่ไฟล์เชื่อมต่อถูก comment — ขัดสมมติฐานเดิมว่าเป็น "Express + Mongoose"app.ts:8, util/mongo.config.ts:1-14, util/db.config.ts:1-6Vol 7 · meeting-vtrc-api
QUAL-MTVTRC-02meeting-vtrc-apiMediummodel/login.ts นิยามตาราง user/user_group สไตล์เกม ไม่พบ route อ้างถึงตรงmodel/login.ts:1-122Vol 7 · meeting-vtrc-api
QUAL-MTVTRC-03meeting-vtrc-apiMediumสองไฟล์ emailsender.ts/Emailsender.func.ts ต่างกันแค่ตัวพิมพ์ใหญ่-เล็ก เสี่ยง case-sensitive filesystemutil/helper/emailsender.ts:4Vol 7 · meeting-vtrc-api
QUAL-MTVTRC-04meeting-vtrc-apiMediumทั้ง repo สะกด "cron" เป็น "corn" ทุกที่ — เป็น public API path แล้ว ห้ามแก้ครั้งเดียวcorn-job/, routes/secure/meeting/corn-email.tsVol 7 · meeting-vtrc-api
QUAL-MTVTRC-05meeting-vtrc-apiMediumไม่มีไฟล์ Dockerfile แต่ docker-compose.yml สั่ง build: context: .docker-compose.yml:6-11Vol 7 · meeting-vtrc-api
QUAL-MTBO-01meeting-backofficeMediumpackage.json name/version เป็น "reportmonitor"/"5.0.0" ไม่สัมพันธ์กับแอปจริงpackage.json:2-3Vol 7 · meeting-backoffice
QUAL-MTBO-02meeting-backofficeMediumtypescript.ignoreBuildErrors: true — production build ผ่านแม้มี type error จริงnext.config.js:11-19Vol 7 · meeting-backoffice
QUAL-MTBO-03meeting-backofficeMediumDockerfile:20 รัน CMD ["yarn","dev"] — คอนเทนเนอร์ production รัน Next.js dev serverDockerfile:1-20Vol 7 · meeting-backoffice
QUAL-MTBO-04meeting-backofficeMediumSidebar มีเมนูแค่ 2 รายการ แต่มีหน้าอื่นที่ใช้งานได้จริงเข้าถึงได้แค่ผ่าน URL ตรงsrc/layouts/Sidebar.tsx:41-63Vol 7 · meeting-backoffice
QUAL-MTBO-05meeting-backofficeMediumpublic/locales/de/ มีไฟล์แปลภาษาเยอรมันเต็มชุด — ซากจาก starter templatepublic/locales/de/*.jsonVol 7 · meeting-backoffice
QUAL-MTBONEW-01meeting-backoffice-newMediumโฟลเดอร์ build/ (webpack bundle + sourcemap) commit ตรงเข้า git แทนให้ CI generatebuild/static/js/main.633a23c6.jsVol 7 · meeting-backoffice-new
QUAL-MTBONEW-02meeting-backoffice-newMediumไม่มี @sentry/* หรือเครื่องมือ error-tracking ใด ๆpackage.json:6-27Vol 7 · meeting-backoffice-new
QUAL-MTBONEW-03meeting-backoffice-newMediumdocker-compose.yml ไม่ตรงกับวิธี deploy จริง (static build ถูกฝังใน vtrc-backoffice ด้วยมือ)docker-compose.yml:1-9Vol 7 · meeting-backoffice-new
QUAL-BONEW-04vtrc-backoffice-newLow2 เมนู (WorkForce Org, Attendance abstainTime) ถูก comment ปิดโดยไม่มีคำอธิบายsrc/config/routes.js:272-295,718-743 (branch: uat)Vol 4 · vtrc-backoffice-new
QUAL-PMS-05pms-apiLowTODO ค้างอยู่ 1 จุด — business logic ที่ยังไม่ยืนยันสมบูรณ์salaryAdjust.service.ts:127 (branch: uat)Vol 6 · pms-api
QUAL-PMS-06pms-apiLowTypo ในชื่อ entity (periodExtesnd ควรเป็น periodExtend) กลายเป็นชื่อตารางถาวรแล้วentities/periodExtesnd.entity.ts (branch: uat)Vol 6 · pms-api
QUAL-AIRECRUIT-03ai-recruitment-apiLowไฟล์ภาพ 300+ ไฟล์ commit อยู่ใน repo แทนเก็บที่ object storagestorage-uploads/ (branch: prod)Vol 6 · ai-recruitment-api
QUAL-RECRUIT-04recruitment-apiLowejs template สำรอง/เก่าหลายไฟล์ (.bak.ejs, _old.ejs) commit ปนกับไฟล์ที่ใช้จริงlibs/pdfTemplate/announcement/qualified-exam_old.ejs และอื่น ๆ (branch: prod)Vol 6 · recruitment-api
QUAL-BENEFIT-04benefit-apiLowไฟล์ผู้ใช้จริง (ภาพประกอบการเบิกภัยพิบัติ) commit อยู่ใน uploads/ ตั้งแต่ปี 2023uploads/disaster/2023-02-27/*.png (branch: prod)Vol 6 · benefit-api
QUAL-BENEFIT-05benefit-apiLowBase entity สองตัว (base.ts, baseBenefit.entity.ts) ทำหน้าที่ซ้ำกันเกือบหมดentities/base.ts, baseBenefit.entity.ts (branch: prod)Vol 6 · benefit-api

OBS — Observability (24 รายการ: High 2, Medium 21, Low 1)

IDRepoSeverityคำอธิบายfile:lineSource
OBS-VTRC-API-01vtrc-apiHighPII logging — userRole, device token, request/response ถูก log เต็มรูปแบบsession/session.js:147, firebase/firebasePushNotification.jsVol 3 · vtrc-api
OBS-PMS-01pms-apiHighCron error handling แบบ silent — ไม่มี alert ต่อเมื่อ job ล้มเหลวconfigNotification.controller.ts:33-40 (branch: uat)Vol 6 · pms-api
OBS-VTRC-API-02vtrc-apiMediumRedis caching layer ตายทั้งระบบ — bug (tr undefined) ที่ทุก caller ถูก comment ไว้redis.controller.js:16Vol 3 · vtrc-api
OBS-VTRC-API-03vtrc-apiMediumไม่มี structured logging, tracing ID, health check, graceful shutdownwlog.js, logging.js, index.jsVol 3 · vtrc-api
OBS-CU-01cu-central-apiMediumdbHRMI_test dead connection — เปิด pool 100 session ทุก boot โดยไม่มี model ผูกconnector.jsVol 3 · cu-central-api
OBS-BO-01vtrc-backofficeMediumconsole.log/warn/error ถูก override เป็น no-op ทุกครั้งที่ App mountcontainers/App/index.js:14Vol 4 · vtrc-backoffice
OBS-BONEW-01vtrc-backoffice-newMediumconsole.log = console.warn = console.error = () => {} override เหมือน vtrc-backoffice ทุกประการsrc/containers/App/index.js:14 (branch: uat)Vol 4 · vtrc-backoffice-new
OBS-PMS-02pms-apiMediumconsole.log มากที่สุดในกลุ่ม (111 จุด) แม้จะถูก no-op ใน prodmain.ts:16-18 (branch: uat)Vol 6 · pms-api
OBS-AIRECRUIT-01ai-recruitment-apiMediumไม่มี test suite เลยทั้ง repo (ไม่พบไฟล์ .test.js/.spec.js แม้แต่ไฟล์เดียว)— (branch: prod)Vol 6 · ai-recruitment-api
OBS-AIRECRUIT-02ai-recruitment-apiMediumconsole.log ใช้เป็น logger หลักในหลายจุดแทน logger.js ที่มีอยู่แล้วroutes/index.js:26,41-48 (branch: prod)Vol 6 · ai-recruitment-api
OBS-COMMON-01vtrc-commonMediumเอกสาร workspace-level อธิบาย vtrc-common ผิดว่าเป็น "shared library" ทั้งที่เป็น standalone microserviceดู 02-core-pipelineVol 6 · vtrc-common
OBS-SSO-01sso-apiMediumไม่มี Dockerfile, docker-compose.yml, .env/.env.example, หรือไฟล์ CI ใดเลย— (branch: master)Vol 6 · sso-api
OBS-JOBSCHED-01job-scheduler-apiMediumDockerfile ประกาศ EXPOSE 3000 แต่พอร์ตจริงตาม .env/compose คือ 9900Dockerfile:24Vol 6 · job-scheduler-api
OBS-CHAT-01chat-center-apiMediumไม่มี docker-compose.yml หรือไฟล์ manifest การ deploy ใน repo— (branch: prod)Vol 6 · chat-center-api
OBS-OCRAPI-01vtrc-ocr-apiMediumHealth check ตรวจแค่ process.uptime()/memoryUsage() ไม่ตรวจ dependency จริงservices/health.service.js:1-24Vol 9 · vtrc-ocr-api
OBS-REPORTLOG-01report-logMediumไม่มี error handling ใด ๆ ใน IIFE หลักหรือ readData/setDataapp.js:85-88,208-219Vol 9 · report-log
OBS-RECRUIT-01recruitment-apiMediumconsole.log ปนกับ structured logger (71 จุดทั่ว repo)— (branch: prod)Vol 6 · recruitment-api
OBS-BENEFIT-01benefit-apiMediumconsole.log ปนกับ I3GatewayLogger — log payload เต็มรวม PII ออกไปที่ production stdoutpayments.service.ts:82,85,90,145,265... (branch: prod)Vol 6 · benefit-api
OBS-BENEFIT-02benefit-apiMediumไม่มี health check endpoint เฉพาะ แม้ import TerminusModule ไว้แล้วapp.module.ts:34 (branch: prod)Vol 6 · benefit-api
OBS-2WAYMTBO-012way-meeting-backofficeMediumชื่อ env variable ไม่สื่อความหมายตรงปลายทางจริง (appConnectChatAPI ไม่ได้เชื่อม chat-center)next.config.js env blockVol 5 · 2way-meeting-backoffice
OBS-MOBILE-01vtrc-mobileMediumไม่มี crash reporting/error tracking SDK ใด ๆ — auth flow สำคัญ catch error แล้วไม่รายงานauthSlice.js:423-425,613-624,662-673Vol 8 · vtrc-mobile
OBS-MTVTRC-01meeting-vtrc-apiMediumSentry DSN hardcode ตรงในซอร์สไม่ผ่าน env — ผูกทุก environment เข้า project เดียวกันapp.ts:80Vol 7 · meeting-vtrc-api
OBS-MTBONEW-01meeting-backoffice-newMediumทั้ง repo มีแค่ 6 commit ทั้งหมดในวันเดียว ข้อความ commit กว้าง ๆ ไม่มี ticket referencegit log --onelineVol 7 · meeting-backoffice-new
OBS-RECRUIT-02recruitment-apiLowTest coverage กระจุกอยู่เฉพาะบางโมดูล (24 ไฟล์ .spec.ts) — ไม่ยืนยันความลึกของ assertion— (branch: prod)Vol 6 · recruitment-api

ไป ดูจัดกลุ่มตาม Category หรือ ดูจัดกลุ่มตาม Severity