Skip to content

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 prefixRoutesAuth
app.controller.ts:9'' (root)GET ping-centrail, GET testProfile, GET healthทั้งหมด @Public()
approveDisaster.controller.ts:12approveDisasterPOST /, GET /listBenefitForApproverJWT
payments.controller.ts:28payments11 routes (POST /add, POST /update/:status, GET welfarePaymentList, POST cashPayment, POST cancelWelfare, POST checkEmpDetail, POST updateEmpDetail, ฯลฯ)JWT
wdhospitals.controller.ts:21wdHospitalsPOST /add, POST /update/:status, GET /detail/:id, GET /employee, GET /maker, GET /approver3 แรก @Public() — mutation โดยไม่ auth
disaster.controller.ts:23disaster12 routes (GET get_list, POST create_disaster, PUT update_disaster, GET export_disaster, ฯลฯ)JWT
dropdown.controller.ts:15dropdown5 routes (GET get_dropdown_by_type, POST getCOAList, ฯลฯ)ทั้งหมด @Public()
export-payments.controller.ts:15exportPayments5 routes รวม GET test/:id (debug)JWT
exportPaymentReport.controller.ts:25exportPaymentReport14 routes (10report, medicalExpenseReport, cashReport, exportReportByOrder, exportReportByOrderExcel (@Public), genReportAC011, genFMISReport, genPDFBgdoc, ฯลฯ)ส่วนใหญ่ JWT
disbursement.controller.ts:15disbursementGET '', POST createOtherWelfare, POST updateOtherWelfareJWT
chartOfAccount.controller.ts:20chartOfAccountPOST createChartOfAccount, POST updateChartOfAccount, GET getChartOfAccountById, GET listChartOfAccountJWT
setupPayor.controller.ts:19setupPayorPOST createSetupPayor, POST updateSetupPayor, GET listSetupPayorJWT
studyLeave.controller.ts:6studyLeavePOST /addJWT (แต่ body typed anyไม่มี validation)
manualBatch.controller.ts:10batchPOST importFuneral, POST importInheritance, POST updateFuneral, POST updateInheritanceทั้งหมด @Public()
upload.controller.ts:13uploadGET 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-17SSRF — server ยิง HTTP ไปยัง URL ที่ผู้เรียกส่ง
GET app/testProfileapp.controller.ts:19-59debug — ส่งต่อ token ไป UAT GraphQL พร้อม hardcoded apiKey
GET app/healthapp.controller.ts:61health check
POST wdHospitals/addwdhospitals.controller.ts:24-28สร้างเอกสารเบิกค่ารักษา — mutation โดยไม่ auth
POST wdHospitals/update/:statuswdhospitals.controller.ts:30-34อัปเดตสถานะเอกสาร — mutation โดยไม่ auth
GET wdHospitals/detail/:idwdhospitals.controller.ts:36-40อ่าน detail เอกสาร
GET dropdown/get_dropdown_by_typedropdown.controller.ts:18อ่าน master data
GET dropdown/getWelfareTypeListdropdown.controller.ts:24อ่าน master data
GET dropdown/getWelfareTypeListByEmpdropdown.controller.ts:30อ่าน master data
POST dropdown/getCOAListdropdown.controller.ts:36อ่าน master data
POST dropdown/getDropDownListdropdown.controller.ts:42อ่าน master data
POST uploadupload.controller.ts:19-23upload ไฟล์ (base64) ไป disk
GET upload/:idupload.controller.ts:13-17stub — คืน input
POST batch/importFuneralmanualBatch.controller.ts:13-17trigger ฌาปนกิจ HRMI import
POST batch/importInheritancemanualBatch.controller.ts:19-23trigger มรดก HRMI import
POST batch/updateFuneralmanualBatch.controller.ts:25-29push ฌาปนกิจ status → HRMI
POST batch/updateInheritancemanualBatch.controller.ts:31-35push มรดก status → HRMI
POST exportPaymentReport/exportReportByOrderExcelexportPaymentReport.controller.ts:62-70สร้าง Excel report

DTOs

มี 18 DTO files ใน src/dto/ (รวม ~3,884 บรรทัด) ใช้ class-validator decorators สำหรับ validation:

6:33:benefit-api/src/dto/wdhospitals.dto.ts
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():

3:11:benefit-api/docs/document.config.ts
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)

ไปต่อ