@memberjunction/notifications 6.2.0-edge.2 → 6.2.0-edge.4
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/NotificationEngine.d.ts +9 -0
- package/dist/NotificationEngine.d.ts.map +1 -1
- package/dist/NotificationEngine.js +46 -19
- package/dist/NotificationEngine.js.map +1 -1
- package/dist/__tests__/scoped-notification-config-resolver.test.d.ts +2 -0
- package/dist/__tests__/scoped-notification-config-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/scoped-notification-config-resolver.test.js +124 -0
- package/dist/__tests__/scoped-notification-config-resolver.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/scoped-notification-config-resolver.d.ts +102 -0
- package/dist/scoped-notification-config-resolver.d.ts.map +1 -0
- package/dist/scoped-notification-config-resolver.js +118 -0
- package/dist/scoped-notification-config-resolver.js.map +1 -0
- package/dist/shareNotificationHandler.d.ts +3 -0
- package/dist/shareNotificationHandler.d.ts.map +1 -1
- package/dist/shareNotificationHandler.js +18 -5
- package/dist/shareNotificationHandler.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BaseEngine, IMetadataProvider, UserInfo } from '@memberjunction/core';
|
|
2
2
|
import { SendNotificationParams, NotificationResult } from './types.js';
|
|
3
|
+
import { type ScopedChannelDecisions, type ScopedNotificationConfigRow } from './scoped-notification-config-resolver.js';
|
|
3
4
|
export declare class NotificationEngine extends BaseEngine<NotificationEngine> {
|
|
4
5
|
/**
|
|
5
6
|
* Returns the singleton instance of the NotificationEngine
|
|
@@ -17,6 +18,14 @@ export declare class NotificationEngine extends BaseEngine<NotificationEngine> {
|
|
|
17
18
|
* @param provider - Optional metadata provider override
|
|
18
19
|
*/
|
|
19
20
|
Config(forceRefresh?: boolean, contextUser?: UserInfo, provider?: IMetadataProvider): Promise<void>;
|
|
21
|
+
private _scopedConfigs;
|
|
22
|
+
/** Every `MJ: Scoped Notification Configs` row, any status; the resolver filters. */
|
|
23
|
+
get ScopedNotificationConfigs(): ScopedNotificationConfigRow[];
|
|
24
|
+
/**
|
|
25
|
+
* What the scoped configs say for this notice, for the recipient and the roles they hold. Public so a host can
|
|
26
|
+
* see the decision a notice got, and so tests can drive it without sending.
|
|
27
|
+
*/
|
|
28
|
+
ResolveScopedChannels(params: SendNotificationParams, typeId: string): ScopedChannelDecisions;
|
|
20
29
|
/**
|
|
21
30
|
* Get a notification type by name (case-insensitive) or ID.
|
|
22
31
|
* Uses UserInfoEngine's cached notification types.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationEngine.d.ts","sourceRoot":"","sources":["../src/NotificationEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAY,QAAQ,EAA2C,MAAM,sBAAsB,CAAC;AAOlI,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAoB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"NotificationEngine.d.ts","sourceRoot":"","sources":["../src/NotificationEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAY,QAAQ,EAA2C,MAAM,sBAAsB,CAAC;AAOlI,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAoB,MAAM,SAAS,CAAC;AACvF,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EACjC,MAAM,uCAAuC,CAAC;AAU/C,qBAAa,kBAAmB,SAAQ,UAAU,CAAC,kBAAkB,CAAC;IACpE;;OAEG;IACH,WAAkB,QAAQ,IAAI,kBAAkB,CAE/C;IAED;;;;;;;;;;OAUG;IACU,MAAM,CACjB,YAAY,GAAE,OAAe,EAC7B,WAAW,CAAC,EAAE,QAAQ,EACtB,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,OAAO,CAAC,IAAI,CAAC;IAmBhB,OAAO,CAAC,cAAc,CAAqC;IAE3D,qFAAqF;IACrF,IAAW,yBAAyB,IAAI,2BAA2B,EAAE,CAEpE;IAED;;;OAGG;IACI,qBAAqB,CAAC,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,GAAG,sBAAsB;IASpG;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;;;;;;;;;;;OAYG;IACU,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8DjH;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAQ/B;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAW3B,kGAAkG;IAClG,OAAO,CAAC,wBAAwB;IA6BhC;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;YACW,uBAAuB;IAgCrC;;OAEG;YACW,SAAS;IAiEvB;;OAEG;YACW,OAAO;CAqDtB"}
|
|
@@ -5,14 +5,20 @@ import { TemplateEngineServer } from '@memberjunction/templates';
|
|
|
5
5
|
import { CommunicationEngine } from '@memberjunction/communication-engine';
|
|
6
6
|
import { Message } from '@memberjunction/communication-types';
|
|
7
7
|
import { UserCache } from '@memberjunction/generic-database-provider';
|
|
8
|
+
import { CreateScopedNotificationConfigResolver, ResolveChannel, } from './scoped-notification-config-resolver.js';
|
|
8
9
|
/*
|
|
9
10
|
* Unified notification engine that handles in-app, email, and SMS delivery
|
|
10
|
-
* based on notification types and user preferences.
|
|
11
|
+
* based on notification types, scoped configs and user preferences.
|
|
11
12
|
*
|
|
12
|
-
* This engine relies on UserInfoEngine for notification types and preferences
|
|
13
|
-
*
|
|
13
|
+
* This engine relies on UserInfoEngine for notification types and preferences, and loads
|
|
14
|
+
* `MJ: Scoped Notification Configs` itself: the level between a type's defaults and a
|
|
15
|
+
* recipient's preference where an application, a role or a notice's origin can speak.
|
|
14
16
|
*/
|
|
15
17
|
export class NotificationEngine extends BaseEngine {
|
|
18
|
+
constructor() {
|
|
19
|
+
super(...arguments);
|
|
20
|
+
this._scopedConfigs = [];
|
|
21
|
+
}
|
|
16
22
|
/**
|
|
17
23
|
* Returns the singleton instance of the NotificationEngine
|
|
18
24
|
*/
|
|
@@ -31,10 +37,33 @@ export class NotificationEngine extends BaseEngine {
|
|
|
31
37
|
* @param provider - Optional metadata provider override
|
|
32
38
|
*/
|
|
33
39
|
async Config(forceRefresh = false, contextUser, provider) {
|
|
34
|
-
// Ensure UserInfoEngine is configured (it loads notification types)
|
|
40
|
+
// Ensure UserInfoEngine is configured (it loads notification types and the recipient's preferences)
|
|
35
41
|
await UserInfoEngine.Instance.Config(forceRefresh, contextUser, provider);
|
|
36
|
-
//
|
|
37
|
-
await this.Load([
|
|
42
|
+
// This engine's own data: the scoped configs, a global reference table (no user filter)
|
|
43
|
+
await this.Load([
|
|
44
|
+
{
|
|
45
|
+
Type: 'entity',
|
|
46
|
+
EntityName: 'MJ: Scoped Notification Configs',
|
|
47
|
+
PropertyName: '_scopedConfigs',
|
|
48
|
+
CacheLocal: true,
|
|
49
|
+
},
|
|
50
|
+
], provider ?? Metadata.Provider, forceRefresh, contextUser);
|
|
51
|
+
}
|
|
52
|
+
/** Every `MJ: Scoped Notification Configs` row, any status; the resolver filters. */
|
|
53
|
+
get ScopedNotificationConfigs() {
|
|
54
|
+
return this._scopedConfigs ?? [];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* What the scoped configs say for this notice, for the recipient and the roles they hold. Public so a host can
|
|
58
|
+
* see the decision a notice got, and so tests can drive it without sending.
|
|
59
|
+
*/
|
|
60
|
+
ResolveScopedChannels(params, typeId) {
|
|
61
|
+
const recipient = UserCache.Instance.Users.find((u) => UUIDsEqual(u.ID, params.userId));
|
|
62
|
+
const roleIds = (recipient?.UserRoles ?? []).map((r) => r.RoleID).filter((id) => !!id);
|
|
63
|
+
return CreateScopedNotificationConfigResolver().Resolve(this.ScopedNotificationConfigs, typeId, params.scope, {
|
|
64
|
+
userId: params.userId,
|
|
65
|
+
roleIds,
|
|
66
|
+
});
|
|
38
67
|
}
|
|
39
68
|
/**
|
|
40
69
|
* Get a notification type by name (case-insensitive) or ID.
|
|
@@ -153,20 +182,18 @@ export class NotificationEngine extends BaseEngine {
|
|
|
153
182
|
if (prefs && !prefs.Enabled) {
|
|
154
183
|
return { inApp: false, email: false, sms: false };
|
|
155
184
|
}
|
|
156
|
-
//
|
|
185
|
+
// Each channel, most specific wins: the recipient's preference (if the type allows one and it is set), then the
|
|
186
|
+
// scoped configs (global, application, role, recipient; Deny beats Allow at equal specificity), then the type's
|
|
187
|
+
// default. A locked Deny at the scoped level caps the recipient's preference.
|
|
157
188
|
const allowUserPref = type.AllowUserPreference !== false;
|
|
158
|
-
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
// Resolve SMS channel
|
|
167
|
-
const sms = (allowUserPref && prefs?.SMSEnabled != null)
|
|
168
|
-
? prefs.SMSEnabled
|
|
169
|
-
: (type.DefaultSMS ?? false);
|
|
189
|
+
const scoped = this.ResolveScopedChannels(params, type.ID);
|
|
190
|
+
const pref = (value) => (allowUserPref && value != null ? value : null);
|
|
191
|
+
const inApp = ResolveChannel({ typeDefault: type.DefaultInApp ?? false, scoped: scoped.inApp, userPreference: pref(prefs?.InAppEnabled) });
|
|
192
|
+
const email = ResolveChannel({ typeDefault: type.DefaultEmail ?? false, scoped: scoped.email, userPreference: pref(prefs?.EmailEnabled) });
|
|
193
|
+
const sms = ResolveChannel({ typeDefault: type.DefaultSMS ?? false, scoped: scoped.sms, userPreference: pref(prefs?.SMSEnabled) });
|
|
194
|
+
if (scoped.rows.length > 0) {
|
|
195
|
+
LogStatus(`Notification '${type.Name}' resolved through ${scoped.rows.length} scoped config(s): inApp=${inApp} email=${email} sms=${sms}`);
|
|
196
|
+
}
|
|
170
197
|
return { inApp, email, sms };
|
|
171
198
|
}
|
|
172
199
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationEngine.js","sourceRoot":"","sources":["../src/NotificationEngine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NotificationEngine.js","sourceRoot":"","sources":["../src/NotificationEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-notification-config-resolver.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/scoped-notification-config-resolver.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The scoped level of notification resolution (MJ#4946): which rows are in scope, which wins, and how the recipient's
|
|
3
|
+
* own preference and a locked Deny combine.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect } from 'vitest';
|
|
6
|
+
import { ResolveChannel, ScopedNotificationConfigResolver, CreateScopedNotificationConfigResolver } from '../scoped-notification-config-resolver.js';
|
|
7
|
+
const TYPE = '11111111-1111-1111-1111-111111111111';
|
|
8
|
+
const OTHER_TYPE = '22222222-2222-2222-2222-222222222222';
|
|
9
|
+
const APP = 'AAAAAAAA-0000-0000-0000-000000000001';
|
|
10
|
+
const ROLE_UI = 'BBBBBBBB-0000-0000-0000-000000000001';
|
|
11
|
+
const ROLE_DEV = 'BBBBBBBB-0000-0000-0000-000000000002';
|
|
12
|
+
const USER = 'CCCCCCCC-0000-0000-0000-000000000001';
|
|
13
|
+
const ENTITY_APPLICATIONS = 'DDDDDDDD-0000-0000-0000-000000000001';
|
|
14
|
+
let n = 0;
|
|
15
|
+
function row(overrides) {
|
|
16
|
+
return {
|
|
17
|
+
ID: `row-${++n}`,
|
|
18
|
+
NotificationTypeID: TYPE,
|
|
19
|
+
PrimaryScopeEntityID: null,
|
|
20
|
+
PrimaryScopeRecordID: null,
|
|
21
|
+
SecondaryScopes: null,
|
|
22
|
+
InApp: null,
|
|
23
|
+
Email: null,
|
|
24
|
+
SMS: null,
|
|
25
|
+
IsLocked: false,
|
|
26
|
+
Priority: 0,
|
|
27
|
+
Status: 'Active',
|
|
28
|
+
...overrides,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const resolver = new ScopedNotificationConfigResolver();
|
|
32
|
+
const recipient = { userId: USER, roleIds: [ROLE_UI, ROLE_DEV] };
|
|
33
|
+
describe('ScopedNotificationConfigResolver', () => {
|
|
34
|
+
it('says nothing when no row is in scope, so the type default stands', () => {
|
|
35
|
+
const r = resolver.Resolve([row({ NotificationTypeID: OTHER_TYPE, Email: 'Deny' })], TYPE, undefined, recipient);
|
|
36
|
+
expect(r.email).toEqual({ value: null, lockedOff: false });
|
|
37
|
+
expect(r.rows).toHaveLength(0);
|
|
38
|
+
});
|
|
39
|
+
it('applies a global row to everyone, and ignores Archived rows', () => {
|
|
40
|
+
const rows = [row({ Email: 'Deny' }), row({ Email: 'Allow', Status: 'Archived', Priority: 99 })];
|
|
41
|
+
expect(resolver.Resolve(rows, TYPE, undefined, recipient).email.value).toBe('Deny');
|
|
42
|
+
});
|
|
43
|
+
it('narrows by origin through the secondary scopes: the system user is quiet, a person is not', () => {
|
|
44
|
+
const rows = [row({ SecondaryScopes: JSON.stringify({ origin: 'System' }), InApp: 'Deny', Email: 'Deny', SMS: 'Deny', IsLocked: true })];
|
|
45
|
+
const system = resolver.Resolve(rows, TYPE, { secondaryScopes: { origin: 'System' } }, recipient);
|
|
46
|
+
const person = resolver.Resolve(rows, TYPE, { secondaryScopes: { origin: 'Person' } }, recipient);
|
|
47
|
+
const none = resolver.Resolve(rows, TYPE, undefined, recipient);
|
|
48
|
+
expect(system.email).toEqual({ value: 'Deny', lockedOff: true });
|
|
49
|
+
expect(person.email.value).toBeNull();
|
|
50
|
+
expect(none.email.value).toBeNull();
|
|
51
|
+
});
|
|
52
|
+
it('lets the more specific row win: an application row over a global row, a secondary-scoped row over both', () => {
|
|
53
|
+
const rows = [
|
|
54
|
+
row({ Email: 'Deny' }),
|
|
55
|
+
row({ PrimaryScopeEntityID: ENTITY_APPLICATIONS, PrimaryScopeRecordID: APP, Email: 'Allow' }),
|
|
56
|
+
row({ PrimaryScopeEntityID: ENTITY_APPLICATIONS, PrimaryScopeRecordID: APP, SecondaryScopes: JSON.stringify({ origin: 'Automation' }), Email: 'Deny' }),
|
|
57
|
+
];
|
|
58
|
+
const scope = { primaryScopeEntityId: ENTITY_APPLICATIONS, primaryScopeRecordId: APP };
|
|
59
|
+
expect(resolver.Resolve(rows, TYPE, scope, recipient).email.value).toBe('Allow');
|
|
60
|
+
expect(resolver.Resolve(rows, TYPE, { ...scope, secondaryScopes: { origin: 'Automation' } }, recipient).email.value).toBe('Deny');
|
|
61
|
+
expect(resolver.Resolve(rows, TYPE, undefined, recipient).email.value).toBe('Deny');
|
|
62
|
+
});
|
|
63
|
+
it("takes the recipient's roles and the recipient as primary scopes without the caller naming them", () => {
|
|
64
|
+
const rows = [row({ PrimaryScopeRecordID: ROLE_DEV, SMS: 'Allow' }), row({ PrimaryScopeRecordID: USER, InApp: 'Deny' })];
|
|
65
|
+
const r = resolver.Resolve(rows, TYPE, undefined, recipient);
|
|
66
|
+
expect(r.sms.value).toBe('Allow');
|
|
67
|
+
expect(r.inApp.value).toBe('Deny');
|
|
68
|
+
expect(resolver.Resolve(rows, TYPE, undefined, { userId: 'someone-else', roleIds: [ROLE_UI] }).sms.value).toBeNull();
|
|
69
|
+
});
|
|
70
|
+
it('at equal specificity one Deny beats any Allow, the permission rule, with Priority only breaking ties otherwise', () => {
|
|
71
|
+
const twoRoles = [row({ PrimaryScopeRecordID: ROLE_UI, Email: 'Allow', Priority: 10 }), row({ PrimaryScopeRecordID: ROLE_DEV, Email: 'Deny' })];
|
|
72
|
+
expect(resolver.Resolve(twoRoles, TYPE, undefined, recipient).email.value).toBe('Deny');
|
|
73
|
+
const twoAllows = [row({ PrimaryScopeRecordID: ROLE_UI, Email: 'Allow', Priority: 1 }), row({ PrimaryScopeRecordID: ROLE_DEV, Email: null, Priority: 10 })];
|
|
74
|
+
expect(resolver.Resolve(twoAllows, TYPE, undefined, recipient).email.value).toBe('Allow');
|
|
75
|
+
});
|
|
76
|
+
it('leaves a channel a row does not speak to for the next level', () => {
|
|
77
|
+
const rows = [row({ PrimaryScopeRecordID: ROLE_UI, Email: 'Deny' }), row({ InApp: 'Allow' })];
|
|
78
|
+
const r = resolver.Resolve(rows, TYPE, undefined, recipient);
|
|
79
|
+
expect(r.email.value).toBe('Deny');
|
|
80
|
+
expect(r.inApp.value).toBe('Allow');
|
|
81
|
+
expect(r.sms.value).toBeNull();
|
|
82
|
+
});
|
|
83
|
+
it('reports a locked Deny even when a more specific Allow would otherwise win', () => {
|
|
84
|
+
const rows = [row({ Email: 'Deny', IsLocked: true }), row({ PrimaryScopeRecordID: USER, Email: 'Allow' })];
|
|
85
|
+
expect(resolver.Resolve(rows, TYPE, undefined, recipient).email).toEqual({ value: 'Allow', lockedOff: true });
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('ResolveChannel', () => {
|
|
89
|
+
const scoped = (value, lockedOff = false) => ({ value, lockedOff });
|
|
90
|
+
it('falls back to the type default when nothing above speaks', () => {
|
|
91
|
+
expect(ResolveChannel({ typeDefault: true, scoped: scoped(null), userPreference: null })).toBe(true);
|
|
92
|
+
expect(ResolveChannel({ typeDefault: false, scoped: scoped(null), userPreference: null })).toBe(false);
|
|
93
|
+
});
|
|
94
|
+
it('lets a scoped row override the type default, and the recipient override the scoped row', () => {
|
|
95
|
+
expect(ResolveChannel({ typeDefault: true, scoped: scoped('Deny'), userPreference: null })).toBe(false);
|
|
96
|
+
expect(ResolveChannel({ typeDefault: false, scoped: scoped('Allow'), userPreference: null })).toBe(true);
|
|
97
|
+
expect(ResolveChannel({ typeDefault: true, scoped: scoped('Deny'), userPreference: true })).toBe(true);
|
|
98
|
+
expect(ResolveChannel({ typeDefault: true, scoped: scoped('Allow'), userPreference: false })).toBe(false);
|
|
99
|
+
});
|
|
100
|
+
it('a locked Deny caps everything below it, the recipient included', () => {
|
|
101
|
+
expect(ResolveChannel({ typeDefault: true, scoped: scoped('Deny', true), userPreference: true })).toBe(false);
|
|
102
|
+
expect(ResolveChannel({ typeDefault: true, scoped: scoped('Allow', true), userPreference: true })).toBe(false);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe('decide() return values (review nits on #4961)', () => {
|
|
106
|
+
it('returns a fresh no-decision object each time, so a caller mutating one cannot corrupt another', () => {
|
|
107
|
+
const resolver = CreateScopedNotificationConfigResolver();
|
|
108
|
+
const a = resolver.Resolve([], TYPE, undefined, { userId: 'u1', roleIds: [] });
|
|
109
|
+
const b = resolver.Resolve([], TYPE, undefined, { userId: 'u1', roleIds: [] });
|
|
110
|
+
expect(a.inApp).toEqual({ value: null, lockedOff: false });
|
|
111
|
+
expect(a.inApp).not.toBe(b.inApp);
|
|
112
|
+
a.inApp.value = 'Deny';
|
|
113
|
+
expect(b.inApp.value).toBeNull();
|
|
114
|
+
});
|
|
115
|
+
it('never reports lockedOff without a value: a locked Deny is itself an answer at its level', () => {
|
|
116
|
+
const resolver = CreateScopedNotificationConfigResolver();
|
|
117
|
+
const rows = [row({ ID: 'g', InApp: 'Deny', IsLocked: true })];
|
|
118
|
+
const out = resolver.Resolve(rows, TYPE, undefined, { userId: 'u1', roleIds: [] });
|
|
119
|
+
expect(out.inApp).toEqual({ value: 'Deny', lockedOff: true });
|
|
120
|
+
const none = resolver.Resolve(rows, TYPE, undefined, { userId: 'u1', roleIds: [] }).email;
|
|
121
|
+
expect(none.value === null ? none.lockedOff : true).toBe(false);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=scoped-notification-config-resolver.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-notification-config-resolver.test.js","sourceRoot":"","sources":["../../src/__tests__/scoped-notification-config-resolver.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -34,4 +34,5 @@
|
|
|
34
34
|
export { NotificationEngine } from './NotificationEngine.js';
|
|
35
35
|
export { SendNotificationParams, NotificationResult, DeliveryChannels } from './types.js';
|
|
36
36
|
export { RegisterResourceSharedNotificationHandler, CreateResourceSharedHandler, createResourceSharedHandler } from './shareNotificationHandler.js';
|
|
37
|
+
export * from './scoped-notification-config-resolver.js';
|
|
37
38
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EACH,yCAAyC,EACzC,2BAA2B,EAAE,2BAA2B,EAC3D,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EACH,yCAAyC,EACzC,2BAA2B,EAAE,2BAA2B,EAC3D,MAAM,4BAA4B,CAAC;AACpC,cAAc,uCAAuC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -33,4 +33,5 @@
|
|
|
33
33
|
*/
|
|
34
34
|
export { NotificationEngine } from './NotificationEngine.js';
|
|
35
35
|
export { RegisterResourceSharedNotificationHandler, CreateResourceSharedHandler, createResourceSharedHandler } from './shareNotificationHandler.js';
|
|
36
|
+
export * from './scoped-notification-config-resolver.js';
|
|
36
37
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EACH,yCAAyC,EACzC,2BAA2B,EAAE,2BAA2B,EAC3D,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EACH,yCAAyC,EACzC,2BAA2B,EAAE,2BAA2B,EAC3D,MAAM,4BAA4B,CAAC;AACpC,cAAc,uCAAuC,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/** A secondary scope dimension's value, as on the AI layer's scoped prompt configs. */
|
|
2
|
+
export type SecondaryScopeValue = string | number | boolean | string[];
|
|
3
|
+
/**
|
|
4
|
+
* The scope a notification is sent in, mirroring the polymorphic scope MJ's AI layer carries for scoped prompt
|
|
5
|
+
* configs and parts: a primary record of any entity (an Application, a Company, …) plus named secondary dimensions.
|
|
6
|
+
* The engine adds the recipient and the recipient's roles as primary-scope candidates itself, so a caller names only
|
|
7
|
+
* what it knows, usually its application and the notice's origin.
|
|
8
|
+
*/
|
|
9
|
+
export interface NotificationScope {
|
|
10
|
+
primaryScopeEntityId?: string;
|
|
11
|
+
primaryScopeRecordId?: string;
|
|
12
|
+
secondaryScopes?: Record<string, SecondaryScopeValue>;
|
|
13
|
+
}
|
|
14
|
+
/** The well-known secondary dimension this package sets: who or what caused the notice. */
|
|
15
|
+
export declare const NOTIFICATION_ORIGIN_SCOPE = "origin";
|
|
16
|
+
export type NotificationOrigin = 'Person' | 'System' | 'Automation';
|
|
17
|
+
/** `Allow`, `Deny`, or null for "leave it to the next level": the Entity Field Permissions posture. */
|
|
18
|
+
export type ChannelAccess = 'Allow' | 'Deny' | null;
|
|
19
|
+
/**
|
|
20
|
+
* One row of `MJ: Scoped Notification Configs`, as the resolver reads it. Structural, so the generated entity class
|
|
21
|
+
* satisfies it and tests can build rows without one.
|
|
22
|
+
*/
|
|
23
|
+
export interface ScopedNotificationConfigRow {
|
|
24
|
+
ID: string;
|
|
25
|
+
NotificationTypeID: string;
|
|
26
|
+
PrimaryScopeEntityID: string | null;
|
|
27
|
+
PrimaryScopeRecordID: string | null;
|
|
28
|
+
SecondaryScopes: string | null;
|
|
29
|
+
InApp: ChannelAccess;
|
|
30
|
+
Email: ChannelAccess;
|
|
31
|
+
SMS: ChannelAccess;
|
|
32
|
+
IsLocked: boolean;
|
|
33
|
+
Priority: number;
|
|
34
|
+
Status: string;
|
|
35
|
+
}
|
|
36
|
+
/** Who the notice is for, as the resolver needs it: the user and the roles they hold. */
|
|
37
|
+
export interface NotificationRecipient {
|
|
38
|
+
userId: string;
|
|
39
|
+
roleIds: string[];
|
|
40
|
+
}
|
|
41
|
+
/** One channel's answer from the scoped level: a value, or nothing, and whether a locked Deny stands. */
|
|
42
|
+
export interface ScopedChannelDecision {
|
|
43
|
+
/** The most specific non-null answer, Deny winning a tie; null when no in-scope row speaks to this channel. */
|
|
44
|
+
value: ChannelAccess;
|
|
45
|
+
/** True when any in-scope row denies this channel with `IsLocked`: nothing below may turn it on. */
|
|
46
|
+
lockedOff: boolean;
|
|
47
|
+
}
|
|
48
|
+
export interface ScopedChannelDecisions {
|
|
49
|
+
inApp: ScopedChannelDecision;
|
|
50
|
+
email: ScopedChannelDecision;
|
|
51
|
+
sms: ScopedChannelDecision;
|
|
52
|
+
/** The rows that took part, most specific first, for logging and tests. */
|
|
53
|
+
rows: ScopedNotificationConfigRow[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* ScopedNotificationConfigResolver: the notification sibling of `ScopedPromptConfigResolver`. Given the configs for a
|
|
57
|
+
* notification type, the scope the notice is sent in and the recipient, it answers each channel from the most specific
|
|
58
|
+
* in-scope row down.
|
|
59
|
+
*
|
|
60
|
+
* In scope: a global row (no primary record, no secondary scopes); a row whose primary record is the caller's primary
|
|
61
|
+
* scope, the recipient, or a role the recipient holds; and in every case a row whose secondary scopes all match the
|
|
62
|
+
* notice's. Specificity is the primitive's score: secondary match +4, primary record +2, global +1, ties by `Priority`.
|
|
63
|
+
* At equal specificity one `Deny` beats any `Allow`, MJ's permission rule. A `Deny` on a row with `IsLocked` is
|
|
64
|
+
* absorbing for everything less specific and for the recipient's own preference.
|
|
65
|
+
*
|
|
66
|
+
* Pluggable through `ClassFactory`: `CreateScopedNotificationConfigResolver()` returns a host's
|
|
67
|
+
* `@RegisterClass(ScopedNotificationConfigResolver)` subclass when one is registered, else this base. The base itself
|
|
68
|
+
* carries no decorator, like `ScopedPromptConfigResolver`: a decorated class in this package would pull it into every
|
|
69
|
+
* host's generated class manifest, and the server bootstrap does not depend on it.
|
|
70
|
+
* `isInScope` and `score` are the override points.
|
|
71
|
+
*/
|
|
72
|
+
export declare class ScopedNotificationConfigResolver {
|
|
73
|
+
/** Resolves every channel for one notice. `candidates` are the type's rows, any status. */
|
|
74
|
+
Resolve(candidates: readonly ScopedNotificationConfigRow[], notificationTypeId: string, scope: NotificationScope | undefined, recipient: NotificationRecipient): ScopedChannelDecisions;
|
|
75
|
+
/**
|
|
76
|
+
* Is this row for the notice at hand? A primary record must be the caller's primary scope, the recipient, or one of
|
|
77
|
+
* the recipient's roles; every secondary scope the row names must match the notice's.
|
|
78
|
+
*/
|
|
79
|
+
protected isInScope(c: ScopedNotificationConfigRow, scope: NotificationScope | undefined, recipient: NotificationRecipient): boolean;
|
|
80
|
+
/** Specificity: secondary scopes match +4, primary record +2, global +1 (the prompt resolver's scale). */
|
|
81
|
+
protected score(c: ScopedNotificationConfigRow): number;
|
|
82
|
+
/** The most specific non-null answer for one channel, Deny winning a tie, with the lock noted. */
|
|
83
|
+
private decide;
|
|
84
|
+
private parseScopes;
|
|
85
|
+
}
|
|
86
|
+
/** The resolver the engine uses: the base class, or a host's registered subclass. */
|
|
87
|
+
export declare function CreateScopedNotificationConfigResolver(): ScopedNotificationConfigResolver;
|
|
88
|
+
/** One channel's inputs from every level, in the order the engine resolves them. */
|
|
89
|
+
export interface ChannelLevels {
|
|
90
|
+
/** The type's default for the channel. */
|
|
91
|
+
typeDefault: boolean;
|
|
92
|
+
/** What the scoped configs said. */
|
|
93
|
+
scoped: ScopedChannelDecision;
|
|
94
|
+
/** The recipient's own preference for the channel, when the type allows preferences and one is set. */
|
|
95
|
+
userPreference: boolean | null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The channel's effective value, most specific wins: the recipient's preference, then the scoped configs, then the
|
|
99
|
+
* type's default. A locked Deny from the scoped level caps the recipient's preference: it may not turn the channel on.
|
|
100
|
+
*/
|
|
101
|
+
export declare function ResolveChannel(levels: ChannelLevels): boolean;
|
|
102
|
+
//# sourceMappingURL=scoped-notification-config-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-notification-config-resolver.d.ts","sourceRoot":"","sources":["../src/scoped-notification-config-resolver.ts"],"names":[],"mappings":"AAEA,uFAAuF;AACvF,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CACvD;AAED,2FAA2F;AAC3F,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAClD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAC;AAEpE,uGAAuG;AACvG,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;AAEpD;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,aAAa,CAAC;IACrB,GAAG,EAAE,aAAa,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yFAAyF;AACzF,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,yGAAyG;AACzG,MAAM,WAAW,qBAAqB;IACpC,+GAA+G;IAC/G,KAAK,EAAE,aAAa,CAAC;IACrB,oGAAoG;IACpG,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,KAAK,EAAE,qBAAqB,CAAC;IAC7B,GAAG,EAAE,qBAAqB,CAAC;IAC3B,2EAA2E;IAC3E,IAAI,EAAE,2BAA2B,EAAE,CAAC;CACrC;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gCAAgC;IAC3C,2FAA2F;IACpF,OAAO,CACZ,UAAU,EAAE,SAAS,2BAA2B,EAAE,EAClD,kBAAkB,EAAE,MAAM,EAC1B,KAAK,EAAE,iBAAiB,GAAG,SAAS,EACpC,SAAS,EAAE,qBAAqB,GAC/B,sBAAsB;IAazB;;;OAGG;IACH,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,2BAA2B,EAAE,KAAK,EAAE,iBAAiB,GAAG,SAAS,EAAE,SAAS,EAAE,qBAAqB,GAAG,OAAO;IAmBpI,0GAA0G;IAC1G,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,2BAA2B,GAAG,MAAM;IAOvD,kGAAkG;IAClG,OAAO,CAAC,MAAM;IAed,OAAO,CAAC,WAAW;CASpB;AAED,qFAAqF;AACrF,wBAAgB,sCAAsC,IAAI,gCAAgC,CAEzF;AAED,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,WAAW,EAAE,OAAO,CAAC;IACrB,oCAAoC;IACpC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,uGAAuG;IACvG,cAAc,EAAE,OAAO,GAAG,IAAI,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAM7D"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { MJGlobal, UUIDsEqual } from '@memberjunction/global';
|
|
2
|
+
/** The well-known secondary dimension this package sets: who or what caused the notice. */
|
|
3
|
+
export const NOTIFICATION_ORIGIN_SCOPE = 'origin';
|
|
4
|
+
/** Statuses eligible for resolution, as for scoped prompt configs. Archived rows are excluded. */
|
|
5
|
+
const RESOLVABLE_STATUSES = new Set(['Active', 'Provisional']);
|
|
6
|
+
/**
|
|
7
|
+
* ScopedNotificationConfigResolver: the notification sibling of `ScopedPromptConfigResolver`. Given the configs for a
|
|
8
|
+
* notification type, the scope the notice is sent in and the recipient, it answers each channel from the most specific
|
|
9
|
+
* in-scope row down.
|
|
10
|
+
*
|
|
11
|
+
* In scope: a global row (no primary record, no secondary scopes); a row whose primary record is the caller's primary
|
|
12
|
+
* scope, the recipient, or a role the recipient holds; and in every case a row whose secondary scopes all match the
|
|
13
|
+
* notice's. Specificity is the primitive's score: secondary match +4, primary record +2, global +1, ties by `Priority`.
|
|
14
|
+
* At equal specificity one `Deny` beats any `Allow`, MJ's permission rule. A `Deny` on a row with `IsLocked` is
|
|
15
|
+
* absorbing for everything less specific and for the recipient's own preference.
|
|
16
|
+
*
|
|
17
|
+
* Pluggable through `ClassFactory`: `CreateScopedNotificationConfigResolver()` returns a host's
|
|
18
|
+
* `@RegisterClass(ScopedNotificationConfigResolver)` subclass when one is registered, else this base. The base itself
|
|
19
|
+
* carries no decorator, like `ScopedPromptConfigResolver`: a decorated class in this package would pull it into every
|
|
20
|
+
* host's generated class manifest, and the server bootstrap does not depend on it.
|
|
21
|
+
* `isInScope` and `score` are the override points.
|
|
22
|
+
*/
|
|
23
|
+
export class ScopedNotificationConfigResolver {
|
|
24
|
+
/** Resolves every channel for one notice. `candidates` are the type's rows, any status. */
|
|
25
|
+
Resolve(candidates, notificationTypeId, scope, recipient) {
|
|
26
|
+
const inScope = candidates
|
|
27
|
+
.filter((c) => UUIDsEqual(c.NotificationTypeID, notificationTypeId) && RESOLVABLE_STATUSES.has(c.Status))
|
|
28
|
+
.filter((c) => this.isInScope(c, scope, recipient))
|
|
29
|
+
.sort((a, b) => this.score(b) - this.score(a) || (b.Priority ?? 0) - (a.Priority ?? 0));
|
|
30
|
+
return {
|
|
31
|
+
inApp: this.decide(inScope, (c) => c.InApp),
|
|
32
|
+
email: this.decide(inScope, (c) => c.Email),
|
|
33
|
+
sms: this.decide(inScope, (c) => c.SMS),
|
|
34
|
+
rows: inScope,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Is this row for the notice at hand? A primary record must be the caller's primary scope, the recipient, or one of
|
|
39
|
+
* the recipient's roles; every secondary scope the row names must match the notice's.
|
|
40
|
+
*/
|
|
41
|
+
isInScope(c, scope, recipient) {
|
|
42
|
+
if (c.PrimaryScopeRecordID) {
|
|
43
|
+
const record = c.PrimaryScopeRecordID;
|
|
44
|
+
const matchesCaller = !!scope?.primaryScopeRecordId &&
|
|
45
|
+
record.toLowerCase() === scope.primaryScopeRecordId.toLowerCase() &&
|
|
46
|
+
(!c.PrimaryScopeEntityID || !scope.primaryScopeEntityId || UUIDsEqual(c.PrimaryScopeEntityID, scope.primaryScopeEntityId));
|
|
47
|
+
const matchesRecipient = UUIDsEqual(record, recipient.userId);
|
|
48
|
+
const matchesRole = recipient.roleIds.some((roleId) => UUIDsEqual(record, roleId));
|
|
49
|
+
if (!matchesCaller && !matchesRecipient && !matchesRole)
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const rowScopes = this.parseScopes(c.SecondaryScopes);
|
|
53
|
+
for (const key of Object.keys(rowScopes)) {
|
|
54
|
+
const sent = scope?.secondaryScopes?.[key];
|
|
55
|
+
if (sent === undefined || String(sent) !== String(rowScopes[key]))
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
/** Specificity: secondary scopes match +4, primary record +2, global +1 (the prompt resolver's scale). */
|
|
61
|
+
score(c) {
|
|
62
|
+
let s = 1;
|
|
63
|
+
if (c.PrimaryScopeRecordID)
|
|
64
|
+
s += 2;
|
|
65
|
+
if (Object.keys(this.parseScopes(c.SecondaryScopes)).length > 0)
|
|
66
|
+
s += 4;
|
|
67
|
+
return s;
|
|
68
|
+
}
|
|
69
|
+
/** The most specific non-null answer for one channel, Deny winning a tie, with the lock noted. */
|
|
70
|
+
decide(sorted, pick) {
|
|
71
|
+
// A locked Deny anywhere in the rows is a Deny at its own level, so the scan below always returns before running out
|
|
72
|
+
// when one exists: no-answer therefore always means no lock either. A fresh object each time, never a shared one.
|
|
73
|
+
const lockedOff = sorted.some((c) => pick(c) === 'Deny' && c.IsLocked);
|
|
74
|
+
let i = 0;
|
|
75
|
+
while (i < sorted.length) {
|
|
76
|
+
const level = this.score(sorted[i]);
|
|
77
|
+
const peers = [];
|
|
78
|
+
while (i < sorted.length && this.score(sorted[i]) === level)
|
|
79
|
+
peers.push(pick(sorted[i++]));
|
|
80
|
+
if (peers.includes('Deny'))
|
|
81
|
+
return { value: 'Deny', lockedOff };
|
|
82
|
+
if (peers.includes('Allow'))
|
|
83
|
+
return { value: 'Allow', lockedOff };
|
|
84
|
+
}
|
|
85
|
+
return { value: null, lockedOff: false };
|
|
86
|
+
}
|
|
87
|
+
parseScopes(json) {
|
|
88
|
+
if (!json)
|
|
89
|
+
return {};
|
|
90
|
+
try {
|
|
91
|
+
const parsed = JSON.parse(json);
|
|
92
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return {};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** The resolver the engine uses: the base class, or a host's registered subclass. */
|
|
100
|
+
export function CreateScopedNotificationConfigResolver() {
|
|
101
|
+
return MJGlobal.Instance.ClassFactory.CreateInstance(ScopedNotificationConfigResolver) ?? new ScopedNotificationConfigResolver();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The channel's effective value, most specific wins: the recipient's preference, then the scoped configs, then the
|
|
105
|
+
* type's default. A locked Deny from the scoped level caps the recipient's preference: it may not turn the channel on.
|
|
106
|
+
*/
|
|
107
|
+
export function ResolveChannel(levels) {
|
|
108
|
+
if (levels.scoped.lockedOff)
|
|
109
|
+
return false;
|
|
110
|
+
if (levels.userPreference !== null)
|
|
111
|
+
return levels.userPreference;
|
|
112
|
+
if (levels.scoped.value === 'Deny')
|
|
113
|
+
return false;
|
|
114
|
+
if (levels.scoped.value === 'Allow')
|
|
115
|
+
return true;
|
|
116
|
+
return levels.typeDefault;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=scoped-notification-config-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-notification-config-resolver.js","sourceRoot":"","sources":["../src/scoped-notification-config-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ShareNotificationHandler } from '@memberjunction/core-entities';
|
|
2
|
+
import { type NotificationOrigin } from './scoped-notification-config-resolver.js';
|
|
2
3
|
/**
|
|
3
4
|
* Build a handler that converts the share-notification payload into a
|
|
4
5
|
* `SendNotificationParams` and routes it through `NotificationEngine`.
|
|
@@ -14,4 +15,6 @@ export declare function createResourceSharedHandler(): ShareNotificationHandler;
|
|
|
14
15
|
* the previously-registered handler.
|
|
15
16
|
*/
|
|
16
17
|
export declare function RegisterResourceSharedNotificationHandler(): void;
|
|
18
|
+
/** MJ's system user is the one of type `Owner`; a grant it writes is plumbing, not a person sharing. */
|
|
19
|
+
export declare function OriginForUserType(userType: string | null | undefined): NotificationOrigin;
|
|
17
20
|
//# sourceMappingURL=shareNotificationHandler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shareNotificationHandler.d.ts","sourceRoot":"","sources":["../src/shareNotificationHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,wBAAwB,EAG3B,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"shareNotificationHandler.d.ts","sourceRoot":"","sources":["../src/shareNotificationHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,wBAAwB,EAG3B,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAA6B,KAAK,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAgB3G;;;;;GAKG;AACH,wBAAgB,2BAA2B,IAAI,wBAAwB,CAqDtE;AAED,2DAA2D;AAC3D,wBAAgB,2BAA2B,IAAI,wBAAwB,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,yCAAyC,IAAI,IAAI,CAEhE;AAkBD,wGAAwG;AACxG,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,kBAAkB,CAEzF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { LogError } from '@memberjunction/core';
|
|
2
2
|
import { RegisterShareNotificationHandler, ResourcePermissionEngine } from '@memberjunction/core-entities';
|
|
3
3
|
import { NotificationEngine } from './NotificationEngine.js';
|
|
4
|
+
import { NOTIFICATION_ORIGIN_SCOPE } from './scoped-notification-config-resolver.js';
|
|
4
5
|
/**
|
|
5
6
|
* `@memberjunction/core-entities` hosts the share-notification dispatcher
|
|
6
7
|
* (`CreateShareNotification`) but can't import from `@memberjunction/notifications`
|
|
@@ -27,7 +28,8 @@ export function CreateResourceSharedHandler() {
|
|
|
27
28
|
// short-circuits when already loaded. Guards against calls that arrive
|
|
28
29
|
// before the server's explicit startup Config().
|
|
29
30
|
await NotificationEngine.Instance.Config(false, input.ContextUser);
|
|
30
|
-
const
|
|
31
|
+
const grantor = await resolveGrantor(input);
|
|
32
|
+
const grantorName = grantor.name;
|
|
31
33
|
const resourceTypeLabel = input.ResourceTypeLabel || 'resource';
|
|
32
34
|
const resourceName = input.ResourceName ?? `a ${resourceTypeLabel.toLowerCase()}`;
|
|
33
35
|
const actionsSummary = input.ActionsSummary ?? '';
|
|
@@ -53,7 +55,10 @@ export function CreateResourceSharedHandler() {
|
|
|
53
55
|
resourceTypeLabel,
|
|
54
56
|
actionsSummary,
|
|
55
57
|
resourceUrl: null // TODO: build deep link once navigation registry exposes a server-side helper
|
|
56
|
-
}
|
|
58
|
+
},
|
|
59
|
+
// Who caused the share: the system (Owner-type) user writing a grant as plumbing, or a person.
|
|
60
|
+
// `MJ: Scoped Notification Configs` can quiet one and not the other.
|
|
61
|
+
scope: { secondaryScopes: { [NOTIFICATION_ORIGIN_SCOPE]: grantor.origin } }
|
|
57
62
|
}, input.ContextUser);
|
|
58
63
|
return result.success;
|
|
59
64
|
}
|
|
@@ -75,16 +80,24 @@ export function createResourceSharedHandler() {
|
|
|
75
80
|
export function RegisterResourceSharedNotificationHandler() {
|
|
76
81
|
RegisterShareNotificationHandler(CreateResourceSharedHandler());
|
|
77
82
|
}
|
|
78
|
-
|
|
83
|
+
/** The grantor's display name, and the notice's origin: `System` for MJ's Owner-type user, `Person` for anyone else. */
|
|
84
|
+
async function resolveGrantor(input) {
|
|
79
85
|
try {
|
|
80
86
|
const user = await input.Provider.GetEntityObject('MJ: Users', input.ContextUser);
|
|
81
87
|
await user.Load(input.GrantorUserID);
|
|
82
|
-
return
|
|
88
|
+
return {
|
|
89
|
+
name: user.Name || user.Email || 'Another user',
|
|
90
|
+
origin: OriginForUserType(user.Type),
|
|
91
|
+
};
|
|
83
92
|
}
|
|
84
93
|
catch {
|
|
85
|
-
return 'Another user';
|
|
94
|
+
return { name: 'Another user', origin: 'Person' };
|
|
86
95
|
}
|
|
87
96
|
}
|
|
97
|
+
/** MJ's system user is the one of type `Owner`; a grant it writes is plumbing, not a person sharing. */
|
|
98
|
+
export function OriginForUserType(userType) {
|
|
99
|
+
return (userType ?? '').trim().toLowerCase() === 'owner' ? 'System' : 'Person';
|
|
100
|
+
}
|
|
88
101
|
async function resolveResourceTypeId(input) {
|
|
89
102
|
const name = input.ResourceTypeName;
|
|
90
103
|
if (!name)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shareNotificationHandler.js","sourceRoot":"","sources":["../src/shareNotificationHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EACH,gCAAgC,EAGhC,wBAAwB,EAC3B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"shareNotificationHandler.js","sourceRoot":"","sources":["../src/shareNotificationHandler.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { NotificationScope } from './scoped-notification-config-resolver.js';
|
|
1
2
|
/**
|
|
2
3
|
* Individual channel settings for notification delivery.
|
|
3
4
|
* Each channel can be independently enabled or disabled.
|
|
@@ -74,6 +75,12 @@ export interface SendNotificationParams {
|
|
|
74
75
|
* which is the property that makes it safe to expose.
|
|
75
76
|
*/
|
|
76
77
|
allowedDeliveryChannels?: Partial<DeliveryChannels>;
|
|
78
|
+
/**
|
|
79
|
+
* The scope the notice is sent in, for `MJ: Scoped Notification Configs`: the caller's primary record (its
|
|
80
|
+
* application, say) and named secondary dimensions such as `origin`. The engine adds the recipient and the
|
|
81
|
+
* recipient's roles as scopes itself. Omit it and only global rows apply.
|
|
82
|
+
*/
|
|
83
|
+
scope?: NotificationScope;
|
|
77
84
|
}
|
|
78
85
|
/**
|
|
79
86
|
* Result of sending a notification
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,GAAG,EAAE,OAAO,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,qBAAqB,CAAC,EAAE,GAAG,CAAC;IAE5B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEnC;;;OAGG;IACH,qBAAqB,CAAC,EAAE,gBAAgB,CAAC;IAEzC;;;;;;;;;;;;;;;OAeG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE/E;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,GAAG,EAAE,OAAO,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,qBAAqB,CAAC,EAAE,GAAG,CAAC;IAE5B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEnC;;;OAGG;IACH,qBAAqB,CAAC,EAAE,gBAAgB,CAAC;IAEzC;;;;;;;;;;;;;;;OAeG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEpD;;;;OAIG;IACH,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/notifications",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "6.2.0-edge.
|
|
4
|
+
"version": "6.2.0-edge.4",
|
|
5
5
|
"description": "MemberJunction: Unified Notification System with Multi-Channel Delivery",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -15,14 +15,14 @@
|
|
|
15
15
|
"typescript": "^5.9.3"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@memberjunction/global": "6.2.0-edge.
|
|
19
|
-
"@memberjunction/core": "6.2.0-edge.
|
|
20
|
-
"@memberjunction/core-entities": "6.2.0-edge.
|
|
21
|
-
"@memberjunction/templates": "6.2.0-edge.
|
|
22
|
-
"@memberjunction/communication-engine": "6.2.0-edge.
|
|
23
|
-
"@memberjunction/communication-types": "6.2.0-edge.
|
|
24
|
-
"@memberjunction/generic-database-provider": "6.2.0-edge.
|
|
25
|
-
"@memberjunction/sqlserver-dataprovider": "6.2.0-edge.
|
|
18
|
+
"@memberjunction/global": "6.2.0-edge.4",
|
|
19
|
+
"@memberjunction/core": "6.2.0-edge.4",
|
|
20
|
+
"@memberjunction/core-entities": "6.2.0-edge.4",
|
|
21
|
+
"@memberjunction/templates": "6.2.0-edge.4",
|
|
22
|
+
"@memberjunction/communication-engine": "6.2.0-edge.4",
|
|
23
|
+
"@memberjunction/communication-types": "6.2.0-edge.4",
|
|
24
|
+
"@memberjunction/generic-database-provider": "6.2.0-edge.4",
|
|
25
|
+
"@memberjunction/sqlserver-dataprovider": "6.2.0-edge.4"
|
|
26
26
|
},
|
|
27
27
|
"repository": {
|
|
28
28
|
"type": "git",
|