@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.
Files changed (34) hide show
  1. package/dist/repository/redis.repository.module.js +1 -1
  2. package/dist/repository/redis.repository.module.js.map +1 -1
  3. package/dist/repository/redis.repository.service.d.ts +6 -3
  4. package/dist/repository/redis.repository.service.js +83 -20
  5. package/dist/repository/redis.repository.service.js.map +1 -1
  6. package/dist/store/redis.store.module.js +1 -1
  7. package/dist/store/redis.store.module.js.map +1 -1
  8. package/dist/store/redis.store.service.js +1 -1
  9. package/dist/store/redis.store.service.js.map +1 -1
  10. package/package.json +4 -4
  11. package/src/common/definitions/common.constants.ts +10 -0
  12. package/src/common/definitions/index.ts +1 -0
  13. package/src/entityService/index.ts +2 -0
  14. package/src/entityService/redis.entity.service.definitions.ts +73 -0
  15. package/src/entityService/redis.entity.service.spec.ts +190 -0
  16. package/src/entityService/redis.entity.service.ts +291 -0
  17. package/src/index.ts +5 -0
  18. package/src/module/index.ts +2 -0
  19. package/src/module/redis.module.definitions.ts +18 -0
  20. package/src/module/redis.module.spec.ts +80 -0
  21. package/src/module/redis.module.ts +31 -0
  22. package/src/repository/index.ts +3 -0
  23. package/src/repository/redis.repository.definitions.ts +97 -0
  24. package/src/repository/redis.repository.module.spec.ts +60 -0
  25. package/src/repository/redis.repository.module.ts +34 -0
  26. package/src/repository/redis.repository.service.ts +657 -0
  27. package/src/repository/redis.repository.spec.ts +384 -0
  28. package/src/store/index.ts +3 -0
  29. package/src/store/redis.store.definitions.ts +25 -0
  30. package/src/store/redis.store.module.spec.ts +70 -0
  31. package/src/store/redis.store.module.ts +34 -0
  32. package/src/store/redis.store.service.spec.ts +392 -0
  33. package/src/store/redis.store.service.ts +391 -0
  34. 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
+ }