@solidstarters/solid-core 1.2.173 → 1.2.175
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/dev-grooming-docs/ozzy-prompts.txt +13 -0
- package/dist/config/iam.config.js +2 -2
- package/dist/config/iam.config.js.map +1 -1
- package/dist/constants/chatter-message.constants.d.ts +11 -0
- package/dist/constants/chatter-message.constants.d.ts.map +1 -0
- package/dist/constants/chatter-message.constants.js +14 -0
- package/dist/constants/chatter-message.constants.js.map +1 -0
- package/dist/controllers/ai-interaction.controller.js +1 -1
- package/dist/controllers/ai-interaction.controller.js.map +1 -1
- package/dist/controllers/authentication.controller.d.ts +1 -2
- package/dist/controllers/authentication.controller.d.ts.map +1 -1
- package/dist/controllers/chatter-message-details.controller.d.ts +0 -16
- package/dist/controllers/chatter-message-details.controller.d.ts.map +1 -1
- package/dist/controllers/chatter-message-details.controller.js +0 -109
- package/dist/controllers/chatter-message-details.controller.js.map +1 -1
- package/dist/controllers/chatter-message.controller.d.ts +10 -13
- package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
- package/dist/controllers/chatter-message.controller.js +19 -88
- package/dist/controllers/chatter-message.controller.js.map +1 -1
- package/dist/controllers/service.controller.js +2 -1
- package/dist/controllers/service.controller.js.map +1 -1
- package/dist/dtos/invoke-ai-prompt.dto.d.ts +1 -0
- package/dist/dtos/invoke-ai-prompt.dto.d.ts.map +1 -1
- package/dist/dtos/invoke-ai-prompt.dto.js +6 -1
- package/dist/dtos/invoke-ai-prompt.dto.js.map +1 -1
- package/dist/entities/chatter-message-details.entity.d.ts +1 -0
- package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
- package/dist/entities/chatter-message-details.entity.js +5 -1
- package/dist/entities/chatter-message-details.entity.js.map +1 -1
- package/dist/entities/chatter-message.entity.d.ts +4 -0
- package/dist/entities/chatter-message.entity.d.ts.map +1 -1
- package/dist/entities/chatter-message.entity.js +14 -1
- package/dist/entities/chatter-message.entity.js.map +1 -1
- package/dist/entities/user.entity.d.ts +1 -0
- package/dist/entities/user.entity.d.ts.map +1 -1
- package/dist/entities/user.entity.js +5 -1
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/interfaces.d.ts +2 -1
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts +3 -2
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +61 -22
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/repository/chatter-message-details.repository.d.ts.map +1 -1
- package/dist/repository/chatter-message-details.repository.js +7 -3
- package/dist/repository/chatter-message-details.repository.js.map +1 -1
- package/dist/repository/chatter-message.repository.d.ts.map +1 -1
- package/dist/repository/chatter-message.repository.js +4 -0
- package/dist/repository/chatter-message.repository.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +78 -5
- package/dist/services/ai-interaction.service.d.ts +2 -1
- package/dist/services/ai-interaction.service.d.ts.map +1 -1
- package/dist/services/ai-interaction.service.js +15 -3
- package/dist/services/ai-interaction.service.js.map +1 -1
- package/dist/services/authentication.service.d.ts +2 -3
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +4 -4
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts +16 -3
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +120 -25
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/refresh-token-ids-storage.service.d.ts +2 -1
- package/dist/services/refresh-token-ids-storage.service.d.ts.map +1 -1
- package/dist/services/refresh-token-ids-storage.service.js +6 -7
- package/dist/services/refresh-token-ids-storage.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/config/iam.config.ts +2 -2
- package/src/constants/chatter-message.constants.ts +11 -0
- package/src/controllers/ai-interaction.controller.ts +1 -1
- package/src/controllers/chatter-message-details.controller.ts +44 -44
- package/src/controllers/chatter-message.controller.ts +58 -38
- package/src/controllers/service.controller.ts +2 -2
- package/src/dtos/invoke-ai-prompt.dto.ts +5 -1
- package/src/entities/chatter-message-details.entity.ts +3 -0
- package/src/entities/chatter-message.entity.ts +9 -2
- package/src/entities/user.entity.ts +2 -0
- package/src/interfaces.ts +2 -1
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +108 -25
- package/src/repository/chatter-message-details.repository.ts +6 -5
- package/src/repository/chatter-message.repository.ts +2 -0
- package/src/seeders/seed-data/solid-core-metadata.json +78 -5
- package/src/services/ai-interaction.service.ts +24 -3
- package/src/services/authentication.service.ts +9 -4
- package/src/services/chatter-message.service.ts +143 -24
- package/src/services/refresh-token-ids-storage.service.ts +11 -7
|
@@ -31,8 +31,12 @@ const request_context_service_1 = require("./request-context.service");
|
|
|
31
31
|
const chatter_message_repository_1 = require("../repository/chatter-message.repository");
|
|
32
32
|
const string_helper_1 = require("../helpers/string.helper");
|
|
33
33
|
const model_metadata_helper_service_1 = require("../helpers/model-metadata-helper.service");
|
|
34
|
+
const chatter_message_details_repository_1 = require("../repository/chatter-message-details.repository");
|
|
35
|
+
const field_metadata_entity_1 = require("../entities/field-metadata.entity");
|
|
36
|
+
const chatter_message_constants_1 = require("../constants/chatter-message.constants");
|
|
37
|
+
const strings_1 = require("@angular-devkit/core/src/utils/strings");
|
|
34
38
|
let ChatterMessageService = class ChatterMessageService extends crud_service_1.CRUDService {
|
|
35
|
-
constructor(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, chatterMessageDetailsRepo, moduleRef, modelMetadataRepo, requestContextService, modelMetadataHelperService) {
|
|
39
|
+
constructor(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, chatterMessageDetailsRepo, fieldMetadataRepo, moduleRef, modelMetadataRepo, requestContextService, modelMetadataHelperService) {
|
|
36
40
|
super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);
|
|
37
41
|
this.modelMetadataService = modelMetadataService;
|
|
38
42
|
this.moduleMetadataService = moduleMetadataService;
|
|
@@ -43,6 +47,7 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
|
|
|
43
47
|
this.entityManager = entityManager;
|
|
44
48
|
this.repo = repo;
|
|
45
49
|
this.chatterMessageDetailsRepo = chatterMessageDetailsRepo;
|
|
50
|
+
this.fieldMetadataRepo = fieldMetadataRepo;
|
|
46
51
|
this.moduleRef = moduleRef;
|
|
47
52
|
this.modelMetadataRepo = modelMetadataRepo;
|
|
48
53
|
this.requestContextService = requestContextService;
|
|
@@ -50,8 +55,8 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
|
|
|
50
55
|
}
|
|
51
56
|
async postMessage(postDto, files = []) {
|
|
52
57
|
const chatterMessage = new chatter_message_entity_1.ChatterMessage();
|
|
53
|
-
chatterMessage.messageType =
|
|
54
|
-
chatterMessage.messageSubType = postDto.messageSubType ||
|
|
58
|
+
chatterMessage.messageType = chatter_message_constants_1.CHATTER_MESSAGE_TYPE.CUSTOM;
|
|
59
|
+
chatterMessage.messageSubType = postDto.messageSubType || chatter_message_constants_1.CHATTER_MESSAGE_SUBTYPE.CUSTOM;
|
|
55
60
|
chatterMessage.messageBody = postDto.messageBody;
|
|
56
61
|
chatterMessage.coModelEntityId = postDto.coModelEntityId;
|
|
57
62
|
chatterMessage.coModelName = postDto.coModelName;
|
|
@@ -95,7 +100,8 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
|
|
|
95
100
|
},
|
|
96
101
|
relations: {
|
|
97
102
|
fields: true,
|
|
98
|
-
module: true
|
|
103
|
+
module: true,
|
|
104
|
+
userKeyField: true
|
|
99
105
|
}
|
|
100
106
|
});
|
|
101
107
|
if (!model || !model.enableAuditTracking) {
|
|
@@ -106,11 +112,13 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
|
|
|
106
112
|
!(field.type === 'relation' && field.relationType === 'one-to-many'));
|
|
107
113
|
const activeUser = this.requestContextService.getActiveUser();
|
|
108
114
|
const chatterMessage = new chatter_message_entity_1.ChatterMessage();
|
|
109
|
-
chatterMessage.messageType =
|
|
110
|
-
chatterMessage.messageSubType =
|
|
115
|
+
chatterMessage.messageType = chatter_message_constants_1.CHATTER_MESSAGE_TYPE.AUDIT;
|
|
116
|
+
chatterMessage.messageSubType = chatter_message_constants_1.CHATTER_MESSAGE_SUBTYPE.AUDIT_INSERT;
|
|
111
117
|
chatterMessage.coModelEntityId = entity.id;
|
|
112
|
-
chatterMessage.coModelName = model
|
|
113
|
-
chatterMessage.
|
|
118
|
+
chatterMessage.coModelName = model?.singularName;
|
|
119
|
+
chatterMessage.modelDisplayName = model?.displayName;
|
|
120
|
+
chatterMessage.modelUserKey = entity[model?.userKeyField?.name];
|
|
121
|
+
chatterMessage.messageBody = `New ${model?.displayName} created`;
|
|
114
122
|
if (activeUser) {
|
|
115
123
|
const userId = activeUser?.sub;
|
|
116
124
|
chatterMessage.user = { id: userId };
|
|
@@ -125,6 +133,7 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
|
|
|
125
133
|
const messageDetail = new chatter_message_details_entity_1.ChatterMessageDetails();
|
|
126
134
|
messageDetail.chatterMessage = savedMessage;
|
|
127
135
|
messageDetail.fieldName = field.name;
|
|
136
|
+
messageDetail.fieldDisplayName = field.displayName;
|
|
128
137
|
messageDetail.oldValue = null;
|
|
129
138
|
messageDetail.oldValueDisplay = null;
|
|
130
139
|
messageDetail.newValue = this.formatFieldValue(field, fieldValue);
|
|
@@ -143,7 +152,8 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
|
|
|
143
152
|
},
|
|
144
153
|
relations: {
|
|
145
154
|
fields: true,
|
|
146
|
-
module: true
|
|
155
|
+
module: true,
|
|
156
|
+
userKeyField: true
|
|
147
157
|
}
|
|
148
158
|
});
|
|
149
159
|
if (!model || !model.enableAuditTracking) {
|
|
@@ -197,11 +207,13 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
|
|
|
197
207
|
}
|
|
198
208
|
const activeUser = this.requestContextService.getActiveUser();
|
|
199
209
|
const chatterMessage = new chatter_message_entity_1.ChatterMessage();
|
|
200
|
-
chatterMessage.messageType =
|
|
201
|
-
chatterMessage.messageSubType =
|
|
202
|
-
chatterMessage.coModelEntityId = entity
|
|
203
|
-
chatterMessage.coModelName = model
|
|
204
|
-
chatterMessage.
|
|
210
|
+
chatterMessage.messageType = chatter_message_constants_1.CHATTER_MESSAGE_TYPE.AUDIT;
|
|
211
|
+
chatterMessage.messageSubType = chatter_message_constants_1.CHATTER_MESSAGE_SUBTYPE.AUDIT_UPDATE;
|
|
212
|
+
chatterMessage.coModelEntityId = entity?.id;
|
|
213
|
+
chatterMessage.coModelName = model?.singularName;
|
|
214
|
+
chatterMessage.modelDisplayName = model.displayName;
|
|
215
|
+
chatterMessage.modelUserKey = entity[model?.userKeyField?.name];
|
|
216
|
+
chatterMessage.messageBody = `${model?.displayName} updated`;
|
|
205
217
|
if (activeUser) {
|
|
206
218
|
const userId = activeUser?.sub;
|
|
207
219
|
chatterMessage.user = { id: userId };
|
|
@@ -214,6 +226,7 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
|
|
|
214
226
|
const messageDetail = new chatter_message_details_entity_1.ChatterMessageDetails();
|
|
215
227
|
messageDetail.chatterMessage = savedMessage;
|
|
216
228
|
messageDetail.fieldName = field.name;
|
|
229
|
+
messageDetail.fieldDisplayName = field.displayName;
|
|
217
230
|
messageDetail.oldValue = this.formatFieldValue(field, oldValue);
|
|
218
231
|
messageDetail.newValue = this.formatFieldValue(field, newValue);
|
|
219
232
|
messageDetail.oldValueDisplay = this.formatFieldValueDisplay(field, oldValue);
|
|
@@ -228,18 +241,21 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
|
|
|
228
241
|
},
|
|
229
242
|
relations: {
|
|
230
243
|
fields: true,
|
|
231
|
-
module: true
|
|
244
|
+
module: true,
|
|
245
|
+
userKeyField: true
|
|
232
246
|
}
|
|
233
247
|
});
|
|
234
248
|
if (!model || !model.enableAuditTracking) {
|
|
235
249
|
return;
|
|
236
250
|
}
|
|
237
251
|
const chatterMessage = new chatter_message_entity_1.ChatterMessage();
|
|
238
|
-
chatterMessage.messageType =
|
|
239
|
-
chatterMessage.messageSubType =
|
|
240
|
-
chatterMessage.coModelEntityId = databaseEntity
|
|
241
|
-
chatterMessage.coModelName = model
|
|
242
|
-
chatterMessage.
|
|
252
|
+
chatterMessage.messageType = chatter_message_constants_1.CHATTER_MESSAGE_TYPE.AUDIT;
|
|
253
|
+
chatterMessage.messageSubType = chatter_message_constants_1.CHATTER_MESSAGE_SUBTYPE.AUDIT_DELETE;
|
|
254
|
+
chatterMessage.coModelEntityId = databaseEntity?.id;
|
|
255
|
+
chatterMessage.coModelName = model?.singularName;
|
|
256
|
+
chatterMessage.modelDisplayName = model?.displayName;
|
|
257
|
+
chatterMessage.modelUserKey = entity[model?.userKeyField?.name];
|
|
258
|
+
chatterMessage.messageBody = `${model?.displayName} deleted`;
|
|
243
259
|
const activeUser = this.requestContextService.getActiveUser();
|
|
244
260
|
if (activeUser) {
|
|
245
261
|
const userId = activeUser?.sub;
|
|
@@ -261,7 +277,7 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
|
|
|
261
277
|
if (field.relationType === "many-to-one") {
|
|
262
278
|
return value.id;
|
|
263
279
|
}
|
|
264
|
-
if (field.relationType === '
|
|
280
|
+
if (field.relationType === 'many-to-many') {
|
|
265
281
|
return value.map(item => item.id).join(', ');
|
|
266
282
|
}
|
|
267
283
|
}
|
|
@@ -278,7 +294,7 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
|
|
|
278
294
|
if (field.relationType === "many-to-one") {
|
|
279
295
|
return value.name;
|
|
280
296
|
}
|
|
281
|
-
if (field.relationType === 'many-
|
|
297
|
+
if (field.relationType === 'many-to-many') {
|
|
282
298
|
return value.map(item => item.name).join(', ');
|
|
283
299
|
}
|
|
284
300
|
}
|
|
@@ -324,7 +340,7 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
|
|
|
324
340
|
const oldId = this.extractRelationId(oldValue);
|
|
325
341
|
return newId !== oldId;
|
|
326
342
|
}
|
|
327
|
-
if (field.relationType === 'many-to-many'
|
|
343
|
+
if (field.relationType === 'many-to-many') {
|
|
328
344
|
const newIds = this.extractRelationIds(newValue);
|
|
329
345
|
const oldIds = this.extractRelationIds(oldValue);
|
|
330
346
|
if (newIds.length !== oldIds.length) {
|
|
@@ -397,13 +413,91 @@ let ChatterMessageService = class ChatterMessageService extends crud_service_1.C
|
|
|
397
413
|
}
|
|
398
414
|
return populatedEntity;
|
|
399
415
|
}
|
|
416
|
+
async getChatterMessages(entityId, entityName, query) {
|
|
417
|
+
const { limit = 25, offset = 0, sort, populate = [] } = query;
|
|
418
|
+
const model = await this.modelMetadataRepo.findOne({
|
|
419
|
+
where: {
|
|
420
|
+
singularName: entityName
|
|
421
|
+
},
|
|
422
|
+
});
|
|
423
|
+
const oneToManyFields = await this.fieldMetadataRepo.find({
|
|
424
|
+
where: {
|
|
425
|
+
model: { id: model.id },
|
|
426
|
+
type: 'relation',
|
|
427
|
+
relationType: 'one-to-many'
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
const relatedEntitiesMap = new Map();
|
|
431
|
+
for (const field of oneToManyFields) {
|
|
432
|
+
const coModelName = field.relationCoModelSingularName;
|
|
433
|
+
const coModelFieldName = field.relationCoModelFieldName;
|
|
434
|
+
const coModel = await this.modelMetadataRepo.findOne({
|
|
435
|
+
where: { singularName: coModelName }
|
|
436
|
+
});
|
|
437
|
+
if (coModel) {
|
|
438
|
+
const relatedEntityRepository = this.entityManager.getRepository((0, strings_1.classify)(coModelName));
|
|
439
|
+
const relatedEntities = await relatedEntityRepository.find({
|
|
440
|
+
where: { [coModelFieldName]: { id: entityId } }
|
|
441
|
+
});
|
|
442
|
+
const relatedIds = relatedEntities.map((entity) => entity.id);
|
|
443
|
+
relatedEntitiesMap.set(field.name, relatedIds);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
const qb = this.repo.createQueryBuilder('entity');
|
|
447
|
+
const orConditions = [];
|
|
448
|
+
const parameters = {};
|
|
449
|
+
orConditions.push('(entity.coModelName = :entityName AND entity.coModelEntityId = :entityId)');
|
|
450
|
+
parameters.entityName = entityName;
|
|
451
|
+
parameters.entityId = entityId;
|
|
452
|
+
let paramIndex = 0;
|
|
453
|
+
for (const [fieldName, relatedIds] of relatedEntitiesMap.entries()) {
|
|
454
|
+
if (relatedIds.length > 0) {
|
|
455
|
+
const field = oneToManyFields.find(f => f.name === fieldName);
|
|
456
|
+
if (field) {
|
|
457
|
+
const coModelName = field.relationCoModelSingularName;
|
|
458
|
+
const idsParamName = `relatedIds${paramIndex}`;
|
|
459
|
+
orConditions.push(`(entity.coModelName = :coModelName${paramIndex} AND entity.coModelEntityId IN (:...${idsParamName}))`);
|
|
460
|
+
parameters[`coModelName${paramIndex}`] = coModelName;
|
|
461
|
+
parameters[idsParamName] = relatedIds;
|
|
462
|
+
paramIndex++;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
qb.where(orConditions.join(' OR '), parameters);
|
|
467
|
+
const relations = ['chatterMessageDetails', 'user'];
|
|
468
|
+
if (populate && populate.length > 0) {
|
|
469
|
+
const normalizedPopulate = this.crudHelperService.normalize(populate);
|
|
470
|
+
relations.push(...normalizedPopulate.filter(rel => !relations.includes(rel)));
|
|
471
|
+
}
|
|
472
|
+
relations.forEach(relation => {
|
|
473
|
+
qb.leftJoinAndSelect(`entity.${relation}`, relation);
|
|
474
|
+
});
|
|
475
|
+
qb.orderBy('entity.createdAt', 'DESC');
|
|
476
|
+
qb.skip(offset).take(limit);
|
|
477
|
+
const [entities, count] = await qb.getManyAndCount();
|
|
478
|
+
const currentPage = Math.floor(offset / limit) + 1;
|
|
479
|
+
const totalPages = Math.ceil(count / limit);
|
|
480
|
+
const nextPage = currentPage < totalPages ? currentPage + 1 : null;
|
|
481
|
+
const prevPage = currentPage > 1 ? currentPage - 1 : null;
|
|
482
|
+
return {
|
|
483
|
+
meta: {
|
|
484
|
+
totalRecords: count,
|
|
485
|
+
currentPage: currentPage,
|
|
486
|
+
nextPage: nextPage,
|
|
487
|
+
prevPage: prevPage,
|
|
488
|
+
totalPages: totalPages,
|
|
489
|
+
perPage: +limit,
|
|
490
|
+
},
|
|
491
|
+
records: entities
|
|
492
|
+
};
|
|
493
|
+
}
|
|
400
494
|
};
|
|
401
495
|
exports.ChatterMessageService = ChatterMessageService;
|
|
402
496
|
exports.ChatterMessageService = ChatterMessageService = __decorate([
|
|
403
497
|
(0, common_1.Injectable)(),
|
|
404
498
|
__param(6, (0, typeorm_1.InjectEntityManager)()),
|
|
405
|
-
__param(
|
|
406
|
-
__param(
|
|
499
|
+
__param(9, (0, typeorm_1.InjectRepository)(field_metadata_entity_1.FieldMetadata, 'default')),
|
|
500
|
+
__param(11, (0, typeorm_1.InjectRepository)(model_metadata_entity_1.ModelMetadata)),
|
|
407
501
|
__metadata("design:paramtypes", [model_metadata_service_1.ModelMetadataService,
|
|
408
502
|
module_metadata_service_1.ModuleMetadataService,
|
|
409
503
|
config_1.ConfigService,
|
|
@@ -412,6 +506,7 @@ exports.ChatterMessageService = ChatterMessageService = __decorate([
|
|
|
412
506
|
crud_helper_service_1.CrudHelperService,
|
|
413
507
|
typeorm_2.EntityManager,
|
|
414
508
|
chatter_message_repository_1.ChatterMessageRepository,
|
|
509
|
+
chatter_message_details_repository_1.ChatterMessageDetailsRepository,
|
|
415
510
|
typeorm_2.Repository,
|
|
416
511
|
core_1.ModuleRef,
|
|
417
512
|
typeorm_2.Repository,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatter-message.service.js","sourceRoot":"","sources":["../../src/services/chatter-message.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, Repository, EntityMetadata } from 'typeorm';\n\nimport { CRUDService } from 'src/services/crud.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { ConfigService } from '@nestjs/config';\nimport { FileService } from 'src/services/file.service';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { PostChatterMessageDto } from 'src/dtos/post-chatter-message.dto';\nimport { ChatterMessage } from '../entities/chatter-message.entity';\nimport { getMediaStorageProvider } from './mediaStorageProviders';\nimport { MediaStorageProviderType } from '../dtos/create-media-storage-provider-metadata.dto';\nimport { ChatterMessageDetails } from '../entities/chatter-message-details.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { RequestContextService } from './request-context.service';\nimport { ChatterMessageRepository } from 'src/repository/chatter-message.repository';\nimport { lowerFirst } from 'src/helpers/string.helper';\nimport { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';\n@Injectable()\nexport class ChatterMessageService extends CRUDService<ChatterMessage> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(ChatterMessage, 'default')\n readonly repo: ChatterMessageRepository,\n @InjectRepository(ChatterMessageDetails, 'default')\n readonly chatterMessageDetailsRepo: Repository<ChatterMessageDetails>,\n readonly moduleRef: ModuleRef,\n @InjectRepository(ModelMetadata)\n private readonly modelMetadataRepo: Repository<ModelMetadata>,\n readonly requestContextService: RequestContextService,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);\n }\n\n async postMessage(postDto: PostChatterMessageDto, files: Express.Multer.File[] = []) {\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = 'custom';\n chatterMessage.messageSubType = postDto.messageSubType || 'post_message';\n chatterMessage.messageBody = postDto.messageBody;\n chatterMessage.coModelEntityId = postDto.coModelEntityId;\n chatterMessage.coModelName = postDto.coModelName;\n\n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n if (files && files.length > 0) {\n const model = await this.modelMetadataService.findOneBySingularName('chatterMessage', {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n\n const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');\n\n for (const mediaField of mediaFields) {\n const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);\n if (media.length > 0) {\n const storageProviderMetadata = mediaField.mediaStorageProvider;\n const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.store(media, savedMessage, mediaField);\n }\n }\n }\n\n return savedMessage;\n }\n\n async postAuditMessageOnInsert(entity: any, metadata: EntityMetadata, messageQueue: boolean = false) {\n if (!entity) {\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const auditFields = model.fields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = 'audit';\n chatterMessage.messageSubType = 'insert';\n chatterMessage.coModelEntityId = entity.id;\n chatterMessage.coModelName = model.singularName;\n chatterMessage.messageBody = `New ${model.displayName} created`;\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const field of auditFields) {\n const fieldValue = entity[field.name];\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.oldValue = null;\n messageDetail.oldValueDisplay = null;\n messageDetail.newValue = this.formatFieldValue(field, fieldValue);\n messageDetail.newValueDisplay = this.formatFieldValueDisplay(field, fieldValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n }\n\n async postAuditMessageOnUpdate(entity: any, metadata: EntityMetadata, databaseEntity: any, updatedColumns: any[] = [], messageQueue: boolean = false) {\n if (!databaseEntity || !entity) {\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const modelFields = await this.modelMetadataHelperService.loadFieldHierarchy(model.singularName)\n\n const auditFields = modelFields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const updatedFieldNames = new Set(updatedColumns.map(col => col.propertyName));\n\n const allNonRelationFields = auditFields.filter(field => field.type !== 'relation');\n const allRelationFields = auditFields.filter(field => field.type === 'relation');\n\n let potentialNonRelationFields = [];\n\n if (updatedColumns.length > 0) {\n potentialNonRelationFields = allNonRelationFields.filter(field =>\n updatedFieldNames.has(field.name)\n );\n } else {\n potentialNonRelationFields = allNonRelationFields;\n }\n\n const potentialRelationFields = allRelationFields;\n\n const changedNonRelationFields = potentialNonRelationFields.filter(field => {\n const newValue = entity[field.name];\n const oldValue = databaseEntity[field.name];\n return this.hasValueChanged(newValue, oldValue);\n });\n\n const changedRelationFields = [];\n if (potentialRelationFields.length > 0) {\n const populatedOldEntity = await this.populateRelationFields(databaseEntity, potentialRelationFields, metadata);\n\n for (const field of potentialRelationFields) {\n const newValue = entity[field.name];\n const oldValue = populatedOldEntity[field.name];\n\n if (this.hasRelationValueChanged(field, newValue, oldValue)) {\n changedRelationFields.push({\n field,\n newValue,\n oldValue\n });\n }\n }\n }\n\n\n const allChangedFields = [\n ...changedNonRelationFields.map(field => ({\n field,\n newValue: entity[field.name],\n oldValue: databaseEntity[field.name]\n })),\n ...changedRelationFields\n ];\n\n if (allChangedFields.length === 0) {\n return;\n }\n\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = 'audit';\n chatterMessage.messageSubType = 'update';\n chatterMessage.coModelEntityId = entity.id;\n chatterMessage.coModelName = model.singularName;\n chatterMessage.messageBody = `${model.displayName} updated`;\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const { field, newValue, oldValue } of allChangedFields) {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.oldValue = this.formatFieldValue(field, oldValue);\n messageDetail.newValue = this.formatFieldValue(field, newValue);\n messageDetail.oldValueDisplay = this.formatFieldValueDisplay(field, oldValue);\n messageDetail.newValueDisplay = this.formatFieldValueDisplay(field, newValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n\n async postAuditMessageOnDelete(entity: any, metadata: EntityMetadata, databaseEntity: any, messageQueue: boolean = false) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = 'audit';\n chatterMessage.messageSubType = 'delete';\n chatterMessage.coModelEntityId = databaseEntity.id;\n chatterMessage.coModelName = model.singularName;\n chatterMessage.messageBody = `${model.displayName} deleted`;\n\n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n await this.repo.save(chatterMessage);\n }\n\n private formatFieldValue(field: any, value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n return value.id;\n }\n if (field.relationType === 'manyToMany') {\n return value.map(item => item.id).join(', ');\n }\n }\n\n\n return value.toString();\n }\n\n private formatFieldValueDisplay(field: any, value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n return value.name;\n }\n if (field.relationType === 'many-toMany') {\n return value.map(item => item.name).join(', ');\n }\n }\n\n\n return value.toString();\n }\n\n private hasValueChanged(newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n\n if (newValue === null && oldValue === null) {\n return false;\n }\n\n if (newValue === undefined && oldValue === undefined) {\n return false;\n }\n\n if (newValue && oldValue && typeof newValue === 'object' && typeof oldValue === 'object') {\n if (newValue.id !== undefined && oldValue.id !== undefined) {\n return newValue.id !== oldValue.id;\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n if (newValue.length !== oldValue.length) {\n return true;\n }\n const newIds = newValue.map(item => item.id || item).sort();\n const oldIds = oldValue.map(item => item.id || item).sort();\n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n return JSON.stringify(newValue) !== JSON.stringify(oldValue);\n }\n\n return true;\n }\n\n private hasRelationValueChanged(field: any, newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n\n if ((newValue === null || newValue === undefined) && (oldValue === null || oldValue === undefined)) {\n return false;\n }\n\n if (field.relationType === 'many-to-one') {\n const newId = this.extractRelationId(newValue);\n const oldId = this.extractRelationId(oldValue);\n return newId !== oldId;\n }\n\n if (field.relationType === 'many-to-many' || field.relationType === 'manyToMany') {\n const newIds = this.extractRelationIds(newValue);\n const oldIds = this.extractRelationIds(oldValue);\n\n if (newIds.length !== oldIds.length) {\n return true;\n }\n\n newIds.sort();\n oldIds.sort();\n\n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n\n return this.hasValueChanged(newValue, oldValue);\n }\n\n private extractRelationId(value: any): any {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'object' && value.id !== undefined) {\n return value.id;\n }\n\n return null;\n }\n\n private extractRelationIds(value: any): any[] {\n if (!Array.isArray(value)) {\n const id = this.extractRelationId(value);\n return id !== null ? [id] : [];\n }\n\n return value.map(item => this.extractRelationId(item)).filter(id => id !== null);\n }\n\n private async populateRelationFields(databaseEntity: any, relationFields: any[], metadata: EntityMetadata): Promise<any> {\n const populatedEntity = { ...databaseEntity };\n\n for (const field of relationFields) {\n const relationValue = databaseEntity[field.name];\n\n if (relationValue === null || relationValue === undefined) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const relationMetadata = metadata.relations.find(rel => rel.propertyName === field.name);\n if (!relationMetadata) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const targetEntity = relationMetadata.inverseEntityMetadata || relationMetadata.type;\n\n if (field.relationType === 'many-to-one') {\n const relationId = this.extractRelationId(relationValue);\n if (relationId) {\n const relatedEntity = await this.entityManager.findOne(targetEntity as any, {\n where: { id: relationId }\n });\n populatedEntity[field.name] = relatedEntity;\n } else {\n populatedEntity[field.name] = relationValue;\n }\n } else if (field.relationType === 'many-to-many' || field.relationType === 'manyToMany') {\n const relationIds = this.extractRelationIds(relationValue);\n if (relationIds.length > 0) {\n const relatedEntities = await this.entityManager.findByIds(targetEntity as any, relationIds);\n populatedEntity[field.name] = relatedEntities;\n } else {\n populatedEntity[field.name] = relationValue;\n }\n } else {\n populatedEntity[field.name] = relationValue;\n }\n }\n\n return populatedEntity;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chatter-message.service.js","sourceRoot":"","sources":["../../src/services/chatter-message.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, Repository, EntityMetadata } from 'typeorm';\n\nimport { CRUDService } from 'src/services/crud.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { ConfigService } from '@nestjs/config';\nimport { FileService } from 'src/services/file.service';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { PostChatterMessageDto } from 'src/dtos/post-chatter-message.dto';\nimport { ChatterMessage } from '../entities/chatter-message.entity';\nimport { getMediaStorageProvider } from './mediaStorageProviders';\nimport { MediaStorageProviderType } from '../dtos/create-media-storage-provider-metadata.dto';\nimport { ChatterMessageDetails } from '../entities/chatter-message-details.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { RequestContextService } from './request-context.service';\nimport { ChatterMessageRepository } from 'src/repository/chatter-message.repository';\nimport { lowerFirst } from 'src/helpers/string.helper';\nimport { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';\nimport { ChatterMessageDetailsRepository } from 'src/repository/chatter-message-details.repository';\nimport { FieldMetadata } from 'src/entities/field-metadata.entity';\nimport { CHATTER_MESSAGE_TYPE, CHATTER_MESSAGE_SUBTYPE } from 'src/constants/chatter-message.constants';\nimport { classify } from '@angular-devkit/core/src/utils/strings';\n@Injectable()\nexport class ChatterMessageService extends CRUDService<ChatterMessage> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(ChatterMessage, 'default')\n readonly repo: ChatterMessageRepository,\n // @InjectRepository(ChatterMessageDetailsRepository, 'default')\n readonly chatterMessageDetailsRepo: ChatterMessageDetailsRepository,\n @InjectRepository(FieldMetadata, 'default')\n readonly fieldMetadataRepo: Repository<FieldMetadata>,\n readonly moduleRef: ModuleRef,\n @InjectRepository(ModelMetadata)\n private readonly modelMetadataRepo: Repository<ModelMetadata>,\n readonly requestContextService: RequestContextService,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);\n }\n\n async postMessage(postDto: PostChatterMessageDto, files: Express.Multer.File[] = []) {\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.CUSTOM;\n chatterMessage.messageSubType = postDto.messageSubType || CHATTER_MESSAGE_SUBTYPE.CUSTOM;\n chatterMessage.messageBody = postDto.messageBody;\n chatterMessage.coModelEntityId = postDto.coModelEntityId;\n chatterMessage.coModelName = postDto.coModelName;\n\n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n if (files && files.length > 0) {\n const model = await this.modelMetadataService.findOneBySingularName('chatterMessage', {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n\n const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');\n\n for (const mediaField of mediaFields) {\n const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);\n if (media.length > 0) {\n const storageProviderMetadata = mediaField.mediaStorageProvider;\n const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.store(media, savedMessage, mediaField);\n }\n }\n }\n\n return savedMessage;\n }\n\n async postAuditMessageOnInsert(entity: any, metadata: EntityMetadata, messageQueue: boolean = false) {\n if (!entity) {\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const auditFields = model.fields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_INSERT;\n chatterMessage.coModelEntityId = entity.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model?.displayName;\n chatterMessage.modelUserKey = entity[model?.userKeyField?.name];\n chatterMessage.messageBody = `New ${model?.displayName} created`;\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const field of auditFields) {\n const fieldValue = entity[field.name];\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.fieldDisplayName = field.displayName;\n messageDetail.oldValue = null;\n messageDetail.oldValueDisplay = null;\n messageDetail.newValue = this.formatFieldValue(field, fieldValue);\n messageDetail.newValueDisplay = this.formatFieldValueDisplay(field, fieldValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n }\n\n async postAuditMessageOnUpdate(entity: any, metadata: EntityMetadata, databaseEntity: any, updatedColumns: any[] = [], messageQueue: boolean = false) {\n if (!databaseEntity || !entity) {\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const modelFields = await this.modelMetadataHelperService.loadFieldHierarchy(model.singularName)\n\n const auditFields = modelFields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const updatedFieldNames = new Set(updatedColumns.map(col => col.propertyName));\n\n const allNonRelationFields = auditFields.filter(field => field.type !== 'relation');\n const allRelationFields = auditFields.filter(field => field.type === 'relation');\n\n let potentialNonRelationFields = [];\n\n if (updatedColumns.length > 0) {\n potentialNonRelationFields = allNonRelationFields.filter(field =>\n updatedFieldNames.has(field.name)\n );\n } else {\n potentialNonRelationFields = allNonRelationFields;\n }\n\n const potentialRelationFields = allRelationFields;\n\n const changedNonRelationFields = potentialNonRelationFields.filter(field => {\n const newValue = entity[field.name];\n const oldValue = databaseEntity[field.name];\n return this.hasValueChanged(newValue, oldValue);\n });\n\n const changedRelationFields = [];\n if (potentialRelationFields.length > 0) {\n const populatedOldEntity = await this.populateRelationFields(databaseEntity, potentialRelationFields, metadata);\n\n for (const field of potentialRelationFields) {\n const newValue = entity[field.name];\n const oldValue = populatedOldEntity[field.name];\n\n if (this.hasRelationValueChanged(field, newValue, oldValue)) {\n changedRelationFields.push({\n field,\n newValue,\n oldValue\n });\n }\n }\n }\n\n\n const allChangedFields = [\n ...changedNonRelationFields.map(field => ({\n field,\n newValue: entity[field.name],\n oldValue: databaseEntity[field.name]\n })),\n ...changedRelationFields\n ];\n\n if (allChangedFields.length === 0) {\n return;\n }\n\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_UPDATE;\n chatterMessage.coModelEntityId = entity?.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model.displayName;\n chatterMessage.modelUserKey = entity[model?.userKeyField?.name];\n chatterMessage.messageBody = `${model?.displayName} updated`;\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const { field, newValue, oldValue } of allChangedFields) {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.fieldDisplayName = field.displayName;\n messageDetail.oldValue = this.formatFieldValue(field, oldValue);\n messageDetail.newValue = this.formatFieldValue(field, newValue);\n messageDetail.oldValueDisplay = this.formatFieldValueDisplay(field, oldValue);\n messageDetail.newValueDisplay = this.formatFieldValueDisplay(field, newValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n\n async postAuditMessageOnDelete(entity: any, metadata: EntityMetadata, databaseEntity: any, messageQueue: boolean = false) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(metadata.name)\n },\n relations: {\n fields: true,\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_DELETE;\n chatterMessage.coModelEntityId = databaseEntity?.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model?.displayName;\n chatterMessage.modelUserKey = entity[model?.userKeyField?.name];\n chatterMessage.messageBody = `${model?.displayName} deleted`;\n\n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n await this.repo.save(chatterMessage);\n }\n\n private formatFieldValue(field: any, value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n return value.id;\n }\n if (field.relationType === 'many-to-many') {\n return value.map(item => item.id).join(', ');\n }\n }\n\n\n return value.toString();\n }\n\n private formatFieldValueDisplay(field: any, value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n return value.name;\n }\n if (field.relationType === 'many-to-many') {\n return value.map(item => item.name).join(', ');\n }\n }\n\n\n return value.toString();\n }\n\n private hasValueChanged(newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n\n if (newValue === null && oldValue === null) {\n return false;\n }\n\n if (newValue === undefined && oldValue === undefined) {\n return false;\n }\n\n if (newValue && oldValue && typeof newValue === 'object' && typeof oldValue === 'object') {\n if (newValue.id !== undefined && oldValue.id !== undefined) {\n return newValue.id !== oldValue.id;\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n if (newValue.length !== oldValue.length) {\n return true;\n }\n const newIds = newValue.map(item => item.id || item).sort();\n const oldIds = oldValue.map(item => item.id || item).sort();\n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n return JSON.stringify(newValue) !== JSON.stringify(oldValue);\n }\n\n return true;\n }\n\n private hasRelationValueChanged(field: any, newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n\n if ((newValue === null || newValue === undefined) && (oldValue === null || oldValue === undefined)) {\n return false;\n }\n\n if (field.relationType === 'many-to-one') {\n const newId = this.extractRelationId(newValue);\n const oldId = this.extractRelationId(oldValue);\n return newId !== oldId;\n }\n\n if (field.relationType === 'many-to-many') {\n const newIds = this.extractRelationIds(newValue);\n const oldIds = this.extractRelationIds(oldValue);\n\n if (newIds.length !== oldIds.length) {\n return true;\n }\n\n newIds.sort();\n oldIds.sort();\n\n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n\n return this.hasValueChanged(newValue, oldValue);\n }\n\n private extractRelationId(value: any): any {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'object' && value.id !== undefined) {\n return value.id;\n }\n\n return null;\n }\n\n private extractRelationIds(value: any): any[] {\n if (!Array.isArray(value)) {\n const id = this.extractRelationId(value);\n return id !== null ? [id] : [];\n }\n\n return value.map(item => this.extractRelationId(item)).filter(id => id !== null);\n }\n\n private async populateRelationFields(databaseEntity: any, relationFields: any[], metadata: EntityMetadata): Promise<any> {\n const populatedEntity = { ...databaseEntity };\n\n for (const field of relationFields) {\n const relationValue = databaseEntity[field.name];\n\n if (relationValue === null || relationValue === undefined) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const relationMetadata = metadata.relations.find(rel => rel.propertyName === field.name);\n if (!relationMetadata) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const targetEntity = relationMetadata.inverseEntityMetadata || relationMetadata.type;\n\n if (field.relationType === 'many-to-one') {\n const relationId = this.extractRelationId(relationValue);\n if (relationId) {\n const relatedEntity = await this.entityManager.findOne(targetEntity as any, {\n where: { id: relationId }\n });\n populatedEntity[field.name] = relatedEntity;\n } else {\n populatedEntity[field.name] = relationValue;\n }\n } else if (field.relationType === 'many-to-many' || field.relationType === 'manyToMany') {\n const relationIds = this.extractRelationIds(relationValue);\n if (relationIds.length > 0) {\n const relatedEntities = await this.entityManager.findByIds(targetEntity as any, relationIds);\n populatedEntity[field.name] = relatedEntities;\n } else {\n populatedEntity[field.name] = relationValue;\n }\n } else {\n populatedEntity[field.name] = relationValue;\n }\n }\n\n return populatedEntity;\n }\n\n async getChatterMessages(\n entityId: number,\n entityName: string,\n query: any\n ) {\n const { limit = 25, offset = 0, sort, populate = [] } = query;\n\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: entityName\n },\n });\n const oneToManyFields = await this.fieldMetadataRepo.find({\n where: {\n model: { id: model.id },\n type: 'relation',\n relationType: 'one-to-many'\n }\n });\n\n const relatedEntitiesMap = new Map<string, number[]>();\n\n for (const field of oneToManyFields) {\n const coModelName = field.relationCoModelSingularName;\n const coModelFieldName = field.relationCoModelFieldName;\n\n const coModel = await this.modelMetadataRepo.findOne({\n where: { singularName: coModelName }\n });\n\n if (coModel) {\n const relatedEntityRepository = this.entityManager.getRepository(classify(coModelName));\n\n const relatedEntities = await relatedEntityRepository.find({\n where: { [coModelFieldName]: { id: entityId } }\n });\n\n const relatedIds = relatedEntities.map((entity: any) => entity.id);\n relatedEntitiesMap.set(field.name, relatedIds);\n }\n }\n\n const qb = this.repo.createQueryBuilder('entity');\n\n const orConditions: string[] = [];\n const parameters: any = {};\n\n orConditions.push('(entity.coModelName = :entityName AND entity.coModelEntityId = :entityId)');\n parameters.entityName = entityName;\n parameters.entityId = entityId;\n\n let paramIndex = 0;\n for (const [fieldName, relatedIds] of relatedEntitiesMap.entries()) {\n if (relatedIds.length > 0) {\n const field = oneToManyFields.find(f => f.name === fieldName);\n if (field) {\n const coModelName = field.relationCoModelSingularName;\n const idsParamName = `relatedIds${paramIndex}`;\n orConditions.push(`(entity.coModelName = :coModelName${paramIndex} AND entity.coModelEntityId IN (:...${idsParamName}))`);\n parameters[`coModelName${paramIndex}`] = coModelName;\n parameters[idsParamName] = relatedIds;\n paramIndex++;\n }\n }\n }\n\n qb.where(orConditions.join(' OR '), parameters);\n\n const relations = ['chatterMessageDetails', 'user'];\n if (populate && populate.length > 0) {\n const normalizedPopulate = this.crudHelperService.normalize(populate);\n relations.push(...normalizedPopulate.filter(rel => !relations.includes(rel)));\n }\n\n relations.forEach(relation => {\n qb.leftJoinAndSelect(`entity.${relation}`, relation);\n });\n\n qb.orderBy('entity.createdAt', 'DESC');\n\n qb.skip(offset).take(limit);\n\n const [entities, count] = await qb.getManyAndCount();\n\n const currentPage = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(count / limit);\n const nextPage = currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = currentPage > 1 ? currentPage - 1 : null;\n\n return {\n meta: {\n totalRecords: count,\n currentPage: currentPage,\n nextPage: nextPage,\n prevPage: prevPage,\n totalPages: totalPages,\n perPage: +limit,\n },\n records: entities\n };\n }\n}\n"]}
|
|
@@ -6,10 +6,11 @@ export declare class RefreshTokenIdsStorageService {
|
|
|
6
6
|
private cacheManager;
|
|
7
7
|
private readonly authenticationService;
|
|
8
8
|
constructor(cacheManager: Cache, authenticationService: AuthenticationService);
|
|
9
|
-
insert(userId: number, refreshToken: string): Promise<void>;
|
|
9
|
+
insert(userId: number, refreshToken: string, previousRefreshToken?: string): Promise<void>;
|
|
10
10
|
validate(userId: number, refreshToken: string): Promise<boolean>;
|
|
11
11
|
invalidate(userId: number): Promise<void>;
|
|
12
12
|
validateAndRotate(user: any, refreshToken: string): Promise<string>;
|
|
13
13
|
private getKey;
|
|
14
|
+
getCurrentRefreshTokenState(userId: number): Promise<any>;
|
|
14
15
|
}
|
|
15
16
|
//# sourceMappingURL=refresh-token-ids-storage.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh-token-ids-storage.service.d.ts","sourceRoot":"","sources":["../../src/services/refresh-token-ids-storage.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,qBAAa,4BAA6B,SAAQ,KAAK;CAAI;AAE3D,qBAEa,6BAA6B;IAeX,OAAO,CAAC,YAAY;IAE3C,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBAFP,YAAY,EAAE,KAAK,EAEjC,qBAAqB,EAAE,qBAAqB;IAG3D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"refresh-token-ids-storage.service.d.ts","sourceRoot":"","sources":["../../src/services/refresh-token-ids-storage.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,qBAAa,4BAA6B,SAAQ,KAAK;CAAI;AAE3D,qBAEa,6BAA6B;IAeX,OAAO,CAAC,YAAY;IAE3C,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBAFP,YAAY,EAAE,KAAK,EAEjC,qBAAqB,EAAE,qBAAqB;IAG3D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1F,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqEzE,OAAO,CAAC,MAAM;IAId,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAG5D"}
|
|
@@ -24,11 +24,11 @@ let RefreshTokenIdsStorageService = class RefreshTokenIdsStorageService {
|
|
|
24
24
|
this.cacheManager = cacheManager;
|
|
25
25
|
this.authenticationService = authenticationService;
|
|
26
26
|
}
|
|
27
|
-
async insert(userId, refreshToken) {
|
|
27
|
+
async insert(userId, refreshToken, previousRefreshToken) {
|
|
28
28
|
const existing = (await this.cacheManager.get(this.getKey(userId)));
|
|
29
29
|
const refreshTokenState = {
|
|
30
30
|
currentRefreshToken: refreshToken,
|
|
31
|
-
previousRefreshToken: "",
|
|
31
|
+
previousRefreshToken: previousRefreshToken ?? "",
|
|
32
32
|
};
|
|
33
33
|
await this.cacheManager.set(this.getKey(userId), refreshTokenState);
|
|
34
34
|
}
|
|
@@ -53,11 +53,7 @@ let RefreshTokenIdsStorageService = class RefreshTokenIdsStorageService {
|
|
|
53
53
|
'previousRefreshToken' in refreshTokenState) {
|
|
54
54
|
if (refreshTokenState.currentRefreshToken === refreshToken) {
|
|
55
55
|
valid = true;
|
|
56
|
-
newRefreshToken = await this.authenticationService.generateRefreshToken(user);
|
|
57
|
-
await this.cacheManager.set(this.getKey(user.id), {
|
|
58
|
-
currentRefreshToken: newRefreshToken,
|
|
59
|
-
previousRefreshToken: refreshTokenState.currentRefreshToken,
|
|
60
|
-
});
|
|
56
|
+
newRefreshToken = await this.authenticationService.generateRefreshToken(user, refreshTokenState.currentRefreshToken);
|
|
61
57
|
setTimeout(async () => {
|
|
62
58
|
const state = (await this.cacheManager.get(this.getKey(user.id)));
|
|
63
59
|
if (state && state.currentRefreshToken === newRefreshToken) {
|
|
@@ -82,6 +78,9 @@ let RefreshTokenIdsStorageService = class RefreshTokenIdsStorageService {
|
|
|
82
78
|
getKey(userId) {
|
|
83
79
|
return `user-${userId}`;
|
|
84
80
|
}
|
|
81
|
+
getCurrentRefreshTokenState(userId) {
|
|
82
|
+
return this.cacheManager.get(this.getKey(userId));
|
|
83
|
+
}
|
|
85
84
|
};
|
|
86
85
|
exports.RefreshTokenIdsStorageService = RefreshTokenIdsStorageService;
|
|
87
86
|
exports.RefreshTokenIdsStorageService = RefreshTokenIdsStorageService = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh-token-ids-storage.service.js","sourceRoot":"","sources":["../../src/services/refresh-token-ids-storage.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yDAAsD;AACtD,2CAAgE;AAEhE,qEAAiE;AAGjE,MAAa,4BAA6B,SAAQ,KAAK;CAAI;AAA3D,oEAA2D;AAIpD,IAAM,6BAA6B,GAAnC,MAAM,6BAA6B;IActC,YACmC,YAAmB,EAEjC,qBAA4C;QAF9B,iBAAY,GAAZ,YAAY,CAAO;QAEjC,0BAAqB,GAArB,qBAAqB,CAAuB;IAC7D,CAAC;IAEL,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,YAAoB;
|
|
1
|
+
{"version":3,"file":"refresh-token-ids-storage.service.js","sourceRoot":"","sources":["../../src/services/refresh-token-ids-storage.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { CACHE_MANAGER } from '@nestjs/cache-manager';\nimport { Inject, Injectable, forwardRef } from '@nestjs/common';\nimport { Cache } from 'cache-manager';\nimport { AuthenticationService } from './authentication.service';\n\n// TODO: Ideally this should be in a separate file - putting this here for brevity\nexport class InvalidatedRefreshTokenError extends Error { }\n\n@Injectable()\n// export class RefreshTokenIdsStorageService implements OnApplicationBootstrap, OnApplicationShutdown {\nexport class RefreshTokenIdsStorageService {\n // private redisClient: Redis;\n // onApplicationBootstrap() {\n // // TODO: Ideally, we should move this to the dedicated \"RedisModule\" instead of initiating the connection here.\n // this.redisClient = new Redis({\n // // TODO: According to best practices, we should use the environment variables here instead.\n // host: 'localhost',\n // port: 6379,\n // });\n // }\n // onApplicationShutdown(signal?: string) {\n // return this.redisClient.quit();\n // }\n\n constructor(\n @Inject(CACHE_MANAGER) private cacheManager: Cache,\n @Inject(forwardRef(() => AuthenticationService))\n private readonly authenticationService: AuthenticationService\n ) { }\n\n async insert(userId: number, refreshToken: string, previousRefreshToken?: string): Promise<void> {\n // TODO: save a refresh token object with this shape {\"currentRefreshToken\": \"\", \"previousRefreshToken\": \"\"}\n // Save a refresh token object with the shape: { currentRefreshToken: string, previousRefreshToken: string }\n const existing = (await this.cacheManager.get(this.getKey(userId))) as { currentRefreshToken?: string, previousRefreshToken?: string } | undefined;\n const refreshTokenState = {\n currentRefreshToken: refreshToken,\n previousRefreshToken: previousRefreshToken ?? \"\",\n };\n await this.cacheManager.set(this.getKey(userId), refreshTokenState);\n }\n\n async validate(userId: number, refreshToken: string): Promise<boolean> {\n // TODO: Assume you get this shape out of the cache {\"currentRefreshToken\": \"\", \"previousRefreshToken\": \"\"}\n // Then you will compare against the currentRefreshToken.\n const storedId = await this.cacheManager.get(this.getKey(userId));\n if (storedId !== refreshToken) {\n throw new InvalidatedRefreshTokenError();\n }\n return storedId === refreshToken;\n }\n\n async invalidate(userId: number): Promise<void> {\n await this.cacheManager.del(this.getKey(userId));\n }\n\n async validateAndRotate(user: any, refreshToken: string): Promise<string> {\n let valid = false;\n\n // TODO: Assume you get this shape out of the cache {\"currentRefreshToken\": \"\", \"previousRefreshToken\": \"\"}\n // Then you will compare against the currentRefreshToken.\n const refreshTokenState = await this.cacheManager.get(this.getKey(user.id));\n console.log(\"refreshTokenState\", refreshTokenState);\n\n // Use the authentication service to generate a new refresh token, set it in the currentRefreshToken in scenario 1 and return.\n\n // if UI.refresh_token is matching with Cache.currentRefreshToken\n // then invalidate (updated cache state, no need to delete anything), then generate new token and return.\n // also set a setTimeout to run after X minutes, this will simply update the RefreshTokenCacheState to this object {\"currentRefreshToken\": \"R2\",\"justInvalidatedRefreshToken\": \"\"}\n // valid=true\n\n // - if UI.refresh_token is matching Cache.justInvalidatedRefreshToken \n // then use the Cache.currentRefreshToken, generate new access token and return.\n // We do not modify the cache state at all.\n // valid=true\n\n let newRefreshToken: string | undefined;\n if (\n refreshTokenState &&\n typeof refreshTokenState === 'object' &&\n 'currentRefreshToken' in refreshTokenState &&\n 'previousRefreshToken' in refreshTokenState\n ) {\n if (refreshTokenState.currentRefreshToken === refreshToken) {\n // Scenario 1: Token matches currentRefreshToken\n valid = true;\n // Rotate tokens: move current to previous, set new current (simulate generation)\n newRefreshToken = await this.authenticationService.generateRefreshToken(user, refreshTokenState.currentRefreshToken); // Replace with real token generation logic\n\n\n // updated cache state\n // await this.cacheManager.set(this.getKey(user.id), {\n // currentRefreshToken: newRefreshToken,\n // previousRefreshToken: refreshTokenState.currentRefreshToken,\n // });\n\n // Optionally, set a timeout to clear previousRefreshToken after X minutes\n setTimeout(async () => {\n const state = (await this.cacheManager.get(this.getKey(user.id))) as any;\n if (state && state.currentRefreshToken === newRefreshToken) {\n await this.cacheManager.set(this.getKey(user.id), {\n currentRefreshToken: newRefreshToken,\n previousRefreshToken: \"\",\n });\n }\n }, 1 * 60 * 1000); // 5 minutes\n } else if (refreshTokenState.previousRefreshToken === refreshToken) {\n // Scenario 2: Token matches previousRefreshToken\n valid = true;\n // Do not modify cache\n // Generate new refresh token based on currentRefreshToken\n const existingRefreshTokenState = (await this.cacheManager.get(this.getKey(user.id))) as { currentRefreshToken?: string, previousRefreshToken?: string } | undefined;\n newRefreshToken = existingRefreshTokenState?.currentRefreshToken;\n }\n }\n\n\n if (!valid) {\n throw new InvalidatedRefreshTokenError();\n }\n\n // TODO: return the refresh token either currentRefreshToken\n return newRefreshToken; // Fallback to the provided tokenId if no new token was generated\n }\n\n private getKey(userId: number): string {\n return `user-${userId}`;\n }\n\n getCurrentRefreshTokenState(userId: number): Promise<any> {\n return this.cacheManager.get(this.getKey(userId));\n }\n}\n"]}
|