Giao diện
DataSourceManager
1) Kiến trúc lớp
| Lớp | Trách nhiệm |
|---|---|
DataSourceManager | Map dataSources, middleware cấp manager, hook lifecycle, factory cho data source type |
DataSource (abstract) | Có collectionManager, resourceManager, acl. Setup default action handlers. Expose middleware(). |
DatabaseDataSource | Thêm logic introspection DB |
SequelizeDataSource | Concrete 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:
- URL parse được ra resource hợp lệ.
- Collection tồn tại trong collection manager.
- 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:
| Action | Repository method | Ghi chú |
|---|---|---|
create | repository.create | |
get | repository.findOne | |
update | repository.update | |
destroy | repository.destroy | |
firstOrCreate | repository.firstOrCreate | |
updateOrCreate | repository.updateOrCreate | |
toggle | Custom toggle logic | |
add / remove / set | Association methods | |
list | Implementation riêng | Trong default-actions/list.ts |
query | Từ @digiforce-nc/actions | Aggregate 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:
| Dialect | Introspector |
|---|---|
postgres | PostgresIntrospector |
mariadb | MariaDBIntrospector |
| Khác | DatabaseIntrospector (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:
| Feature | Mô tả |
|---|---|
collectionsFilter | Chỉ 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 middleware | Gắ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
| Server | Client | |
|---|---|---|
| Package | @digiforce-nc/data-source-manager | @digiforce-nc/client → src/data-source/... |
| Pipeline | Koa middleware → ResourceManager → Action → Repository | Không có |
| ACL | Engine runtime + middleware | Đọc permission từ API |
| Mục đích | Xử lý request, query DB | Metadata 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
- Resourcer & Actions - action pipeline bên trong data source
- Engine ACL - ACL engine gắn với mỗi data source