@solidxai/core 0.1.6-beta.15 → 0.1.6-beta.16

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 (30) hide show
  1. package/dist/helpers/cache.helper.d.ts +2 -0
  2. package/dist/helpers/cache.helper.d.ts.map +1 -0
  3. package/dist/helpers/cache.helper.js +8 -0
  4. package/dist/helpers/cache.helper.js.map +1 -0
  5. package/dist/jobs/computed-field-evaluation-queue-options.d.ts +1 -0
  6. package/dist/jobs/computed-field-evaluation-queue-options.d.ts.map +1 -1
  7. package/dist/jobs/computed-field-evaluation-queue-options.js +1 -0
  8. package/dist/jobs/computed-field-evaluation-queue-options.js.map +1 -1
  9. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts +4 -1
  10. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts.map +1 -1
  11. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js +41 -11
  12. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js.map +1 -1
  13. package/dist/services/model-metadata.service.d.ts +4 -1
  14. package/dist/services/model-metadata.service.d.ts.map +1 -1
  15. package/dist/services/model-metadata.service.js +31 -2
  16. package/dist/services/model-metadata.service.js.map +1 -1
  17. package/dist/solid-core.module.d.ts.map +1 -1
  18. package/dist/solid-core.module.js +0 -2
  19. package/dist/solid-core.module.js.map +1 -1
  20. package/package.json +1 -1
  21. package/src/helpers/cache.helper.ts +5 -0
  22. package/src/jobs/computed-field-evaluation-queue-options.ts +1 -0
  23. package/src/services/computed-fields/entity/sequence-num-computed-field-provider.ts +54 -12
  24. package/src/services/model-metadata.service.ts +38 -0
  25. package/src/solid-core.module.ts +0 -2
  26. package/dist/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.d.ts +0 -15
  27. package/dist/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.d.ts.map +0 -1
  28. package/dist/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.js +0 -71
  29. package/dist/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.js.map +0 -1
  30. package/src/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.ts +0 -70
@@ -0,0 +1,2 @@
1
+ export declare function shouldUseCache(): boolean;
2
+ //# sourceMappingURL=cache.helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.helper.d.ts","sourceRoot":"","sources":["../../src/helpers/cache.helper.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,IAAI,OAAO,CAGxC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shouldUseCache = shouldUseCache;
4
+ function shouldUseCache() {
5
+ const env = (process.env.ENV ?? process.env.NODE_ENV ?? '').toLowerCase();
6
+ return env === 'prod' || env === 'production';
7
+ }
8
+ //# sourceMappingURL=cache.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.helper.js","sourceRoot":"","sources":["../../src/helpers/cache.helper.ts"],"names":[],"mappings":";;AAAA,wCAGC;AAHD,SAAgB,cAAc;IAC5B,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1E,OAAO,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,YAAY,CAAC;AAChD,CAAC","sourcesContent":["export function shouldUseCache(): boolean {\n const env = (process.env.ENV ?? process.env.NODE_ENV ?? '').toLowerCase();\n return env === 'prod' || env === 'production';\n}\n\n"]}
@@ -3,6 +3,7 @@ declare const _default: {
3
3
  name: string;
4
4
  type: BrokerType;
5
5
  queueName: string;
6
+ prefetch: number;
6
7
  };
7
8
  export default _default;
8
9
  //# sourceMappingURL=computed-field-evaluation-queue-options.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"computed-field-evaluation-queue-options.d.ts","sourceRoot":"","sources":["../../src/jobs/computed-field-evaluation-queue-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;;;;;;AAI3C,wBAIE"}
