vtrc-ocr-api — Repository Map
บทนี้เป็นแผนที่ไฟล์ของ vtrc-ocr-api (branch: main, 21 tracked files)
แผนที่โฟลเดอร์
vtrc-ocr-api/ (branch: main)
├── app.js # Express entrypoint
├── package.json / package-lock.json
├── README.md
├── .gitignore
├── public/
│ └── index.html # landing page
├── docs/
│ └── swagger.js # OpenAPI + schemas
├── routes/
│ ├── index.js # mount /health, /ocr; GET /api
│ ├── health.routes.js
│ └── ocr.routes.js
├── controllers/
│ ├── health.controller.js
│ └── ocr.controller.js
├── services/
│ ├── health.service.js
│ └── ocr.service.js # mock OCR
├── models/
│ └── ocr.model.js # Map in-memory
├── middleware/
│ ├── validation.middleware.js # ใช้จริงกับ POST /process
│ └── error.middleware.js # ไม่ได้ wire ใน app.js
├── config/
│ ├── config.js
│ └── database.js # stub — ไม่ถูกเรียก
└── utils/
├── logger.js # ไม่ถูก import
└── response.js # ไม่ถูกเรียกจาก controllerBoot sequence
1. dotenv.config()
`app.js:7`
▼
2. express() + middleware
helmet → cors() → morgan('dev') → json → urlencoded
`app.js:14-19`
▼
3. express.static(public/)
`app.js:22`
▼
4. Swagger UI /docs + /docs.json
`app.js:25-29`
▼
5. app.use('/api', routes)
`app.js:32-33`
▼
6. GET / → public/index.html
GET /health → inline JSON
`app.js:36-47`
▼
7. 404 handler
`app.js:50-55`
▼
8. Error handler (inline — ไม่ใช่ error.middleware.js)
`app.js:58-64`
▼
9. app.listen(PORT)
`app.js:67-70`ไม่มีการเรียก connectDatabase() จาก config/database.js ใน boot — stub ล้วน ๆ
Config keys (config/config.js)
| Key | Default | ถูกใช้จริงใน app? | Citation |
|---|---|---|---|
port | 3000 | ใช่ทาง process.env.PORT ใน app.js (อ่านซ้ำคนละที่) | config.js:5, app.js:12 |
nodeEnv | development | ใช้ใน error stack + health | config.js:6 |
api.version | '1.0.0' | ใช่ที่ GET /api + swagger | config.js:11 |
cors.origin | * | ไม่ — app.use(cors()) เปล่า | config.js:15-18 vs app.js:16 |
ocr.maxImageSize | '10MB' | ไม่ถูกอ่านนอก config | config.js:22 |
ocr.timeout | 30000 | ไม่ถูกอ่านนอก config | config.js:24 |
In-memory model API
models/ocr.model.js — store เดียวของทั้งระบบ:
| Function | พฤติกรรม | Citation |
|---|---|---|
saveProcessingRecord | Map.set(id, record) | ocr.model.js:7-9 |
getProcessingRecord | Map.get(id) หรือ null | ocr.model.js:12-14 |
updateProcessingRecord | spread merge {...existing, ...updates} | ocr.model.js:16-22 |
getAllProcessingRecords | Array.from(values).reverse() | ocr.model.js:26-28 |
deleteProcessingRecord | Map.delete — ไม่มี caller | ocr.model.js:30-32 |
ข้อมูลหายเมื่อ process restart — ไม่มี disk/DB
Layer status
| Layer | สถานะจริง |
|---|---|
| Routes + Swagger annotations | ทำงานครบ |
| Controllers | thin — เรียก service แล้ว map status |
ocr.service | mock ทั้งหมด |
ocr.model | in-memory เท่านั้น |
validation.middleware | ใช้กับ POST process |
error.middleware | dead (ไม่ import) |
database.js | dead stub |
utils/* | dead (ไม่ถูกเรียกจาก controller) |
README เรียกโครงสร้างว่า "MCP structure" (README.md) — ในที่นี้หมายถึงโฟลเดอร์ layout ของโปรเจกต์ ไม่เกี่ยวกับ Model Context Protocol
Dead / unwired files
| Path | หลักฐาน |
|---|---|
middleware/error.middleware.js | ไม่มี require ใน app.js |
config/database.js | ไม่มี import ใน boot |
utils/logger.js | ไม่พบ import จาก controllers/services |
utils/response.js | controllers เขียน res.json เอง |
deleteProcessingRecord | export แต่ไม่มี caller |
| AllProcessingRecords` | Array.from(values).reverse() (newest first) |
deleteProcessingRecord | Map.delete — ไม่มี caller ใน repo |
ข้อมูลหายเมื่อ process restart — ไม่มี serialization / DB
public/index.html
Landing กลางจอ มีลิงก์สามจุด (public/index.html:72-74):
/health/api/api/health/detailed
ไม่มีลิงก์ไป /docs หรือ /api/ocr/* บนหน้านี้
สิ่งที่ README บอก vs โค้ดจริง
| README claim | ความจริง | Citation |
|---|---|---|
มี .env.example | ไม่มีไฟล์ | README.md:12 vs glob |
| "Process OCR on an image" | mock text คงที่ | ocr.service.js:26-34 |
| MCP architecture | โฟลเดอร์ครบ แต่ logic ส่วนใหญ่ placeholder | README.md:105-115 |
Env vars ดูที่ .env.example | ดูที่ config.js แทน | README.md:131-133 |