Bỏ qua, đến nội dung

Luồng dữ liệu & request

Tài liệu mô tả pipeline request thực tế từ client đến repository/database.

1) Khái niệm cốt lõi

Thành phầnTrách nhiệm
ResourceManagerParse URL → resolve Resource + Action
ActionGom params (query/path/body) + middleware chain
DataSourceManagerChọn data source (main hoặc header x-data-source)
RepositoryParse filter/options → query/update database
AuthXác thực request (JWT, token)
ACLPhân quyền (role → resource → action)

2) Sơ đồ tổng quát request pipeline

3) Sequence cho read action (list / get / query)

4) Sequence cho write action (create / update / destroy)

5) Đường đi của ctx.action.params

params được hợp nhất từ nhiều nguồn:

Chiến lược merge của Action.mergeParams():

TrườngChiến lượcÝ nghĩa
filterand-mergeFilter từ nhiều nguồn được AND lại, đảm bảo không mất điều kiện bảo mật
fields / whitelist / blacklistintersectChỉ giữ trường nằm trong tất cả các danh sách
appends / exceptunionGộp lại, cho phép mở rộng
sortoverwriteNguồn sau ghi đè nguồn trước

Tại sao filter dùng and-merge?

ACL middleware thường inject filter ẩn (ví dụ: { createdById: currentUserId } cho quyền "view own"). Nếu merge bằng overwrite, plugin hoặc client có thể vô tình xóa filter bảo mật này.

6) Điểm đặt policy bảo mật

Lớp bảo mậtChức năngVí dụ
Auth middlewareXác định token → ctx.state.currentUserJWT decode, session check
ACL middlewareKiểm tra role có quyền thực hiện action khôngeditor không được destroy trên users
ACL fixed paramsÉp filter theo role vào params{ createdById: ctx.state.currentUser.id }
Pre-handler pluginBổ sung logic permission phức tạpCheck quyền trên association lồng

7) Điểm đặt logic plugin

Plugin can thiệp vào pipeline tại nhiều vị trí:

Mục đíchAPIScope
Thêm middleware toàn appapp.use(fn, { tag, after, before })Tất cả request
Thêm middleware toàn data sourcedataSourceManager.use(fn)Request có data source
Thêm action mớiresourceManager.registerActionHandler(name, fn)Resource cụ thể
Thêm logic tiền xử lýresourceManager.registerPreActionHandler(name, fn, topo)Trước handler

Thứ tự middleware quan trọng

Middleware dùng Toposort (tag + after/before). Nếu plugin thêm middleware không khai báo dependency đúng, thứ tự thực thi có thể không như mong đợi. Luôn khai báo after/before rõ ràng.

8) Mối liên hệ client ↔ server

  • Client chỉ giao tiếp qua HTTP/WS, không truy cập repository trực tiếp.
  • Data block trên client tạo request theo schema + params (field selection, filter, sort).
  • Response JSON được render lại bởi UI schema / component map.
  • WebSocket dùng cho trạng thái realtime (maintaining, notification), không dùng cho data query.

Đọc tiếp