@node-c/data-typeorm 1.0.0-alpha64 → 1.0.0-beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/entityService/typeorm.entity.service.d.ts +3 -2
- package/dist/entityService/typeorm.entity.service.js +3 -2
- package/dist/entityService/typeorm.entity.service.js.map +1 -1
- package/dist/module/typeorm.module.js +4 -4
- package/dist/module/typeorm.module.js.map +1 -1
- package/package.json +5 -4
- package/src/common/definitions/common.constants.ts +1 -0
- package/src/common/definitions/index.ts +1 -0
- package/src/entityService/index.ts +1 -0
- package/src/entityService/typeorm.entity.service.spec.ts +1180 -0
- package/src/entityService/typeorm.entity.service.ts +23 -0
- package/src/index.ts +4 -0
- package/src/module/index.ts +2 -0
- package/src/module/typeorm.module.definitions.ts +19 -0
- package/src/module/typeorm.module.spec.ts +148 -0
- package/src/module/typeorm.module.ts +90 -0
- package/src/repository/index.ts +3 -0
- package/src/repository/typeorm.repository.definitions.ts +7 -0
- package/src/repository/typeorm.repository.module.spec.ts +68 -0
- package/src/repository/typeorm.repository.module.ts +58 -0
- package/src/repository/typeorm.repository.ts +18 -0
- package/src/vitest.config.ts +10 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ConfigProviderService, DataDefaultData, LoggerService } from '@node-c/core';
|
|
2
|
+
import { RDBEntityService, SQLQueryBuilderService } from '@node-c/data-rdb';
|
|
3
|
+
|
|
4
|
+
import { EntitySchema, ObjectLiteral } from 'typeorm';
|
|
5
|
+
|
|
6
|
+
import { TypeORMDBRepository } from '../repository';
|
|
7
|
+
|
|
8
|
+
export class TypeORMDBEntityService<
|
|
9
|
+
Entity extends ObjectLiteral,
|
|
10
|
+
Data extends DataDefaultData<Entity> = DataDefaultData<Entity>
|
|
11
|
+
> extends RDBEntityService<Entity, Data> {
|
|
12
|
+
protected primaryKeys: string[];
|
|
13
|
+
|
|
14
|
+
constructor(
|
|
15
|
+
protected configProvider: ConfigProviderService,
|
|
16
|
+
protected logger: LoggerService,
|
|
17
|
+
protected qb: SQLQueryBuilderService,
|
|
18
|
+
protected repository: TypeORMDBRepository<Entity>,
|
|
19
|
+
protected schema: EntitySchema
|
|
20
|
+
) {
|
|
21
|
+
super(configProvider, logger, qb, repository, schema);
|
|
22
|
+
}
|
|
23
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ModuleMetadata } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
import { GenericObject } from '@node-c/core';
|
|
4
|
+
|
|
5
|
+
export interface TypeORMDBModuleOptions {
|
|
6
|
+
connectionName: string;
|
|
7
|
+
entityModuleRegisterOptions?: unknown;
|
|
8
|
+
exports?: ModuleMetadata['exports'];
|
|
9
|
+
folderData: GenericObject<unknown>;
|
|
10
|
+
imports?: {
|
|
11
|
+
atEnd?: ModuleMetadata['imports'];
|
|
12
|
+
postORM?: ModuleMetadata['imports'];
|
|
13
|
+
preORM?: ModuleMetadata['imports'];
|
|
14
|
+
};
|
|
15
|
+
moduleClass: unknown;
|
|
16
|
+
moduleName: string;
|
|
17
|
+
providers?: ModuleMetadata['providers'];
|
|
18
|
+
registerOptionsPerEntityModule?: GenericObject;
|
|
19
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
3
|
+
|
|
4
|
+
// import { ConfigProviderService } from '@node-c/core';
|
|
5
|
+
import { SQLQueryBuilderModule } from '@node-c/data-rdb';
|
|
6
|
+
|
|
7
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
8
|
+
|
|
9
|
+
import { TypeORMDBModule } from './index';
|
|
10
|
+
|
|
11
|
+
// Dummy classes to use in tests.
|
|
12
|
+
class AtEndModule {}
|
|
13
|
+
// class DummyEntity {}
|
|
14
|
+
class DummyModule {}
|
|
15
|
+
class LoadedModule {}
|
|
16
|
+
class PostORMModule {}
|
|
17
|
+
class PreORMModule {}
|
|
18
|
+
|
|
19
|
+
describe('TypeORMDBModule.register', () => {
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
vi.restoreAllMocks();
|
|
22
|
+
});
|
|
23
|
+
it('should register a module with minimal options', () => {
|
|
24
|
+
// const fakeEntities = [DummyEntity];
|
|
25
|
+
const fakeLoadedModules = [LoadedModule];
|
|
26
|
+
// Spy on SQLQueryBuilderModule.register and provide a dummy implementation.
|
|
27
|
+
const sqlQueryRegisterSpy = vi
|
|
28
|
+
.spyOn(SQLQueryBuilderModule, 'register')
|
|
29
|
+
.mockImplementation((options: { dataModuleName: string }) => {
|
|
30
|
+
return { module: 'SQLQueryBuilderModule', options } as unknown as DynamicModule;
|
|
31
|
+
});
|
|
32
|
+
const options = {
|
|
33
|
+
connectionName: 'testConnection',
|
|
34
|
+
folderData: {
|
|
35
|
+
loadedModule: LoadedModule
|
|
36
|
+
},
|
|
37
|
+
moduleClass: DummyModule,
|
|
38
|
+
moduleName: 'testModule'
|
|
39
|
+
};
|
|
40
|
+
const dynamicModule: DynamicModule = TypeORMDBModule.register(options);
|
|
41
|
+
expect(dynamicModule.module).toBe(DummyModule);
|
|
42
|
+
expect(dynamicModule.providers).toEqual([]);
|
|
43
|
+
expect(dynamicModule.exports).toEqual(fakeLoadedModules);
|
|
44
|
+
// The imports array is composed as:
|
|
45
|
+
// [ ...preORM, TypeOrmModule.forRootAsync({ ... }), SQLQueryBuilderModule.register({ ... }), ...postORM, ...loadedModules, ...atEnd ]
|
|
46
|
+
// Since no additional imports were provided, expect:
|
|
47
|
+
// index 0: TypeOrmModule.forRootAsync config
|
|
48
|
+
// index 1: SQLQueryBuilderModule.register result
|
|
49
|
+
// index 2: LoadedModule (from fakeLoadedModules)
|
|
50
|
+
expect(dynamicModule.imports).toHaveLength(3);
|
|
51
|
+
// Verify the TypeOrmModule.forRootAsync configuration.
|
|
52
|
+
const typeOrmAsyncModule = dynamicModule.imports![0] as unknown as {
|
|
53
|
+
imports: unknown[];
|
|
54
|
+
module: TypeOrmModule;
|
|
55
|
+
providers: unknown[];
|
|
56
|
+
};
|
|
57
|
+
expect(typeOrmAsyncModule.module).toBe(TypeOrmModule);
|
|
58
|
+
expect((dynamicModule.imports![1] as unknown as { module: string }).module).toEqual('SQLQueryBuilderModule');
|
|
59
|
+
// Verify that SQLQueryBuilderModule.register was called with the proper argument.
|
|
60
|
+
expect(sqlQueryRegisterSpy).toHaveBeenCalledWith({ dataModuleName: 'testModule' });
|
|
61
|
+
const sqlQueryModule = dynamicModule.imports![1];
|
|
62
|
+
expect(sqlQueryModule).toEqual({
|
|
63
|
+
module: 'SQLQueryBuilderModule',
|
|
64
|
+
options: { dataModuleName: 'testModule' }
|
|
65
|
+
});
|
|
66
|
+
// Finally, check that the loaded module from loadDynamicModules is included.
|
|
67
|
+
expect(dynamicModule.imports![2]).toBe(LoadedModule);
|
|
68
|
+
});
|
|
69
|
+
it('should register a module with additional imports, providers, and exports', () => {
|
|
70
|
+
// const fakeEntities = [DummyEntity];
|
|
71
|
+
const fakeLoadedModules = [LoadedModule];
|
|
72
|
+
// Spy on SQLQueryBuilderModule.register.
|
|
73
|
+
const sqlQueryRegisterSpy = vi
|
|
74
|
+
.spyOn(SQLQueryBuilderModule, 'register')
|
|
75
|
+
.mockImplementation((options: { dataModuleName: string }) => {
|
|
76
|
+
return { module: 'SQLQueryBuilderModule', options } as unknown as DynamicModule;
|
|
77
|
+
});
|
|
78
|
+
const dummyProvider = { provide: 'DUMMY', useValue: 123 };
|
|
79
|
+
const dummyExport = { export: 'DUMMY_EXPORT' } as unknown as DynamicModule;
|
|
80
|
+
const options = {
|
|
81
|
+
connectionName: 'customConnection',
|
|
82
|
+
folderData: {
|
|
83
|
+
loadedModule: LoadedModule
|
|
84
|
+
},
|
|
85
|
+
moduleClass: DummyModule,
|
|
86
|
+
moduleName: 'customModule',
|
|
87
|
+
providers: [dummyProvider],
|
|
88
|
+
exports: [dummyExport],
|
|
89
|
+
imports: {
|
|
90
|
+
preORM: [PreORMModule],
|
|
91
|
+
postORM: [PostORMModule],
|
|
92
|
+
atEnd: [AtEndModule]
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const dynamicModule: DynamicModule = TypeORMDBModule.register(options);
|
|
96
|
+
// Verify module and providers.
|
|
97
|
+
expect(dynamicModule.module).toBe(DummyModule);
|
|
98
|
+
expect(dynamicModule.providers).toEqual([dummyProvider]);
|
|
99
|
+
// Exports should be the concatenation of loaded modules and provided exports.
|
|
100
|
+
expect(dynamicModule.exports).toEqual([...fakeLoadedModules, dummyExport]);
|
|
101
|
+
// Expected imports ordering:
|
|
102
|
+
// index 0: PreORMModule (from imports.preORM)
|
|
103
|
+
// index 1: TypeOrmModule.forRootAsync configuration
|
|
104
|
+
// index 2: SQLQueryBuilderModule.register result
|
|
105
|
+
// index 3: PostORMModule (from imports.postORM)
|
|
106
|
+
// index 4: LoadedModule (from loadDynamicModules.modules)
|
|
107
|
+
// index 5: AtEndModule (from imports.atEnd)
|
|
108
|
+
expect(dynamicModule.imports).toHaveLength(6);
|
|
109
|
+
expect(dynamicModule.imports![0]).toBe(PreORMModule);
|
|
110
|
+
// const typeOrmAsyncModule = dynamicModule.imports![1] as unknown as {
|
|
111
|
+
// useFactory: (_configProvider: ConfigProviderService) => unknown;
|
|
112
|
+
// inject: unknown[];
|
|
113
|
+
// };
|
|
114
|
+
// expect(typeOrmAsyncModule.useFactory).toBeDefined();
|
|
115
|
+
// expect(typeOrmAsyncModule.inject).toEqual([ConfigProviderService]);
|
|
116
|
+
// Supply a fake config for customModule.
|
|
117
|
+
// const fakeConfigProvider: ConfigProviderService = {
|
|
118
|
+
// config: {
|
|
119
|
+
// data: {
|
|
120
|
+
// customModule: {
|
|
121
|
+
// host: '192.168.1.100',
|
|
122
|
+
// password: 'topsecret',
|
|
123
|
+
// port: 27017
|
|
124
|
+
// }
|
|
125
|
+
// }
|
|
126
|
+
// }
|
|
127
|
+
// } as unknown as ConfigProviderService;
|
|
128
|
+
// const typeOrmConfig = typeOrmAsyncModule.useFactory(fakeConfigProvider);
|
|
129
|
+
// expect(typeOrmConfig).toEqual({
|
|
130
|
+
// host: '192.168.1.100',
|
|
131
|
+
// password: 'topsecret',
|
|
132
|
+
// port: 27017,
|
|
133
|
+
// entities: fakeEntities,
|
|
134
|
+
// name: 'customConnection'
|
|
135
|
+
// });
|
|
136
|
+
// Verify SQLQueryBuilderModule.register call.
|
|
137
|
+
expect(sqlQueryRegisterSpy).toHaveBeenCalledWith({ dataModuleName: 'customModule' });
|
|
138
|
+
const sqlQueryModule = dynamicModule.imports![2];
|
|
139
|
+
expect(sqlQueryModule).toEqual({
|
|
140
|
+
module: 'SQLQueryBuilderModule',
|
|
141
|
+
options: { dataModuleName: 'customModule' }
|
|
142
|
+
});
|
|
143
|
+
// Check the rest of the ordering.
|
|
144
|
+
expect(dynamicModule.imports![3]).toBe(PostORMModule);
|
|
145
|
+
expect(dynamicModule.imports![4]).toBe(LoadedModule);
|
|
146
|
+
expect(dynamicModule.imports![5]).toBe(AtEndModule);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm';
|
|
3
|
+
import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type';
|
|
4
|
+
|
|
5
|
+
import { AppConfigDataRDB, ConfigProviderService, LoggerService, RDBType, loadDynamicModules } from '@node-c/core';
|
|
6
|
+
import { SQLQueryBuilderModule } from '@node-c/data-rdb';
|
|
7
|
+
|
|
8
|
+
import { DataSource } from 'typeorm';
|
|
9
|
+
|
|
10
|
+
import { TypeORMDBModuleOptions } from './typeorm.module.definitions';
|
|
11
|
+
|
|
12
|
+
export class TypeORMDBModule {
|
|
13
|
+
static register(options: TypeORMDBModuleOptions): DynamicModule {
|
|
14
|
+
const { connectionName, folderData, imports: additionalImports, moduleClass, moduleName } = options;
|
|
15
|
+
const { atEnd: importsAtEnd, postORM: importsPostORM, preORM: importsPreORM } = additionalImports || {};
|
|
16
|
+
const { entities, modules } = loadDynamicModules(folderData, {
|
|
17
|
+
moduleRegisterOptions: options.entityModuleRegisterOptions,
|
|
18
|
+
registerOptionsPerModule: options.registerOptionsPerEntityModule
|
|
19
|
+
});
|
|
20
|
+
let lastRetryAt = new Date().valueOf();
|
|
21
|
+
return {
|
|
22
|
+
global: true,
|
|
23
|
+
module: moduleClass as DynamicModule['module'],
|
|
24
|
+
imports: [
|
|
25
|
+
...(importsPreORM || []),
|
|
26
|
+
TypeOrmModule.forRootAsync({
|
|
27
|
+
dataSourceFactory: async options => {
|
|
28
|
+
let dataSource: DataSource;
|
|
29
|
+
try {
|
|
30
|
+
dataSource = new DataSource(options!);
|
|
31
|
+
await dataSource.initialize();
|
|
32
|
+
} catch (err) {
|
|
33
|
+
const { failOnConnectionError = true, nodeCAppLoggerService } = (options || {}) as {
|
|
34
|
+
failOnConnectionError?: boolean;
|
|
35
|
+
nodeCAppLoggerService: LoggerService;
|
|
36
|
+
};
|
|
37
|
+
nodeCAppLoggerService.error(`[TypeORMDBModule][${moduleName}]: Error connecting to the DB Server:`, err);
|
|
38
|
+
if (failOnConnectionError) {
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return dataSource!;
|
|
43
|
+
},
|
|
44
|
+
name: connectionName,
|
|
45
|
+
useFactory: (configProvider: ConfigProviderService, logger: LoggerService) => {
|
|
46
|
+
const dataConfig = configProvider.config.data;
|
|
47
|
+
// example : configProvider.config.data.db
|
|
48
|
+
const { database, failOnConnectionError, host, password, port, type, typeormExtraOptions, user } =
|
|
49
|
+
dataConfig[moduleName as keyof typeof dataConfig] as AppConfigDataRDB;
|
|
50
|
+
const dataSourceOptions: { toRetry?: TypeOrmModuleOptions['toRetry'] } = {};
|
|
51
|
+
if (!failOnConnectionError) {
|
|
52
|
+
dataSourceOptions.toRetry = () => {
|
|
53
|
+
const now = new Date().valueOf();
|
|
54
|
+
// 1 minute retry interval
|
|
55
|
+
if (Math.abs(lastRetryAt - now) > 60000) {
|
|
56
|
+
lastRetryAt = now;
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
...dataSourceOptions,
|
|
64
|
+
database,
|
|
65
|
+
entities: entities as EntityClassOrSchema[],
|
|
66
|
+
failOnConnectionError,
|
|
67
|
+
host,
|
|
68
|
+
manualInitialization: true,
|
|
69
|
+
name: connectionName,
|
|
70
|
+
nodeCAppLoggerService: logger,
|
|
71
|
+
password,
|
|
72
|
+
port,
|
|
73
|
+
synchronize: false,
|
|
74
|
+
type: type === RDBType.Aurora ? RDBType.MySQL : type,
|
|
75
|
+
username: user,
|
|
76
|
+
...(typeormExtraOptions || {})
|
|
77
|
+
} as TypeOrmModuleOptions;
|
|
78
|
+
},
|
|
79
|
+
inject: [ConfigProviderService]
|
|
80
|
+
}),
|
|
81
|
+
SQLQueryBuilderModule.register({ dataModuleName: moduleName }),
|
|
82
|
+
...(importsPostORM || []),
|
|
83
|
+
...(modules || []),
|
|
84
|
+
...(importsAtEnd || [])
|
|
85
|
+
],
|
|
86
|
+
providers: [...(options.providers || [])],
|
|
87
|
+
exports: [...(modules || []), ...(options.exports || [])]
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
2
|
+
import { Repository } from 'typeorm';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
|
|
5
|
+
import { RDBRepositoryModule } from './index';
|
|
6
|
+
|
|
7
|
+
import { Constants } from '../common/definitions/common.constants';
|
|
8
|
+
import { SQLQueryBuilderService } from '../sqlQueryBuilder';
|
|
9
|
+
|
|
10
|
+
class DummyEntity {}
|
|
11
|
+
|
|
12
|
+
describe('RDBRepositoryModule', () => {
|
|
13
|
+
describe('register', () => {
|
|
14
|
+
const dataModuleName = 'TestModule';
|
|
15
|
+
const options = {
|
|
16
|
+
entityClass: DummyEntity,
|
|
17
|
+
dataModuleName
|
|
18
|
+
};
|
|
19
|
+
const dynamicModule = RDBRepositoryModule.register<DummyEntity>(options);
|
|
20
|
+
it('should return a DynamicModule with the correct module property', () => {
|
|
21
|
+
expect(dynamicModule.module).toBe(RDBRepositoryModule);
|
|
22
|
+
});
|
|
23
|
+
it('should include the correct imports', () => {
|
|
24
|
+
expect(dynamicModule.imports).toBeDefined();
|
|
25
|
+
expect(Array.isArray(dynamicModule.imports)).toBe(true);
|
|
26
|
+
expect(dynamicModule.imports!.length).toBe(1);
|
|
27
|
+
// The import should be the result of TypeOrmModule.forFeature, which we can assume is valid if defined.
|
|
28
|
+
expect(dynamicModule.imports![0]).toBeDefined();
|
|
29
|
+
});
|
|
30
|
+
it('should include the correct providers', () => {
|
|
31
|
+
expect(dynamicModule.providers).toBeDefined();
|
|
32
|
+
expect(Array.isArray(dynamicModule.providers)).toBe(true);
|
|
33
|
+
expect(dynamicModule.providers!.length).toBe(2);
|
|
34
|
+
// Find the provider for SQLQueryBuilderService.
|
|
35
|
+
const sqlProvider = dynamicModule.providers!.find(
|
|
36
|
+
(
|
|
37
|
+
provider
|
|
38
|
+
): provider is {
|
|
39
|
+
provide: typeof SQLQueryBuilderService;
|
|
40
|
+
useFactory: (_dep: SQLQueryBuilderService) => SQLQueryBuilderService;
|
|
41
|
+
inject: string[];
|
|
42
|
+
} =>
|
|
43
|
+
typeof provider === 'object' &&
|
|
44
|
+
provider !== null &&
|
|
45
|
+
'provide' in provider &&
|
|
46
|
+
provider.provide === SQLQueryBuilderService
|
|
47
|
+
);
|
|
48
|
+
expect(sqlProvider).toBeDefined();
|
|
49
|
+
if (sqlProvider) {
|
|
50
|
+
expect(typeof sqlProvider.useFactory).toBe('function');
|
|
51
|
+
// Verify that the factory returns its argument.
|
|
52
|
+
const dummyService = {} as SQLQueryBuilderService;
|
|
53
|
+
expect(sqlProvider.useFactory(dummyService)).toBe(dummyService);
|
|
54
|
+
// Check that the inject token is formed correctly.
|
|
55
|
+
expect(sqlProvider.inject).toEqual([`${dataModuleName}${Constants.SQL_BUILDER_SERVICE_TOKEN_SUFFIX}`]);
|
|
56
|
+
}
|
|
57
|
+
// Check that the Repository provider is present.
|
|
58
|
+
const repositoryProvider = dynamicModule.providers!.find(provider => provider === Repository);
|
|
59
|
+
expect(repositoryProvider).toBe(Repository);
|
|
60
|
+
});
|
|
61
|
+
it('should include the correct exports', () => {
|
|
62
|
+
expect(dynamicModule.exports).toBeDefined();
|
|
63
|
+
expect(Array.isArray(dynamicModule.exports)).toBe(true);
|
|
64
|
+
// The module exports TypeOrmModule, Repository, and SQLQueryBuilderService.
|
|
65
|
+
expect(dynamicModule.exports).toEqual([TypeOrmModule, Repository, SQLQueryBuilderService]);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { DynamicModule, Module } from '@nestjs/common';
|
|
2
|
+
import { TypeOrmModule, getDataSourceToken } from '@nestjs/typeorm';
|
|
3
|
+
|
|
4
|
+
import { Constants, SQLQueryBuilderService } from '@node-c/data-rdb';
|
|
5
|
+
|
|
6
|
+
import { DataSource, ObjectLiteral } from 'typeorm';
|
|
7
|
+
|
|
8
|
+
import { TypeORMDBRepository } from './typeorm.repository';
|
|
9
|
+
import { TypeORMDBRepositoryModuleOptions } from './typeorm.repository.definitions';
|
|
10
|
+
|
|
11
|
+
@Module({})
|
|
12
|
+
export class TypeORMDBRepositoryModule {
|
|
13
|
+
static register<Entity extends ObjectLiteral>(options: TypeORMDBRepositoryModuleOptions): DynamicModule {
|
|
14
|
+
const { connectionName, entityClass, dataModuleName } = options;
|
|
15
|
+
return {
|
|
16
|
+
module: TypeORMDBRepositoryModule,
|
|
17
|
+
imports: [TypeOrmModule.forFeature([entityClass], connectionName)],
|
|
18
|
+
providers: [
|
|
19
|
+
{
|
|
20
|
+
provide: Constants.RDB_REPOSITORY_CONNECTION_NAME,
|
|
21
|
+
useValue: connectionName
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
provide: SQLQueryBuilderService,
|
|
25
|
+
useFactory: (sqlQueryBuilderService: SQLQueryBuilderService) => sqlQueryBuilderService,
|
|
26
|
+
inject: [`${dataModuleName}${Constants.SQL_BUILDER_SERVICE_TOKEN_SUFFIX}`]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
provide: Constants.RDB_REPOSITORY_ENTITY_CLASS,
|
|
30
|
+
useValue: entityClass
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
provide: Constants.RDB_REPOSITORY_DATASOURCE,
|
|
34
|
+
useFactory: (dataSource: DataSource) => dataSource,
|
|
35
|
+
inject: [getDataSourceToken(connectionName)]
|
|
36
|
+
},
|
|
37
|
+
TypeORMDBRepository<Entity>,
|
|
38
|
+
{
|
|
39
|
+
provide: Constants.RDB_ENTITY_REPOSITORY,
|
|
40
|
+
useExisting: TypeORMDBRepository<Entity>
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
exports: [
|
|
44
|
+
TypeOrmModule,
|
|
45
|
+
SQLQueryBuilderService,
|
|
46
|
+
{
|
|
47
|
+
provide: Constants.RDB_ENTITY_REPOSITORY,
|
|
48
|
+
useExisting: TypeORMDBRepository<Entity>
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
provide: Constants.RDB_REPOSITORY_DATASOURCE,
|
|
52
|
+
useFactory: (dataSource: DataSource) => dataSource,
|
|
53
|
+
inject: [getDataSourceToken(connectionName)]
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import { EntityClassOrSchema } from '@nestjs/typeorm/dist/interfaces/entity-class-or-schema.type';
|
|
3
|
+
|
|
4
|
+
import { Constants } from '@node-c/data-rdb';
|
|
5
|
+
|
|
6
|
+
import { DataSource, ObjectLiteral, Repository } from 'typeorm';
|
|
7
|
+
|
|
8
|
+
@Injectable()
|
|
9
|
+
export class TypeORMDBRepository<Entity extends ObjectLiteral> extends Repository<Entity> {
|
|
10
|
+
constructor(
|
|
11
|
+
@Inject(Constants.RDB_REPOSITORY_DATASOURCE)
|
|
12
|
+
protected dataSource: DataSource,
|
|
13
|
+
@Inject(Constants.RDB_REPOSITORY_ENTITY_CLASS)
|
|
14
|
+
protected entityClass: EntityClassOrSchema
|
|
15
|
+
) {
|
|
16
|
+
super(entityClass, dataSource.createEntityManager());
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config';
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
test: {
|
|
5
|
+
coverage: {
|
|
6
|
+
exclude: ['dist', 'src/index.ts', 'src/vitest.config.ts', 'src/**/*/*definitions.ts', 'test']
|
|
7
|
+
},
|
|
8
|
+
exclude: ['src/sqlQueryBuilder/sqlQueryBuilder.service.helpers.spec.ts']
|
|
9
|
+
}
|
|
10
|
+
});
|