Skip to content

11.3 · vtrc-api GraphQL catalog

บทนี้รวบรวม GraphQL operations ทั้งหมดของ vtrc-api — 265 operations ใน 44 typeDefs files — จัดกลุ่มตาม domain พร้อม signature ตัวอย่าง


ภาพรวม

ตัวเลขค่า
TypeDefs files44
Resolver files42
รวม operations (Query + Mutation)~265
Subscription0
Custom scalars5 (Date, JSON, input, Upload, Decimal)
Custom directives1 (@auth)

Root schema

3:18:typeDefs/root.js
export default gql`
  directive @auth(accessRole: [String], accessMenu: [String]) on FIELD_DEFINITION
  scalar Date
  scalar JSON
  scalar input
  scalar Upload
  scalar Decimal
  
  type Query {
    _: String
  }

  type Mutation {
    _: String
  }`

Operations ต่อ domain — 15 อันดับแรก

DomainTypeDefs fileOps@auth usages
Leave / Medical (HRMI)hrmi.js3015
Hospital WithdrawwdHospital.js2324
User / Accountuser.js178
Bankbank.js1617
Documentsdocument.js157
Provident FundprovidentFund.js142
Reference DatareferenceData.js1417
Study Leave RequeststudyLeaveRequest.js122
Contact UscontactUs.js128
Payroll / Tax Slipslip.js1110
Notificationnotification.js106
Authenticationauthentication.js92
News / Postpost.js86
Master DatamasterData.js84
Bank AccountbankAccount.js7

และอีก 29 files ขนาดเล็ก (profile, career, course, organization, role, ...)


Operations แบบจัดกลุ่มตามฟังก์ชัน

1. Authentication (9 ops) — authentication.js

OperationประเภทAuthความหมาย
loginMutationlogin สำหรับ user
loginBackofficeMutationlogin สำหรับ backoffice
loginBypassMutationlogin สำหรับ dev/admin bypass
logoutMutationlogout
forceLogingMutationforce login (admin)
refreshTokenQueryขอ token ใหม่
generateCaptchaQueryขอ captcha
verifyEmpCodeLoginQueryตรวจ empCode ก่อน login
fetchAuthSessionMoblieQueryดึง session (typo: Moblie)

ตัวอย่าง signature — login

25:41:typeDefs/authentication.js
    login(
      lsid: ID!
      password: String!
      clientInfo: ClientInfo!
      apiKey: String!
      organization: ID!
    ) : Auth

lsid = login session ID (จาก verifyEmpCodeLogin), clientInfo = device info (OS, browser, IP)

2. User / Account (17 ops) — user.js

OperationประเภทAuthความหมาย
getUserQueryดึง user ทั่วไป
accordingProfileQueryดึง profile ตามเงื่อนไข
fetchEmployeeDetailQueryรายละเอียดพนักงาน
forgetPasswordMutationลืมรหัสผ่าน
checkSMSforgetPasswordMutationตรวจ SMS สำหรับ forget
createUserMutationสร้าง user (public)
resetPasswordMutationreset รหัสผ่าน
searchUserQueryค้นหา user
updatePublicDeviceTokenMutationอัปเดต device token
+ 8 operations อื่น ๆ@authจัดการ user + role

3. Profile (3 ops) — profile.js

