Bỏ qua, đến nội dung

Kiến trúc

Tổng quan

plugin-data-source-manager quản lý nhiều data source bên ngoài — từ kết nối, load schema, đến phân quyền riêng cho mỗi nguồn dữ liệu. Plugin sử dụng factory pattern để hỗ trợ nhiều loại connector và per-datasource ACL để kiểm soát truy cập.

DataSource Lifecycle

Luồng thêm data source mới

Trạng thái

Plugin theo dõi trạng thái mỗi data source:

StatusÝ nghĩa
loadingĐang kết nối và load schema
loadedSẵn sàng sử dụng
failedKết nối lỗi (xem dataSourceErrors)
reloadingĐang reload (sau cập nhật cấu hình)

Progress events được emit trong quá trình load, client có thể hiển thị thanh tiến trình.

Factory Pattern

Plugin sử dụng factory để tạo DataSource instance theo type:

typescript
// Plugin đăng ký driver
this.app.dataSourceManager.factory.register('postgres', PostgresDataSource);
this.app.dataSourceManager.factory.register('mysql', MySQLDataSource);

// Khi tạo data source mới
const ds = this.app.dataSourceManager.factory.create(type, options);

Connector types có sẵn

PluginType key
plugin-data-source-external-postgrespostgres
plugin-data-source-external-mysqlmysql
plugin-data-source-external-mssqlmssql
plugin-data-source-external-oracleoracle
plugin-data-source-external-mariadbmariadb
plugin-data-source-rest-apirest-api

Per-DataSource ACL

Mỗi data source ngoài có hệ thống ACL riêng, hoàn toàn tách biệt với ACL của data source chính.

Cấu trúc phân quyền

loadIntoACL

Khi data source được load, plugin:

  1. Tạo ACL instance riêng cho data source.
  2. Đọc dataSourcesRoles → gán strategy.
  3. Đọc dataSourcesRolesResources → gán resource permissions.
  4. Đọc dataSourcesRolesResourcesActions → gán action permissions với scope.

mergeRole

Tương tự plugin-acl, per-DS ACL hỗ trợ mergeRole để kết hợp quyền từ nhiều role của user.

handleSyncMessage — Cluster Sync

Khi chạy nhiều instance, thay đổi trên instance A cần đồng bộ sang instance B:

Sync messages bao gồm:

  • ACL sync (role/resource/action thay đổi).
  • Load/unload collection/field.
  • Data source enable/disable.

Hooks

HookThời điểmHành vi
dataSources.beforeSaveTrước khi lưuValidate options, test connection
dataSources.afterSaveSau khi lưuLoad data source vào app
dataSourcesFields.beforeSaveTrước khi lưu fieldValidate field config
dataSourcesFields.afterSaveSau khi lưu fieldReload collection

loadDataSourceTablesIntoCollections

Middleware chạy khi data source load xong — đọc danh sách tables từ database ngoài và tạo dataSourcesCollections records tương ứng.