6.3 · REST surface + DTOs
บทนี้สำรวจ controller ทั้งหมดของ benefit-api รวมถึงรูปแบบ DTO และการใช้ @Public() decorator
Global prefix ของทุก route คือ benefit-api/api/v1 (จาก BASE_PATH .env:3 + main.ts:23)
ตาราง controllers
| Controller (ไฟล์) | Class prefix | Routes | Auth |
|---|---|---|---|
app.controller.ts:9 | '' (root) | GET ping-centrail, GET testProfile, GET health | ทั้งหมด @Public() |
approveDisaster.controller.ts:12 | approveDisaster | POST /, GET /listBenefitForApprover | JWT |
payments.controller.ts:28 | payments | 11 routes (POST /add, POST /update/:status, GET welfarePaymentList, POST cashPayment, POST cancelWelfare, POST checkEmpDetail, POST updateEmpDetail, ฯลฯ) | JWT |
wdhospitals.controller.ts:21 | wdHospitals | POST /add, POST /update/:status, GET /detail/:id, GET /employee, GET /maker, GET /approver | 3 แรก @Public() — mutation โดยไม่ auth |
disaster.controller.ts:23 | disaster | 12 routes (GET get_list, POST create_disaster, PUT update_disaster, GET export_disaster, ฯลฯ) | JWT |
dropdown.controller.ts:15 | dropdown | 5 routes (GET get_dropdown_by_type, POST getCOAList, ฯลฯ) | ทั้งหมด @Public() |
export-payments.controller.ts:15 | exportPayments | 5 routes รวม GET test/:id (debug) | JWT |
exportPaymentReport.controller.ts:25 | exportPaymentReport | 14 routes (10report, medicalExpenseReport, cashReport, exportReportByOrder, exportReportByOrderExcel (@Public), genReportAC011, genFMISReport, genPDFBgdoc, ฯลฯ) | ส่วนใหญ่ JWT |
disbursement.controller.ts:15 | disbursement | GET '', POST createOtherWelfare, POST updateOtherWelfare | JWT |
chartOfAccount.controller.ts:20 | chartOfAccount | POST createChartOfAccount, POST updateChartOfAccount, GET getChartOfAccountById, GET listChartOfAccount | JWT |
setupPayor.controller.ts:19 | setupPayor | POST createSetupPayor, POST updateSetupPayor, GET listSetupPayor | JWT |
studyLeave.controller.ts:6 | studyLeave | POST /add | JWT (แต่ body typed any — ไม่มี validation) |
manualBatch.controller.ts:10 | batch | POST importFuneral, POST importInheritance, POST updateFuneral, POST updateInheritance | ทั้งหมด @Public() |
upload.controller.ts:13 | upload | GET upload/:id (stub), POST upload | ทั้งหมด @Public() |
รายการ endpoints ที่ @Public() (no auth)
Endpoints เหล่านี้สามารถเรียกได้โดยไม่ต้องส่ง JWT — ดู 6.8 S6 สำหรับ severity
| Endpoint | ไฟล์:บรรทัด | Effect |
|---|---|---|
GET app/ping-centrail?url=... | app.controller.ts:13-17 | SSRF — server ยิง HTTP ไปยัง URL ที่ผู้เรียกส่ง |
GET app/testProfile | app.controller.ts:19-59 | debug — ส่งต่อ token ไป UAT GraphQL พร้อม hardcoded apiKey |
GET app/health | app.controller.ts:61 | health check |
POST wdHospitals/add | wdhospitals.controller.ts:24-28 | สร้างเอกสารเบิกค่ารักษา — mutation โดยไม่ auth |
POST wdHospitals/update/:status | wdhospitals.controller.ts:30-34 | อัปเดตสถานะเอกสาร — mutation โดยไม่ auth |
GET wdHospitals/detail/:id | wdhospitals.controller.ts:36-40 | อ่าน detail เอกสาร |
GET dropdown/get_dropdown_by_type | dropdown.controller.ts:18 | อ่าน master data |
GET dropdown/getWelfareTypeList | dropdown.controller.ts:24 | อ่าน master data |
GET dropdown/getWelfareTypeListByEmp | dropdown.controller.ts:30 | อ่าน master data |
POST dropdown/getCOAList | dropdown.controller.ts:36 | อ่าน master data |
POST dropdown/getDropDownList | dropdown.controller.ts:42 | อ่าน master data |
POST upload | upload.controller.ts:19-23 | upload ไฟล์ (base64) ไป disk |
GET upload/:id | upload.controller.ts:13-17 | stub — คืน input |
POST batch/importFuneral | manualBatch.controller.ts:13-17 | trigger ฌาปนกิจ HRMI import |
POST batch/importInheritance | manualBatch.controller.ts:19-23 | trigger มรดก HRMI import |
POST batch/updateFuneral | manualBatch.controller.ts:25-29 | push ฌาปนกิจ status → HRMI |
POST batch/updateInheritance | manualBatch.controller.ts:31-35 | push มรดก status → HRMI |
POST exportPaymentReport/exportReportByOrderExcel | exportPaymentReport.controller.ts:62-70 | สร้าง Excel report |
DTOs
มี 18 DTO files ใน src/dto/ (รวม ~3,884 บรรทัด) ใช้ class-validator decorators สำหรับ validation:
export class RequestWdHospitalsDto {
@IsArray()
@ValidateNested({ each: true })
@ArrayMinSize(1)
@Type(() => SicknessDto)
sicknessList: SicknessDto[];
// ...Decorators ที่ใช้บ่อย: @IsString, @IsNumber, @IsEnum, @IsArray, @ValidateNested, @ArrayMinSize, @Type, @IsOptional, @IsDateString
Validation bypass
แม้ global ValidationPipe จะเปิดอยู่ (main.ts:32) แต่มี controller ที่ bypass การ validation:
studyLeave.controller.ts:10—@Body() body: any(ไม่ใช้ DTO)manualBatch.controller.ts:15-34— ใช้BatchJobDtoแต่ endpoint@Public()อยู่แล้ว
Swagger / OpenAPI integration
docs/document.config.ts:3-11 — ใช้ DocumentBuilder กับ addBearerAuth() + addApiKey():
export default new DocumentBuilder()
.setName('VTRC RESTfull v2')
.setDescription('VTRC RESTfull v2 API description')
.setVersion('1.0')
.addTag('vtrc')
.addBearerAuth()
.addApiKey()
.setServer(process.env.SERVER_URL) // https://vtrcapi.redcross.or.th/
.build();Swagger UI mount ที่ benefit-api/docs โดยไม่ auth (main.ts:41) — เปิดเผย schema ทั้งหมดให้ใครก็เข้าถึงได้
รูปแบบ path structure
{BASE_PATH}api/v1/
├── ping-centrail, testProfile, health (root controller)
├── approveDisaster/
├── payments/
├── wdHospitals/ (3 แรก @Public)
├── disaster/
├── dropdown/ (ทั้งหมด @Public)
├── exportPayments/
├── exportPaymentReport/
├── disbursement/
├── chartOfAccount/
├── setupPayor/
├── studyLeave/ (body: any — no validation)
├── batch/ (ทั้งหมด @Public)
└── upload/ (ทั้งหมด @Public)