@node-c/data-redis 1.0.0-alpha64 → 1.0.0-beta0
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/repository/redis.repository.module.js +1 -1
- package/dist/repository/redis.repository.module.js.map +1 -1
- package/dist/repository/redis.repository.service.d.ts +6 -3
- package/dist/repository/redis.repository.service.js +83 -20
- package/dist/repository/redis.repository.service.js.map +1 -1
- package/dist/store/redis.store.module.js +1 -1
- package/dist/store/redis.store.module.js.map +1 -1
- package/dist/store/redis.store.service.js +1 -1
- package/dist/store/redis.store.service.js.map +1 -1
- package/package.json +4 -4
- package/src/common/definitions/common.constants.ts +10 -0
- package/src/common/definitions/index.ts +1 -0
- package/src/entityService/index.ts +2 -0
- package/src/entityService/redis.entity.service.definitions.ts +73 -0
- package/src/entityService/redis.entity.service.spec.ts +190 -0
- package/src/entityService/redis.entity.service.ts +291 -0
- package/src/index.ts +5 -0
- package/src/module/index.ts +2 -0
- package/src/module/redis.module.definitions.ts +18 -0
- package/src/module/redis.module.spec.ts +80 -0
- package/src/module/redis.module.ts +31 -0
- package/src/repository/index.ts +3 -0
- package/src/repository/redis.repository.definitions.ts +97 -0
- package/src/repository/redis.repository.module.spec.ts +60 -0
- package/src/repository/redis.repository.module.ts +34 -0
- package/src/repository/redis.repository.service.ts +657 -0
- package/src/repository/redis.repository.spec.ts +384 -0
- package/src/store/index.ts +3 -0
- package/src/store/redis.store.definitions.ts +25 -0
- package/src/store/redis.store.module.spec.ts +70 -0
- package/src/store/redis.store.module.ts +34 -0
- package/src/store/redis.store.service.spec.ts +392 -0
- package/src/store/redis.store.service.ts +391 -0
- package/src/vitest.config.ts +9 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { GenericObject } from '@node-c/core';
|
|
2
|
+
|
|
3
|
+
import { ValidationSchema } from 'class-validator';
|
|
4
|
+
|
|
5
|
+
export interface EntitySchema {
|
|
6
|
+
columns: {
|
|
7
|
+
[columnName: string]: {
|
|
8
|
+
generated?: boolean;
|
|
9
|
+
isCreationDate?: boolean;
|
|
10
|
+
isDeletionDate?: boolean;
|
|
11
|
+
// this only works with arrays
|
|
12
|
+
isInnerPrimary?: boolean;
|
|
13
|
+
isUpdateDate?: boolean;
|
|
14
|
+
primary?: boolean;
|
|
15
|
+
primaryOrder?: number;
|
|
16
|
+
type?: EntitySchemaColumnType;
|
|
17
|
+
// https://www.npmjs.com/package/class-validator/v/0.6.0#defining-validation-schema-without-decorators
|
|
18
|
+
validationProperties?: ValidationSchema['properties'][''];
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
isArray?: boolean;
|
|
22
|
+
name: string;
|
|
23
|
+
nestedObjectContainerPath?: string;
|
|
24
|
+
paranoid?: boolean;
|
|
25
|
+
storeKey: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export enum EntitySchemaColumnType {
|
|
29
|
+
// eslint-disable-next-line no-unused-vars
|
|
30
|
+
Array = 'array',
|
|
31
|
+
// eslint-disable-next-line no-unused-vars
|
|
32
|
+
Boolean = 'boolean',
|
|
33
|
+
// eslint-disable-next-line no-unused-vars
|
|
34
|
+
Integer = 'integer',
|
|
35
|
+
// eslint-disable-next-line no-unused-vars
|
|
36
|
+
Object = 'object',
|
|
37
|
+
// eslint-disable-next-line no-unused-vars
|
|
38
|
+
String = 'string',
|
|
39
|
+
// eslint-disable-next-line no-unused-vars
|
|
40
|
+
TimestampTz = 'timestampTz',
|
|
41
|
+
// eslint-disable-next-line no-unused-vars
|
|
42
|
+
UUIDV4 = 'uuidv4'
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface FilterItemOptions {
|
|
46
|
+
keysToSkip?: GenericObject<boolean>;
|
|
47
|
+
skippableKeysToForceCheck?: GenericObject<boolean>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface GetValuesFromResultsOptions {
|
|
51
|
+
filters?: GenericObject<unknown>;
|
|
52
|
+
flattenArray?: boolean;
|
|
53
|
+
hasNonPrimaryKeyFilters?: boolean;
|
|
54
|
+
primaryKeyFiltersToForceCheck?: GenericObject<boolean>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface PrepareOptions {
|
|
58
|
+
generatePrimaryKeys: boolean;
|
|
59
|
+
onConflict?: SaveOptionsOnConflict;
|
|
60
|
+
validate?: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface RedisRepositoryModuleOptions {
|
|
64
|
+
dataModuleName: string;
|
|
65
|
+
schema: EntitySchema;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface RepositoryFindOptions {
|
|
69
|
+
filters?: GenericObject<unknown>;
|
|
70
|
+
findAll?: boolean;
|
|
71
|
+
individualSearch?: boolean;
|
|
72
|
+
page?: number;
|
|
73
|
+
perPage?: number;
|
|
74
|
+
withValues?: boolean;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface RepositoryFindPrivateOptions {
|
|
78
|
+
requirePrimaryKeys?: boolean;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface SaveOptions {
|
|
82
|
+
delete?: boolean;
|
|
83
|
+
generatePrimaryKeys: boolean;
|
|
84
|
+
onConflict?: SaveOptionsOnConflict;
|
|
85
|
+
transactionId?: string;
|
|
86
|
+
ttl?: number;
|
|
87
|
+
validate?: boolean;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export enum SaveOptionsOnConflict {
|
|
91
|
+
// eslint-disable-next-line no-unused-vars
|
|
92
|
+
DoNothing = 'doNothing',
|
|
93
|
+
// eslint-disable-next-line no-unused-vars
|
|
94
|
+
ThrowError = 'throwError',
|
|
95
|
+
// eslint-disable-next-line no-unused-vars
|
|
96
|
+
Update = 'update'
|
|
97
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { EntitySchema, RedisRepositoryModule, RedisRepositoryService } from './index';
|
|
4
|
+
|
|
5
|
+
import { Constants } from '../common/definitions';
|
|
6
|
+
import { RedisStoreService } from '../store';
|
|
7
|
+
|
|
8
|
+
interface ProviderObject {
|
|
9
|
+
provide: unknown;
|
|
10
|
+
useValue?: unknown;
|
|
11
|
+
useFactory?: (_arg: unknown) => unknown;
|
|
12
|
+
inject?: string[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
describe('RedisRepositoryModule', () => {
|
|
16
|
+
const moduleName = 'test';
|
|
17
|
+
const storeKey = 'test-store';
|
|
18
|
+
|
|
19
|
+
describe('register', () => {
|
|
20
|
+
const dummySchema: EntitySchema = { columns: {}, name: 'testSchema' };
|
|
21
|
+
const options = { dataModuleName: moduleName, schema: dummySchema, storeKey };
|
|
22
|
+
const dynamicModule = RedisRepositoryModule.register(options);
|
|
23
|
+
const expectedStoreServiceToken = `${moduleName}${Constants.REDIS_CLIENT_STORE_SERVICE_SUFFIX}`;
|
|
24
|
+
it('should return a dynamic module with the expected properties', () => {
|
|
25
|
+
expect(dynamicModule.module).toBe(RedisRepositoryModule);
|
|
26
|
+
expect(dynamicModule.imports).toEqual([]);
|
|
27
|
+
expect(dynamicModule.providers).toHaveLength(4);
|
|
28
|
+
expect(dynamicModule.exports).toEqual([RedisRepositoryService, RedisStoreService]);
|
|
29
|
+
});
|
|
30
|
+
it('should include a provider for Constants.REDIS_REPOSITORY_SCHEMA with useValue equal to schema', () => {
|
|
31
|
+
const provider = dynamicModule.providers!.find(
|
|
32
|
+
(p: unknown): p is ProviderObject =>
|
|
33
|
+
typeof p === 'object' &&
|
|
34
|
+
p !== null &&
|
|
35
|
+
'provide' in p &&
|
|
36
|
+
(p as ProviderObject).provide === Constants.REDIS_REPOSITORY_SCHEMA
|
|
37
|
+
) as ProviderObject | undefined;
|
|
38
|
+
expect(provider).toBeDefined();
|
|
39
|
+
expect(provider!.useValue).toEqual(dummySchema);
|
|
40
|
+
});
|
|
41
|
+
it('should include a provider for RedisStoreService with correct useFactory and inject', () => {
|
|
42
|
+
const provider = dynamicModule.providers!.find(
|
|
43
|
+
(p: unknown): p is ProviderObject =>
|
|
44
|
+
typeof p === 'object' && p !== null && 'provide' in p && (p as ProviderObject).provide === RedisStoreService
|
|
45
|
+
) as ProviderObject | undefined;
|
|
46
|
+
expect(provider).toBeDefined();
|
|
47
|
+
expect(typeof provider!.useFactory).toBe('function');
|
|
48
|
+
expect(provider!.inject).toEqual([expectedStoreServiceToken]);
|
|
49
|
+
// Verify the useFactory function returns its input
|
|
50
|
+
const dummyInstance: RedisStoreService = {} as RedisStoreService;
|
|
51
|
+
const factoryResult = provider!.useFactory!(dummyInstance);
|
|
52
|
+
expect(factoryResult).toBe(dummyInstance);
|
|
53
|
+
});
|
|
54
|
+
it('should include RedisRepositoryService as a provider', () => {
|
|
55
|
+
// RedisRepositoryService is provided as a class (not an object provider)
|
|
56
|
+
const providerExists = dynamicModule.providers!.some((p: unknown) => p === RedisRepositoryService);
|
|
57
|
+
expect(providerExists).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { DynamicModule, Module } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
import { Constants as CoreConstants } from '@node-c/core';
|
|
4
|
+
|
|
5
|
+
import { RedisRepositoryModuleOptions } from './redis.repository.definitions';
|
|
6
|
+
import { RedisRepositoryService } from './redis.repository.service';
|
|
7
|
+
|
|
8
|
+
import { Constants } from '../common/definitions';
|
|
9
|
+
import { RedisStoreService } from '../store';
|
|
10
|
+
|
|
11
|
+
@Module({})
|
|
12
|
+
export class RedisRepositoryModule {
|
|
13
|
+
static register<Entity>(options: RedisRepositoryModuleOptions): DynamicModule {
|
|
14
|
+
const { dataModuleName, schema } = options;
|
|
15
|
+
return {
|
|
16
|
+
module: RedisRepositoryModule,
|
|
17
|
+
imports: [],
|
|
18
|
+
providers: [
|
|
19
|
+
{
|
|
20
|
+
provide: Constants.REDIS_REPOSITORY_SCHEMA,
|
|
21
|
+
useValue: schema
|
|
22
|
+
},
|
|
23
|
+
{ provide: CoreConstants.DATA_MODULE_NAME, useValue: dataModuleName },
|
|
24
|
+
{
|
|
25
|
+
provide: RedisStoreService,
|
|
26
|
+
useFactory: (redisStoreService: RedisStoreService) => redisStoreService,
|
|
27
|
+
inject: [`${dataModuleName}${Constants.REDIS_CLIENT_STORE_SERVICE_SUFFIX}`]
|
|
28
|
+
},
|
|
29
|
+
RedisRepositoryService<Entity>
|
|
30
|
+
],
|
|
31
|
+
exports: [RedisRepositoryService<Entity>, RedisStoreService]
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|