@memberjunction/core 5.51.0 → 6.1.0-edge.1
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/LICENSE +7 -0
- package/dist/generic/baseEngine.d.ts.map +1 -1
- package/dist/generic/baseEngine.js +13 -2
- package/dist/generic/baseEngine.js.map +1 -1
- package/dist/generic/baseEngineRegistry.d.ts +14 -0
- package/dist/generic/baseEngineRegistry.d.ts.map +1 -1
- package/dist/generic/baseEngineRegistry.js +32 -0
- package/dist/generic/baseEngineRegistry.js.map +1 -1
- package/dist/generic/baseEntity.d.ts +329 -26
- package/dist/generic/baseEntity.d.ts.map +1 -1
- package/dist/generic/baseEntity.js +788 -79
- package/dist/generic/baseEntity.js.map +1 -1
- package/dist/generic/databaseProviderBase.d.ts +54 -17
- package/dist/generic/databaseProviderBase.d.ts.map +1 -1
- package/dist/generic/databaseProviderBase.js +133 -52
- package/dist/generic/databaseProviderBase.js.map +1 -1
- package/dist/generic/entityCompanion.d.ts +218 -0
- package/dist/generic/entityCompanion.d.ts.map +1 -0
- package/dist/generic/entityCompanion.js +170 -0
- package/dist/generic/entityCompanion.js.map +1 -0
- package/dist/generic/entityInfo.d.ts +146 -0
- package/dist/generic/entityInfo.d.ts.map +1 -1
- package/dist/generic/entityInfo.js +188 -0
- package/dist/generic/entityInfo.js.map +1 -1
- package/dist/generic/entitySavePlan.d.ts +199 -0
- package/dist/generic/entitySavePlan.d.ts.map +1 -0
- package/dist/generic/entitySavePlan.js +213 -0
- package/dist/generic/entitySavePlan.js.map +1 -0
- package/dist/generic/entityTransactionScope.d.ts +125 -0
- package/dist/generic/entityTransactionScope.d.ts.map +1 -0
- package/dist/generic/entityTransactionScope.js +115 -0
- package/dist/generic/entityTransactionScope.js.map +1 -0
- package/dist/generic/interfaces.d.ts +93 -35
- package/dist/generic/interfaces.d.ts.map +1 -1
- package/dist/generic/interfaces.js +27 -0
- package/dist/generic/interfaces.js.map +1 -1
- package/dist/generic/providerBase.d.ts +13 -0
- package/dist/generic/providerBase.d.ts.map +1 -1
- package/dist/generic/providerBase.js +64 -5
- package/dist/generic/providerBase.js.map +1 -1
- package/dist/generic/relatedRecordBatchLoader.d.ts +39 -0
- package/dist/generic/relatedRecordBatchLoader.d.ts.map +1 -0
- package/dist/generic/relatedRecordBatchLoader.js +154 -0
- package/dist/generic/relatedRecordBatchLoader.js.map +1 -0
- package/dist/generic/relatedRecordCollection.d.ts +578 -0
- package/dist/generic/relatedRecordCollection.d.ts.map +1 -0
- package/dist/generic/relatedRecordCollection.js +1004 -0
- package/dist/generic/relatedRecordCollection.js.map +1 -0
- package/dist/generic/saveEntityGraphOperation.d.ts +148 -0
- package/dist/generic/saveEntityGraphOperation.d.ts.map +1 -0
- package/dist/generic/saveEntityGraphOperation.js +157 -0
- package/dist/generic/saveEntityGraphOperation.js.map +1 -0
- package/dist/generic/securityInfo.d.ts +99 -1
- package/dist/generic/securityInfo.d.ts.map +1 -1
- package/dist/generic/securityInfo.js +88 -6
- package/dist/generic/securityInfo.js.map +1 -1
- package/dist/generic/telemetryManager.d.ts +21 -1
- package/dist/generic/telemetryManager.d.ts.map +1 -1
- package/dist/generic/telemetryManager.js +21 -6
- package/dist/generic/telemetryManager.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/views/runView.d.ts +31 -0
- package/dist/views/runView.d.ts.map +1 -1
- package/dist/views/runView.js.map +1 -1
- package/package.json +13 -13
- package/readme.md +159 -1
- package/dist/generic/runReport.d.ts +0 -25
- package/dist/generic/runReport.d.ts.map +0 -1
- package/dist/generic/runReport.js +0 -38
- package/dist/generic/runReport.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relatedRecordCollection.js","sourceRoot":"","sources":["../../src/generic/relatedRecordCollection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `MJ.SaveEntityGraph` — the remote operation that lets a client save a parent record
|
|
3
|
+
* and its companion-contributed children as one atomic unit of work.
|
|
4
|
+
*
|
|
5
|
+
* ## Why a remote operation rather than a wire change
|
|
6
|
+
*
|
|
7
|
+
* A client provider has no transaction to open, so it cannot make several round trips atomic. The
|
|
8
|
+
* options were:
|
|
9
|
+
*
|
|
10
|
+
* 1. Add a `Companions___` field to every generated Create/Update GraphQL input type. That is a
|
|
11
|
+
* CodeGen change touching every entity's published input schema across 100+ packages.
|
|
12
|
+
* 2. Ship **one** framework-level remote operation that carries the whole graph.
|
|
13
|
+
*
|
|
14
|
+
* This is (2). `BaseRemotableOperation` already provides a typed RPC whose `Execute()` is identical
|
|
15
|
+
* on both tiers — marshalled over GraphQL from the browser, dispatched in-process on the server —
|
|
16
|
+
* so a single registration covers every entity, forever, with **zero changes to any generated
|
|
17
|
+
* GraphQL type**. Under MemberJunction's publish-then-no-breaking-changes policy, adding nothing to
|
|
18
|
+
* a published schema is worth a great deal.
|
|
19
|
+
*
|
|
20
|
+
* It is also the pattern the applications reached for on their own: `bizapps-orders` already ships
|
|
21
|
+
* `Orders.SaveOrder`, a hand-written remote operation that hydrates a client draft and hands it to
|
|
22
|
+
* `OrderEntityServer.Save()`. This generalises that.
|
|
23
|
+
*
|
|
24
|
+
* ## What happens server-side
|
|
25
|
+
*
|
|
26
|
+
* The operation rebuilds the root record through `provider.GetEntityObject()`, so it resolves to
|
|
27
|
+
* whatever subclass is registered **on the server** — `OrderEntityServer`, not the shared
|
|
28
|
+
* `OrderEntity`. Companions are deserialised onto it, and then plain `entity.Save()` runs, which
|
|
29
|
+
* takes the ordinary local graph path inside a real transaction. Server-side business logic,
|
|
30
|
+
* `PreSave` hooks, Record Changes, entity actions and events all run exactly as they would for a
|
|
31
|
+
* save initiated on the server.
|
|
32
|
+
*
|
|
33
|
+
* ## Security
|
|
34
|
+
*
|
|
35
|
+
* This is the same API-key bypass surface that `TransactionGroupResolver` had to be patched for
|
|
36
|
+
* (bug-register B1 / SEC1): a restricted key could otherwise perform writes by wrapping them in a
|
|
37
|
+
* batch mutation whose scope ceiling was never consulted. {@link SaveEntityGraphOperation.Authorize}
|
|
38
|
+
* therefore refuses any caller that cannot satisfy the per-record entity permissions, and the
|
|
39
|
+
* server resolver applies the `entity:create` / `entity:update` scope gate before dispatch. Entity
|
|
40
|
+
* permissions still enforce inside `Save()`; the API-key ceiling does not check itself.
|
|
41
|
+
*
|
|
42
|
+
* @module @memberjunction/core
|
|
43
|
+
*/
|
|
44
|
+
import { BaseRemotableOperation } from './baseRemotableOperation.js';
|
|
45
|
+
import type { RemoteOpServerContext } from './baseRemotableOperation.js';
|
|
46
|
+
import type { EntityCompanionPayload } from './entityCompanion.js';
|
|
47
|
+
import type { IMetadataProvider } from './interfaces.js';
|
|
48
|
+
import type { UserInfo } from './securityInfo.js';
|
|
49
|
+
/** The stable registry key and wire token for this operation. */
|
|
50
|
+
export declare const SAVE_ENTITY_GRAPH_OPERATION_KEY = "MJ.SaveEntityGraph";
|
|
51
|
+
/**
|
|
52
|
+
* Input payload for {@link SaveEntityGraphOperation}.
|
|
53
|
+
*/
|
|
54
|
+
export type SaveEntityGraphInput = {
|
|
55
|
+
/** The root record's entity name, e.g. `'MJ_BizApps_Orders: Orders'`. */
|
|
56
|
+
EntityName: string;
|
|
57
|
+
/** The root record's field values, as produced by `BaseEntity.GetAll()`. */
|
|
58
|
+
Fields: Record<string, unknown>;
|
|
59
|
+
/** Serialised companion payloads to attach to the rebuilt root. */
|
|
60
|
+
Companions: EntityCompanionPayload[];
|
|
61
|
+
/**
|
|
62
|
+
* Whether the root already exists. Drives whether the server loads the record before applying
|
|
63
|
+
* field values (an update) or starts a new one (a create).
|
|
64
|
+
*/
|
|
65
|
+
IsExistingRecord: boolean;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Output payload for {@link SaveEntityGraphOperation}.
|
|
69
|
+
*/
|
|
70
|
+
export type SaveEntityGraphOutput = {
|
|
71
|
+
/** True when the whole graph committed. */
|
|
72
|
+
Success: boolean;
|
|
73
|
+
/** Failure detail when `Success` is false. */
|
|
74
|
+
ErrorMessage?: string;
|
|
75
|
+
/**
|
|
76
|
+
* The root record's field values **after** the save — server-assigned primary keys, computed
|
|
77
|
+
* columns, sequence numbers, trigger-populated fields.
|
|
78
|
+
*/
|
|
79
|
+
Fields: Record<string, unknown>;
|
|
80
|
+
/**
|
|
81
|
+
* The companions re-serialised after the save, so the client can adopt server-assigned child
|
|
82
|
+
* primary keys and computed values.
|
|
83
|
+
*
|
|
84
|
+
* Returning a result *graph* rather than a result *row* is easy to overlook and important: a
|
|
85
|
+
* client that only refreshed the header would be left holding children that look unsaved and
|
|
86
|
+
* would re-insert them on the next save.
|
|
87
|
+
*/
|
|
88
|
+
Companions: EntityCompanionPayload[];
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Saves a parent record and its companion-contributed children atomically, server-side.
|
|
92
|
+
*
|
|
93
|
+
* Invoked automatically by `BaseEntity.Save()` when the entity has companion work to do and the
|
|
94
|
+
* active provider cannot open a local transaction. Application code does not normally call this
|
|
95
|
+
* directly — the point of the design is that `order.Save()` is the whole API on both tiers.
|
|
96
|
+
*/
|
|
97
|
+
export declare class SaveEntityGraphOperation extends BaseRemotableOperation<SaveEntityGraphInput, SaveEntityGraphOutput> {
|
|
98
|
+
/** @inheritdoc */
|
|
99
|
+
readonly OperationKey = "MJ.SaveEntityGraph";
|
|
100
|
+
/**
|
|
101
|
+
* API-key scope required to invoke this operation.
|
|
102
|
+
*
|
|
103
|
+
* `entity:update` is the ceiling applied at the resolver; per-record Create vs Update
|
|
104
|
+
* permissions are enforced inside each node's own `Save()`.
|
|
105
|
+
*/
|
|
106
|
+
readonly RequiredScope = "entity:update";
|
|
107
|
+
/**
|
|
108
|
+
* Validates the shape of the incoming payload.
|
|
109
|
+
*
|
|
110
|
+
* Deliberately **not** where entity permissions are checked. Two other layers already own that,
|
|
111
|
+
* and duplicating it here would need a provider this hook is not given:
|
|
112
|
+
*
|
|
113
|
+
* - The server resolver applies the API-key scope ceiling ({@link RequiredScope}) before
|
|
114
|
+
* dispatch, closing the batch-mutation bypass that `TransactionGroupResolver` was patched for.
|
|
115
|
+
* - Every node's own `BaseEntity.Save()` calls `CheckPermissions()` for Create or Update as
|
|
116
|
+
* appropriate, per record, against the acting user — including children the caller never
|
|
117
|
+
* named explicitly.
|
|
118
|
+
*
|
|
119
|
+
* @param input - The graph payload.
|
|
120
|
+
* @param _user - The acting user.
|
|
121
|
+
* @returns True when the payload is well-formed enough to attempt.
|
|
122
|
+
*/
|
|
123
|
+
protected Authorize(input: SaveEntityGraphInput, _user: UserInfo): Promise<boolean>;
|
|
124
|
+
/**
|
|
125
|
+
* Rebuilds the graph server-side and saves it.
|
|
126
|
+
*
|
|
127
|
+
* @param input - The graph payload.
|
|
128
|
+
* @param provider - The provider to build entity objects from.
|
|
129
|
+
* @param user - The acting user.
|
|
130
|
+
* @param _context - The server execution context.
|
|
131
|
+
* @returns The post-save root fields and re-serialised companions.
|
|
132
|
+
*/
|
|
133
|
+
protected InternalExecute(input: SaveEntityGraphInput, provider: IMetadataProvider, user: UserInfo, _context: RemoteOpServerContext): Promise<SaveEntityGraphOutput>;
|
|
134
|
+
/**
|
|
135
|
+
* Reconstructs the root entity on the server, resolved to its server-side registered subclass.
|
|
136
|
+
*
|
|
137
|
+
* An existing record is loaded first so that unchanged fields keep their database values and
|
|
138
|
+
* the concurrency/old-value bookkeeping is correct; only then are the client's field values
|
|
139
|
+
* applied on top.
|
|
140
|
+
*
|
|
141
|
+
* @param input - The graph payload.
|
|
142
|
+
* @param provider - The provider to build the entity from.
|
|
143
|
+
* @param user - The acting user.
|
|
144
|
+
* @returns The rebuilt root, with companions deserialised onto it.
|
|
145
|
+
*/
|
|
146
|
+
private rebuildRoot;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=saveEntityGraphOperation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saveEntityGraphOperation.d.ts","sourceRoot":"","sources":["../../src/generic/saveEntityGraphOperation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,iEAAiE;AACjE,eAAO,MAAM,+BAA+B,uBAAuB,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAC/B,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,mEAAmE;IACnE,UAAU,EAAE,sBAAsB,EAAE,CAAC;IACrC;;;OAGG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAChC,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC;;;;;;;OAOG;IACH,UAAU,EAAE,sBAAsB,EAAE,CAAC;CACxC,CAAC;AAEF;;;;;;GAMG;AACH,qBACa,wBAAyB,SAAQ,sBAAsB,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;IAC7G,kBAAkB;IAClB,SAAgB,YAAY,wBAAmC;IAE/D;;;;;OAKG;IACH,SAAyB,aAAa,mBAAmB;IAEzD;;;;;;;;;;;;;;;OAeG;cACsB,SAAS,CAAC,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlG;;;;;;;;OAQG;cACsB,eAAe,CACpC,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,qBAAqB,GAChC,OAAO,CAAC,qBAAqB,CAAC;IAsBjC;;;;;;;;;;;OAWG;YACW,WAAW;CA0B5B"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `MJ.SaveEntityGraph` — the remote operation that lets a client save a parent record
|
|
3
|
+
* and its companion-contributed children as one atomic unit of work.
|
|
4
|
+
*
|
|
5
|
+
* ## Why a remote operation rather than a wire change
|
|
6
|
+
*
|
|
7
|
+
* A client provider has no transaction to open, so it cannot make several round trips atomic. The
|
|
8
|
+
* options were:
|
|
9
|
+
*
|
|
10
|
+
* 1. Add a `Companions___` field to every generated Create/Update GraphQL input type. That is a
|
|
11
|
+
* CodeGen change touching every entity's published input schema across 100+ packages.
|
|
12
|
+
* 2. Ship **one** framework-level remote operation that carries the whole graph.
|
|
13
|
+
*
|
|
14
|
+
* This is (2). `BaseRemotableOperation` already provides a typed RPC whose `Execute()` is identical
|
|
15
|
+
* on both tiers — marshalled over GraphQL from the browser, dispatched in-process on the server —
|
|
16
|
+
* so a single registration covers every entity, forever, with **zero changes to any generated
|
|
17
|
+
* GraphQL type**. Under MemberJunction's publish-then-no-breaking-changes policy, adding nothing to
|
|
18
|
+
* a published schema is worth a great deal.
|
|
19
|
+
*
|
|
20
|
+
* It is also the pattern the applications reached for on their own: `bizapps-orders` already ships
|
|
21
|
+
* `Orders.SaveOrder`, a hand-written remote operation that hydrates a client draft and hands it to
|
|
22
|
+
* `OrderEntityServer.Save()`. This generalises that.
|
|
23
|
+
*
|
|
24
|
+
* ## What happens server-side
|
|
25
|
+
*
|
|
26
|
+
* The operation rebuilds the root record through `provider.GetEntityObject()`, so it resolves to
|
|
27
|
+
* whatever subclass is registered **on the server** — `OrderEntityServer`, not the shared
|
|
28
|
+
* `OrderEntity`. Companions are deserialised onto it, and then plain `entity.Save()` runs, which
|
|
29
|
+
* takes the ordinary local graph path inside a real transaction. Server-side business logic,
|
|
30
|
+
* `PreSave` hooks, Record Changes, entity actions and events all run exactly as they would for a
|
|
31
|
+
* save initiated on the server.
|
|
32
|
+
*
|
|
33
|
+
* ## Security
|
|
34
|
+
*
|
|
35
|
+
* This is the same API-key bypass surface that `TransactionGroupResolver` had to be patched for
|
|
36
|
+
* (bug-register B1 / SEC1): a restricted key could otherwise perform writes by wrapping them in a
|
|
37
|
+
* batch mutation whose scope ceiling was never consulted. {@link SaveEntityGraphOperation.Authorize}
|
|
38
|
+
* therefore refuses any caller that cannot satisfy the per-record entity permissions, and the
|
|
39
|
+
* server resolver applies the `entity:create` / `entity:update` scope gate before dispatch. Entity
|
|
40
|
+
* permissions still enforce inside `Save()`; the API-key ceiling does not check itself.
|
|
41
|
+
*
|
|
42
|
+
* @module @memberjunction/core
|
|
43
|
+
*/
|
|
44
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
45
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
46
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
47
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
48
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
49
|
+
};
|
|
50
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
51
|
+
import { BaseRemotableOperation } from './baseRemotableOperation.js';
|
|
52
|
+
import { CompositeKey, KeyValuePair } from './compositeKey.js';
|
|
53
|
+
import { LogError } from './logging.js';
|
|
54
|
+
/** The stable registry key and wire token for this operation. */
|
|
55
|
+
export const SAVE_ENTITY_GRAPH_OPERATION_KEY = 'MJ.SaveEntityGraph';
|
|
56
|
+
/**
|
|
57
|
+
* Saves a parent record and its companion-contributed children atomically, server-side.
|
|
58
|
+
*
|
|
59
|
+
* Invoked automatically by `BaseEntity.Save()` when the entity has companion work to do and the
|
|
60
|
+
* active provider cannot open a local transaction. Application code does not normally call this
|
|
61
|
+
* directly — the point of the design is that `order.Save()` is the whole API on both tiers.
|
|
62
|
+
*/
|
|
63
|
+
let SaveEntityGraphOperation = class SaveEntityGraphOperation extends BaseRemotableOperation {
|
|
64
|
+
constructor() {
|
|
65
|
+
super(...arguments);
|
|
66
|
+
/** @inheritdoc */
|
|
67
|
+
this.OperationKey = SAVE_ENTITY_GRAPH_OPERATION_KEY;
|
|
68
|
+
/**
|
|
69
|
+
* API-key scope required to invoke this operation.
|
|
70
|
+
*
|
|
71
|
+
* `entity:update` is the ceiling applied at the resolver; per-record Create vs Update
|
|
72
|
+
* permissions are enforced inside each node's own `Save()`.
|
|
73
|
+
*/
|
|
74
|
+
this.RequiredScope = 'entity:update';
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Validates the shape of the incoming payload.
|
|
78
|
+
*
|
|
79
|
+
* Deliberately **not** where entity permissions are checked. Two other layers already own that,
|
|
80
|
+
* and duplicating it here would need a provider this hook is not given:
|
|
81
|
+
*
|
|
82
|
+
* - The server resolver applies the API-key scope ceiling ({@link RequiredScope}) before
|
|
83
|
+
* dispatch, closing the batch-mutation bypass that `TransactionGroupResolver` was patched for.
|
|
84
|
+
* - Every node's own `BaseEntity.Save()` calls `CheckPermissions()` for Create or Update as
|
|
85
|
+
* appropriate, per record, against the acting user — including children the caller never
|
|
86
|
+
* named explicitly.
|
|
87
|
+
*
|
|
88
|
+
* @param input - The graph payload.
|
|
89
|
+
* @param _user - The acting user.
|
|
90
|
+
* @returns True when the payload is well-formed enough to attempt.
|
|
91
|
+
*/
|
|
92
|
+
async Authorize(input, _user) {
|
|
93
|
+
return !!input?.EntityName && !!input.Fields;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Rebuilds the graph server-side and saves it.
|
|
97
|
+
*
|
|
98
|
+
* @param input - The graph payload.
|
|
99
|
+
* @param provider - The provider to build entity objects from.
|
|
100
|
+
* @param user - The acting user.
|
|
101
|
+
* @param _context - The server execution context.
|
|
102
|
+
* @returns The post-save root fields and re-serialised companions.
|
|
103
|
+
*/
|
|
104
|
+
async InternalExecute(input, provider, user, _context) {
|
|
105
|
+
const root = await this.rebuildRoot(input, provider, user);
|
|
106
|
+
const saved = await root.Save();
|
|
107
|
+
if (!saved) {
|
|
108
|
+
const detail = root.LatestResult?.CompleteMessage ?? 'unknown error';
|
|
109
|
+
LogError(`${SAVE_ENTITY_GRAPH_OPERATION_KEY} failed for ${input.EntityName}: ${detail}`);
|
|
110
|
+
return {
|
|
111
|
+
Success: false,
|
|
112
|
+
ErrorMessage: detail,
|
|
113
|
+
Fields: root.GetAll(),
|
|
114
|
+
Companions: await root.SerializeCompanions(),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
Success: true,
|
|
119
|
+
Fields: root.GetAll(),
|
|
120
|
+
Companions: await root.SerializeCompanions(),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Reconstructs the root entity on the server, resolved to its server-side registered subclass.
|
|
125
|
+
*
|
|
126
|
+
* An existing record is loaded first so that unchanged fields keep their database values and
|
|
127
|
+
* the concurrency/old-value bookkeeping is correct; only then are the client's field values
|
|
128
|
+
* applied on top.
|
|
129
|
+
*
|
|
130
|
+
* @param input - The graph payload.
|
|
131
|
+
* @param provider - The provider to build the entity from.
|
|
132
|
+
* @param user - The acting user.
|
|
133
|
+
* @returns The rebuilt root, with companions deserialised onto it.
|
|
134
|
+
*/
|
|
135
|
+
async rebuildRoot(input, provider, user) {
|
|
136
|
+
const root = await provider.GetEntityObject(input.EntityName, user);
|
|
137
|
+
if (input.IsExistingRecord) {
|
|
138
|
+
const key = new CompositeKey(root.EntityInfo.PrimaryKeys.map(pk => new KeyValuePair(pk.Name, input.Fields[pk.Name])));
|
|
139
|
+
const loaded = await root.InnerLoad(key);
|
|
140
|
+
if (!loaded) {
|
|
141
|
+
throw new Error(`${SAVE_ENTITY_GRAPH_OPERATION_KEY}: could not load existing ${input.EntityName} ` +
|
|
142
|
+
`record for update.`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
root.NewRecord();
|
|
147
|
+
}
|
|
148
|
+
root.SetMany(input.Fields, true);
|
|
149
|
+
await root.DeserializeCompanions(input.Companions ?? []);
|
|
150
|
+
return root;
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
SaveEntityGraphOperation = __decorate([
|
|
154
|
+
RegisterClass(BaseRemotableOperation, SAVE_ENTITY_GRAPH_OPERATION_KEY)
|
|
155
|
+
], SaveEntityGraphOperation);
|
|
156
|
+
export { SaveEntityGraphOperation };
|
|
157
|
+
//# sourceMappingURL=saveEntityGraphOperation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saveEntityGraphOperation.js","sourceRoot":"","sources":["../../src/generic/saveEntityGraphOperation.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,6 +42,54 @@ export interface MagicLinkScope {
|
|
|
42
42
|
/** ResourceType name/id of the shared resource. */
|
|
43
43
|
ResourceType?: string;
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Per-request acting context for an API-key session, carried on {@link UserInfo}.
|
|
47
|
+
* Consumed by API-key-scoped RLS filters via the `{{Acting*}}` tokens in
|
|
48
|
+
* {@link RowLevelSecurityFilterInfo.MarkupFilterText}.
|
|
49
|
+
*
|
|
50
|
+
* TRUST BOUNDARY: these values MUST be derived server-side from an authenticated
|
|
51
|
+
* identity. The engine binds what it is given and cannot validate provenance —
|
|
52
|
+
* never populate from a client-supplied header, argument, or GraphQL variable,
|
|
53
|
+
* and never expose via a resolver. A client-settable acting context is a total
|
|
54
|
+
* bypass of API-key row filtering.
|
|
55
|
+
*
|
|
56
|
+
* Cardinality is a one-way door, decided per token at registration: the three
|
|
57
|
+
* scalar tokens are scalar forever (moving to a set later changes the token's
|
|
58
|
+
* shape and breaks every filter authored against it), and ActingCompanyIDs is
|
|
59
|
+
* list-capable from day one for exactly that reason.
|
|
60
|
+
*/
|
|
61
|
+
export interface APIKeyActingContext {
|
|
62
|
+
/** Organization / tenant the caller is acting on behalf of (GUID, scalar forever). */
|
|
63
|
+
ActingOrganizationID?: string;
|
|
64
|
+
/** Person / contact the caller is acting on behalf of (GUID, scalar forever). */
|
|
65
|
+
ActingPersonID?: string;
|
|
66
|
+
/** Opaque per-integration scope value (bounded identifier, scalar forever). */
|
|
67
|
+
ActingScopeID?: string;
|
|
68
|
+
/**
|
|
69
|
+
* Companies the caller is acting for — LIST-capable. Renders inside
|
|
70
|
+
* `Col IN ({{ActingCompanyIDs}})` as a sorted, per-element-validated,
|
|
71
|
+
* quoted and escaped list; an empty or absent set resolves the whole
|
|
72
|
+
* filter to `(1=0)` (match nothing), same as any unresolved token.
|
|
73
|
+
*/
|
|
74
|
+
ActingCompanyIDs?: string[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* One API-key row-filter binding carried on {@link UserInfo}: for the named
|
|
78
|
+
* entity and permission type, the referenced Row Level Security Filter applies
|
|
79
|
+
* IN ADDITION TO (AND-composed with) role RLS — and independently of the
|
|
80
|
+
* role-RLS exemption, because a key ceiling exists precisely to bind
|
|
81
|
+
* principals whose roles are unrestricted. Resolved server-side per request
|
|
82
|
+
* from the validated API key's scope rules; plain data so MJCore can consume
|
|
83
|
+
* it without depending on the APIKeys packages.
|
|
84
|
+
*/
|
|
85
|
+
export interface APIKeyRowFilterBinding {
|
|
86
|
+
/** ID of the entity the filtered scope rule targets (exact entity — patterns are rejected at rule save). */
|
|
87
|
+
EntityID: string;
|
|
88
|
+
/** Which operation the binding constrains, resolved from the rule's scope path at stamp time. */
|
|
89
|
+
PermissionType: 'Read' | 'Create' | 'Update' | 'Delete';
|
|
90
|
+
/** FK into the RowLevelSecurityFilter catalog (same catalog role RLS uses). */
|
|
91
|
+
FilterID: string;
|
|
92
|
+
}
|
|
45
93
|
/**
|
|
46
94
|
* Returning-visitor context carried on {@link UserInfo} for a public web-widget guest session,
|
|
47
95
|
* sourced from the verified session token's claims. Lets a server-created conversation (the voice
|
|
@@ -180,6 +228,31 @@ export declare class UserInfo extends BaseInfo {
|
|
|
180
228
|
*/
|
|
181
229
|
get MagicLinkScope(): MagicLinkScope | undefined;
|
|
182
230
|
set MagicLinkScope(value: MagicLinkScope | undefined);
|
|
231
|
+
private _APIKeyActingContext?;
|
|
232
|
+
/**
|
|
233
|
+
* Per-request acting context for an API-key session. Set server-side in the
|
|
234
|
+
* API-key auth path from an authenticated identity, ON A CLONED UserInfo
|
|
235
|
+
* (the resolved userRecord may be the shared UserCache instance — stamping
|
|
236
|
+
* it in place leaks one session's scope to every concurrent session of the
|
|
237
|
+
* same user). Consumed by API-key row filters via the {{Acting*}} tokens.
|
|
238
|
+
* Same getter/setter (non-enumerable accessor) rationale as TenantContext —
|
|
239
|
+
* not a DB/GraphQL field, and it must NEVER be exposed via a resolver.
|
|
240
|
+
*/
|
|
241
|
+
get APIKeyActingContext(): APIKeyActingContext | undefined;
|
|
242
|
+
set APIKeyActingContext(value: APIKeyActingContext | undefined);
|
|
243
|
+
private _APIKeyRowFilters?;
|
|
244
|
+
/**
|
|
245
|
+
* Row-filter bindings for the API key this session authenticated with,
|
|
246
|
+
* resolved per request from the key's scope rules and stamped on the CLONED
|
|
247
|
+
* per-request UserInfo. Consumed by
|
|
248
|
+
* {@link EntityInfo.GetEffectiveRowFilterWhereClause}, which AND-composes
|
|
249
|
+
* each matching binding's filter with role RLS — outside the role-RLS
|
|
250
|
+
* exemption. Plain data on purpose: MJCore cannot depend on the APIKeys
|
|
251
|
+
* packages, so the bridge is this carrier. Never a DB/GraphQL field; never
|
|
252
|
+
* exposed to or settable by a client.
|
|
253
|
+
*/
|
|
254
|
+
get APIKeyRowFilters(): APIKeyRowFilterBinding[] | undefined;
|
|
255
|
+
set APIKeyRowFilters(value: APIKeyRowFilterBinding[] | undefined);
|
|
183
256
|
private _ReturningVisitorContext?;
|
|
184
257
|
/**
|
|
185
258
|
* Returning-visitor context for a public web-widget guest session. Set at request time from the
|
|
@@ -342,7 +415,32 @@ export declare class RowLevelSecurityFilterInfo extends BaseInfo {
|
|
|
342
415
|
* @param {UserInfo} user - The user whose properties will be substituted into the filter text
|
|
343
416
|
* @returns {string} The filter text with all user tokens replaced with actual values
|
|
344
417
|
*/
|
|
345
|
-
MarkupFilterText(user: UserInfo): string;
|
|
418
|
+
MarkupFilterText(user: UserInfo, options?: MarkupFilterOptions): string;
|
|
419
|
+
/**
|
|
420
|
+
* Resolves the `{{Acting*}}` token family from {@link UserInfo.APIKeyActingContext}.
|
|
421
|
+
* Scalars substitute escaped; the list token renders as a canonical (sorted),
|
|
422
|
+
* per-element-escaped, quoted list for use inside `IN (...)`. Sorting is not
|
|
423
|
+
* cosmetic: the resolved clause participates in the RunView cache fingerprint,
|
|
424
|
+
* so the same set must always produce the same clause bytes (INV-2). An absent
|
|
425
|
+
* context or empty list leaves tokens unresolved, which the caller's
|
|
426
|
+
* unresolved-token handling turns into a match-nothing filter for key filters.
|
|
427
|
+
*/
|
|
428
|
+
private resolveActingTokens;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Options for {@link RowLevelSecurityFilterInfo.MarkupFilterText}.
|
|
432
|
+
*/
|
|
433
|
+
export interface MarkupFilterOptions {
|
|
434
|
+
/**
|
|
435
|
+
* How an unresolved token is handled after markup:
|
|
436
|
+
* - `'legacy'` (default): log the error and return the text with the token in
|
|
437
|
+
* place — the resulting SQL fails to match/parse, which is fail-closed but
|
|
438
|
+
* produces an unexplainable result. Role-RLS behavior, unchanged.
|
|
439
|
+
* - `'match-nothing'`: the entire filter resolves to `(1=0)` — required for
|
|
440
|
+
* API-key row filters, where an unresolved token must deny regardless of the
|
|
441
|
+
* expression's operator shapes.
|
|
442
|
+
*/
|
|
443
|
+
unresolvedBehavior?: 'legacy' | 'match-nothing';
|
|
346
444
|
}
|
|
347
445
|
/**
|
|
348
446
|
* Stores the fundamental permissions and access rights that can be granted to users and roles throughout the system.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securityInfo.d.ts","sourceRoot":"","sources":["../../src/generic/securityInfo.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"securityInfo.d.ts","sourceRoot":"","sources":["../../src/generic/securityInfo.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,6 +44,37 @@ export class UserInfo extends BaseInfo {
|
|
|
44
44
|
set MagicLinkScope(value) {
|
|
45
45
|
this._MagicLinkScope = value;
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Per-request acting context for an API-key session. Set server-side in the
|
|
49
|
+
* API-key auth path from an authenticated identity, ON A CLONED UserInfo
|
|
50
|
+
* (the resolved userRecord may be the shared UserCache instance — stamping
|
|
51
|
+
* it in place leaks one session's scope to every concurrent session of the
|
|
52
|
+
* same user). Consumed by API-key row filters via the {{Acting*}} tokens.
|
|
53
|
+
* Same getter/setter (non-enumerable accessor) rationale as TenantContext —
|
|
54
|
+
* not a DB/GraphQL field, and it must NEVER be exposed via a resolver.
|
|
55
|
+
*/
|
|
56
|
+
get APIKeyActingContext() {
|
|
57
|
+
return this._APIKeyActingContext;
|
|
58
|
+
}
|
|
59
|
+
set APIKeyActingContext(value) {
|
|
60
|
+
this._APIKeyActingContext = value;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Row-filter bindings for the API key this session authenticated with,
|
|
64
|
+
* resolved per request from the key's scope rules and stamped on the CLONED
|
|
65
|
+
* per-request UserInfo. Consumed by
|
|
66
|
+
* {@link EntityInfo.GetEffectiveRowFilterWhereClause}, which AND-composes
|
|
67
|
+
* each matching binding's filter with role RLS — outside the role-RLS
|
|
68
|
+
* exemption. Plain data on purpose: MJCore cannot depend on the APIKeys
|
|
69
|
+
* packages, so the bridge is this carrier. Never a DB/GraphQL field; never
|
|
70
|
+
* exposed to or settable by a client.
|
|
71
|
+
*/
|
|
72
|
+
get APIKeyRowFilters() {
|
|
73
|
+
return this._APIKeyRowFilters;
|
|
74
|
+
}
|
|
75
|
+
set APIKeyRowFilters(value) {
|
|
76
|
+
this._APIKeyRowFilters = value;
|
|
77
|
+
}
|
|
47
78
|
/**
|
|
48
79
|
* Returning-visitor context for a public web-widget guest session. Set at request time from the
|
|
49
80
|
* verified session token's claims (the widget mint embeds the resolved VisitorKey / prior
|
|
@@ -182,6 +213,8 @@ export class UserInfo extends BaseInfo {
|
|
|
182
213
|
this.EmployeeSupervisorEmail = null;
|
|
183
214
|
this._TenantContext = undefined;
|
|
184
215
|
this._MagicLinkScope = undefined;
|
|
216
|
+
this._APIKeyActingContext = undefined;
|
|
217
|
+
this._APIKeyRowFilters = undefined;
|
|
185
218
|
this._ReturningVisitorContext = undefined;
|
|
186
219
|
this._WidgetGuestContext = undefined;
|
|
187
220
|
this._IsMagicLinkAnonymous = false;
|
|
@@ -327,30 +360,79 @@ export class RowLevelSecurityFilterInfo extends BaseInfo {
|
|
|
327
360
|
* @param {UserInfo} user - The user whose properties will be substituted into the filter text
|
|
328
361
|
* @returns {string} The filter text with all user tokens replaced with actual values
|
|
329
362
|
*/
|
|
330
|
-
MarkupFilterText(user) {
|
|
363
|
+
MarkupFilterText(user, options) {
|
|
331
364
|
let ret = this.FilterText;
|
|
332
365
|
if (user) {
|
|
333
366
|
const keys = Object.keys(user);
|
|
334
367
|
for (let i = 0; i < keys.length; i++) {
|
|
335
368
|
const key = keys[i];
|
|
336
369
|
const val = user[key];
|
|
337
|
-
|
|
338
|
-
|
|
370
|
+
// `val != null` deliberately excludes BOTH null and undefined. The old
|
|
371
|
+
// `val !== null` guard let `undefined` through, substituting the literal
|
|
372
|
+
// string "undefined" — which made negation-shaped filters
|
|
373
|
+
// (Col <> '{{UserX}}') match every row. Undefined is unresolved, period.
|
|
374
|
+
if (val != null && typeof val !== 'object') {
|
|
375
|
+
// Escape embedded quotes in the substituted value: a user-sourced value
|
|
376
|
+
// containing an apostrophe must not break (or rewrite) the predicate —
|
|
377
|
+
// the same defect class as the tenant-header injection, in the engine
|
|
378
|
+
// every RLS filter depends on.
|
|
379
|
+
ret = ret.replace(new RegExp(`{{User${key}}}`, 'g'), String(val).replace(/'/g, "''"));
|
|
339
380
|
}
|
|
340
381
|
}
|
|
341
382
|
// Per-session magic-link resource scope. Fail-closed: an absent scope resolves
|
|
342
383
|
// to '' so a resource-pinned predicate (e.g. ID = '{{ScopeResourceID}}') matches
|
|
343
384
|
// NO rows rather than leaking — a session without the scope sees nothing.
|
|
344
385
|
const scope = user.MagicLinkScope;
|
|
345
|
-
ret = ret.replace(/\{\{ScopeResourceID\}\}/g, scope?.ResourceID ?? '');
|
|
346
|
-
ret = ret.replace(/\{\{ScopeResourceType\}\}/g, scope?.ResourceType ?? '');
|
|
386
|
+
ret = ret.replace(/\{\{ScopeResourceID\}\}/g, (scope?.ResourceID ?? '').replace(/'/g, "''"));
|
|
387
|
+
ret = ret.replace(/\{\{ScopeResourceType\}\}/g, (scope?.ResourceType ?? '').replace(/'/g, "''"));
|
|
388
|
+
ret = this.resolveActingTokens(ret, user);
|
|
347
389
|
}
|
|
348
|
-
const unresolvedMatch = ret.match(/\{\{User\w+\}\}/);
|
|
390
|
+
const unresolvedMatch = ret.match(/\{\{(?:User|Acting)\w+\}\}/);
|
|
349
391
|
if (unresolvedMatch) {
|
|
392
|
+
if (options?.unresolvedBehavior === 'match-nothing') {
|
|
393
|
+
// API-key row filters fail closed AND diagnosably: '' substitution is only
|
|
394
|
+
// safe for equality shapes (Col <> '' or LIKE '%%' match everything), so an
|
|
395
|
+
// unresolved token collapses the ENTIRE filter to a predicate that matches
|
|
396
|
+
// nothing regardless of the expression's operators.
|
|
397
|
+
LogError('Row filter has unresolved token after markup — resolving filter to (1=0): ' + unresolvedMatch[0] + ' in filter: ' + this.FilterText);
|
|
398
|
+
return '(1=0)';
|
|
399
|
+
}
|
|
350
400
|
LogError('RLS filter has unresolved token after markup: ' + unresolvedMatch[0] + ' in filter: ' + this.FilterText);
|
|
351
401
|
}
|
|
352
402
|
return ret;
|
|
353
403
|
}
|
|
404
|
+
/**
|
|
405
|
+
* Resolves the `{{Acting*}}` token family from {@link UserInfo.APIKeyActingContext}.
|
|
406
|
+
* Scalars substitute escaped; the list token renders as a canonical (sorted),
|
|
407
|
+
* per-element-escaped, quoted list for use inside `IN (...)`. Sorting is not
|
|
408
|
+
* cosmetic: the resolved clause participates in the RunView cache fingerprint,
|
|
409
|
+
* so the same set must always produce the same clause bytes (INV-2). An absent
|
|
410
|
+
* context or empty list leaves tokens unresolved, which the caller's
|
|
411
|
+
* unresolved-token handling turns into a match-nothing filter for key filters.
|
|
412
|
+
*/
|
|
413
|
+
resolveActingTokens(text, user) {
|
|
414
|
+
const acting = user.APIKeyActingContext;
|
|
415
|
+
let ret = text;
|
|
416
|
+
const scalars = [
|
|
417
|
+
['ActingOrganizationID', acting?.ActingOrganizationID],
|
|
418
|
+
['ActingPersonID', acting?.ActingPersonID],
|
|
419
|
+
['ActingScopeID', acting?.ActingScopeID],
|
|
420
|
+
];
|
|
421
|
+
for (const [token, value] of scalars) {
|
|
422
|
+
if (value != null && value.length > 0) {
|
|
423
|
+
ret = ret.replace(new RegExp(`\\{\\{${token}\\}\\}`, 'g'), value.replace(/'/g, "''"));
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
const companies = acting?.ActingCompanyIDs;
|
|
427
|
+
if (companies && companies.length > 0) {
|
|
428
|
+
const rendered = [...companies]
|
|
429
|
+
.sort()
|
|
430
|
+
.map(c => `'${c.replace(/'/g, "''")}'`)
|
|
431
|
+
.join(',');
|
|
432
|
+
ret = ret.replace(/\{\{ActingCompanyIDs\}\}/g, rendered);
|
|
433
|
+
}
|
|
434
|
+
return ret;
|
|
435
|
+
}
|
|
354
436
|
}
|
|
355
437
|
/**
|
|
356
438
|
* Stores the fundamental permissions and access rights that can be granted to users and roles throughout the system.
|