4:19:typeDefs/profile.js
  extend type Query {
    fetchProfile: Profile @auth(accessRole: ["USER","SUPER_ADMIN","ADMIN","STAFF"])
    fetchEmployeeProfile: EmployeeProfile @auth(accessRole: ["USER"])
    fetchEmployeeBankAccount: [EmployeeBookBank] @auth(accessRole: ["USER"])
    fetchEmployeeProvidentFund: EmployeeProvidentFund @auth(accessRole: ["USER"])

4. Leave / Medical (HRMI) — 30 ops — hrmi.js

เป็น domain ใหญ่ที่สุด — ครอบคลุมการลา, ประวัติการรักษา, ตรวจสอบสิทธิ์

Query ตัวอย่าง — fetchMedicalExpensesLicensee

3:29:typeDefs/hrmi.js
  extend type Query {
    fetchMedicalExpensesLicensee ( empCode:String ): [MedicalData] @auth(accessRole: ["USER"])
    ...
    fetchLeaveType(
      empCode: String
      isReqByEmp: Boolean!
    ): [LeaveTypeData] @auth(accessRole: ["USER"])

Mutation ตัวอย่าง — สร้างเอกสารลา

graphql
createLeaveDocument(
  empCode: String
  documentDate: Date!
  leaveTypeId: ID!
  leaveStartDate: Date!
  leaveEndDate: Date!
  durationType: DurationType!
  leaveDay: Float!
  description: String!
  approveStatus: ApproveStatus!
  ...
): LeaveDocument @auth(accessRole: ["USER"])

5. Hospital Withdraw (Welfare) — 23 ops — wdHospital.js

ระบบเบิกค่ารักษาพยาบาล

Query — fetchListWDHospital

5:27:typeDefs/wdHospital.js
    fetchListWDHospital(
      wdHospitalId: ID
      empFirstName: String
      ...
      searchType: SearchDetailType!
    ): [WDHospital] @auth(accessRole: ["USER"])

Mutation — createWDHospital (มี accessMenu)

183:258:typeDefs/wdHospital.js
  extend type Mutation {
    createWDHospital ( 
      empCode: String
      ...
      cashFlg: String
    ) : ResposeStatus @auth(accessRole: ["SUPER_ADMIN","ADMIN","STAFF"], accessMenu: ["hospitalHr"])

6. Payroll / Tax Slip — 11 ops — slip.js

5:16:typeDefs/slip.js
    fetchSlip(
      identityCard: String!
      month: String!
      year: String!
      profileKey: String
      typeSlip: String
    ): Slip! @auth(accessRole: ["USER"])

7. Provident Fund — 14 ops — providentFund.js

4:52:typeDefs/providentFund.js
  extend type Query {
    ...
    fetchListFundBenefitPerson(
      searchKeyword: String
      startDate: Date
      endDate: Date
      status: RequestFundStatus
    ): [ListFundBenefitPerson]

8. Documents — 15 ops — document.js

5:24:typeDefs/document.js
    fetchListPostBackoffice(
      postId: ID 
      type: [Type] 
      status: String
      order: String
      offset: Int 
      limit: Int
      search: SearchPost
      category: CatType
    ): ListPostBackoffice @auth(accessRole: ["SUPER_ADMIN","ADMIN","STAFF"])

9. News / Post — 8 ops — post.js

4:13:typeDefs/post.js
  extend type Query {
    fetchListPost(
      postId: ID 
      type: String 
      status: String 
      offset: Int 
      limit: Int 
      search: String
      category: CatType
    ): ListPost

10. Bank / Bank Account — 23 ops

FileOpsหน้าที่
bank.js16ธนาคาร, สาขา
bankAccount.js7บัญชีธนาคารของพนักงาน

11. Notification — 10 ops — notification.js

การแจ้งเตือนในแอป + push notification

12. Study Leave — 19 ops

FileOpsหน้าที่
studyLeave.js7การลาศึกษา
studyLeaveRequest.js12คำขอลาศึกษา

13. Contact Us — 12 ops — contactUs.js

ระบบติดต่อสอบถาม

14. Organization — 11 ops

FileOpsหน้าที่
organization.js5หน่วยงาน
organizationGroup.js6กลุ่มหน่วยงาน

15. Misc domains

DomainFileOps
Careercareer.js6
Coursecourse.js6
Rolerole.js + roleAccess.js5
Addressaddress.js4
Verificationverification.js6
Consentconsent.js2
Delegatedelegate.js2
Tax DrafttaxDraft.js3
Child TuitionchildTuition.js2
Conicleconicle.js3
Policypolicy.js1
Time AttendancetimeAttendance.js1
Versionversion.js1

@auth directive — coverage

จาก 265 operations:

สถานะจำนวน (ประมาณ)หมายเหตุ
มี @auth~190ต้อง JWT + session
ไม่มี @auth (public)~75ใครมี apiKey ก็เรียกได้

Public operations ที่น่าสนใจ

  • login, loginBackoffice, loginBypass — ต้อง public (จะได้ token ออกมา)
  • refreshToken, generateCaptcha — public
  • createUser, forgetPassword, resetPassword — public (self-registration)
  • fetchListPost (news) — public (แสดงข่าวโดยไม่ login)
  • fetchLeaveDocumentList (HRMI) — public (ใช้ใน flow ก่อน login)

ตัวอย่าง operation ที่ใช้บ่อย

fetchProfile — ข้อมูลผู้ใช้ปัจจุบัน

graphql
query {
  fetchProfile {
    id
    firstName
    lastName
    email
    role { id name }
    organization { id name }
  }
}

fetchSlip — สลิปเงินเดือน

graphql
query {
  fetchSlip(
    identityCard: "1234567890123"
    month: "07"
    year: "2569"
    typeSlip: "salary"
  ) {
    income { code name amount }
    deduct { code name amount }
    netPay
  }
}

createLeaveDocument — สร้างใบลา

graphql
mutation {
  createLeaveDocument(
    empCode: "12345"
    documentDate: "2026-07-10"
    leaveTypeId: 1
    leaveStartDate: "2026-07-15"
    leaveEndDate: "2026-07-16"
    durationType: DAY
    leaveDay: 2
    description: "ลากิจ"
    approveStatus: WAITING
  ) {
    id
    documentNo
  }
}

Resolver → Controller → Repository

แต่ละ operation มี layering คือ:

GraphQL operation (typeDefs/*.js)

Resolver (resolvers/*.js) — thin wrapper

Controller (lib/controllers/*) — business logic

Repository (lib/repositories/*) — Sequelize query

MariaDB

หรือ สำหรับข้อมูล HR master:

GraphQL operation (typeDefs/*.js)

Resolver (resolvers/*.js)

Centralize controller (centralize/controllers/*.js)

GraphqlCDWithToken → cu-central-api

ดูรายละเอียดใน บท 10.9


Resolver ที่ใช้ context

Resolver ส่วนใหญ่ส่ง context ไป controller โดยตรง แต่บาง resolver อ่าน context เอง:

Resolvercontext field ที่ใช้
user.js (5 จุด)context.user, context.userId
notification.js (1 จุด)context.userId
authentication.js (1 จุด)context.device

รูปแบบ return type

ResposeStatus (typo — ควรเป็น ResponseStatus)

หลาย mutation return type นี้:

graphql
type ResposeStatus {
  success: Boolean
  message: String
  id: ID
}

ข้อระวัง: typo ResposeStatus ติดอยู่ใน schema สาธารณะ — เปลี่ยนไม่ได้เพราะ frontend ใช้อยู่

[Model] — array

graphql
fetchUsers(...): [User]

Model! — non-null

graphql
fetchSlip(...): Slip!

Custom scalar

graphql
fetchLeaveDocument(documentDate: Date!)  # scalar Date

DataLoader — ไม่มี

grep หา DataLoader ใน resolvers/ ได้ 0 ผล — ไม่มี N+1 mitigation ฝั่ง server ทำให้ query ที่ fetch relation ของ list อาจช้า

ดูเพิ่มเติมเรื่อง N+1 ใน Volume 3 บท 3.5


ข้อระวังเมื่อแก้ typeDefs

1. อย่าลบ field โดยไม่ตรวจ frontend

  • grep ชื่อ field ใน vtrc-web/src/graphql/queries.js และ vtrc-rc-backoffice/src/graphql/queries.js
  • ถ้ามี frontend ใช้ — ต้อง coordinate กับการ deploy frontend

2. อย่าเปลี่ยนชื่อ field

  • การเปลี่ยนชื่อ (เช่น fetchUsersgetUsers) ทำให้ frontend query เดิมพัง

3. ระวัง @auth change

  • ถ้าเปลี่ยนจาก public → @auth — อาจทำให้ flow ที่ใช้ก่อน login พัง
  • ถ้าเปลี่ยนจาก @auth → public — ลด security

4. typo ที่ติดอยู่ใน schema

Typoควรเป็นหมายเหตุ
ResposeStatusResponseStatusใช้ในหลาย typeDefs
fetchAuthSessionMobliefetchAuthSessionMobileauthentication.js
refundScholashiprefundScholarshipqueries.js (frontend)

วิธีค้นหา operation

หาว่ามี operation สำหรับ X ไหม

  1. grep คำที่คาดไว้ใน vtrc-api/api/src/typeDefs/*.js
  2. ดูว่าเป็น Query หรือ Mutation
  3. ดู argument + return type

หาว่า operation ทำงานอย่างไร

  1. ค้นชื่อ operation ใน vtrc-api/api/src/resolvers/*.js
  2. ดูว่าเรียก controller ตัวไหน
  3. ดู controller ใน lib/controllers/
  4. ถ้า forward ไป cu-central-api — ดูใน centralize/controllers/

เปรียบเทียบกับ frontend queries

Frontendไฟล์จำนวน queries
vtrc-websrc/graphql/queries.js~80
vtrc-rc-backofficesrc/graphql/queries.js120

frontend รวมกันใช้ประมาณ 200 operations (บางตัวซ้ำกัน) — server expose 265 ตัว


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

ไป บท 10.4 vtrc-api REST surface