11.3 · vtrc-api GraphQL catalog
บทนี้รวบรวม GraphQL operations ทั้งหมดของ vtrc-api — 265 operations ใน 44 typeDefs files — จัดกลุ่มตาม domain พร้อม signature ตัวอย่าง
ภาพรวม
| ตัวเลข | ค่า |
|---|---|
| TypeDefs files | 44 |
| Resolver files | 42 |
| รวม operations (Query + Mutation) | ~265 |
| Subscription | 0 |
| Custom scalars | 5 (Date, JSON, input, Upload, Decimal) |
| Custom directives | 1 (@auth) |
Root schema
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 อันดับแรก
| Domain | TypeDefs file | Ops | @auth usages |
|---|---|---|---|
| Leave / Medical (HRMI) | hrmi.js | 30 | 15 |
| Hospital Withdraw | wdHospital.js | 23 | 24 |
| User / Account | user.js | 17 | 8 |
| Bank | bank.js | 16 | 17 |
| Documents | document.js | 15 | 7 |
| Provident Fund | providentFund.js | 14 | 2 |
| Reference Data | referenceData.js | 14 | 17 |
| Study Leave Request | studyLeaveRequest.js | 12 | 2 |
| Contact Us | contactUs.js | 12 | 8 |
| Payroll / Tax Slip | slip.js | 11 | 10 |
| Notification | notification.js | 10 | 6 |
| Authentication | authentication.js | 9 | 2 |
| News / Post | post.js | 8 | 6 |
| Master Data | masterData.js | 8 | 4 |
| Bank Account | bankAccount.js | 7 | — |
และอีก 29 files ขนาดเล็ก (profile, career, course, organization, role, ...)
Operations แบบจัดกลุ่มตามฟังก์ชัน
1. Authentication (9 ops) — authentication.js
| Operation | ประเภท | Auth | ความหมาย |
|---|---|---|---|
login | Mutation | — | login สำหรับ user |
loginBackoffice | Mutation | — | login สำหรับ backoffice |
loginBypass | Mutation | — | login สำหรับ dev/admin bypass |
logout | Mutation | — | logout |
forceLoging | Mutation | — | force login (admin) |
refreshToken | Query | — | ขอ token ใหม่ |
generateCaptcha | Query | — | ขอ captcha |
verifyEmpCodeLogin | Query | — | ตรวจ empCode ก่อน login |
fetchAuthSessionMoblie | Query | — | ดึง session (typo: Moblie) |
ตัวอย่าง signature — login
login(
lsid: ID!
password: String!
clientInfo: ClientInfo!
apiKey: String!
organization: ID!
) : Authlsid = login session ID (จาก verifyEmpCodeLogin), clientInfo = device info (OS, browser, IP)
2. User / Account (17 ops) — user.js
| Operation | ประเภท | Auth | ความหมาย |
|---|---|---|---|
getUser | Query | — | ดึง user ทั่วไป |
accordingProfile | Query | — | ดึง profile ตามเงื่อนไข |
fetchEmployeeDetail | Query | — | รายละเอียดพนักงาน |
forgetPassword | Mutation | — | ลืมรหัสผ่าน |
checkSMSforgetPassword | Mutation | — | ตรวจ SMS สำหรับ forget |
createUser | Mutation | — | สร้าง user (public) |
resetPassword | Mutation | — | reset รหัสผ่าน |
searchUser | Query | — | ค้นหา user |
updatePublicDeviceToken | Mutation | — | อัปเดต device token |
| + 8 operations อื่น ๆ | @auth | จัดการ user + role |
3. Profile (3 ops) — 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
extend type Query {
fetchMedicalExpensesLicensee ( empCode:String ): [MedicalData] @auth(accessRole: ["USER"])
...
fetchLeaveType(
empCode: String
isReqByEmp: Boolean!
): [LeaveTypeData] @auth(accessRole: ["USER"])Mutation ตัวอย่าง — สร้างเอกสารลา
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
fetchListWDHospital(
wdHospitalId: ID
empFirstName: String
...
searchType: SearchDetailType!
): [WDHospital] @auth(accessRole: ["USER"])Mutation — createWDHospital (มี accessMenu)
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
fetchSlip(
identityCard: String!
month: String!
year: String!
profileKey: String
typeSlip: String
): Slip! @auth(accessRole: ["USER"])7. Provident Fund — 14 ops — providentFund.js
extend type Query {
...
fetchListFundBenefitPerson(
searchKeyword: String
startDate: Date
endDate: Date
status: RequestFundStatus
): [ListFundBenefitPerson]8. Documents — 15 ops — 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
extend type Query {
fetchListPost(
postId: ID
type: String
status: String
offset: Int
limit: Int
search: String
category: CatType
): ListPost10. Bank / Bank Account — 23 ops
| File | Ops | หน้าที่ |
|---|---|---|
bank.js | 16 | ธนาคาร, สาขา |
bankAccount.js | 7 | บัญชีธนาคารของพนักงาน |
11. Notification — 10 ops — notification.js
การแจ้งเตือนในแอป + push notification
12. Study Leave — 19 ops
| File | Ops | หน้าที่ |
|---|---|---|
studyLeave.js | 7 | การลาศึกษา |
studyLeaveRequest.js | 12 | คำขอลาศึกษา |
13. Contact Us — 12 ops — contactUs.js
ระบบติดต่อสอบถาม
14. Organization — 11 ops
| File | Ops | หน้าที่ |
|---|---|---|
organization.js | 5 | หน่วยงาน |
organizationGroup.js | 6 | กลุ่มหน่วยงาน |
15. Misc domains
| Domain | File | Ops |
|---|---|---|
| Career | career.js | 6 |
| Course | course.js | 6 |
| Role | role.js + roleAccess.js | 5 |
| Address | address.js | 4 |
| Verification | verification.js | 6 |
| Consent | consent.js | 2 |
| Delegate | delegate.js | 2 |
| Tax Draft | taxDraft.js | 3 |
| Child Tuition | childTuition.js | 2 |
| Conicle | conicle.js | 3 |
| Policy | policy.js | 1 |
| Time Attendance | timeAttendance.js | 1 |
| Version | version.js | 1 |
@auth directive — coverage
จาก 265 operations:
| สถานะ | จำนวน (ประมาณ) | หมายเหตุ |
|---|---|---|
มี @auth | ~190 | ต้อง JWT + session |
ไม่มี @auth (public) | ~75 | ใครมี apiKey ก็เรียกได้ |
Public operations ที่น่าสนใจ
login,loginBackoffice,loginBypass— ต้อง public (จะได้ token ออกมา)refreshToken,generateCaptcha— publiccreateUser,forgetPassword,resetPassword— public (self-registration)fetchListPost(news) — public (แสดงข่าวโดยไม่ login)fetchLeaveDocumentList(HRMI) — public (ใช้ใน flow ก่อน login)
ตัวอย่าง operation ที่ใช้บ่อย
fetchProfile — ข้อมูลผู้ใช้ปัจจุบัน
query {
fetchProfile {
id
firstName
lastName
email
role { id name }
organization { id name }
}
}fetchSlip — สลิปเงินเดือน
query {
fetchSlip(
identityCard: "1234567890123"
month: "07"
year: "2569"
typeSlip: "salary"
) {
income { code name amount }
deduct { code name amount }
netPay
}
}createLeaveDocument — สร้างใบลา
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 เอง:
| Resolver | context 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 นี้:
type ResposeStatus {
success: Boolean
message: String
id: ID
}ข้อระวัง: typo ResposeStatus ติดอยู่ใน schema สาธารณะ — เปลี่ยนไม่ได้เพราะ frontend ใช้อยู่
[Model] — array
fetchUsers(...): [User]Model! — non-null
fetchSlip(...): Slip!Custom scalar
fetchLeaveDocument(documentDate: Date!) # scalar DateDataLoader — ไม่มี
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
- การเปลี่ยนชื่อ (เช่น
fetchUsers→getUsers) ทำให้ frontend query เดิมพัง
3. ระวัง @auth change
- ถ้าเปลี่ยนจาก public →
@auth— อาจทำให้ flow ที่ใช้ก่อน login พัง - ถ้าเปลี่ยนจาก
@auth→ public — ลด security
4. typo ที่ติดอยู่ใน schema
| Typo | ควรเป็น | หมายเหตุ |
|---|---|---|
ResposeStatus | ResponseStatus | ใช้ในหลาย typeDefs |
fetchAuthSessionMoblie | fetchAuthSessionMobile | authentication.js |
refundScholaship | refundScholarship | queries.js (frontend) |
วิธีค้นหา operation
หาว่ามี operation สำหรับ X ไหม
- grep คำที่คาดไว้ใน
vtrc-api/api/src/typeDefs/*.js - ดูว่าเป็น Query หรือ Mutation
- ดู argument + return type
หาว่า operation ทำงานอย่างไร
- ค้นชื่อ operation ใน
vtrc-api/api/src/resolvers/*.js - ดูว่าเรียก controller ตัวไหน
- ดู controller ใน
lib/controllers/ - ถ้า forward ไป cu-central-api — ดูใน
centralize/controllers/
เปรียบเทียบกับ frontend queries
| Frontend | ไฟล์ | จำนวน queries |
|---|---|---|
| vtrc-web | src/graphql/queries.js | ~80 |
| vtrc-rc-backoffice | src/graphql/queries.js | 120 |
frontend รวมกันใช้ประมาณ 200 operations (บางตัวซ้ำกัน) — server expose 265 ตัว