Bỏ qua, đến nội dung

DataSourceManager

1) Kiến trúc lớp

LớpTrách nhiệm
DataSourceManagerMap dataSources, middleware cấp manager, hook lifecycle, factory cho data source type
DataSource (abstract)collectionManager, resourceManager, acl. Setup default action handlers. Expose middleware().
DatabaseDataSourceThêm logic introspection DB
SequelizeDataSourceConcrete data source dùng SequelizeCollectionManager

2) DataSourceManager.add() - trình tự thực tế

Auto-cleanup khi stop

Constructor DataSourceManager bind app.on('beforeStop', ...) để đóng toàn bộ data source khi app stop. Không cần cleanup thủ công.

3) DataSource.init() - setup chi tiết

ACL middleware cấp data source luôn nằm sau auth trong topo order.

4) Data source middleware request flow

collectionToResourceMiddleware() - auto-define resource

Middleware này tự define resource động nếu:

  1. URL parse được ra resource hợp lệ.
  2. Collection tồn tại trong collection manager.
  3. Resource chưa được define.

Zero-config resource

Nhờ cơ chế này, không cần define thủ công resource cho mỗi collection. Khi tạo collection mới qua UI hoặc code, resource tương ứng tự động available.

5) Default actions của data-source-manager

loadDefaultActions() map action sang repository method:

ActionRepository methodGhi chú
createrepository.create
getrepository.findOne
updaterepository.update
destroyrepository.destroy
firstOrCreaterepository.firstOrCreate
updateOrCreaterepository.updateOrCreate
toggleCustom toggle logic
add / remove / setAssociation methods
listImplementation riêngTrong default-actions/list.ts
queryTừ @digiforce-nc/actionsAggregate query

proxyToRepository() có guard: nếu repository không hỗ trợ method → throw lỗi rõ ràng (action/resource/dataSource).

6) Introspector và DB data source

DatabaseDataSource chọn introspector theo dialect:

DialectIntrospector
postgresPostgresIntrospector
mariadbMariaDBIntrospector
KhácDatabaseIntrospector (fallback)

Helper merge metadata:

  • mergeWithLoadedCollections(): merge collection đọc từ DB với metadata đã lưu.
  • mergeFieldOptions(): ưu tiên giữ lại option quan trọng khi raw type thay đổi.

7) MainDataSource trong server package

packages/core/server/src/main-data-source.ts override một số logic:

FeatureMô tả
collectionsFilterChỉ load collection được quản lý
readTables()Đọc tables từ DB
loadTables()Load tables vào collection manager
syncFieldsFromDatabase()Đồng bộ field definition từ DB schema
ACL middlewareGắn với group: 'acl', after: 'auth'

Application luôn tạo sẵn MainDataSource tên main trong createMainDataSource().

8) Phân biệt server vs client DataSourceManager

ServerClient
Package@digiforce-nc/data-source-manager@digiforce-nc/clientsrc/data-source/...
PipelineKoa middleware → ResourceManager → Action → RepositoryKhông có
ACLEngine runtime + middlewareĐọc permission từ API
Mục đíchXử lý request, query DBMetadata UI, render schema

Import path

Khi viết plugin, cần ghi rõ import path. Hai class DataSourceManager cùng tên nhưng hoàn toàn khác nhau về chức năng.

Đọc tiếp