@mj-biz-apps/common-server 5.46.2 → 5.47.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.
|
@@ -6,14 +6,25 @@
|
|
|
6
6
|
* lifecycle appears on a person's or organization's timeline with no code in the consuming app.
|
|
7
7
|
*
|
|
8
8
|
* It WRAPS `ActivityWriter` (§3.2 — one writer, two entry points), never writes its own rows, and
|
|
9
|
-
* takes only serializable params
|
|
10
|
-
*
|
|
9
|
+
* takes only serializable params. A `Durable` binding must pass only `Static` / `Entity Field`
|
|
10
|
+
* values (e.g. `RecordID` via Entity Field `ID`): redaction always strips whole-record values from
|
|
11
|
+
* the durable task payload, and strips a `LogValue = false` param unless the binding row sets
|
|
12
|
+
* `LogValue: true` (see manual-log.ts). `RecordData` (`'Entity Object Data'`, never `'Entity Object'` — a
|
|
13
|
+
* BaseEntity serializes to `{}` silently, §3.3) is only for `LinkFields` on inline bindings.
|
|
14
|
+
*
|
|
15
|
+
* The write runs on an independent provider instance, never the process-global one (#195).
|
|
11
16
|
*/
|
|
12
17
|
import { BaseAction } from '@memberjunction/actions';
|
|
13
18
|
import type { ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
|
|
14
19
|
export declare class LogActivityAction extends BaseAction {
|
|
15
20
|
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
16
21
|
private log;
|
|
22
|
+
/**
|
|
23
|
+
* Metadata.Provider is process-global: a transaction opened on it captures every concurrent
|
|
24
|
+
* caller's queries (#195). Never switch this to params.Provider either — the entity-action run is
|
|
25
|
+
* detached from the save, and the caller may release that instance mid-write.
|
|
26
|
+
*/
|
|
27
|
+
private writeOnOwnProvider;
|
|
17
28
|
}
|
|
18
29
|
export declare function LoadLogActivityAction(): void;
|
|
19
30
|
//# sourceMappingURL=log-activity.action.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-activity.action.d.ts","sourceRoot":"","sources":["../../src/custom/log-activity.action.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"log-activity.action.d.ts","sourceRoot":"","sources":["../../src/custom/log-activity.action.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAe,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AA0CrG,qBACa,iBAAkB,SAAQ,UAAU;cAC7B,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAkBzE,GAAG;IAkCjB;;;;OAIG;YACW,kBAAkB;CAenC;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -12,13 +12,18 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
12
12
|
* lifecycle appears on a person's or organization's timeline with no code in the consuming app.
|
|
13
13
|
*
|
|
14
14
|
* It WRAPS `ActivityWriter` (§3.2 — one writer, two entry points), never writes its own rows, and
|
|
15
|
-
* takes only serializable params
|
|
16
|
-
*
|
|
15
|
+
* takes only serializable params. A `Durable` binding must pass only `Static` / `Entity Field`
|
|
16
|
+
* values (e.g. `RecordID` via Entity Field `ID`): redaction always strips whole-record values from
|
|
17
|
+
* the durable task payload, and strips a `LogValue = false` param unless the binding row sets
|
|
18
|
+
* `LogValue: true` (see manual-log.ts). `RecordData` (`'Entity Object Data'`, never `'Entity Object'` — a
|
|
19
|
+
* BaseEntity serializes to `{}` silently, §3.3) is only for `LinkFields` on inline bindings.
|
|
20
|
+
*
|
|
21
|
+
* The write runs on an independent provider instance, never the process-global one (#195).
|
|
17
22
|
*/
|
|
18
23
|
import { BaseAction } from '@memberjunction/actions';
|
|
19
|
-
import { Metadata } from '@memberjunction/core';
|
|
24
|
+
import { LogError, Metadata } from '@memberjunction/core';
|
|
20
25
|
import { RegisterClass } from '@memberjunction/global';
|
|
21
|
-
import { ActivityWriter, ParseLogActivityParams } from '@mj-biz-apps/common-activity-sync';
|
|
26
|
+
import { ActivityWriter, IsDatabaseProvider, ParseLogActivityParams, } from '@mj-biz-apps/common-activity-sync';
|
|
22
27
|
function setOutput(params, name, value) {
|
|
23
28
|
const existing = params.Params?.find((p) => p.Name?.toLowerCase() === name.toLowerCase());
|
|
24
29
|
if (existing) {
|
|
@@ -28,29 +33,49 @@ function setOutput(params, name, value) {
|
|
|
28
33
|
params.Params = params.Params ?? [];
|
|
29
34
|
params.Params.push({ Name: name, Value: value, Type: 'Output' });
|
|
30
35
|
}
|
|
36
|
+
function paramValues(params) {
|
|
37
|
+
const values = {};
|
|
38
|
+
for (const param of params.Params ?? []) {
|
|
39
|
+
if (param.Name)
|
|
40
|
+
values[param.Name] = param.Value;
|
|
41
|
+
}
|
|
42
|
+
return values;
|
|
43
|
+
}
|
|
44
|
+
/** "which record, for whom" — read from the raw params so it is available even when parsing failed. */
|
|
45
|
+
function describeTarget(params) {
|
|
46
|
+
const values = paramValues(params);
|
|
47
|
+
const recordData = values.RecordData;
|
|
48
|
+
const recordDataID = recordData !== null && typeof recordData === 'object' && 'ID' in recordData
|
|
49
|
+
? recordData.ID
|
|
50
|
+
: undefined;
|
|
51
|
+
const entityName = values.EntityName ?? '(none)';
|
|
52
|
+
const recordID = values.RecordID ?? recordDataID ?? '(none)';
|
|
53
|
+
return `EntityName=${String(entityName)}, RecordID=${String(recordID)}, ContextUser=${params.ContextUser?.ID ?? '(none)'}`;
|
|
54
|
+
}
|
|
31
55
|
let LogActivityAction = class LogActivityAction extends BaseAction {
|
|
32
56
|
async InternalRunAction(params) {
|
|
57
|
+
let result;
|
|
33
58
|
try {
|
|
34
|
-
|
|
59
|
+
result = await this.log(params);
|
|
35
60
|
}
|
|
36
61
|
catch (error) {
|
|
37
|
-
|
|
62
|
+
result = {
|
|
38
63
|
Success: false,
|
|
39
64
|
ResultCode: 'ERROR',
|
|
40
65
|
Message: `LogActivity failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
41
66
|
};
|
|
42
67
|
}
|
|
68
|
+
// A durable run's failure otherwise lives only on its Task row, where nobody looks (#197).
|
|
69
|
+
if (!result.Success) {
|
|
70
|
+
LogError(`[Common.LogActivity] ${result.Message} (${describeTarget(params)})`);
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
43
73
|
}
|
|
44
74
|
async log(params) {
|
|
45
75
|
if (!params.ContextUser) {
|
|
46
76
|
return { Success: false, ResultCode: 'VALIDATION_ERROR', Message: 'ContextUser is required.' };
|
|
47
77
|
}
|
|
48
|
-
const
|
|
49
|
-
for (const param of params.Params ?? []) {
|
|
50
|
-
if (param.Name)
|
|
51
|
-
values[param.Name] = param.Value;
|
|
52
|
-
}
|
|
53
|
-
const parsed = ParseLogActivityParams(values);
|
|
78
|
+
const parsed = ParseLogActivityParams(paramValues(params));
|
|
54
79
|
if (!parsed.Input) {
|
|
55
80
|
return {
|
|
56
81
|
Success: false,
|
|
@@ -58,7 +83,7 @@ let LogActivityAction = class LogActivityAction extends BaseAction {
|
|
|
58
83
|
Message: `LogActivity input is invalid: ${parsed.Errors.join(' | ')}`,
|
|
59
84
|
};
|
|
60
85
|
}
|
|
61
|
-
const result = await
|
|
86
|
+
const result = await this.writeOnOwnProvider(parsed.Input, params.ContextUser);
|
|
62
87
|
setOutput(params, 'ActivityID', result.ActivityID);
|
|
63
88
|
setOutput(params, 'AlreadyPresent', result.AlreadyPresent);
|
|
64
89
|
if (!result.Success) {
|
|
@@ -76,6 +101,24 @@ let LogActivityAction = class LogActivityAction extends BaseAction {
|
|
|
76
101
|
: `Activity ${result.ActivityID} written with ${result.Links.length} link(s).`,
|
|
77
102
|
};
|
|
78
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Metadata.Provider is process-global: a transaction opened on it captures every concurrent
|
|
106
|
+
* caller's queries (#195). Never switch this to params.Provider either — the entity-action run is
|
|
107
|
+
* detached from the save, and the caller may release that instance mid-write.
|
|
108
|
+
*/
|
|
109
|
+
async writeOnOwnProvider(input, contextUser) {
|
|
110
|
+
const shared = Metadata.Provider;
|
|
111
|
+
if (!IsDatabaseProvider(shared)) {
|
|
112
|
+
throw new Error('Common.LogActivity is server-only: Metadata.Provider cannot open transactions.');
|
|
113
|
+
}
|
|
114
|
+
const own = await shared.CreateIndependentInstance();
|
|
115
|
+
try {
|
|
116
|
+
return await new ActivityWriter().WriteManual(input, own, contextUser);
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
await own.ReleaseIndependentInstance(); // rolls back anything left open; never closes the shared pool
|
|
120
|
+
}
|
|
121
|
+
}
|
|
79
122
|
};
|
|
80
123
|
LogActivityAction = __decorate([
|
|
81
124
|
RegisterClass(BaseAction, 'Common.LogActivity')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-activity.action.js","sourceRoot":"","sources":["../../src/custom/log-activity.action.ts"],"names":[],"mappings":";;;;;;AAAA
|
|
1
|
+
{"version":3,"file":"log-activity.action.js","sourceRoot":"","sources":["../../src/custom/log-activity.action.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mj-biz-apps/common-server",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "5.
|
|
4
|
+
"version": "5.47.0",
|
|
5
5
|
"description": "BizApps Common server bootstrap - GraphQL resolvers and class registrations for the Common business entities Open App",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -18,10 +18,10 @@
|
|
|
18
18
|
"vitest": "^3.2.4"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@mj-biz-apps/common-activity-sync": "5.
|
|
22
|
-
"@mj-biz-apps/common-core-entities-server": "5.
|
|
23
|
-
"@mj-biz-apps/common-entities": "5.
|
|
24
|
-
"@mj-biz-apps/common-actions": "5.
|
|
21
|
+
"@mj-biz-apps/common-activity-sync": "5.47.0",
|
|
22
|
+
"@mj-biz-apps/common-core-entities-server": "5.47.0",
|
|
23
|
+
"@mj-biz-apps/common-entities": "5.47.0",
|
|
24
|
+
"@mj-biz-apps/common-actions": "5.47.0",
|
|
25
25
|
"class-validator": "^0.14.3"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|