สมอง SML

คลังความรู้ / API & Process actions

#api#overview

ภาพรวมแค็ตตาล็อก API

โน้ตนี้เป็นศูนย์กลาง (hub) ของมิติ "API catalog" ใน SML Brain: อธิบายว่าคำขอหนึ่งเดินทางผ่านอะไรบ้างตั้งแต่เบราว์เซอร์ถึงฐานข้อมูล, middleware ที่ครอบ, รูปแบบ response/error, ขีดจำกัด และดัชนีของโน้ต API ทั้ง 19 ฉบับ. รายละเอียดเชิงสถาปัตยกรรมอยู่ที่ ภาพรวม Backend Go ของ SML Ai Account (Backend overview), สถาปัตยกรรม Hexagonal และ composition root ของ Go backend (Hexagonal Architecture + DI), Router, middleware และแผนผัง route ทั้งหมดของ backend (chi router) และฝั่งหน้าเว็บที่ เส้นทาง API ฝั่ง Next.js ที่ส่งต่อไป Go backend (API proxy routes).

1. วงจรคำขอ (request lifecycle)

flowchart LR
  C[เบราว์เซอร์ / แอป POS / ไคลเอนต์ MCP] --> N[Next.js route /api/...]
  N --> G[Go chi router]
  G --> M[middleware: RequestID, Recoverer, Timeout 60s, SecurityHeaders, RequestLogger]
  M --> A[Auth / AdminAuth / RequireRight ต่อกลุ่ม]
  A --> H[handler ใน adapter/inbound/http]
  H --> S[service ใน application]
  S --> D[(pgx pool ต่อบริษัท)]
