@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.
- package/dist/helpers/cache.helper.d.ts +2 -0
- package/dist/helpers/cache.helper.d.ts.map +1 -0
- package/dist/helpers/cache.helper.js +8 -0
- package/dist/helpers/cache.helper.js.map +1 -0
- package/dist/jobs/computed-field-evaluation-queue-options.d.ts +1 -0
- package/dist/jobs/computed-field-evaluation-queue-options.d.ts.map +1 -1
- package/dist/jobs/computed-field-evaluation-queue-options.js +1 -0
- package/dist/jobs/computed-field-evaluation-queue-options.js.map +1 -1
- package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts +4 -1
- package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts.map +1 -1
- package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js +41 -11
- package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +4 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +31 -2
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +0 -2
- package/dist/solid-core.module.js.map +1 -1
- package/package.json +1 -1
- package/src/helpers/cache.helper.ts +5 -0
- package/src/jobs/computed-field-evaluation-queue-options.ts +1 -0
- package/src/services/computed-fields/entity/sequence-num-computed-field-provider.ts +54 -12
- package/src/services/model-metadata.service.ts +38 -0
- package/src/solid-core.module.ts +0 -2
- package/dist/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.d.ts +0 -15
- package/dist/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.d.ts.map +0 -1
- package/dist/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.js +0 -71
- package/dist/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.js.map +0 -1
- package/src/services/computed-fields/entity/entity-id-sequence-num-computed-field-provider.ts +0 -70
|
@@ -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"]}
|
|
@@ -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
|
|
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"}
|
|
@@ -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;
|
|
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
|
|
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":"
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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":";;;;;;;;;;;;;;;AAAA,oEAAkE;AAClE,2CAA4C;AAC5C,6CAAmD;AACnD,6GAAyF;AAEzF,mFAAmE;AAGnE,qCAAoD;
|
|
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":";;;;;;;;;;;;;;;AAAA,oEAAkE;AAClE,2CAA4C;AAC5C,6CAAmD;AACnD,uFAAmF;AACnF,6GAAyF;AAEzF,mFAAmE;AAGnE,qCAAoD;AAe7C,IAAM,gCAAgC,GAAtC,MAAM,gCAAgC;IACzC,YAEqB,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IACvC,CAAC;IAEL,IAAI;QACA,OAAO,kCAAkC,CAAC;IAC9C,CAAC;IAED,IAAI;QACA,OAAO,gHAAgH;YACnH,8EAA8E;YAC9E,+GAA+G,CAAC;IACxH,CAAC;IAEO,mBAAmB,CAAC,aAA4B,EAAE,YAAoB;QAC1E,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,IAAI,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9E,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,4BAA4B,CAAC,YAAoB,EAAE,OAAuB;QACpF,MAAM,GAAG,GAAG,KAAK,EAAE,GAAkB,EAAE,EAAE;YACrC,MAAM,iBAAiB,GAAG,GAAG,CAAC,aAAa,CAAC,qCAAa,CAAC,CAAC;YAC3D,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC;gBAClD,KAAK,EAAE,EAAE,YAAY,EAAE;gBACvB,IAAI,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;aACtC,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,YAAY,EAAE,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,GAAG,CAAC,CAAC;YACjD,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;YAE1E,aAAa,CAAC,YAAY,GAAG,SAAS,CAAC;YACvC,MAAM,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAG5C,MAAM,sBAAsB,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC;gBAC3D,KAAK,EAAE,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE;gBAC/B,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;aAC7B,CAAC,CAAC;YACH,MAAM,iBAAiB,GAAG,sBAAsB,EAAE,KAAK,EAAE,YAAY,CAAC;YACtE,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,6CAA6C,YAAY,EAAE,CAAC,CAAC;YACjF,CAAC;YAED,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;QAC1E,CAAC,CAAC;QAEF,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACrE,CAAC;IAEO,KAAK,CAAC,6BAA6B,CAAC,YAAoB,EAAE,QAAgB;QAC9E,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,qCAAa,CAAC,CAAC;QAC/E,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC;YAClD,KAAK,EAAE,EAAE,YAAY,EAAE;YACvB,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SAC7B,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,YAAY,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,iBAAiB,GAAG,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC;QAC5D,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,6CAA6C,YAAY,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACpG,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,aAAgB,EAAE,qBAA6E;QACzH,MAAM,EAAE,YAAY,EAAE,IAAI,GAAG,SAAS,EAAE,GAAG,qBAAqB,CAAC,8BAA8B,IAAI,EAAE,CAAC;QAEtG,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,cAAsB,CAAC;QAC3B,IAAI,iBAAyB,CAAC;QAE9B,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,qBAAqB,CAAC,YAAY,EAAE,SAAS,CAAC;YAChE,IAAI,SAAS,KAAK,yDAA6B,CAAC,WAAW,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,wEAAwE,yDAA6B,CAAC,WAAW,2BAA2B,SAAS,GAAG,CAAC,CAAC;YAC9K,CAAC;YACD,CAAC,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;QACvH,CAAC;aAAM,CAAC;YACJ,CAAC,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,YAAY,CAAC,CAAC,CAAC;QACpG,CAAC;QAED,MAAM,UAAU,GAAG,IAAA,kBAAQ,EAAC,iBAAiB,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACrE,MAAM,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;IACrG,CAAC;CACJ,CAAA;AApGY,4EAAgC;2CAAhC,gCAAgC;IAF5C,IAAA,yDAAqB,GAAE;IACvB,IAAA,mBAAU,GAAE;IAGJ,WAAA,IAAA,0BAAgB,GAAE,CAAA;qCACU,oBAAU;GAHlC,gCAAgC,CAoG5C","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":"
|
|
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
|