Skip to content

1 · Repository map — workflow-api

โครงสร้างอ้างอิง branch uat (~153 ไฟล์ tracked ไม่รวม node_modules, .git, dist)

ทีมกำหนด convention "NestJS Clean Architecture" ใน .cursor/rules/backend-clean-architecture.mdccore/ = infra, common/ = utility เบา, integrations/ = external client, modules/ = business domain


Tree

text
workflow-api/
├── .cursor/rules/backend-clean-architecture.mdc
├── artifacts/screenshots/generate-api-slides.mjs   เครื่องมือ dev ไม่ใช่ runtime
├── database/
│   ├── schema.sql          schema ตัวอย่างเก่า — ไม่ตรง entity จริง (QUAL-WORKFLOW-03)
│   └── seed-data.sql
├── docs/
│   ├── pms-ai-api-spec.md
│   └── pms-ai-test-cases.md
├── src/
│   ├── main.ts
│   ├── app.module.ts
│   ├── common/
│   │   ├── auth/jwt-actor.util.ts      decode JWT ไม่ verify — ใช้ทั่ว repo
│   │   ├── errors/                     error-codes, error-formatter
│   │   ├── filters/http-error.filter.ts
│   │   └── validation/validate-request.ts
│   ├── core/
│   │   ├── audit-log/                  เขียน healthCheckLogs บน benefit_write
│   │   ├── database/
│   │   │   ├── database.module.ts      6 TypeORM connections (export DatabasePgModule)
│   │   │   ├── entities/course.entity.ts
│   │   │   └── services/course-pg.service.ts
│   │   ├── logger/logger.module.ts
│   │   └── middleware/request-context.middleware.ts
│   ├── integrations/
│   │   └── llm/llm.service.ts          AI router (chat + embeddings)
│   ├── modules/
│   │   ├── db-connection-check/        GET health ของหลาย DB
│   │   ├── embedding/                  ~35 ไฟล์ — jobs, groups, assignments, reports
│   │   ├── health-checkup/
│   │   │   ├── extra-benefit-persons/
│   │   │   └── health-program-config/  controller ~672 บรรทัด, service ~1398
│   │   └── ipd/                        ~25 ไฟล์ — batch + documents + HRMI match
│   └── types/nestjs-missing-modules.d.ts
├── Dockerfile                          multi-stage node:22-alpine + pnpm
├── .env.example                        มี secret จริง (SEC-WORKFLOW-02)
├── .env.uat
├── package.json                        name: ai-pms-nest
└── jest.config.js                      มี unit/e2e specs กระจายใน modules

Root module wiring

AppModule นำเข้า (workflow-api/src/app.module.ts (branch: uat):11-23):

Importหน้าที่
ConfigModule.forRoot({ envFilePath: '.env' })โหลด env ทั้งแอป
LoggerModuleWinston daily rotate
AuditLogModuleaudit ข้าม domain
DbConnectionCheckModulehealth check DB
EmbeddingModulePMS AI
HealthCheckupModuleโปรแกรมตรวจสุขภาพ
IpdModuleIPD billing

RequestContextMiddleware ผูกทุก route (app.module.ts:26-28)

หมายเหตุDatabasePgModule ไม่ได้ import โดยตรงใน AppModule; ถูกดึงเข้าผ่าน feature modules ที่ import TypeORM connections (embedding / ipd / health / db-check)


Module breakdown

ModuleControllersPath prefix (หลัง global prefix)หลักฐาน
DbConnectionCheckModule1pms-ai/db-connectionsdb-connection-check.controller.ts:6
EmbeddingModule4pms-ai/embedding/jobs, pms-ai/course-groups, pms-ai/assignments, pms-ai/reportscontrollers ใน modules/embedding/
HealthCheckupModulehealth-program-config (+ extra-benefit-persons)health-checkups/health-programs/configurationshealth-program-config.controller.ts:34
IpdModule4ipd, approval-center, accounting-center, chartOfAccountipd.controller.ts:49, sibling controllers

HTTP endpoint inventory (สรุป)

Global prefix จริง: /workflow-api/api/v1 (จาก .env.example BASE_PATH + api/v1)

IPD (IpdControlleripd/...)

