From 320d4fef0750c77ea5c12273ca90f8e0970995cc Mon Sep 17 00:00:00 2001 From: ChengLei Shao Date: Mon, 22 Apr 2024 22:23:41 +0800 Subject: [PATCH] chore: datasource manager api (#4124) * chore: datasource manager api * chore: interface * chore: api * chore: datasource api --- .../src/__tests__/data-source-factory.test.ts | 24 +++++++++++++++++++ .../src/data-source-manager.ts | 19 ++++++++++++--- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/packages/core/data-source-manager/src/__tests__/data-source-factory.test.ts b/packages/core/data-source-manager/src/__tests__/data-source-factory.test.ts index 1f2f7e8c04..86fdef37bf 100644 --- a/packages/core/data-source-manager/src/__tests__/data-source-factory.test.ts +++ b/packages/core/data-source-manager/src/__tests__/data-source-factory.test.ts @@ -3,6 +3,30 @@ import { DataSource } from '../data-source'; import { ICollectionManager } from '../types'; describe('data source factory', () => { + it('should register data source type from dataSourceManager', async () => { + class MockDataSource extends DataSource { + createCollectionManager(options?: any): ICollectionManager { + return undefined; + } + } + + const app = await createMockServer({ + acl: false, + resourcer: { + prefix: '/api/', + }, + name: 'test-app-0', + }); + + app.dataSourceManager.registerDataSourceType('mock', MockDataSource); + + expect(app.dataSourceManager.getDataSourceType('mock')).toBe(MockDataSource); + + const ds = app.dataSourceManager.buildDataSourceByType('mock'); + + expect(ds).toBeInstanceOf(MockDataSource); + }); + it('should register data source type', async () => { class MockDataSource extends DataSource { createCollectionManager(options?: any): ICollectionManager { diff --git a/packages/core/data-source-manager/src/data-source-manager.ts b/packages/core/data-source-manager/src/data-source-manager.ts index f34cfbc9ab..11a34d8f8c 100644 --- a/packages/core/data-source-manager/src/data-source-manager.ts +++ b/packages/core/data-source-manager/src/data-source-manager.ts @@ -6,11 +6,12 @@ type DataSourceHook = (dataSource: DataSource) => void; export class DataSourceManager { dataSources: Map; + /** + * @internal + */ factory: DataSourceFactory = new DataSourceFactory(); - - onceHooks: Array = []; - protected middlewares = []; + private onceHooks: Array = []; constructor(public options = {}) { this.dataSources = new Map(); @@ -49,6 +50,18 @@ export class DataSourceManager { }; } + registerDataSourceType(type: string, DataSourceClass: typeof DataSource) { + this.factory.register(type, DataSourceClass); + } + + getDataSourceType(type: string): typeof DataSource | undefined { + return this.factory.getClass(type); + } + + buildDataSourceByType(type: string, options: any = {}): DataSource { + return this.factory.create(type, options); + } + afterAddDataSource(hook: DataSourceHook) { this.addHookAndRun(hook); }