@memberjunction/core 5.50.0 → 6.1.0-edge.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/LICENSE +7 -0
- package/dist/generic/baseEngine.d.ts +9 -0
- package/dist/generic/baseEngine.d.ts.map +1 -1
- package/dist/generic/baseEngine.js +39 -42
- package/dist/generic/baseEngine.js.map +1 -1
- package/dist/generic/baseEntity.d.ts +30 -0
- package/dist/generic/baseEntity.d.ts.map +1 -1
- package/dist/generic/baseEntity.js +30 -0
- package/dist/generic/baseEntity.js.map +1 -1
- package/dist/generic/databaseProviderBase.d.ts +10 -0
- package/dist/generic/databaseProviderBase.d.ts.map +1 -1
- package/dist/generic/databaseProviderBase.js +37 -0
- package/dist/generic/databaseProviderBase.js.map +1 -1
- package/dist/generic/entityInfo.d.ts +125 -0
- package/dist/generic/entityInfo.d.ts.map +1 -1
- package/dist/generic/entityInfo.js +167 -0
- package/dist/generic/entityInfo.js.map +1 -1
- package/dist/generic/providerBase.js +1 -1
- package/dist/generic/providerBase.js.map +1 -1
- 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/package.json +13 -13
- package/readme.md +31 -0
|
@@ -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.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securityInfo.js","sourceRoot":"","sources":["../../src/generic/securityInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,kEAAkE;AAClE,mEAAmE;AACnE,iEAAiE;AACjE,6DAA6D;AAC7D,4DAA4D;AAC5D,sDAAsD;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,qBAAqB,EAAwB,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACzG,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"securityInfo.js","sourceRoot":"","sources":["../../src/generic/securityInfo.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/core",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "6.1.0-edge.0",
|
|
5
5
|
"description": "MemberJunction: Core Library including Metadata, Application, Entity Retrieval and Manipulation, and Utilities",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"files": [
|
|
9
9
|
"/dist"
|
|
10
10
|
],
|
|
11
|
-
"scripts": {
|
|
12
|
-
"start": "ts-node-dev src/index.ts",
|
|
13
|
-
"build": "tsc && tsc-alias -f",
|
|
14
|
-
"test": "vitest run",
|
|
15
|
-
"test:watch": "vitest",
|
|
16
|
-
"test:coverage": "vitest run --coverage",
|
|
17
|
-
"test:refresh": "vitest run providerBase.refresh.test.ts",
|
|
18
|
-
"test:concurrency": "vitest run providerBase.concurrency.test.ts"
|
|
19
|
-
},
|
|
20
11
|
"author": "MemberJunction.com",
|
|
21
12
|
"license": "ISC",
|
|
22
13
|
"devDependencies": {
|
|
@@ -26,8 +17,8 @@
|
|
|
26
17
|
"vitest": "^3.1.1"
|
|
27
18
|
},
|
|
28
19
|
"dependencies": {
|
|
29
|
-
"@memberjunction/global": "
|
|
30
|
-
"@memberjunction/sql-dialect": "
|
|
20
|
+
"@memberjunction/global": "6.1.0-edge.0",
|
|
21
|
+
"@memberjunction/sql-dialect": "6.1.0-edge.0",
|
|
31
22
|
"rxjs": "^7.8.2",
|
|
32
23
|
"zod": "^3.25.0",
|
|
33
24
|
"debug": "^4.4.3"
|
|
@@ -35,5 +26,14 @@
|
|
|
35
26
|
"repository": {
|
|
36
27
|
"type": "git",
|
|
37
28
|
"url": "https://github.com/MemberJunction/MJ"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"start": "ts-node-dev src/index.ts",
|
|
32
|
+
"build": "tsc && tsc-alias -f",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
35
|
+
"test:coverage": "vitest run --coverage",
|
|
36
|
+
"test:refresh": "vitest run providerBase.refresh.test.ts",
|
|
37
|
+
"test:concurrency": "vitest run providerBase.concurrency.test.ts"
|
|
38
38
|
}
|
|
39
|
-
}
|
|
39
|
+
}
|
package/readme.md
CHANGED
|
@@ -444,6 +444,29 @@ if (!result.Success) {
|
|
|
444
444
|
}
|
|
445
445
|
```
|
|
446
446
|
|
|
447
|
+
#### IS-A (Table-Per-Type) entities
|
|
448
|
+
|
|
449
|
+
An entity may inherit from another — `Webinar` IS-A `Meeting` IS-A `Product` — with one primary key
|
|
450
|
+
shared across every table. `BaseEntity` makes the chain invisible: set a field belonging to ANY
|
|
451
|
+
ancestor directly on the child, and one `Save()` writes every level in a single transaction.
|
|
452
|
+
|
|
453
|
+
```typescript
|
|
454
|
+
const webinar = await md.GetEntityObject<WebinarEntity>('Webinars', contextUser);
|
|
455
|
+
webinar.NewRecord();
|
|
456
|
+
webinar.RecordingURL = '...'; // Webinar's own field
|
|
457
|
+
webinar.StartTime = startTime; // Meeting's field
|
|
458
|
+
webinar.Name = 'Q1 Webinar'; // Product's field — same object
|
|
459
|
+
await webinar.Save(); // writes Product, Meeting, Webinar
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
Two things catch people out. Do **not** create the parent separately and then attach a child to it —
|
|
463
|
+
`NewRecord()` starts a new chain rather than adopting an existing row. And remember to set NOT NULL
|
|
464
|
+
columns that live on ANCESTOR tables: the child can look complete while the parent insert is
|
|
465
|
+
rejected, which fails the whole save.
|
|
466
|
+
|
|
467
|
+
See [docs/isa-relationships.md](docs/isa-relationships.md) for the full model — discovery, disjoint
|
|
468
|
+
vs overlapping subtypes, delete orchestration, and CodeGen integration.
|
|
469
|
+
|
|
447
470
|
### CompositeKey
|
|
448
471
|
|
|
449
472
|
The `CompositeKey` class provides flexible primary key representation supporting both single and multi-field primary keys.
|
|
@@ -1640,6 +1663,14 @@ flowchart LR
|
|
|
1640
1663
|
| `AllowUpdateAPI` | Configurable | Always `false` |
|
|
1641
1664
|
| Stored procedures | Generated | None |
|
|
1642
1665
|
|
|
1666
|
+
> **Not the same thing as a custom base view.** A virtual entity has *no base table* and is read-only.
|
|
1667
|
+
> If you have a real table and only want to add computed columns to what its view exposes, you want a
|
|
1668
|
+
> **layered base view** instead — `GeneratedBaseViewName` keeps CodeGen generating an inner view while
|
|
1669
|
+
> your application owns and wraps `BaseView`, and the entity stays fully writable because
|
|
1670
|
+
> `spCreate`/`spUpdate`/`spDelete` still target `BaseView`. See
|
|
1671
|
+
> [Base Views: Generated, Custom, or Layered](../CodeGenLib/README.md#base-views-generated-custom-or-layered).
|
|
1672
|
+
> Layering is skipped entirely for virtual entities, which have no table to generate from.
|
|
1673
|
+
|
|
1643
1674
|
### Read-Only Enforcement
|
|
1644
1675
|
|
|
1645
1676
|
Virtual entities are enforced as read-only at multiple layers:
|