@lilaquadrat/studio 11.4.1 → 11.5.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/services.d.ts +2 -1
- package/lib/services.js +2 -1
- package/lib/services.js.map +1 -1
- package/lib/src/models/license.model.js +5 -25
- package/lib/src/models/license.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/license.service.d.ts +11 -0
- package/lib/src/services/license.service.js +28 -0
- package/lib/src/services/license.service.js.map +1 -0
- 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/licenseModel.spec.d.ts +1 -0
- package/lib/tests/licenseModel.spec.js +43 -0
- package/lib/tests/licenseModel.spec.js.map +1 -0
- package/lib/tests/licenseService.spec.d.ts +1 -0
- package/lib/tests/licenseService.spec.js +47 -0
- package/lib/tests/licenseService.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
package/lib/services.d.ts
CHANGED
|
@@ -38,4 +38,5 @@ import slaService from './src/services/sla.service.js';
|
|
|
38
38
|
import participantsService, { ParticipantsService } from './src/services/participants.service.js';
|
|
39
39
|
import memoryCache from './src/services/memory-cache.service.js';
|
|
40
40
|
import supportAccessService from './src/services/support-access.service.js';
|
|
41
|
-
|
|
41
|
+
import licenseService from './src/services/license.service.js';
|
|
42
|
+
export { editorService as EditorService, historyService as HistoryService, idService as IdService, publishService as PublishService, secretService as SecretService, publishMethodService as PublishMethodService, domainsService as DomainsService, confService as ConfService, hostingCommandsService as HostingCommandsService, hostingService as HostingService, hostingAdminService as HostingAdminService, customersService as CustomersService, listsService as ListsService, listParticipantsService as ListParticipantsService, spamAnalasysService as SpamAnalasysService, webhooksCallsService as WebhooksCallsService, paymentsService as PaymentsService, paymentProvidersService as PaymentProvidersService, permissionsService as PermissionsService, importService as ImportService, structuresService as StructuresService, meService, MeService, AccessService, PublishDataService, MailFromService, CartService, AiService, LoggingService, jetstreamService as JetStreamService, storageService as StorageService, uploadService as UploadService, authService as AuthService, invoicesService as InvoicesService, emailLimitService as EmailLimitService, designsService as DesignsService, supportService as SupportService, slaService as SlaService, participantsService, ParticipantsService, memoryCache as MemoryCache, supportAccessService as SupportAccessService, licenseService as LicenseService, };
|
package/lib/services.js
CHANGED
|
@@ -38,5 +38,6 @@ import slaService from './src/services/sla.service.js';
|
|
|
38
38
|
import participantsService, { ParticipantsService } from './src/services/participants.service.js';
|
|
39
39
|
import memoryCache from './src/services/memory-cache.service.js';
|
|
40
40
|
import supportAccessService from './src/services/support-access.service.js';
|
|
41
|
-
|
|
41
|
+
import licenseService from './src/services/license.service.js';
|
|
42
|
+
export { editorService as EditorService, historyService as HistoryService, idService as IdService, publishService as PublishService, secretService as SecretService, publishMethodService as PublishMethodService, domainsService as DomainsService, confService as ConfService, hostingCommandsService as HostingCommandsService, hostingService as HostingService, hostingAdminService as HostingAdminService, customersService as CustomersService, listsService as ListsService, listParticipantsService as ListParticipantsService, spamAnalasysService as SpamAnalasysService, webhooksCallsService as WebhooksCallsService, paymentsService as PaymentsService, paymentProvidersService as PaymentProvidersService, permissionsService as PermissionsService, importService as ImportService, structuresService as StructuresService, meService, MeService, AccessService, PublishDataService, MailFromService, CartService, AiService, LoggingService, jetstreamService as JetStreamService, storageService as StorageService, uploadService as UploadService, authService as AuthService, invoicesService as InvoicesService, emailLimitService as EmailLimitService, designsService as DesignsService, supportService as SupportService, slaService as SlaService, participantsService, ParticipantsService, memoryCache as MemoryCache, supportAccessService as SupportAccessService, licenseService as LicenseService, };
|
|
42
43
|
//# sourceMappingURL=services.js.map
|
package/lib/services.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.js","sourceRoot":"","sources":["../services.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,SAAS,MAAM,8BAA8B,CAAC;AACrD,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,oBAAoB,MAAM,yCAAyC,CAAC;AAC3E,OAAO,aAAa,MAAM,kCAAkC,CAAC;AAC7D,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,WAAW,MAAM,gCAAgC,CAAC;AACzD,OAAO,sBAAsB,MAAM,2CAA2C,CAAC;AAC/E,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,mBAAmB,MAAM,wCAAwC,CAAC;AACzE,OAAO,kBAAkB,MAAM,uCAAuC,CAAC;AACvE,OAAO,gBAAgB,MAAM,qCAAqC,CAAC;AACnE,OAAO,YAAY,MAAM,iCAAiC,CAAC;AAC3D,OAAO,uBAAuB,MAAM,4CAA4C,CAAC;AACjF,OAAO,mBAAmB,MAAM,wCAAwC,CAAC;AACzE,OAAO,aAAa,MAAM,kCAAkC,CAAC;AAC7D,OAAO,eAAe,MAAM,oCAAoC,CAAC;AACjE,OAAO,oBAAoB,MAAM,0CAA0C,CAAC;AAC5E,OAAO,eAAe,MAAM,oCAAoC,CAAC;AACjE,OAAO,uBAAuB,MAAM,4CAA4C,CAAC;AACjF,OAAO,kBAAkB,MAAM,uCAAuC,CAAC;AACvE,OAAO,SAAS,EAAE,EAAC,SAAS,EAAC,MAAM,8BAA8B,CAAC;AAClE,OAAO,aAAa,MAAM,kCAAkC,CAAC;AAC7D,OAAO,iBAAiB,MAAM,sCAAsC,CAAC;AACrE,OAAO,WAAW,MAAM,gCAAgC,CAAC;AACzD,OAAO,SAAS,MAAM,8BAA8B,CAAC;AACrD,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,gBAAgB,MAAM,qCAAqC,CAAC;AACnE,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,aAAa,MAAM,kCAAkC,CAAC;AAC7D,OAAO,aAAa,MAAM,kCAAkC,CAAC;AAC7D,OAAO,WAAW,MAAM,gCAAgC,CAAC;AACzD,OAAO,eAAe,MAAM,oCAAoC,CAAC;AACjE,OAAO,iBAAiB,MAAM,sCAAsC,CAAC;AACrE,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,UAAU,MAAM,+BAA+B,CAAC;AACvD,OAAO,mBAAmB,EAAE,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAClG,OAAO,WAAW,MAAM,wCAAwC,CAAC;AACjE,OAAO,oBAAoB,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../services.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,SAAS,MAAM,8BAA8B,CAAC;AACrD,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,oBAAoB,MAAM,yCAAyC,CAAC;AAC3E,OAAO,aAAa,MAAM,kCAAkC,CAAC;AAC7D,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,WAAW,MAAM,gCAAgC,CAAC;AACzD,OAAO,sBAAsB,MAAM,2CAA2C,CAAC;AAC/E,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,mBAAmB,MAAM,wCAAwC,CAAC;AACzE,OAAO,kBAAkB,MAAM,uCAAuC,CAAC;AACvE,OAAO,gBAAgB,MAAM,qCAAqC,CAAC;AACnE,OAAO,YAAY,MAAM,iCAAiC,CAAC;AAC3D,OAAO,uBAAuB,MAAM,4CAA4C,CAAC;AACjF,OAAO,mBAAmB,MAAM,wCAAwC,CAAC;AACzE,OAAO,aAAa,MAAM,kCAAkC,CAAC;AAC7D,OAAO,eAAe,MAAM,oCAAoC,CAAC;AACjE,OAAO,oBAAoB,MAAM,0CAA0C,CAAC;AAC5E,OAAO,eAAe,MAAM,oCAAoC,CAAC;AACjE,OAAO,uBAAuB,MAAM,4CAA4C,CAAC;AACjF,OAAO,kBAAkB,MAAM,uCAAuC,CAAC;AACvE,OAAO,SAAS,EAAE,EAAC,SAAS,EAAC,MAAM,8BAA8B,CAAC;AAClE,OAAO,aAAa,MAAM,kCAAkC,CAAC;AAC7D,OAAO,iBAAiB,MAAM,sCAAsC,CAAC;AACrE,OAAO,WAAW,MAAM,gCAAgC,CAAC;AACzD,OAAO,SAAS,MAAM,8BAA8B,CAAC;AACrD,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,gBAAgB,MAAM,qCAAqC,CAAC;AACnE,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,aAAa,MAAM,kCAAkC,CAAC;AAC7D,OAAO,aAAa,MAAM,kCAAkC,CAAC;AAC7D,OAAO,WAAW,MAAM,gCAAgC,CAAC;AACzD,OAAO,eAAe,MAAM,oCAAoC,CAAC;AACjE,OAAO,iBAAiB,MAAM,sCAAsC,CAAC;AACrE,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,UAAU,MAAM,+BAA+B,CAAC;AACvD,OAAO,mBAAmB,EAAE,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAClG,OAAO,WAAW,MAAM,wCAAwC,CAAC;AACjE,OAAO,oBAAoB,MAAM,0CAA0C,CAAC;AAC5E,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAE/D,OAAO,EACL,aAAa,IAAI,aAAa,EAC9B,cAAc,IAAI,cAAc,EAChC,SAAS,IAAI,SAAS,EACtB,cAAc,IAAI,cAAc,EAChC,aAAa,IAAI,aAAa,EAC9B,oBAAoB,IAAI,oBAAoB,EAC5C,cAAc,IAAI,cAAc,EAChC,WAAW,IAAI,WAAW,EAC1B,sBAAsB,IAAI,sBAAsB,EAChD,cAAc,IAAI,cAAc,EAChC,mBAAmB,IAAI,mBAAmB,EAC1C,gBAAgB,IAAI,gBAAgB,EACpC,YAAY,IAAI,YAAY,EAC5B,uBAAuB,IAAI,uBAAuB,EAClD,mBAAmB,IAAI,mBAAmB,EAC1C,oBAAoB,IAAI,oBAAoB,EAC5C,eAAe,IAAI,eAAe,EAClC,uBAAuB,IAAI,uBAAuB,EAClD,kBAAkB,IAAI,kBAAkB,EACxC,aAAa,IAAI,aAAa,EAC9B,iBAAiB,IAAI,iBAAiB,EACtC,SAAS,EACT,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,SAAS,EACT,cAAc,EACd,gBAAgB,IAAI,gBAAgB,EACpC,cAAc,IAAI,cAAc,EAChC,aAAa,IAAI,aAAa,EAC9B,WAAW,IAAI,WAAW,EAC1B,eAAe,IAAI,eAAe,EAClC,iBAAiB,IAAI,iBAAiB,EACtC,cAAc,IAAI,cAAc,EAChC,cAAc,IAAI,cAAc,EAChC,UAAU,IAAI,UAAU,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,IAAI,WAAW,EAC1B,oBAAoB,IAAI,oBAAoB,EAC5C,cAAc,IAAI,cAAc,GACjC,CAAC"}
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import Modelv2 from '../classes/modelv2.class.js';
|
|
2
2
|
const model = new Modelv2('license', 'licenses');
|
|
3
|
-
model.
|
|
4
|
-
|
|
5
|
-
'oneTimeCost',
|
|
6
|
-
'supportSla',
|
|
7
|
-
'includedApps',
|
|
8
|
-
'limits',
|
|
9
|
-
];
|
|
3
|
+
model.immutable = ['id'];
|
|
4
|
+
model.removeWhenEmpty = ['description'];
|
|
10
5
|
model.addIndex({
|
|
11
6
|
key: {
|
|
12
7
|
id: 1,
|
|
@@ -26,7 +21,7 @@ model.setSchema({
|
|
|
26
21
|
cancellationPeriodDays: { type: 'number', minimum: 0 },
|
|
27
22
|
includesSupport: { type: 'boolean' },
|
|
28
23
|
supportSla: { type: 'string', maxLength: 100 },
|
|
29
|
-
|
|
24
|
+
available: { type: 'boolean' },
|
|
30
25
|
autoExtend: { type: 'boolean' },
|
|
31
26
|
includedApps: {
|
|
32
27
|
type: 'array',
|
|
@@ -45,25 +40,10 @@ model.setSchema({
|
|
|
45
40
|
model.setSchema({
|
|
46
41
|
type: 'object',
|
|
47
42
|
properties: {
|
|
48
|
-
name: { type: 'string', minLength: 3, maxLength: 50 },
|
|
49
43
|
description: { type: 'string', maxLength: 500 },
|
|
50
|
-
|
|
51
|
-
oneTimeCost: { type: 'number', minimum: 0 },
|
|
52
|
-
minimumContractMonths: { type: 'number', minimum: 0 },
|
|
53
|
-
cancellationPeriodDays: { type: 'number', minimum: 0 },
|
|
54
|
-
includesSupport: { type: 'boolean' },
|
|
55
|
-
supportSla: { type: 'string', maxLength: 100 },
|
|
56
|
-
active: { type: 'boolean' },
|
|
57
|
-
autoExtend: { type: 'boolean' },
|
|
58
|
-
includedApps: {
|
|
59
|
-
type: 'array',
|
|
60
|
-
contains: {
|
|
61
|
-
type: 'string',
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
limits: { type: 'object' },
|
|
44
|
+
available: { type: 'boolean' },
|
|
65
45
|
},
|
|
66
|
-
required: ['
|
|
46
|
+
required: ['available'],
|
|
67
47
|
additionalProperties: false,
|
|
68
48
|
}, 'change');
|
|
69
49
|
export default model;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.model.js","sourceRoot":"","sources":["../../../src/models/license.model.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,6BAA6B,CAAC;AAElD,MAAM,KAAK,GAAG,IAAI,OAAO,CAAU,SAAS,EAAE,UAAU,CAAC,CAAC;AAE1D,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"license.model.js","sourceRoot":"","sources":["../../../src/models/license.model.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,6BAA6B,CAAC;AAElD,MAAM,KAAK,GAAG,IAAI,OAAO,CAAU,SAAS,EAAE,UAAU,CAAC,CAAC;AAE1D,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,KAAK,CAAC,eAAe,GAAG,CAAC,aAAa,CAAC,CAAC;AAExC,KAAK,CAAC,QAAQ,CACZ;IACE,GAAG,EAAE;QACH,EAAE,EAAE,CAAC;KACN;IACD,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,gBAAgB;CACvB,EACD,CAAC,CACF,CAAC;AAEF,KAAK,CAAC,SAAS,CACb;IACE,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,EAAE;QACtD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;QACrD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE;QAC/C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;QAC3C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;QAC3C,qBAAqB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;QACrD,sBAAsB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;QACtD,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACpC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE;QAC9C,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC9B,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC/B,YAAY,EAAE;YACZ,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;aACf;SACF;QACD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC3B;IACD,QAAQ,EAAE;QACR,IAAI;QACJ,MAAM;KACP;IACD,oBAAoB,EAAE,KAAK;CAC5B,EACD,QAAQ,CACT,CAAC;AAEF,KAAK,CAAC,SAAS,CACb;IACE,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE;QAC/C,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;KAC/B;IACD,QAAQ,EAAE,CAAC,WAAW,CAAC;IACvB,oBAAoB,EAAE,KAAK;CAC5B,EACD,QAAQ,CACT,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { License } from '@lilaquadrat/interfaces';
|
|
2
|
+
import Immutable from '../Immutable.class.js';
|
|
3
|
+
declare class LicenseService extends Immutable<License> {
|
|
4
|
+
model: import("../classes/modelv2.class.js").default<License, string>;
|
|
5
|
+
single(id: string): Promise<import("mongodb").WithId<License> | null>;
|
|
6
|
+
list(): Promise<import("mongodb").WithId<License>[]>;
|
|
7
|
+
change(id: string, data: Partial<License>, user: string, app: string): Promise<import("mongodb").UpdateResult<import("bson").Document>>;
|
|
8
|
+
remove(id: string, user: string, app: string): Promise<import("mongodb").DeleteResult>;
|
|
9
|
+
}
|
|
10
|
+
declare const _default: LicenseService;
|
|
11
|
+
export default _default;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import Immutable from '../Immutable.class.js';
|
|
2
|
+
import LicenseModel from '../models/license.model.js';
|
|
3
|
+
class LicenseService extends Immutable {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(...arguments);
|
|
6
|
+
this.model = LicenseModel;
|
|
7
|
+
}
|
|
8
|
+
single(id) {
|
|
9
|
+
return this.model.db.findOne({ id }, { projection: { history: 0 } });
|
|
10
|
+
}
|
|
11
|
+
list() {
|
|
12
|
+
return this.model.db.find().sort({ name: 1 }).toArray();
|
|
13
|
+
}
|
|
14
|
+
async change(id, data, user, app) {
|
|
15
|
+
const license = await this.single(id);
|
|
16
|
+
if (!license?._id)
|
|
17
|
+
throw new Error('LICENSE_NOT_FOUND');
|
|
18
|
+
return this.immutable(license._id, data, user, 'change', app);
|
|
19
|
+
}
|
|
20
|
+
async remove(id, user, app) {
|
|
21
|
+
const license = await this.single(id);
|
|
22
|
+
if (!license?._id)
|
|
23
|
+
throw new Error('LICENSE_NOT_FOUND');
|
|
24
|
+
return this.delete(license._id, user, app);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export default new LicenseService();
|
|
28
|
+
//# sourceMappingURL=license.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.service.js","sourceRoot":"","sources":["../../../src/services/license.service.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,YAAY,MAAM,4BAA4B,CAAC;AAEtD,MAAM,cAAe,SAAQ,SAAkB;IAA/C;;QAEE,UAAK,GAAG,YAAY,CAAC;IAgCvB,CAAC;IA9BC,MAAM,CAAC,EAAU;QAEf,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEvE,CAAC;IAED,IAAI;QAEF,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAE1D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,IAAsB,EAAE,IAAY,EAAE,GAAW;QAExE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAExD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAEhE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,IAAY,EAAE,GAAW;QAEhD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAExD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAE7C,CAAC;CAEF;AAED,eAAe,IAAI,cAAc,EAAE,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { describe, expect, it } from '@jest/globals';
|
|
2
|
+
import Models from '../src/classes/models.class';
|
|
3
|
+
import LicenseModel from '../src/models/license.model';
|
|
4
|
+
const models = new Models();
|
|
5
|
+
models.register('license', LicenseModel);
|
|
6
|
+
const validLicense = {
|
|
7
|
+
id: 'starter',
|
|
8
|
+
name: 'Starter',
|
|
9
|
+
};
|
|
10
|
+
describe('LicenseModel', () => {
|
|
11
|
+
it('accepts a license with only id and name', () => {
|
|
12
|
+
expect(LicenseModel.validate(validLicense, 'create')).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
it('accepts availability on create', () => {
|
|
15
|
+
expect(LicenseModel.validate({ ...validLicense, available: true }, 'create')).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
it('requires an id and name', () => {
|
|
18
|
+
expect(LicenseModel.validate({ name: 'Starter' }, 'create')).toBe(false);
|
|
19
|
+
expect(LicenseModel.validate({ id: 'starter' }, 'create')).toBe(false);
|
|
20
|
+
});
|
|
21
|
+
it('allows only availability and description to change', () => {
|
|
22
|
+
expect(LicenseModel.validate({ available: true, description: 'updated' }, 'change')).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
it('requires availability on change', () => {
|
|
25
|
+
expect(LicenseModel.validate({ description: 'updated' }, 'change')).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
it('rejects edits to immutable terms and the id', () => {
|
|
28
|
+
expect(LicenseModel.validate({ available: true, monthlyCost: 5 }, 'change')).toBe(false);
|
|
29
|
+
expect(LicenseModel.validate({ available: true, id: 'other' }, 'change')).toBe(false);
|
|
30
|
+
expect(LicenseModel.validate({ available: true, includedApps: ['editor'] }, 'change')).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
it('marks the id as immutable', () => {
|
|
33
|
+
expect(LicenseModel.immutable).toContain('id');
|
|
34
|
+
});
|
|
35
|
+
it('defines a unique license id', () => {
|
|
36
|
+
expect(LicenseModel.indexes).toContainEqual(expect.objectContaining({
|
|
37
|
+
key: { id: 1 },
|
|
38
|
+
unique: true,
|
|
39
|
+
name: 'license_unique-v1',
|
|
40
|
+
}));
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=licenseModel.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"licenseModel.spec.js","sourceRoot":"","sources":["../../tests/licenseModel.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,MAAM,MAAM,6BAA6B,CAAC;AACjD,OAAO,YAAY,MAAM,6BAA6B,CAAC;AAEvD,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;AAC5B,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAEzC,MAAM,YAAY,GAAY;IAC5B,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAE5B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAEjD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAExC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,GAAG,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAEjC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAE5D,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAEzC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAElF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QAErD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzF,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtF,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAErG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QAEnC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAEjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAErC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAClE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;YACd,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,mBAAmB;SAC1B,CAAC,CAAC,CAAC;IAEN,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, jest } from '@jest/globals';
|
|
2
|
+
import { ObjectId } from 'mongodb';
|
|
3
|
+
import LicenseModel from '../src/models/license.model';
|
|
4
|
+
import LicenseService from '../src/services/license.service';
|
|
5
|
+
describe('LicenseService', () => {
|
|
6
|
+
afterEach(() => {
|
|
7
|
+
jest.restoreAllMocks();
|
|
8
|
+
});
|
|
9
|
+
it('gets a license by its unique id', async () => {
|
|
10
|
+
const findOne = jest.fn().mockResolvedValue(null);
|
|
11
|
+
jest.spyOn(LicenseModel, 'db', 'get').mockReturnValue({ findOne });
|
|
12
|
+
await LicenseService.single('free');
|
|
13
|
+
expect(findOne).toHaveBeenCalledWith({ id: 'free' }, { projection: { history: 0 } });
|
|
14
|
+
});
|
|
15
|
+
it('lists licenses sorted by name', async () => {
|
|
16
|
+
const toArray = jest.fn().mockResolvedValue([]);
|
|
17
|
+
const sort = jest.fn().mockReturnValue({ toArray });
|
|
18
|
+
const find = jest.fn().mockReturnValue({ sort });
|
|
19
|
+
jest.spyOn(LicenseModel, 'db', 'get').mockReturnValue({ find });
|
|
20
|
+
await LicenseService.list();
|
|
21
|
+
expect(find).toHaveBeenCalledWith();
|
|
22
|
+
expect(sort).toHaveBeenCalledWith({ name: 1 });
|
|
23
|
+
expect(toArray).toHaveBeenCalledWith();
|
|
24
|
+
});
|
|
25
|
+
it('changes a license by its unique id', async () => {
|
|
26
|
+
const _id = new ObjectId();
|
|
27
|
+
const findOne = jest.fn().mockResolvedValue({ _id });
|
|
28
|
+
jest.spyOn(LicenseModel, 'db', 'get').mockReturnValue({ findOne });
|
|
29
|
+
const immutable = jest.spyOn(LicenseService, 'immutable').mockResolvedValue({});
|
|
30
|
+
await LicenseService.change('free', { available: true }, 'user', 'app');
|
|
31
|
+
expect(immutable).toHaveBeenCalledWith(_id, { available: true }, 'user', 'change', 'app');
|
|
32
|
+
});
|
|
33
|
+
it('rejects changing a missing license', async () => {
|
|
34
|
+
const findOne = jest.fn().mockResolvedValue(null);
|
|
35
|
+
jest.spyOn(LicenseModel, 'db', 'get').mockReturnValue({ findOne });
|
|
36
|
+
await expect(LicenseService.change('free', { available: true }, 'user', 'app')).rejects.toThrow('LICENSE_NOT_FOUND');
|
|
37
|
+
});
|
|
38
|
+
it('removes a license by its unique id', async () => {
|
|
39
|
+
const _id = new ObjectId();
|
|
40
|
+
const findOne = jest.fn().mockResolvedValue({ _id });
|
|
41
|
+
jest.spyOn(LicenseModel, 'db', 'get').mockReturnValue({ findOne });
|
|
42
|
+
const remove = jest.spyOn(LicenseService, 'delete').mockResolvedValue({ acknowledged: true, deletedCount: 1 });
|
|
43
|
+
await LicenseService.remove('free', 'user', 'app');
|
|
44
|
+
expect(remove).toHaveBeenCalledWith(_id, 'user', 'app');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=licenseService.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"licenseService.spec.js","sourceRoot":"","sources":["../../tests/licenseService.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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.5.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.51.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",
|