@lilaquadrat/studio 11.3.0 → 11.4.2
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/lib/src/models/conversation.model.js +1 -0
- package/lib/src/models/conversation.model.js.map +1 -1
- package/lib/src/services/jetstream.service.js +2 -1
- package/lib/src/services/jetstream.service.js.map +1 -1
- package/lib/src/services/memory-cache.service.d.ts +6 -1
- package/lib/src/services/memory-cache.service.js +8 -1
- package/lib/src/services/memory-cache.service.js.map +1 -1
- package/lib/src/services/participants.service.js +25 -5
- package/lib/src/services/participants.service.js.map +1 -1
- package/lib/tests/conversationSupportCustomer.spec.d.ts +1 -0
- package/lib/tests/conversationSupportCustomer.spec.js +32 -0
- package/lib/tests/conversationSupportCustomer.spec.js.map +1 -0
- package/lib/tests/memoryCache.spec.d.ts +1 -0
- package/lib/tests/memoryCache.spec.js +32 -0
- package/lib/tests/memoryCache.spec.js.map +1 -0
- package/lib/tests/participantsCheckAccess.spec.d.ts +1 -0
- package/lib/tests/participantsCheckAccess.spec.js +42 -0
- package/lib/tests/participantsCheckAccess.spec.js.map +1 -0
- package/package.json +2 -2
|
@@ -6,6 +6,7 @@ model.setSchema({
|
|
|
6
6
|
name: { type: 'string', maxLength: 100 },
|
|
7
7
|
participantsHash: { type: 'string' },
|
|
8
8
|
participants: { type: 'array', items: { type: 'string' } },
|
|
9
|
+
supportCustomer: { type: 'string', minLength: 1 },
|
|
9
10
|
blocked: { type: 'array', items: { type: 'string' } },
|
|
10
11
|
createdAt: { type: 'string', format: 'date-time' },
|
|
11
12
|
lastActivity: { type: 'string', format: 'date-time' },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.model.js","sourceRoot":"","sources":["../../../src/models/conversation.model.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation.model.js","sourceRoot":"","sources":["../../../src/models/conversation.model.ts"],"names":[],"mappings":"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"}
|
|
@@ -126,7 +126,8 @@ export class JetStreamService {
|
|
|
126
126
|
catch (error) {
|
|
127
127
|
logger.error(`jetstream.message.error.${options.streamName}.${options.consumerName}`, error);
|
|
128
128
|
message.ack();
|
|
129
|
-
|
|
129
|
+
// skip only this message; leaving the loop would stop the consumer for the process lifetime
|
|
130
|
+
continue;
|
|
130
131
|
}
|
|
131
132
|
try {
|
|
132
133
|
const messageWithDecoded = { data: decodedData, subject: message.subject };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jetstream.service.js","sourceRoot":"","sources":["../../../src/services/jetstream.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAyC,MAAM,yBAAyB,CAAC;AAC7G,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,eAAe,EAGf,iBAAiB,EACjB,iBAAiB,GAKlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,MAAM,MAAM,cAAc,CAAC;AAElC,MAAM,OAAO,gBAAgB;IAA7B;QAEU,eAAU,GAA0B,IAAI,CAAC;QAEzC,OAAE,GAA2B,IAAI,CAAC;QAElC,QAAG,GAA4B,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"jetstream.service.js","sourceRoot":"","sources":["../../../src/services/jetstream.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,12 @@ declare class MemoryCache {
|
|
|
19
19
|
static clearUsers(users: string[]): void;
|
|
20
20
|
static upsert(cacheKey: string, data: unknown, lifetime?: number): void;
|
|
21
21
|
static get(cacheKey: string): unknown;
|
|
22
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Pass a function: it only runs on a miss. The promise form is kept for older consumers, but
|
|
24
|
+
* that query has already started, so a hit does not save it — and its rejection must be
|
|
25
|
+
* observed here, or a database error on a hit becomes an unhandled rejection that ends the process.
|
|
26
|
+
*/
|
|
27
|
+
static use<T>(cacheKeyOptions: CacheKeyOptions, fetchFunction: (() => Promise<T>) | Promise<T>): Promise<T>;
|
|
23
28
|
static getCacheKey(options: CacheKeyOptions): string;
|
|
24
29
|
}
|
|
25
30
|
export default MemoryCache;
|
|
@@ -33,15 +33,22 @@ class MemoryCache {
|
|
|
33
33
|
}
|
|
34
34
|
return entry.data;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Pass a function: it only runs on a miss. The promise form is kept for older consumers, but
|
|
38
|
+
* that query has already started, so a hit does not save it — and its rejection must be
|
|
39
|
+
* observed here, or a database error on a hit becomes an unhandled rejection that ends the process.
|
|
40
|
+
*/
|
|
36
41
|
static async use(cacheKeyOptions, fetchFunction) {
|
|
37
42
|
const cacheKey = MemoryCache.getCacheKey(cacheKeyOptions);
|
|
38
43
|
const cached = MemoryCache.get(cacheKey);
|
|
39
44
|
if (cached) {
|
|
45
|
+
if (fetchFunction instanceof Promise)
|
|
46
|
+
fetchFunction.catch(() => undefined);
|
|
40
47
|
logger.debug('cache.hit', { key: cacheKey });
|
|
41
48
|
return cached;
|
|
42
49
|
}
|
|
43
50
|
logger.debug('cache.miss', { key: cacheKey });
|
|
44
|
-
const fetchedData = await fetchFunction;
|
|
51
|
+
const fetchedData = await (typeof fetchFunction === 'function' ? fetchFunction() : fetchFunction);
|
|
45
52
|
MemoryCache.upsert(cacheKey, fetchedData, cacheKeyOptions.lifetime);
|
|
46
53
|
return fetchedData;
|
|
47
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-cache.service.js","sourceRoot":"","sources":["../../../src/services/memory-cache.service.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,cAAc,CAAC;AAalC,MAAM,WAAW;IAIf,MAAM,CAAC,KAAK;QAEV,WAAW,CAAC,KAAK,GAAG,EAAE,CAAC;IAEzB,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,eAAgC;QAE5C,OAAO,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC;IAErE,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,IAAY;QAE3B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAE3C,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAEzB,OAAO,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAEhC,CAAC;QAEH,CAAC,CAAC,CAAC;IAEL,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAE3D,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,QAAgB,EAAE,IAAa,EAAE,QAAiB;QAE9D,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG;YACvC,IAAI;YACJ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1D,CAAC;IAEJ,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,QAAgB;QAEzB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAErD,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAE7B,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAEpD,OAAO,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9C,OAAO,SAAS,CAAC;QAEnB,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC;IAEpB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAG,CAAI,eAAgC,EAAE,
|
|
1
|
+
{"version":3,"file":"memory-cache.service.js","sourceRoot":"","sources":["../../../src/services/memory-cache.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,18 @@ import supportAccess from './support-access.service.js';
|
|
|
9
9
|
* so entries age out instead of holding revoked access forever.
|
|
10
10
|
*/
|
|
11
11
|
const ACCESS_CACHE_LIFETIME_MS = 30000;
|
|
12
|
+
/**
|
|
13
|
+
* Which support scope grants a participant right. Mirrors studio-chat's supportAgentRights, which
|
|
14
|
+
* derives an agent's stored rights from the same scopes: `read` and `participants` map to
|
|
15
|
+
* themselves, every content right needs `write`, and rename/block are never agent rights.
|
|
16
|
+
*/
|
|
17
|
+
function supportScopeAllows(right, scopes) {
|
|
18
|
+
if (right === 'read' || right === 'participants')
|
|
19
|
+
return scopes.has(right);
|
|
20
|
+
if (right === 'rename' || right === 'block')
|
|
21
|
+
return false;
|
|
22
|
+
return scopes.has('write');
|
|
23
|
+
}
|
|
12
24
|
/**
|
|
13
25
|
* participant collection and conversation access.
|
|
14
26
|
*
|
|
@@ -109,8 +121,8 @@ export class ParticipantsService extends Immutable {
|
|
|
109
121
|
const { conversationId, user } = settings;
|
|
110
122
|
// Fetch both in parallel with distinct cache keys to avoid collisions
|
|
111
123
|
const [conversation, participant] = await Promise.all([
|
|
112
|
-
MemoryCache.use({ type: "conversation", id: conversationId, lifetime: ACCESS_CACHE_LIFETIME_MS }, ConversationModel.db.findOne({ _id: conversationId })),
|
|
113
|
-
MemoryCache.use({ type: "participant", id: conversationId, user, lifetime: ACCESS_CACHE_LIFETIME_MS }, this.getByConversationAndUser(conversationId, user))
|
|
124
|
+
MemoryCache.use({ type: "conversation", id: conversationId, lifetime: ACCESS_CACHE_LIFETIME_MS }, () => ConversationModel.db.findOne({ _id: conversationId })),
|
|
125
|
+
MemoryCache.use({ type: "participant", id: conversationId, user, lifetime: ACCESS_CACHE_LIFETIME_MS }, () => this.getByConversationAndUser(conversationId, user))
|
|
114
126
|
]);
|
|
115
127
|
if (!participant)
|
|
116
128
|
return false;
|
|
@@ -128,9 +140,17 @@ export class ParticipantsService extends Immutable {
|
|
|
128
140
|
* `role: 'agent'` is only ever set on support participants (participantsService
|
|
129
141
|
* .markSupportAgents), so this touches nobody else — least of all a support agent's own
|
|
130
142
|
* support conversation, where they are the customer and carry no role.
|
|
143
|
+
*
|
|
144
|
+
* The same goes for a *reduced* scope set: an agent's rights are written once, from the
|
|
145
|
+
* scopes they held when they joined, so the stored rights are capped by the current scopes.
|
|
131
146
|
*/
|
|
132
|
-
|
|
133
|
-
|
|
147
|
+
let rights = participant.rights ?? [];
|
|
148
|
+
if (conversation.operationMode === 'support' && participant.role === 'agent') {
|
|
149
|
+
const scopes = await supportAccess.scopes(user);
|
|
150
|
+
if (!scopes.size)
|
|
151
|
+
return false;
|
|
152
|
+
rights = rights.filter((right) => supportScopeAllows(right, scopes));
|
|
153
|
+
}
|
|
134
154
|
// Validate participant membership (cheap array includes)
|
|
135
155
|
if (!conversation.participants?.includes(user) && !requiredAnyStatus.some((single) => ['left', 'removed'].includes(single)))
|
|
136
156
|
return false;
|
|
@@ -138,7 +158,7 @@ export class ParticipantsService extends Immutable {
|
|
|
138
158
|
if (!requiredAnyStatus.includes(participant.state))
|
|
139
159
|
return false;
|
|
140
160
|
// Rights check (all required must be present)
|
|
141
|
-
if (requiredRights && !requiredRights.every(r =>
|
|
161
|
+
if (requiredRights && !requiredRights.every(r => rights.includes(r)))
|
|
142
162
|
return false;
|
|
143
163
|
return true;
|
|
144
164
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"participants.service.js","sourceRoot":"","sources":["../../../src/services/participants.service.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAC9D,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAEhE,OAAO,WAAW,MAAM,2BAA2B,CAAC;AACpD,OAAO,aAAa,MAAM,6BAA6B,CAAC;AAExD;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,OAAO,mBAAoB,SAAQ,SAAsB;IAA/D;;QAEE,UAAK,GAAG,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"participants.service.js","sourceRoot":"","sources":["../../../src/services/participants.service.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAC9D,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAEhE,OAAO,WAAW,MAAM,2BAA2B,CAAC;AACpD,OAAO,aAAa,MAAM,6BAA6B,CAAC;AAExD;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAEvC;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,KAAY,EAAE,MAAmB;IAE3D,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,cAAc;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3E,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAE1D,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAE7B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,mBAAoB,SAAQ,SAAsB;IAA/D;;QAEE,UAAK,GAAG,gBAAgB,CAAC;IA4M3B,CAAC;IA1MC,iBAAiB,CAAC,WAAmB,EAAE,YAAsB,EAAE,IAAY,EAAE,SAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,IAAsB;QAE/I,OAAO,IAAI,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,WAAW;YACjB,YAAY;YACZ,KAAK,EAAE,QAAQ;YACf,MAAM;YACN,UAAU,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1B,EACD,MAAM,CAAC,IAAI,CAAC,EACZ,MAAM,EACN,SAAS,EACT,SAAS,EACT,SAAS,EACT;YACE,cAAc,EAAE,IAAI;SACrB,CACA,CAAC;IAEJ,CAAC;IAED,gBAAgB,CAAC,WAAmB,EAAE,YAAsB,EAAE,UAAkB;QAE9E,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAC5B;YACE,IAAI,EAAE,WAAW;YACjB,YAAY;SACb,EACD,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,CACzB,CAAC;IAEJ,CAAC;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,YAAsB,EAAE,WAAmB,EAAE,KAAc;QAElE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAC5B;YACE,IAAI,EAAE,WAAW;YACjB,YAAY;SACb,EACD,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAC9D,CAAC;IAEJ,CAAC;IAED,sBAAsB,CAAC,WAAmB,EAAE,YAAsB,EAAE,eAAuB;QAEzF,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAC5B;YACE,IAAI,EAAE,WAAW;YACjB,YAAY;SACb,EACD,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,CAC9B,CAAC;IAEJ,CAAC;IAED,wBAAwB,CAAC,cAAwB,EAAE,IAAY;QAE7D,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvE,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,cAAwB,EAAE,KAAe;QAEzD,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAE5C,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAC7B,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EACtD,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAC5B,CAAC;IAEJ,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,gBAAgB,CAAC,cAAwB;QAE7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE;aAC/B,IAAI,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;aAClF,OAAO,EAAE,CAAC;QAEb,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE7C,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,cAAwB;QAEzC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAEnG,CAAC;IAED,SAAS,CAAC,cAAwB,EAAE,MAAc,EAAE,MAAe;QAEjE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAC5B,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,EAC9C,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CACrB,CAAC;IAEJ,CAAC;IAED;;;;;;;;;OASG;IACH,QAAQ,CAAC,cAAwB,EAAE,MAAc,EAAE,KAAuB;QAExE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAC5B,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,EAC9C,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CACpB,CAAC;IAEJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CACf,iBAA2B,EAC3B,cAAoC,EACpC,QAAoD;QAGpD,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;QAE1C,sEAAsE;QACtE,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpD,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,wBAAwB,EAAE,EAC9F,GAAG,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,OAAO,CAAe,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAC1E;YACD,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,wBAAwB,EAAE,EACnG,GAAG,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,IAAI,CAAC,CAC1D;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QAC/B,IAAI,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QAEhC;;;;;;;;;;;;;;;WAeG;QACH,IAAI,MAAM,GAAG,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC;QAEtC,IAAI,YAAY,CAAC,aAAa,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAE7E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEhD,IAAI,CAAC,MAAM,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE/B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAEvE,CAAC;QAED,yDAAyD;QACzD,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAE1I,eAAe;QACf,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEjE,8CAA8C;QAC9C,IAAI,cAAc,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAU,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAE5F,OAAO,IAAI,CAAC;IAEd,CAAC;CAEF;AAED,eAAe,IAAI,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { describe, expect, it } from '@jest/globals';
|
|
2
|
+
import Models from '../src/classes/models.class';
|
|
3
|
+
import ConversationModel from '../src/models/conversation.model';
|
|
4
|
+
const models = new Models();
|
|
5
|
+
models.register('conversation', ConversationModel);
|
|
6
|
+
const conversation = {
|
|
7
|
+
participantsHash: 'original-customer-support',
|
|
8
|
+
participants: ['auth0|customer'],
|
|
9
|
+
messagesCount: 0,
|
|
10
|
+
operationMode: 'support',
|
|
11
|
+
};
|
|
12
|
+
const withCustomer = { ...conversation, supportCustomer: 'auth0|customer' };
|
|
13
|
+
const withEmptyCustomer = { ...conversation, supportCustomer: '' };
|
|
14
|
+
const changeCustomer = { participants: ['auth0|customer'], supportCustomer: 'auth0|other' };
|
|
15
|
+
const renameCustomer = { name: 'support', supportCustomer: 'auth0|other' };
|
|
16
|
+
describe('ConversationModel support customer', () => {
|
|
17
|
+
it('accepts new support conversations and legacy conversations without the field', () => {
|
|
18
|
+
expect(ConversationModel.validate(withCustomer, 'create')).toBe(true);
|
|
19
|
+
expect(ConversationModel.validate(conversation, 'create')).toBe(true);
|
|
20
|
+
expect(ConversationModel.validate({
|
|
21
|
+
participantsHash: conversation.participantsHash,
|
|
22
|
+
participants: conversation.participants,
|
|
23
|
+
messagesCount: conversation.messagesCount,
|
|
24
|
+
}, 'create')).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
it('rejects an empty support customer and prevents changing it through generic actions', () => {
|
|
27
|
+
expect(ConversationModel.validate(withEmptyCustomer, 'create')).toBe(false);
|
|
28
|
+
expect(ConversationModel.validate(changeCustomer, 'change')).toBe(false);
|
|
29
|
+
expect(ConversationModel.validate(renameCustomer, 'updateName')).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=conversationSupportCustomer.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversationSupportCustomer.spec.js","sourceRoot":"","sources":["../../tests/conversationSupportCustomer.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,MAAM,MAAM,6BAA6B,CAAC;AACjD,OAAO,iBAAiB,MAAM,kCAAkC,CAAC;AAEjE,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;AAC5B,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;AAEnD,MAAM,YAAY,GAAG;IACnB,gBAAgB,EAAE,2BAA2B;IAC7C,YAAY,EAAE,CAAC,gBAAgB,CAAC;IAChC,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,SAAkB;CAClC,CAAC;AACF,MAAM,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;AAC5E,MAAM,iBAAiB,GAAG,EAAE,GAAG,YAAY,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;AACnE,MAAM,cAAc,GAAG,EAAE,YAAY,EAAE,CAAC,gBAAgB,CAAC,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC;AAC5F,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC;AAE3E,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAElD,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QAEtF,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC;YAChC,gBAAgB,EAAE,YAAY,CAAC,gBAAgB;YAC/C,YAAY,EAAE,YAAY,CAAC,YAAY;YACvC,aAAa,EAAE,YAAY,CAAC,aAAa;SAC1C,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAE5F,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE/E,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jest, describe, it, expect, beforeEach } from '@jest/globals';
|
|
2
|
+
import MemoryCache from '../src/services/memory-cache.service';
|
|
3
|
+
describe('MemoryCache.use', () => {
|
|
4
|
+
beforeEach(() => MemoryCache.clear());
|
|
5
|
+
it('runs a fetch function only on a miss', async () => {
|
|
6
|
+
const fetch = jest.fn(async () => ({ name: 'conversation' }));
|
|
7
|
+
await MemoryCache.use({ type: 'conversation', id: 'a' }, fetch);
|
|
8
|
+
const cached = await MemoryCache.use({ type: 'conversation', id: 'a' }, fetch);
|
|
9
|
+
expect(cached).toEqual({ name: 'conversation' });
|
|
10
|
+
expect(fetch).toHaveBeenCalledTimes(1);
|
|
11
|
+
});
|
|
12
|
+
it('observes the rejection of a started promise on a hit', async () => {
|
|
13
|
+
await MemoryCache.use({ type: 'conversation', id: 'a' }, Promise.resolve({ name: 'conversation' }));
|
|
14
|
+
const unhandled = jest.fn();
|
|
15
|
+
process.on('unhandledRejection', unhandled);
|
|
16
|
+
const cached = await MemoryCache.use({ type: 'conversation', id: 'a' }, Promise.reject(new Error('database down')));
|
|
17
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
18
|
+
process.off('unhandledRejection', unhandled);
|
|
19
|
+
expect(cached).toEqual({ name: 'conversation' });
|
|
20
|
+
expect(unhandled).not.toHaveBeenCalled();
|
|
21
|
+
});
|
|
22
|
+
it('fetches again once the lifetime has passed', async () => {
|
|
23
|
+
const fetch = jest.fn(async () => ({ name: 'conversation' }));
|
|
24
|
+
const now = jest.spyOn(Date, 'now').mockReturnValue(1000);
|
|
25
|
+
await MemoryCache.use({ type: 'conversation', id: 'a', lifetime: 100 }, fetch);
|
|
26
|
+
now.mockReturnValue(1200);
|
|
27
|
+
await MemoryCache.use({ type: 'conversation', id: 'a', lifetime: 100 }, fetch);
|
|
28
|
+
now.mockRestore();
|
|
29
|
+
expect(fetch).toHaveBeenCalledTimes(2);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=memoryCache.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryCache.spec.js","sourceRoot":"","sources":["../../tests/memoryCache.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,WAAW,MAAM,sCAAsC,CAAC;AAE/D,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAE/B,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;IAEtC,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QAEpD,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QAE9D,MAAM,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QAE/E,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAEzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QAEpE,MAAM,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QAEpG,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5B,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACpH,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAEtD,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;QAE7C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAE3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAE1D,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE1D,MAAM,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/E,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QAE/E,GAAG,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAEzC,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jest, describe, it, expect, beforeEach, afterEach } from '@jest/globals';
|
|
2
|
+
import { ObjectId } from 'mongodb';
|
|
3
|
+
import participantsService from '../src/services/participants.service';
|
|
4
|
+
import supportAccess from '../src/services/support-access.service';
|
|
5
|
+
import MemoryCache from '../src/services/memory-cache.service';
|
|
6
|
+
const CONVERSATION_ID = new ObjectId('507f1f77bcf86cd799439011');
|
|
7
|
+
const AGENT = 'agent-1';
|
|
8
|
+
const agentParticipant = {
|
|
9
|
+
user: AGENT,
|
|
10
|
+
conversation: CONVERSATION_ID,
|
|
11
|
+
state: 'active',
|
|
12
|
+
role: 'agent',
|
|
13
|
+
rights: ['read', 'write', 'files', 'participants'],
|
|
14
|
+
};
|
|
15
|
+
describe('ParticipantsService.checkAccess for support agents', () => {
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
MemoryCache.clear();
|
|
18
|
+
MemoryCache.upsert(MemoryCache.getCacheKey({ type: 'conversation', id: CONVERSATION_ID }), { _id: CONVERSATION_ID, operationMode: 'support', participants: [AGENT, 'customer'] });
|
|
19
|
+
jest.spyOn(participantsService, 'getByConversationAndUser').mockResolvedValue(agentParticipant);
|
|
20
|
+
});
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
jest.restoreAllMocks();
|
|
23
|
+
});
|
|
24
|
+
it('caps stored rights by the current scopes', async () => {
|
|
25
|
+
jest.spyOn(supportAccess, 'scopes').mockResolvedValue(new Set(['read']));
|
|
26
|
+
const settings = { conversationId: CONVERSATION_ID, user: AGENT };
|
|
27
|
+
await expect(participantsService.checkAccess(['active'], ['read'], settings)).resolves.toBe(true);
|
|
28
|
+
await expect(participantsService.checkAccess(['active'], ['write'], settings)).resolves.toBe(false);
|
|
29
|
+
await expect(participantsService.checkAccess(['active'], ['participants'], settings)).resolves.toBe(false);
|
|
30
|
+
});
|
|
31
|
+
it('keeps stored rights the scopes still grant', async () => {
|
|
32
|
+
jest.spyOn(supportAccess, 'scopes').mockResolvedValue(new Set(['read', 'write', 'participants']));
|
|
33
|
+
const settings = { conversationId: CONVERSATION_ID, user: AGENT };
|
|
34
|
+
await expect(participantsService.checkAccess(['active'], ['write'], settings)).resolves.toBe(true);
|
|
35
|
+
await expect(participantsService.checkAccess(['active'], ['participants'], settings)).resolves.toBe(true);
|
|
36
|
+
});
|
|
37
|
+
it('denies an agent without any support scope', async () => {
|
|
38
|
+
jest.spyOn(supportAccess, 'scopes').mockResolvedValue(new Set());
|
|
39
|
+
await expect(participantsService.checkAccess(['active'], undefined, { conversationId: CONVERSATION_ID, user: AGENT })).resolves.toBe(false);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=participantsCheckAccess.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"participantsCheckAccess.spec.js","sourceRoot":"","sources":["../../tests/participantsCheckAccess.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lilaquadrat/studio",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.4.2",
|
|
4
4
|
"description": "classes and tools for STUDIO",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
},
|
|
119
119
|
"dependencies": {
|
|
120
120
|
"@google/genai": "^1.42.0",
|
|
121
|
-
"@lilaquadrat/interfaces": "^1.
|
|
121
|
+
"@lilaquadrat/interfaces": "^1.50.1",
|
|
122
122
|
"@lilaquadrat/storage-sdk": "^0.1.15",
|
|
123
123
|
"@nats-io/jetstream": "^3.2.0",
|
|
124
124
|
"@nats-io/transport-node": "^3.2.0",
|