ขั้น ทำอะไร ที่มา
1. ไคลเอนต์ เว็บเรียก /api/... ของ Next (cookie session) ; แอป POS และ AI ภายนอกถือ token ของตัวเอง โน้ตแต่ละกลุ่ม
2. Next proxy (BFF) ตรวจ session (requireSession), ต่ออายุ/ขอ access token (getValidAccessToken), ส่งต่อไป Go ที่ SERVICE_BASE_URL ด้วย fetchServiceWithAuthRetry (ลองใหม่เมื่อ 401, เติม X-Admin-Api-Key ให้ endpoint ที่มี /admin), ห่อผลเป็น ok()/fail() frontend/src/lib/api-server.ts:34-51, 248, 388, 496, 555
3. Go router chi router ลงทะเบียนกลุ่ม path ทั้งหมดไฟล์เดียว backend/internal/adapter/inbound/http/router.go
4. middleware global RequestID -> Recoverer -> Timeout(60s) -> SecurityHeaders -> RequestLogger router.go:62-66
5. middleware ต่อกลุ่ม Auth(verifier) อ่าน Authorization: Bearer, ตรวจ access token, ใส่ claims ลง context; AdminAuth(key) ตรวจ X-Admin-Api-Key แบบ constant-time; RequireRight ตรวจสิทธิ์เมนูตาม action middleware/auth.go:39, adminauth.go:11, permission.go
6. handler แปลง request, ดึง provider/database/user จาก claims (ไม่เชื่อค่าจาก body), เรียก service adapter/inbound/http/<กลุ่ม>/handler.go
7. service ตรรกะธุรกิจ ใน application/* (query, process, identity, tenant ฯลฯ) backend/internal/application
8. DB pool แยกต่อบริษัท (ฐาน Main + ฐานบริษัท) ผ่านตัวจัดการ pool ตัวจัดการ connection pool ต่อฐานข้อมูล (PoolManager), โมเดลผู้เช่าหลายราย: Tenant, Provider, Main DB, Company (Multi-tenant model)

หลักการสำคัญ: บริษัท/ผู้ใช้ที่ handler ใช้มาจาก JWT claims เสมอ (ดู JWT session token และการเพิกถอน (JWT + revocation store)) ดังนั้นไคลเอนต์เลือกบริษัทได้เฉพาะตอน select-company (API กลุ่ม /auth — ล็อกอิน เลือกบริษัท รีเฟรช ออกจากระบบ (Auth endpoints)).

2. แผนที่เส้นทางใน router.go

prefix middleware โน้ต router.go
/health, /swagger/* (dev) ไม่มี API ตรวจสุขภาพ แผนที่ติดตาม และเส้นทางเฉพาะชั้น Next (Health, Monitormap, Next-only routes) 68-71
/auth/* public (ยกเว้น /auth/me ใช้ Auth) API กลุ่ม /auth — ล็อกอิน เลือกบริษัท รีเฟรช ออกจากระบบ (Auth endpoints) 73-84
/query/{list,limit,batch} Auth API ประตูอ่านข้อมูล /query — list, limit, batch (Query gateway read endpoints) 90-102
/query/{exec,execBatch} Auth + queryWriteGuard (RequireRight) API ประตูเขียนข้อมูล /query/exec และ /query/execBatch (Query exec endpoints) 85-102
/blob/insert Auth API อัปโหลดรูปพร้อมแทรกแถว /blob/insert (Blob insert endpoint) 105-111
/admin/providers AdminAuth API ลงทะเบียนผู้ให้บริการ /admin/providers และกุญแจผู้ดูแล (Tenant registration + AdminAuth) 114-123
/process/* และ /api/v1/process/* Auth + RequireRight(RequiredRight) API เครื่องยนต์ process /process/* — เส้นทาง สิทธิ์ ขนาดบอดี้ (Process engine run API) และกลุ่ม action ด้านล่าง 126-208
/api/v1/admin/* AdminAuth API คอนโซลผู้ดูแล /api/v1/admin — provider, user, database, main-query, menu-permissions (Admin console API), API Workspace — ล็อกอิน Google, เลือกฐานบริษัท, สมาชิก, สิทธิ์จอ, ผูก LINE (Admin workspace API) 211-247
/api/v1/{dashboard,crm,ai,wms,tms,procure,etax,market,autocare} Auth API โมดูลธุรกิจ /api/v1/{dashboard,crm,ai,wms,tms,procure,etax,market,autocare} (Business module endpoints) 250-326
/api/v1/pos/* Pos.Auth (token เครื่อง หรือ user) + DeviceOnly/UserOnly API จุดขาย POS (POS endpoints /api/v1/pos) 329-349
/api/v1/monitormap/tile POST ใช้ Auth API ตรวจสุขภาพ แผนที่ติดตาม และเส้นทางเฉพาะชั้น Next (Health, Monitormap, Next-only routes) 352-358
/mcp, /api/v1/mcp, /api/v1/mcp/tokens token MCP / AdminAuth API เซิร์ฟเวอร์ MCP แบบอ่านอย่างเดียว (MCP read-only gateway และการจัดการ token) 360-371

ฝั่ง Next มี route.ts ราว 75 ไฟล์ใต้ frontend/src/app/api/ (query, process/*, admin, auth, workspace, pos, mcp, โมดูลธุรกิจ และ route เฉพาะชั้น Next เช่น fraudwarning, workmonitor, help, lineoa, monitormap).

3. รูปแบบ response และ error

ชั้น สำเร็จ ล้มเหลว ที่มา
Go โมดูลธุรกิจ / query JSON ดิบของผลลัพธ์ {"error":{"message":"..."}} response/response.go:49-79
Go /process/* {"ok":true,"data":...} เหมือนข้างบน API เครื่องยนต์ process /process/* — เส้นทาง สิทธิ์ ขนาดบอดี้ (Process engine run API)
Go admin / MCP tokens / POS {"ok":true,"data":...} (POS บาง route {ok,section}) admin: {"ok":false,"error":"...","code":"..."}; POS ส่วนใหญ่ใช้ response.Error API คอนโซลผู้ดูแล /api/v1/admin — provider, user, database, main-query, menu-permissions (Admin console API), API จุดขาย POS (POS endpoints /api/v1/pos)
MCP JSON-RPC result ใน JSON-RPC 2.0 error ใน HTTP 200 (ยกเว้น 401/405) API เซิร์ฟเวอร์ MCP แบบอ่านอย่างเดียว (MCP read-only gateway และการจัดการ token)
Next BFF {ok:true,data} {ok:false,error,code} เช่น NO_TOKEN, NO_SESSION, BACKEND_UNAVAILABLE api-server.ts:34-51, 496-520

การแปลง apperr เป็นสถานะ HTTP: Validation=400, Unauthorized=401, Forbidden=403, NotFound=404, Conflict=409, อื่น ๆ=500 พร้อมข้อความ internal server error (ไม่เปิดเผยสาเหตุ) — รายละเอียดที่ รูปแบบ error และ response ของ API (apperr + response helper).

4. สรุปขีดจำกัดที่พบ

เรื่อง ค่า ที่มา/โน้ต
timeout ของทุกคำขอ 60 วินาที router.go:64
body /process/* 1 MB (ค่าเริ่มต้น) ถึง 64 MB (docpicture/save) ตาม route API เครื่องยนต์ process /process/* — เส้นทาง สิทธิ์ ขนาดบอดี้ (Process engine run API)
body /query/* อ่านด้วย peekJSON สูงสุด 1 MB สำหรับตรวจสิทธิ์ API ประตูเขียนข้อมูล /query/exec และ /query/execBatch (Query exec endpoints)
/blob/insert ดูขนาดรูปในโน้ต API อัปโหลดรูปพร้อมแทรกแถว /blob/insert (Blob insert endpoint)
โมดูลธุรกิจ multipart 32 MB (wms/tms/procure/etax), 10-12 MB (crm), autocare 2 MB API โมดูลธุรกิจ /api/v1/{dashboard,crm,ai,wms,tms,procure,etax,market,autocare} (Business module endpoints)
POS บิล 1 MB, config/shift 1 MB, สลิป 5 MB, sync limit สูงสุด 2000 API จุดขาย POS (POS endpoints /api/v1/pos)
MCP body 2 MB, batch <= 20, timeout 35 วินาที, SQL timeout 15 วินาที API เซิร์ฟเวอร์ MCP แบบอ่านอย่างเดียว (MCP read-only gateway และการจัดการ token)
admin key header X-Admin-Api-Key; ค่าว่างใน config = ปฏิเสธทุกคำขอ adminauth.go:18-28, API ลงทะเบียนผู้ให้บริการ /admin/providers และกุญแจผู้ดูแล (Tenant registration + AdminAuth)

5. ดัชนีโน้ต API (19 ฉบับ)

โน้ต ขอบเขต auth หลัก
ภาพรวมแค็ตตาล็อก API (API overview — วงจรคำขอ middleware รูปแบบ response และดัชนี) ฮับ: วงจรคำขอ middleware รูปแบบ response ดัชนี -
API กลุ่ม /auth — ล็อกอิน เลือกบริษัท รีเฟรช ออกจากระบบ (Auth endpoints) /auth/login, select-company, me, refresh, logout และ Next /api/auth/* public / Bearer
API ประตูอ่านข้อมูล /query — list, limit, batch (Query gateway read endpoints) /query/list, limit, batch (อ่านอย่างเดียว) Bearer
API ประตูเขียนข้อมูล /query/exec และ /query/execBatch (Query exec endpoints) /query/exec, execBatch (เขียน, write guard) Bearer + right
API อัปโหลดรูปพร้อมแทรกแถว /blob/insert (Blob insert endpoint) /blob/insert อัปโหลดรูปพร้อมแทรกแถว Bearer
API ลงทะเบียนผู้ให้บริการ /admin/providers และกุญแจผู้ดูแล (Tenant registration + AdminAuth) /admin/providers ลงทะเบียนผู้ให้บริการ + กลไก AdminAuth admin key
API คอนโซลผู้ดูแล /api/v1/admin — provider, user, database, main-query, menu-permissions (Admin console API) /api/v1/admin/* provider, user, database, main-query, menu-permissions admin key
API Workspace — ล็อกอิน Google, เลือกฐานบริษัท, สมาชิก, สิทธิ์จอ, ผูก LINE (Admin workspace API) /api/v1/admin/workspace/* ล็อกอิน Google เลือกฐาน สมาชิก line-binding admin key (+ชั้น Next)
API เครื่องยนต์ process /process/* — เส้นทาง สิทธิ์ ขนาดบอดี้ (Process engine run API) เครื่องยนต์ /process/* เส้นทาง สิทธิ์ ขนาดบอดี้ Bearer + right
Process action กลุ่มเอกสาร/ธุรกรรม — trans, doc, lookup, cheque, tax, transgrid (Transaction process actions) action เอกสาร/ธุรกรรม: trans, doc, lookup, cheque, tax, transgrid Bearer + right
API สต็อกสินค้า (Process stock actions: stock/rebuild, stocktools/*, point-recal, check-ic-trans, ai-smart-reorder) action สต็อก: stock/rebuild, stocktools, itempicture ฯลฯ Bearer + right
API บัญชีแยกประเภท (Process GL actions: gl/rebuild, journal, gl-check, gl-close, สินทรัพย์ถาวร, AI) action บัญชีแยกประเภท: gl/rebuild, journal, ปิดงวด Bearer + right
API ข้อมูลหลัก (Process master actions: master, master-detail, itemmaster, itemdetail, barcode, docpicture, itempicture, modifyprice) action ข้อมูลหลัก: master, itemmaster, itemdetail, barcode, docpicture Bearer + right
API รายงาน (Process report actions: report/run, report/pdf, ai-report-*) รายงาน: report/run, report/pdf, ai-report-* Bearer + right
API เวิร์กโฟลว์ระบบ (Process workflow actions: change-code, audit-list, import-transport-label, province-*, ai-audit-copilot และดัชนี 19 action) workflow: change-code, audit-list, import ฯลฯ Bearer + right
API โมดูลธุรกิจ /api/v1/{dashboard,crm,ai,wms,tms,procure,etax,market,autocare} (Business module endpoints) dashboard, crm, ai, wms, tms, procure, etax, market, autocare Bearer
API จุดขาย POS (POS endpoints /api/v1/pos) /api/v1/pos/* ซิงก์ บิล สื่อ ตั้งค่า เครื่อง token เครื่อง / Bearer
API เซิร์ฟเวอร์ MCP แบบอ่านอย่างเดียว (MCP read-only gateway และการจัดการ token) MCP แบบอ่านอย่างเดียว + จัดการ token token MCP / admin key
API ตรวจสุขภาพ แผนที่ติดตาม และเส้นทางเฉพาะชั้น Next (Health, Monitormap, Next-only routes) /health, /swagger, monitormap tile และ route เฉพาะชั้น Next หลากหลาย

6. ข้อสังเกตข้ามกลุ่ม (รวบรวมจากโน้ตย่อย)

  1. ค่าเงินในโมดูลธุรกิจเป็น float64 ขัดกับแนวปฏิบัติด้านเงิน/ความถูกต้องของข้อมูล (ความถูกต้องของข้อมูล: เงิน ภาษี Transaction เดียว และ Rebuild (Data Integrity, big.Rat, ExecBatch)).
  2. ชื่อบริษัท/tenant ไม่ถูกคัดลอกมาในโน้ต API; ใช้ placeholder เช่น <token>, <provider>, <adminKey> แทน.

ที่มาในโค้ด

  • backend/internal/adapter/inbound/http/router.go:62-66 (middleware global), :68-71, :73-84, :85-111, :114-123, :126-208, :211-247, :250-326, :329-349, :352-358, :360-371
  • backend/internal/adapter/inbound/http/middleware/auth.go:39-61 (Auth), middleware/adminauth.go:11-28 (AdminAuth), middleware/permission.go (RequireRight)
  • backend/internal/adapter/inbound/http/response/response.go:49-79 (รูปแบบ error)
  • frontend/src/lib/api-server.ts:22 (SERVICE_BASE_URL), :34-51 (ok/fail), :248 (requireSession), :388 (fetchServiceWithAuthRetry), :496 (proxyToService), :555 (getValidAccessToken)
  • frontend/src/app/api/**/route.ts (75 ไฟล์)