1
+ {"version":3,"file":"computed-field-evaluation-queue-options.d.ts","sourceRoot":"","sources":["../../src/jobs/computed-field-evaluation-queue-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;;;;;;;AAI3C,wBAKE"}
@@ -6,5 +6,6 @@ exports.default = {
6
6
  name: QUEUE_NAME,
7
7
  type: interfaces_1.BrokerType.RabbitMQ,
8
8
  queueName: QUEUE_NAME,
9
+ prefetch: 20
9
10
  };
10
11
  //# sourceMappingURL=computed-field-evaluation-queue-options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"computed-field-evaluation-queue-options.js","sourceRoot":"","sources":["../../src/jobs/computed-field-evaluation-queue-options.ts"],"names":[],"mappings":";;AAAA,8CAA2C;AAE3C,MAAM,UAAU,GAAG,uCAAuC,CAAC;AAE3D,kBAAe;IACX,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,uBAAU,CAAC,QAAQ;IACzB,SAAS,EAAE,UAAU;CACxB,CAAC","sourcesContent":["import { BrokerType } from \"../interfaces\";\n\nconst QUEUE_NAME = 'solid_computed_field_evaluation_queue';\n\nexport default {\n name: QUEUE_NAME,\n type: BrokerType.RabbitMQ,\n queueName: QUEUE_NAME,\n};\n"]}
1
+ {"version":3,"file":"computed-field-evaluation-queue-options.js","sourceRoot":"","sources":["../../src/jobs/computed-field-evaluation-queue-options.ts"],"names":[],"mappings":";;AAAA,8CAA2C;AAE3C,MAAM,UAAU,GAAG,uCAAuC,CAAC;AAE3D,kBAAe;IACX,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,uBAAU,CAAC,QAAQ;IACzB,SAAS,EAAE,UAAU;IACrB,QAAQ,EAAE,EAAE;CACf,CAAC","sourcesContent":["import { BrokerType } from \"../interfaces\";\n\nconst QUEUE_NAME = 'solid_computed_field_evaluation_queue';\n\nexport default {\n name: QUEUE_NAME,\n type: BrokerType.RabbitMQ,\n queueName: QUEUE_NAME,\n prefetch: 20\n};\n"]}
@@ -4,13 +4,16 @@ import { IEntityPostComputeFieldProvider } from "src/interfaces";
4
4
  import { DataSource } from "typeorm";
5
5
  export interface SequenceNumComputedFieldContext {
6
6
  sequenceName: string;
7
+ mode?: 'counter' | 'entityId';
7
8
  }
8
9
  export declare class SequenceNumComputedFieldProvider<T extends CommonEntity> implements IEntityPostComputeFieldProvider<T, SequenceNumComputedFieldContext> {
9
10
  private readonly dataSource;
10
11
  constructor(dataSource: DataSource);
11
12
  name(): string;
12
13
  help(): string;
13
- private generateSequenceValue;
14
+ private buildSequenceString;
15
+ private generateCounterSequenceValue;
16
+ private generateEntityIdSequenceValue;
14
17
  postComputeAndSaveValue(triggerEntity: T, computedFieldMetadata: ComputedFieldMetadata<SequenceNumComputedFieldContext>): Promise<void>;
15
18
  }
16
19
  //# sourceMappingURL=sequence-num-computed-field-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sequence-num-computed-field-provider.d.ts","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/sequence-num-computed-field-provider.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAiB,MAAM,SAAS,CAAC;AAGpD,MAAM,WAAW,+BAA+B;IAC5C,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,qBAEa,gCAAgC,CAAC,CAAC,SAAS,YAAY,CAAE,YAAW,+BAA+B,CAAC,CAAC,EAAE,+BAA+B,CAAC;IAG5I,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAG3C,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;YAIA,qBAAqB;IAuC7B,uBAAuB,CAAC,aAAa,EAAE,CAAC,EAAE,qBAAqB,EAAE,qBAAqB,CAAC,+BAA+B,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAYhJ"}
1
+ {"version":3,"file":"sequence-num-computed-field-provider.d.ts","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/sequence-num-computed-field-provider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAiB,MAAM,SAAS,CAAC;AAGpD,MAAM,WAAW,+BAA+B;IAC5C,YAAY,EAAE,MAAM,CAAC;IAMrB,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;CACjC;AAED,qBAEa,gCAAgC,CAAC,CAAC,SAAS,YAAY,CAAE,YAAW,+BAA+B,CAAC,CAAC,EAAE,+BAA+B,CAAC;IAG5I,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAG3C,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAMd,OAAO,CAAC,mBAAmB;YAOb,4BAA4B;YAkC5B,6BAA6B;IAmBrC,uBAAuB,CAAC,aAAa,EAAE,CAAC,EAAE,qBAAqB,EAAE,qBAAqB,CAAC,+BAA+B,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAwBhJ"}
@@ -16,6 +16,7 @@ exports.SequenceNumComputedFieldProvider = void 0;
16
16
  const strings_1 = require("@angular-devkit/core/src/utils/strings");
17
17
  const common_1 = require("@nestjs/common");
18
18
  const typeorm_1 = require("@nestjs/typeorm");
19
+ const create_field_metadata_dto_1 = require("../../../dtos/create-field-metadata.dto");
19
20
  const computed_field_provider_decorator_1 = require("../../../decorators/computed-field-provider.decorator");
20
21
  const model_sequence_entity_1 = require("../../../entities/model-sequence.entity");
21
22
  const typeorm_2 = require("typeorm");
@@ -27,9 +28,17 @@ let SequenceNumComputedFieldProvider = class SequenceNumComputedFieldProvider {
27
28
  return "SequenceNumComputedFieldProvider";
28
29
  }
29
30
  help() {
30
- return "Computed field provider used to create fields whose value is based on some prefix, padding & sequence number.";
31
+ return "Computed field provider used to create fields whose value is based on some prefix, padding & sequence number. " +
32
+ "Use mode='counter' (default) to auto-increment the sequence's currentValue. " +
33
+ "Use mode='entityId' to use the entity's own id as the number (afterInsert only, does not update the counter).";
31
34
  }
32
- async generateSequenceValue(sequenceName, manager) {
35
+ buildSequenceString(modelSequence, numericValue) {
36
+ const prefix = modelSequence.prefix ?? "";
37
+ const separator = modelSequence.separator ?? "";
38
+ const padded = String(numericValue).padStart(modelSequence.padding ?? 5, "0");
39
+ return `${prefix}${separator}${padded}`;
40
+ }
41
+ async generateCounterSequenceValue(sequenceName, manager) {
33
42
  const run = async (mgr) => {
34
43
  const modelSequenceRepo = mgr.getRepository(model_sequence_entity_1.ModelSequence);
35
44
  const modelSequence = await modelSequenceRepo.findOne({
@@ -40,17 +49,12 @@ let SequenceNumComputedFieldProvider = class SequenceNumComputedFieldProvider {
40
49
  throw new Error(`ModelSequence not found for ${sequenceName}`);
41
50
  }
42
51
  const nextValue = modelSequence.currentValue + 1;
43
- const paddedValue = String(nextValue).padStart(modelSequence.padding ?? 5, "0");
44
- const prefix = modelSequence.prefix ?? "";
45
- const separator = modelSequence.separator ?? "";
46
- const sequenceString = `${prefix}${separator}${paddedValue}`;
52
+ const sequenceString = this.buildSequenceString(modelSequence, nextValue);
47
53
  modelSequence.currentValue = nextValue;
48
54
  await modelSequenceRepo.save(modelSequence);
49
55
  const modelSequenceWithModel = await modelSequenceRepo.findOne({
50
56
  where: { id: modelSequence.id },
51
- relations: {
52
- model: true,
53
- },
57
+ relations: { model: true },
54
58
  });
55
59
  const modelSingularName = modelSequenceWithModel?.model?.singularName;
56
60
  if (!modelSingularName) {
@@ -60,12 +64,38 @@ let SequenceNumComputedFieldProvider = class SequenceNumComputedFieldProvider {
60
64
  };
61
65
  return manager ? run(manager) : this.dataSource.transaction(run);
62
66
  }
67
+ async generateEntityIdSequenceValue(sequenceName, entityId) {
68
+ const modelSequenceRepo = this.dataSource.manager.getRepository(model_sequence_entity_1.ModelSequence);
69
+ const modelSequence = await modelSequenceRepo.findOne({
70
+ where: { sequenceName },
71
+ relations: { model: true },
72
+ });
73
+ if (!modelSequence) {
74
+ throw new Error(`ModelSequence not found for ${sequenceName}`);
75
+ }
76
+ const modelSingularName = modelSequence.model?.singularName;
77
+ if (!modelSingularName) {
78
+ throw new Error(`Model singularName not found for sequence ${sequenceName}`);
79
+ }
80
+ return { sequenceString: this.buildSequenceString(modelSequence, entityId), modelSingularName };
81
+ }
63
82
  async postComputeAndSaveValue(triggerEntity, computedFieldMetadata) {
64
- const { sequenceName } = computedFieldMetadata.computedFieldValueProviderCtxt ?? {};
83
+ const { sequenceName, mode = 'counter' } = computedFieldMetadata.computedFieldValueProviderCtxt ?? {};
65
84
  if (!sequenceName) {
66
85
  throw new Error("sequenceName is required for sequence computation");
67
86
  }
68
- const { sequenceString, modelSingularName } = await this.generateSequenceValue(sequenceName);
87
+ let sequenceString;
88
+ let modelSingularName;
89
+ if (mode === 'entityId') {
90
+ const eventType = computedFieldMetadata.eventContext?.eventType;
91
+ if (eventType !== create_field_metadata_dto_1.ComputedFieldTriggerOperation.afterInsert) {
92
+ throw new Error(`SequenceNumComputedFieldProvider with mode='entityId' only supports "${create_field_metadata_dto_1.ComputedFieldTriggerOperation.afterInsert}" events, but received "${eventType}"`);
93
+ }
94
+ ({ sequenceString, modelSingularName } = await this.generateEntityIdSequenceValue(sequenceName, triggerEntity.id));
95
+ }
96
+ else {
97
+ ({ sequenceString, modelSingularName } = await this.generateCounterSequenceValue(sequenceName));
98
+ }
69
99
  const entityName = (0, strings_1.classify)(modelSingularName);
70
100
  const entityRepo = this.dataSource.manager.getRepository(entityName);
71
101
  await entityRepo.update(triggerEntity.id, { [computedFieldMetadata.fieldName]: sequenceString });
@@ -1 +1 @@
1
- {"version":3,"file":"sequence-num-computed-field-provider.js","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/sequence-num-computed-field-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { classify } from \"@angular-devkit/core/src/utils/strings\";\nimport { Injectable } from \"@nestjs/common\";\nimport { InjectDataSource } from \"@nestjs/typeorm\";\nimport { ComputedFieldProvider } from \"src/decorators/computed-field-provider.decorator\";\nimport { CommonEntity } from \"src/entities/common.entity\";\nimport { ModelSequence } from \"src/entities/model-sequence.entity\";\nimport { ComputedFieldMetadata } from \"src/helpers/solid-registry\";\nimport { IEntityPostComputeFieldProvider } from \"src/interfaces\";\nimport { DataSource, EntityManager } from \"typeorm\";\n\n\nexport interface SequenceNumComputedFieldContext {\n sequenceName: string; // The separator to use between concatenated values\n}\n\n@ComputedFieldProvider()\n@Injectable()\nexport class SequenceNumComputedFieldProvider<T extends CommonEntity> implements IEntityPostComputeFieldProvider<T, SequenceNumComputedFieldContext> {\n constructor(\n @InjectDataSource()\n private readonly dataSource: DataSource\n ) { }\n\n name(): string {\n return \"SequenceNumComputedFieldProvider\";\n }\n\n help(): string {\n return \"Computed field provider used to create fields whose value is based on some prefix, padding & sequence number.\";\n }\n\n private async generateSequenceValue(sequenceName: string, manager?: EntityManager): Promise<{ sequenceString: string; currentValue: number; modelSingularName: string }> {\n const run = async (mgr: EntityManager) => {\n const modelSequenceRepo = mgr.getRepository(ModelSequence);\n const modelSequence = await modelSequenceRepo.findOne({\n where: { sequenceName },\n lock: { mode: \"pessimistic_write\" }\n });\n\n if (!modelSequence) {\n throw new Error(`ModelSequence not found for ${sequenceName}`);\n }\n\n const nextValue = modelSequence.currentValue + 1;\n const paddedValue = String(nextValue).padStart(modelSequence.padding ?? 5, \"0\");\n const prefix = modelSequence.prefix ?? \"\";\n const separator = modelSequence.separator ?? \"\";\n const sequenceString = `${prefix}${separator}${paddedValue}`;\n\n modelSequence.currentValue = nextValue;\n await modelSequenceRepo.save(modelSequence);\n\n // Load model relation in a separate query to avoid FOR UPDATE on joined relation.\n const modelSequenceWithModel = await modelSequenceRepo.findOne({\n where: { id: modelSequence.id },\n relations: {\n model: true,\n },\n });\n const modelSingularName = modelSequenceWithModel?.model?.singularName;\n if (!modelSingularName) {\n throw new Error(`Model singularName not found for sequence ${sequenceName}`);\n }\n\n return { sequenceString, currentValue: nextValue, modelSingularName };\n };\n\n return manager ? run(manager) : this.dataSource.transaction(run);\n }\n\n async postComputeAndSaveValue(triggerEntity: T, computedFieldMetadata: ComputedFieldMetadata<SequenceNumComputedFieldContext>): Promise<void> {\n const { sequenceName } = computedFieldMetadata.computedFieldValueProviderCtxt ?? {};\n\n if (!sequenceName) {\n throw new Error(\"sequenceName is required for sequence computation\");\n }\n\n const { sequenceString, modelSingularName } = await this.generateSequenceValue(sequenceName);\n const entityName = classify(modelSingularName);\n const entityRepo = this.dataSource.manager.getRepository(entityName);\n await entityRepo.update(triggerEntity.id, { [computedFieldMetadata.fieldName]: sequenceString });\n }\n}\n"]}
1
+ {"version":3,"file":"sequence-num-computed-field-provider.js","sourceRoot":"","sources":["../../../../src/services/computed-fields/entity/sequence-num-computed-field-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { classify } from \"@angular-devkit/core/src/utils/strings\";\nimport { Injectable } from \"@nestjs/common\";\nimport { InjectDataSource } from \"@nestjs/typeorm\";\nimport { ComputedFieldTriggerOperation } from \"src/dtos/create-field-metadata.dto\";\nimport { ComputedFieldProvider } from \"src/decorators/computed-field-provider.decorator\";\nimport { CommonEntity } from \"src/entities/common.entity\";\nimport { ModelSequence } from \"src/entities/model-sequence.entity\";\nimport { ComputedFieldMetadata } from \"src/helpers/solid-registry\";\nimport { IEntityPostComputeFieldProvider } from \"src/interfaces\";\nimport { DataSource, EntityManager } from \"typeorm\";\n\n\nexport interface SequenceNumComputedFieldContext {\n sequenceName: string;\n /**\n * - `'counter'` (default): increments the sequence's `currentValue` and uses it as the number.\n * - `'entityId'`: uses the entity's own `id` as the number; does not update the counter.\n * Only valid on `afterInsert` events.\n */\n mode?: 'counter' | 'entityId';\n}\n\n@ComputedFieldProvider()\n@Injectable()\nexport class SequenceNumComputedFieldProvider<T extends CommonEntity> implements IEntityPostComputeFieldProvider<T, SequenceNumComputedFieldContext> {\n constructor(\n @InjectDataSource()\n private readonly dataSource: DataSource\n ) { }\n\n name(): string {\n return \"SequenceNumComputedFieldProvider\";\n }\n\n help(): string {\n return \"Computed field provider used to create fields whose value is based on some prefix, padding & sequence number. \" +\n \"Use mode='counter' (default) to auto-increment the sequence's currentValue. \" +\n \"Use mode='entityId' to use the entity's own id as the number (afterInsert only, does not update the counter).\";\n }\n\n private buildSequenceString(modelSequence: ModelSequence, numericValue: number): string {\n const prefix = modelSequence.prefix ?? \"\";\n const separator = modelSequence.separator ?? \"\";\n const padded = String(numericValue).padStart(modelSequence.padding ?? 5, \"0\");\n return `${prefix}${separator}${padded}`;\n }\n\n private async generateCounterSequenceValue(sequenceName: string, manager?: EntityManager): Promise<{ sequenceString: string; currentValue: number; modelSingularName: string }> {\n const run = async (mgr: EntityManager) => {\n const modelSequenceRepo = mgr.getRepository(ModelSequence);\n const modelSequence = await modelSequenceRepo.findOne({\n where: { sequenceName },\n lock: { mode: \"pessimistic_write\" }\n });\n\n if (!modelSequence) {\n throw new Error(`ModelSequence not found for ${sequenceName}`);\n }\n\n const nextValue = modelSequence.currentValue + 1;\n const sequenceString = this.buildSequenceString(modelSequence, nextValue);\n\n modelSequence.currentValue = nextValue;\n await modelSequenceRepo.save(modelSequence);\n\n // Load model relation in a separate query to avoid FOR UPDATE on joined relation.\n const modelSequenceWithModel = await modelSequenceRepo.findOne({\n where: { id: modelSequence.id },\n relations: { model: true },\n });\n const modelSingularName = modelSequenceWithModel?.model?.singularName;\n if (!modelSingularName) {\n throw new Error(`Model singularName not found for sequence ${sequenceName}`);\n }\n\n return { sequenceString, currentValue: nextValue, modelSingularName };\n };\n\n return manager ? run(manager) : this.dataSource.transaction(run);\n }\n\n private async generateEntityIdSequenceValue(sequenceName: string, entityId: number): Promise<{ sequenceString: string; modelSingularName: string }> {\n const modelSequenceRepo = this.dataSource.manager.getRepository(ModelSequence);\n const modelSequence = await modelSequenceRepo.findOne({\n where: { sequenceName },\n relations: { model: true },\n });\n\n if (!modelSequence) {\n throw new Error(`ModelSequence not found for ${sequenceName}`);\n }\n\n const modelSingularName = modelSequence.model?.singularName;\n if (!modelSingularName) {\n throw new Error(`Model singularName not found for sequence ${sequenceName}`);\n }\n\n return { sequenceString: this.buildSequenceString(modelSequence, entityId), modelSingularName };\n }\n\n async postComputeAndSaveValue(triggerEntity: T, computedFieldMetadata: ComputedFieldMetadata<SequenceNumComputedFieldContext>): Promise<void> {\n const { sequenceName, mode = 'counter' } = computedFieldMetadata.computedFieldValueProviderCtxt ?? {};\n\n if (!sequenceName) {\n throw new Error(\"sequenceName is required for sequence computation\");\n }\n\n let sequenceString: string;\n let modelSingularName: string;\n\n if (mode === 'entityId') {\n const eventType = computedFieldMetadata.eventContext?.eventType;\n if (eventType !== ComputedFieldTriggerOperation.afterInsert) {\n throw new Error(`SequenceNumComputedFieldProvider with mode='entityId' only supports \"${ComputedFieldTriggerOperation.afterInsert}\" events, but received \"${eventType}\"`);\n }\n ({ sequenceString, modelSingularName } = await this.generateEntityIdSequenceValue(sequenceName, triggerEntity.id));\n } else {\n ({ sequenceString, modelSingularName } = await this.generateCounterSequenceValue(sequenceName));\n }\n\n const entityName = classify(modelSingularName);\n const entityRepo = this.dataSource.manager.getRepository(entityName);\n await entityRepo.update(triggerEntity.id, { [computedFieldMetadata.fieldName]: sequenceString });\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { Cache } from 'cache-manager';
1
2
  import { DataSource, EntityManager, Repository } from 'typeorm';
2
3
  import { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';
3
4
  import { ModelMetadata } from '../entities/model-metadata.entity';
@@ -27,8 +28,9 @@ export declare class ModelMetadataService {
27
28
  private readonly moduleMetadataHelperService;
28
29
  readonly introspectService: SolidIntrospectService;
29
30
  private readonly solidTsMorphService;
31
+ private readonly cacheManager;
30
32
  private logger;
31
- constructor(modelMetadataRepo: ModelMetadataRepository, fieldMetadataRepo: FieldMetadataRepository, schematicService: SchematicService, dataSource: DataSource, crudHelperService: CrudHelperService, mediaStorageProviderMetadataService: MediaStorageProviderMetadataService, fieldMetadataService: FieldMetadataService, roleService: RoleMetadataService, moduleMetadataHelperService: ModuleMetadataHelperService, introspectService: SolidIntrospectService, solidTsMorphService: SolidTsMorphService);
33
+ constructor(modelMetadataRepo: ModelMetadataRepository, fieldMetadataRepo: FieldMetadataRepository, schematicService: SchematicService, dataSource: DataSource, crudHelperService: CrudHelperService, mediaStorageProviderMetadataService: MediaStorageProviderMetadataService, fieldMetadataService: FieldMetadataService, roleService: RoleMetadataService, moduleMetadataHelperService: ModuleMetadataHelperService, introspectService: SolidIntrospectService, solidTsMorphService: SolidTsMorphService, cacheManager: Cache);
32
34
  find(basicFilterDto: BasicFilterDto): Promise<{
33
35
  meta: {
34
36
  totalRecords: number;
@@ -52,6 +54,7 @@ export declare class ModelMetadataService {
52
54
  records: ModelMetadata[];
53
55
  }>;
54
56
  findOne(id: any, query?: any): Promise<ModelMetadata>;
57
+ private buildModelBySingularNameCacheKey;
55
58
  findOneBySingularName(singularName: string, relations?: {}): Promise<ModelMetadata>;
56
59
  findOneByUserKey(singularName: string, relations?: {}): Promise<ModelMetadata>;
57
60
  create(createDto: CreateModelMetadataDto): Promise<ModelMetadata>;
@@ -1 +1 @@
1
- {"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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"}
@@ -47,6 +47,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
47
47
  Object.defineProperty(exports, "__esModule", { value: true });
48
48
  exports.ModelMetadataService = void 0;
49
49
  const common_1 = require("@nestjs/common");
50
+ const cache_manager_1 = require("@nestjs/cache-manager");
50
51
  const typeorm_1 = require("@nestjs/typeorm");
51
52
  const fs = __importStar(require("fs/promises"));
52
53
  const path = __importStar(require("path"));
@@ -57,6 +58,7 @@ const strings_1 = require("@angular-devkit/core/src/utils/strings");
57
58
  const error_messages_1 = require("../constants/error-messages");
58
59
  const disallow_in_production_decorator_1 = require("../decorators/disallow-in-production.decorator");
59
60
  const create_field_metadata_dto_1 = require("../dtos/create-field-metadata.dto");
61
+ const cache_helper_1 = require("../helpers/cache.helper");
60
62
  const module_metadata_helper_service_1 = require("../helpers/module-metadata-helper.service");
61
63
  const field_metadata_repository_1 = require("../repository/field-metadata.repository");
62
64
  const model_metadata_repository_1 = require("../repository/model-metadata.repository");
@@ -72,7 +74,7 @@ const role_metadata_service_1 = require("./role-metadata.service");
72
74
  const solid_introspect_service_1 = require("./solid-introspect.service");
73
75
  const solid_ts_morph_service_1 = require("./solid-ts-morph.service");
74
76
  let ModelMetadataService = class ModelMetadataService {
75
- constructor(modelMetadataRepo, fieldMetadataRepo, schematicService, dataSource, crudHelperService, mediaStorageProviderMetadataService, fieldMetadataService, roleService, moduleMetadataHelperService, introspectService, solidTsMorphService) {
77
+ constructor(modelMetadataRepo, fieldMetadataRepo, schematicService, dataSource, crudHelperService, mediaStorageProviderMetadataService, fieldMetadataService, roleService, moduleMetadataHelperService, introspectService, solidTsMorphService, cacheManager) {
76
78
  this.modelMetadataRepo = modelMetadataRepo;
77
79
  this.fieldMetadataRepo = fieldMetadataRepo;
78
80
  this.schematicService = schematicService;
@@ -84,6 +86,7 @@ let ModelMetadataService = class ModelMetadataService {
84
86
  this.moduleMetadataHelperService = moduleMetadataHelperService;
85
87
  this.introspectService = introspectService;
86
88
  this.solidTsMorphService = solidTsMorphService;
89
+ this.cacheManager = cacheManager;
87
90
  this.logger = new common_1.Logger('ModelMetadataService');
88
91
  }
89
92
  async find(basicFilterDto) {
@@ -124,7 +127,18 @@ let ModelMetadataService = class ModelMetadataService {
124
127
  }
125
128
  return entity;
126
129
  }
130
+ buildModelBySingularNameCacheKey(singularName) {
131
+ return `modelMetadata:singularName:${singularName}`;
132
+ }
127
133
  async findOneBySingularName(singularName, relations = {}) {
134
+ const useCache = (0, cache_helper_1.shouldUseCache)();
135
+ const cacheKey = this.buildModelBySingularNameCacheKey(singularName);
136
+ if (useCache) {
137
+ const cached = await this.cacheManager.get(cacheKey);
138
+ if (cached) {
139
+ return cached;
140
+ }
141
+ }
128
142
  const entity = await this.modelMetadataRepo.findOne({
129
143
  where: {
130
144
  singularName: singularName,
@@ -134,9 +148,20 @@ let ModelMetadataService = class ModelMetadataService {
134
148
  if (!entity) {
135
149
  throw new common_1.NotFoundException(error_messages_1.ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));
136
150
  }
151
+ if (useCache) {
152
+ await this.cacheManager.set(cacheKey, entity);
153
+ }
137
154
  return entity;
138
155
  }
139
156
  async findOneByUserKey(singularName, relations = {}) {
157
+ const useCache = (0, cache_helper_1.shouldUseCache)();
158
+ const cacheKey = this.buildModelBySingularNameCacheKey(singularName);
159
+ if (useCache) {
160
+ const cached = await this.cacheManager.get(cacheKey);
161
+ if (cached) {
162
+ return cached;
163
+ }
164
+ }
140
165
  const entity = await this.modelMetadataRepo.findOne({
141
166
  where: {
142
167
  singularName: singularName,
@@ -146,6 +171,9 @@ let ModelMetadataService = class ModelMetadataService {
146
171
  if (!entity) {
147
172
  throw new common_1.NotFoundException(error_messages_1.ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));
148
173
  }
174
+ if (useCache) {
175
+ await this.cacheManager.set(cacheKey, entity);
176
+ }
149
177
  return entity;
150
178
  }
151
179
  async create(createDto) {
@@ -1181,6 +1209,7 @@ exports.ModelMetadataService = ModelMetadataService = __decorate([
1181
1209
  (0, common_1.Injectable)(),
1182
1210
  __param(0, (0, common_1.Inject)((0, common_1.forwardRef)(() => model_metadata_repository_1.ModelMetadataRepository))),
1183
1211
  __param(3, (0, typeorm_1.InjectDataSource)()),
1212
+ __param(11, (0, common_1.Inject)(cache_manager_1.CACHE_MANAGER)),
1184
1213
  __metadata("design:paramtypes", [model_metadata_repository_1.ModelMetadataRepository,
1185
1214
  field_metadata_repository_1.FieldMetadataRepository,
1186
1215
  schematic_service_1.SchematicService,
@@ -1191,6 +1220,6 @@ exports.ModelMetadataService = ModelMetadataService = __decorate([
1191
1220
  role_metadata_service_1.RoleMetadataService,
1192
1221
  module_metadata_helper_service_1.ModuleMetadataHelperService,
1193
1222
  solid_introspect_service_1.SolidIntrospectService,
1194
- solid_ts_morph_service_1.SolidTsMorphService])
1223
+ solid_ts_morph_service_1.SolidTsMorphService, Object])
1195
1224
  ], ModelMetadataService);
1196
1225
  //# sourceMappingURL=model-metadata.service.js.map