@memberjunction/core-actions 5.14.0 → 5.15.0
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/custom/utilities/external-change-detection.action.d.ts +11 -7
- package/dist/custom/utilities/external-change-detection.action.d.ts.map +1 -1
- package/dist/custom/utilities/external-change-detection.action.js +36 -69
- package/dist/custom/utilities/external-change-detection.action.js.map +1 -1
- package/package.json +27 -28
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
|
|
2
2
|
import { BaseAction } from "@memberjunction/actions";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
4
|
+
* Thin action wrapper for External Change Detection. Delegates to
|
|
5
|
+
* ExternalChangeDetectorEngine.DetectAndReplayChanges() which interleaves
|
|
6
|
+
* detection and replay per entity to keep memory bounded.
|
|
7
|
+
*
|
|
8
|
+
* Params:
|
|
9
|
+
* EntityList - Comma-separated entity names. If omitted, all eligible entities are processed.
|
|
10
|
+
* ReplayBatchSize - Concurrent record replays per entity. Default 20.
|
|
11
|
+
* DetectionBatchSize - Max parallel entity detection. Default 5.
|
|
12
|
+
* StaleTimeoutHours - Hours before a stuck run is considered stale. Default 24.
|
|
11
13
|
*/
|
|
12
14
|
export declare class ExternalChangeDetectionAction extends BaseAction {
|
|
13
15
|
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
16
|
+
private resolveEntityList;
|
|
17
|
+
private getIntParam;
|
|
14
18
|
}
|
|
15
19
|
//# sourceMappingURL=external-change-detection.action.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-change-detection.action.d.ts","sourceRoot":"","sources":["../../../src/custom/utilities/external-change-detection.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAMrD
|
|
1
|
+
{"version":3,"file":"external-change-detection.action.d.ts","sourceRoot":"","sources":["../../../src/custom/utilities/external-change-detection.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAMrD;;;;;;;;;;GAUG;AACH,qBACa,6BAA8B,SAAQ,UAAU;cACzC,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyBvF,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,WAAW;CAMtB"}
|
|
@@ -9,81 +9,48 @@ import { Metadata } from "@memberjunction/core";
|
|
|
9
9
|
import { ExternalChangeDetectorEngine } from "@memberjunction/external-change-detection";
|
|
10
10
|
import { RegisterClass } from "@memberjunction/global";
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
12
|
+
* Thin action wrapper for External Change Detection. Delegates to
|
|
13
|
+
* ExternalChangeDetectorEngine.DetectAndReplayChanges() which interleaves
|
|
14
|
+
* detection and replay per entity to keep memory bounded.
|
|
15
|
+
*
|
|
16
|
+
* Params:
|
|
17
|
+
* EntityList - Comma-separated entity names. If omitted, all eligible entities are processed.
|
|
18
|
+
* ReplayBatchSize - Concurrent record replays per entity. Default 20.
|
|
19
|
+
* DetectionBatchSize - Max parallel entity detection. Default 5.
|
|
20
|
+
* StaleTimeoutHours - Hours before a stuck run is considered stale. Default 24.
|
|
19
21
|
*/
|
|
20
22
|
let ExternalChangeDetectionAction = class ExternalChangeDetectionAction extends BaseAction {
|
|
21
23
|
async InternalRunAction(params) {
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const autoReplayParam = params.Params.find(p => p.Name.trim().toLowerCase() === 'autoreplay');
|
|
26
|
-
const staleTimeoutParam = params.Params.find(p => p.Name.trim().toLowerCase() === 'staletimeouthours');
|
|
27
|
-
const replayBatchSize = replayBatchSizeParam && replayBatchSizeParam.Value ? parseInt(replayBatchSizeParam.Value) : 20;
|
|
28
|
-
const detectionBatchSize = detectionBatchSizeParam && detectionBatchSizeParam.Value ? parseInt(detectionBatchSizeParam.Value) : 10;
|
|
29
|
-
const staleTimeoutHours = staleTimeoutParam && staleTimeoutParam.Value ? parseInt(staleTimeoutParam.Value) : 24;
|
|
30
|
-
const autoReplay = autoReplayParam && autoReplayParam.Value !== undefined ?
|
|
31
|
-
(typeof autoReplayParam.Value === 'string' ? autoReplayParam.Value.toLowerCase() === 'true' : !!autoReplayParam.Value) :
|
|
32
|
-
true;
|
|
24
|
+
const replayBatchSize = this.getIntParam(params, 'replaybatchsize', 20);
|
|
25
|
+
const detectionBatchSize = this.getIntParam(params, 'detectionbatchsize', 5);
|
|
26
|
+
const staleTimeoutHours = this.getIntParam(params, 'staletimeouthours', 24);
|
|
33
27
|
await ExternalChangeDetectorEngine.Instance.Config(false, params.ContextUser);
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
const entities = this.resolveEntityList(params);
|
|
29
|
+
const result = await ExternalChangeDetectorEngine.Instance.DetectAndReplayChanges(entities, replayBatchSize, detectionBatchSize, staleTimeoutHours);
|
|
30
|
+
const summary = `${result.EntitiesProcessed} entities processed, ${result.EntitiesFailed} failed, ` +
|
|
31
|
+
`${result.TotalDetected} changes detected, ${result.TotalReplayed} replayed`;
|
|
32
|
+
return {
|
|
33
|
+
Success: result.Success,
|
|
34
|
+
Message: result.Success ? `${summary}.` : `${summary}. ${result.ErrorMessage || ''}`,
|
|
35
|
+
ResultCode: result.Success ? "SUCCESS" : "FAILED"
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
resolveEntityList(params) {
|
|
39
|
+
const entityListParam = params.Params.find(p => p.Name.trim().toLowerCase() === 'entitylist');
|
|
40
|
+
if (entityListParam?.Value && entityListParam.Value.length > 0) {
|
|
36
41
|
const md = new Metadata();
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
changes = await ExternalChangeDetectorEngine.Instance.DetectChangesForAllEligibleEntities(detectionBatchSize);
|
|
43
|
-
}
|
|
44
|
-
if (changes && changes.Success) {
|
|
45
|
-
const changeCount = changes.Changes ? changes.Changes.length : 0;
|
|
46
|
-
const creations = changes.Changes.filter(c => c.Type === 'Create').length;
|
|
47
|
-
const updates = changes.Changes.filter(c => c.Type === 'Update').length;
|
|
48
|
-
const deletions = changes.Changes.filter(c => c.Type === 'Delete').length;
|
|
49
|
-
const summary = `Detected ${changeCount} changes (Creations: ${creations}, Updates: ${updates}, Deletions: ${deletions}).`;
|
|
50
|
-
if (!autoReplay) {
|
|
51
|
-
return {
|
|
52
|
-
Success: true,
|
|
53
|
-
Message: `${summary} AutoReplay is disabled, so no changes were replayed.`,
|
|
54
|
-
ResultCode: "SUCCESS"
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
if (changeCount === 0) {
|
|
58
|
-
return {
|
|
59
|
-
Success: true,
|
|
60
|
-
Message: "No changes detected.",
|
|
61
|
-
ResultCode: "SUCCESS"
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
// attempt to replay the changes
|
|
65
|
-
if (await ExternalChangeDetectorEngine.Instance.ReplayChanges(changes.Changes, replayBatchSize, staleTimeoutHours)) {
|
|
66
|
-
return {
|
|
67
|
-
Success: true,
|
|
68
|
-
Message: `${summary} All changes replayed successfully.`,
|
|
69
|
-
ResultCode: "SUCCESS"
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
return {
|
|
74
|
-
Success: false,
|
|
75
|
-
Message: `${summary} Some or all changes failed to replay. Check the Record Change Replay Runs for details.`,
|
|
76
|
-
ResultCode: "FAILED"
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
return {
|
|
82
|
-
Success: false,
|
|
83
|
-
Message: changes ? changes.ErrorMessage : "Unknown error during change detection",
|
|
84
|
-
ResultCode: "FAILED"
|
|
85
|
-
};
|
|
42
|
+
return entityListParam.Value.split(',')
|
|
43
|
+
.map((name) => md.EntityByName(name.trim()))
|
|
44
|
+
.filter((e) => !!e);
|
|
86
45
|
}
|
|
46
|
+
return ExternalChangeDetectorEngine.Instance.EligibleEntities;
|
|
47
|
+
}
|
|
48
|
+
getIntParam(params, name, defaultValue) {
|
|
49
|
+
const param = params.Params.find(p => p.Name.trim().toLowerCase() === name.toLowerCase());
|
|
50
|
+
if (!param?.Value)
|
|
51
|
+
return defaultValue;
|
|
52
|
+
const parsed = parseInt(param.Value, 10);
|
|
53
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
87
54
|
}
|
|
88
55
|
};
|
|
89
56
|
ExternalChangeDetectionAction = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-change-detection.action.js","sourceRoot":"","sources":["../../../src/custom/utilities/external-change-detection.action.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAc,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"external-change-detection.action.js","sourceRoot":"","sources":["../../../src/custom/utilities/external-change-detection.action.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/core-actions",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "5.
|
|
4
|
+
"version": "5.15.0",
|
|
5
5
|
"description": "Library of generated and custom actions for the core MemberJunction framework. This library is maintained by MemberJunction and includes actions for use within the framework itself.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -25,32 +25,32 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@asamuzakjp/css-color": "^4.1.2",
|
|
27
27
|
"@dagrejs/dagre": "^1.1.8",
|
|
28
|
-
"@memberjunction/actions": "5.
|
|
29
|
-
"@memberjunction/actions-base": "5.
|
|
30
|
-
"@memberjunction/ai": "5.
|
|
31
|
-
"@memberjunction/ai-mcp-client": "5.
|
|
32
|
-
"@memberjunction/ai-agent-manager": "5.
|
|
33
|
-
"@memberjunction/ai-agents": "5.
|
|
34
|
-
"@memberjunction/ai-betty-bot": "5.
|
|
35
|
-
"@memberjunction/ai-core-plus": "5.
|
|
36
|
-
"@memberjunction/ai-engine-base": "5.
|
|
37
|
-
"@memberjunction/ai-prompts": "5.
|
|
38
|
-
"@memberjunction/ai-vector-sync": "5.
|
|
39
|
-
"@memberjunction/aiengine": "5.
|
|
40
|
-
"@memberjunction/code-execution": "5.
|
|
41
|
-
"@memberjunction/communication-engine": "5.
|
|
42
|
-
"@memberjunction/communication-types": "5.
|
|
43
|
-
"@memberjunction/content-autotagging": "5.
|
|
44
|
-
"@memberjunction/core": "5.
|
|
45
|
-
"@memberjunction/core-entities": "5.
|
|
46
|
-
"@memberjunction/core-entities-server": "5.
|
|
47
|
-
"@memberjunction/export-engine": "5.
|
|
48
|
-
"@memberjunction/external-change-detection": "5.
|
|
49
|
-
"@memberjunction/generic-database-provider": "5.
|
|
50
|
-
"@memberjunction/global": "5.
|
|
51
|
-
"@memberjunction/integration-engine": "5.
|
|
52
|
-
"@memberjunction/sqlserver-dataprovider": "5.
|
|
53
|
-
"@memberjunction/storage": "5.
|
|
28
|
+
"@memberjunction/actions": "5.15.0",
|
|
29
|
+
"@memberjunction/actions-base": "5.15.0",
|
|
30
|
+
"@memberjunction/ai": "5.15.0",
|
|
31
|
+
"@memberjunction/ai-mcp-client": "5.15.0",
|
|
32
|
+
"@memberjunction/ai-agent-manager": "5.15.0",
|
|
33
|
+
"@memberjunction/ai-agents": "5.15.0",
|
|
34
|
+
"@memberjunction/ai-betty-bot": "5.15.0",
|
|
35
|
+
"@memberjunction/ai-core-plus": "5.15.0",
|
|
36
|
+
"@memberjunction/ai-engine-base": "5.15.0",
|
|
37
|
+
"@memberjunction/ai-prompts": "5.15.0",
|
|
38
|
+
"@memberjunction/ai-vector-sync": "5.15.0",
|
|
39
|
+
"@memberjunction/aiengine": "5.15.0",
|
|
40
|
+
"@memberjunction/code-execution": "5.15.0",
|
|
41
|
+
"@memberjunction/communication-engine": "5.15.0",
|
|
42
|
+
"@memberjunction/communication-types": "5.15.0",
|
|
43
|
+
"@memberjunction/content-autotagging": "5.15.0",
|
|
44
|
+
"@memberjunction/core": "5.15.0",
|
|
45
|
+
"@memberjunction/core-entities": "5.15.0",
|
|
46
|
+
"@memberjunction/core-entities-server": "5.15.0",
|
|
47
|
+
"@memberjunction/export-engine": "5.15.0",
|
|
48
|
+
"@memberjunction/external-change-detection": "5.15.0",
|
|
49
|
+
"@memberjunction/generic-database-provider": "5.15.0",
|
|
50
|
+
"@memberjunction/global": "5.15.0",
|
|
51
|
+
"@memberjunction/integration-engine": "5.15.0",
|
|
52
|
+
"@memberjunction/sqlserver-dataprovider": "5.15.0",
|
|
53
|
+
"@memberjunction/storage": "5.15.0",
|
|
54
54
|
"@types/d3-cloud": "^1.2.9",
|
|
55
55
|
"@types/d3-force": "^3.0.10",
|
|
56
56
|
"@types/d3-hierarchy": "^3.1.7",
|
|
@@ -80,7 +80,6 @@
|
|
|
80
80
|
"mammoth": "^1.11.0",
|
|
81
81
|
"marked": "^17.0.1",
|
|
82
82
|
"mermaid": "^11.12.2",
|
|
83
|
-
"node-sql-parser": "^5.4.0",
|
|
84
83
|
"nunjucks": "^3.2.4",
|
|
85
84
|
"nwsapi": "^2.2.23",
|
|
86
85
|
"papaparse": "^5.5.3",
|