MethodPathหมายเหตุสั้นหลักฐาน
GET/ipd/batcheslist กรองตาม roleipd.controller.ts:61
POST/ipd/batchesสร้าง — CHULA onlyipd.controller.ts:75
PATCH/ipd/batches/:batchIdsave draftipd.controller.ts:91
GET/ipd/batches/:batchIddetailipd.controller.ts:108
GET/ipd/batches/:batchId/itemsรายการบิลipd.controller.ts:121
PATCH/ipd/batches/:batchId/items/:itemIdตัดสินรายแถวipd.controller.ts:142
PATCH/ipd/batches/:batchId/itemsbulk decisionipd.controller.ts:163
POST/ipd/batches/:batchId/rejectปฏิเสธipd.controller.ts:183
POST/ipd/batches/:batchId/filesupload Excelipd.controller.ts:210
DELETE/ipd/batches/:batchIdsoft deleteipd.controller.ts:231
DELETE/ipd/batches/:batchId/files/:fileIdลบไฟล์ipd.controller.ts:246
GET/ipd/batches/:batchId/files/:fileId/downloadดาวน์โหลดipd.controller.ts:264
POST/ipd/batches/:batchId/submitส่งตรวจ (→ PENDING_REVIEW)ipd.controller.ts:291
POST/ipd/batches/:batchId/submit-approvalส่งอนุมัติipd.controller.ts:307
POST/ipd/batches/:batchId/approval-decisionอนุมัติ/คืน/ปฏิเสธipd.controller.ts:323
GET/ipd/batches/:batchId/logsaudit logsipd.controller.ts:340
GET/ipd/batches/:batchId/export/*cover-memo / summary-by-org / person / coaipd.controller.ts:353-442
GET/PATCH/ipd/document-configconfig เอกสารipd.controller.ts:369-389

ทุก handler เรียก resolveIpdUser(req) ก่อนเข้า service (ipd.controller.ts:63 เป็นต้นแบบ)

Approval / Accounting / Chart of account

ControllerPathEndpoints หลัก
ApprovalCenterControllerapproval-centerGET pending
AccountingCenterControlleraccounting-centerGET pending
ChartOfAccountControllerchartOfAccountPOST createChartOfAccount

หลักฐาน — approval-center.controller.ts:10,17, accounting-center.controller.ts:10,16, chart-of-account.controller.ts:10,24

Embedding (PMS AI)

MethodPathสถานะหลักฐาน
POST/pms-ai/embedding/jobs/initialเปิดใช้embedding.controller.ts:26
GET/pms-ai/embedding/jobs/:idเปิดใช้embedding.controller.ts:40
GET/pms-ai/embedding/jobscomment ปิด — "Temporarily disabled per product direction"embedding.controller.ts:59
POST/jobs/:id/cancel, /retrycomment ปิดembedding.controller.ts:71,90
GET/pms-ai/course-groupslist กลุ่มหลักสูตรcourse-groups.controller.ts:8-12
POST/pms-ai/assignmentsมอบหมายassignments.controller.ts:20-24
POST/pms-ai/assignments/sync, /cancelsync / cancelassignments.controller.ts:45,61
GET/pms-ai/reports/course-groupsรายงานreports.controller.ts:8-12
GET/pms-ai/db-connections/healthตรวจ DBdb-connection-check.controller.ts:6,12

Health program config

MethodPathหลักฐาน
GET/health-checkups/health-programs/configurationshealth-program-config.controller.ts:110
GET.../dropdowns:187
GET.../:id:271
POST.../ (create):396
PATCH.../:id:502
PATCH.../:id/toggle-status:563
DELETE.../:id:595
POST.../eligibility-simulator:663

Mutation ใช้ resolveHealthProgramActor(req, ...) สำหรับชื่อใน audit log — ไม่ใช่ cryptographic auth


Embedding entities (PostgreSQL pms_ai)

อยู่ที่ src/modules/embedding/entities/:

Entity fileหน้าที่โดยย่อ
master-course.entity.tsmaster หลักสูตร
master-course-embedded.entity.tsหลักสูตรที่ embed แล้ว
embedding-job.entity.tsjob lifecycle
embedding-job-item.entity.tsรายการใน job
course-group.entity.tsกลุ่มที่จัดจาก similarity
course-assignment.entity.tsมอบหมายให้พนักงาน

Course ใน core/database/entities/course.entity.ts เป็น entity ที่ DatabasePgModule ลงทะเบียนด้วย TypeOrmModule.forFeature([Course], 'postgres') (database.module.ts:200)


IPD supporting services

ไฟล์บรรทัดโดยประมาณหน้าที่
ipd-batch.service.ts~2753CRUD batch, status transitions, SQL หลัก
ipd-document.service.tsparse Excel + generate docx/xlsx/pdf buffers
ipd-hrmi-match.service.tsจับคู่รายการบิลกับพนักงาน HRMI
ipd-notification.service.tsแจ้งเตือน (nodemailer ใน dependencies)
ipd.constants.ts~214BATCH_STATUS, Excel column map, affiliation maps
ipd-user.util.ts~72resolveIpdUser / requireRole / inferHospitalUserRole

ไฟล์ที่ควรรู้จักก่อนแก้โค้ด

ไฟล์ทำไมสำคัญ
src/core/database/database.module.ts:9-1996 connections — รู้ว่า module ไหนแตะ DB ของ service อื่น
src/common/auth/jwt-actor.util.ts:1-4,33-47จุดเริ่ม SEC-WORKFLOW-01 — comment ในไฟล์ยืนยันเอง
src/modules/ipd/ipd-user.util.ts:20-65role จาก sourceDB ไม่ใช่ role claim ที่ verify แล้ว
src/modules/ipd/ipd.constants.ts:3-15,24-30status machine + mapping hospital จาก sourceDB
src/integrations/llm/llm.service.ts:41-113เรียก AI router ภายนอก
database/schema.sqlอย่าเชื่อ เป็น source of truth — เก่ากว่า entity จริง

Tests

Repo มี Jest specs จำนวนมากใต้ modules/ (เช่น ipd-batch.service.spec.ts, embedding.e2e.spec.ts, ipd-user.util.spec.ts) — ต่างจาก chat-center-api ที่มีแค่ e2e scaffold ว่าง ระดับความครอบคลุมต่อ flow ไม่ได้ วัดในรอบเอกสารนี้ (UNVERIFIED coverage %)