@solidxai/core 0.1.11-beta.9 → 0.1.12-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/CHANGELOG.md +456 -0
  2. package/dist/controllers/authentication.controller.d.ts +1 -1
  3. package/dist/controllers/chatter-message.controller.d.ts +0 -2
  4. package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
  5. package/dist/controllers/chatter-message.controller.js +0 -16
  6. package/dist/controllers/chatter-message.controller.js.map +1 -1
  7. package/dist/controllers/datasource-introspection.controller.d.ts +8 -0
  8. package/dist/controllers/datasource-introspection.controller.d.ts.map +1 -1
  9. package/dist/controllers/media.controller.js +0 -2
  10. package/dist/controllers/media.controller.js.map +1 -1
  11. package/dist/guards/access-token.guard.d.ts +5 -1
  12. package/dist/guards/access-token.guard.d.ts.map +1 -1
  13. package/dist/guards/access-token.guard.js +31 -3
  14. package/dist/guards/access-token.guard.js.map +1 -1
  15. package/dist/guards/authentication.guard.d.ts +1 -0
  16. package/dist/guards/authentication.guard.d.ts.map +1 -1
  17. package/dist/guards/authentication.guard.js +16 -1
  18. package/dist/guards/authentication.guard.js.map +1 -1
  19. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  20. package/dist/helpers/bootstrap.helper.js +3 -1
  21. package/dist/helpers/bootstrap.helper.js.map +1 -1
  22. package/dist/helpers/environment.helper.d.ts +0 -1
  23. package/dist/helpers/environment.helper.d.ts.map +1 -1
  24. package/dist/helpers/environment.helper.js +0 -4
  25. package/dist/helpers/environment.helper.js.map +1 -1
  26. package/dist/helpers/model-metadata-helper.service.d.ts +1 -2
  27. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  28. package/dist/helpers/model-metadata-helper.service.js +2 -6
  29. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  30. package/dist/helpers/module-metadata-helper.service.js +1 -1
  31. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  32. package/dist/helpers/solid-core-error-codes-provider.service.d.ts.map +1 -1
  33. package/dist/helpers/solid-core-error-codes-provider.service.js +19 -0
  34. package/dist/helpers/solid-core-error-codes-provider.service.js.map +1 -1
  35. package/dist/helpers/solid-registry.d.ts +1 -2
  36. package/dist/helpers/solid-registry.d.ts.map +1 -1
  37. package/dist/helpers/solid-registry.js.map +1 -1
  38. package/dist/index.d.ts +1 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +1 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/interfaces/active-user-data.interface.d.ts +1 -0
  43. package/dist/interfaces/active-user-data.interface.d.ts.map +1 -1
  44. package/dist/interfaces/active-user-data.interface.js.map +1 -1
  45. package/dist/interfaces.d.ts +1 -0
  46. package/dist/interfaces.d.ts.map +1 -1
  47. package/dist/interfaces.js.map +1 -1
  48. package/dist/repository/scheduled-job.repository.d.ts +2 -2
  49. package/dist/repository/scheduled-job.repository.d.ts.map +1 -1
  50. package/dist/repository/scheduled-job.repository.js +3 -6
  51. package/dist/repository/scheduled-job.repository.js.map +1 -1
  52. package/dist/repository/security-rule.repository.d.ts +2 -2
  53. package/dist/repository/security-rule.repository.d.ts.map +1 -1
  54. package/dist/repository/security-rule.repository.js +3 -6
  55. package/dist/repository/security-rule.repository.js.map +1 -1
  56. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  57. package/dist/seeders/module-metadata-seeder.service.js +18 -1
  58. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  59. package/dist/seeders/seed-data/solid-core-metadata.json +62 -34
  60. package/dist/services/active-session-storage.service.d.ts +10 -0
  61. package/dist/services/active-session-storage.service.d.ts.map +1 -0
  62. package/dist/services/active-session-storage.service.js +41 -0
  63. package/dist/services/active-session-storage.service.js.map +1 -0
  64. package/dist/services/authentication.service.d.ts +8 -3
  65. package/dist/services/authentication.service.d.ts.map +1 -1
  66. package/dist/services/authentication.service.js +61 -16
  67. package/dist/services/authentication.service.js.map +1 -1
  68. package/dist/services/chatter-message.service.d.ts +2 -0
  69. package/dist/services/chatter-message.service.d.ts.map +1 -1
  70. package/dist/services/chatter-message.service.js +25 -2
  71. package/dist/services/chatter-message.service.js.map +1 -1
  72. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  73. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +5 -7
  74. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  75. package/dist/services/crud-helper.service.d.ts.map +1 -1
  76. package/dist/services/crud-helper.service.js +7 -0
  77. package/dist/services/crud-helper.service.js.map +1 -1
  78. package/dist/services/crud.service.d.ts.map +1 -1
  79. package/dist/services/crud.service.js +1 -0
  80. package/dist/services/crud.service.js.map +1 -1
  81. package/dist/services/datasource-introspection.service.d.ts +10 -0
  82. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  83. package/dist/services/datasource-introspection.service.js +109 -17
  84. package/dist/services/datasource-introspection.service.js.map +1 -1
  85. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  86. package/dist/services/menu-item-metadata.service.js +1 -0
  87. package/dist/services/menu-item-metadata.service.js.map +1 -1
  88. package/dist/services/model-metadata.service.d.ts +2 -0
  89. package/dist/services/model-metadata.service.d.ts.map +1 -1
  90. package/dist/services/model-metadata.service.js +49 -16
  91. package/dist/services/model-metadata.service.js.map +1 -1
  92. package/dist/services/module-metadata.service.d.ts.map +1 -1
  93. package/dist/services/module-metadata.service.js +0 -28
  94. package/dist/services/module-metadata.service.js.map +1 -1
  95. package/dist/services/refresh-token-ids-storage.service.d.ts +6 -1
  96. package/dist/services/refresh-token-ids-storage.service.d.ts.map +1 -1
  97. package/dist/services/refresh-token-ids-storage.service.js +0 -2
  98. package/dist/services/refresh-token-ids-storage.service.js.map +1 -1
  99. package/dist/services/settings/default-settings-provider.service.d.ts +230 -0
  100. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  101. package/dist/services/settings/default-settings-provider.service.js +116 -0
  102. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  103. package/dist/services/solid-ts-morph.service.d.ts +6 -0
  104. package/dist/services/solid-ts-morph.service.d.ts.map +1 -1
  105. package/dist/services/solid-ts-morph.service.js +43 -0
  106. package/dist/services/solid-ts-morph.service.js.map +1 -1
  107. package/dist/solid-core.module.d.ts.map +1 -1
  108. package/dist/solid-core.module.js +2 -0
  109. package/dist/solid-core.module.js.map +1 -1
  110. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  111. package/dist/subscribers/audit.subscriber.js +2 -8
  112. package/dist/subscribers/audit.subscriber.js.map +1 -1
  113. package/dist/subscribers/computed-entity-field.subscriber.d.ts +0 -8
  114. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  115. package/dist/subscribers/computed-entity-field.subscriber.js +3 -36
  116. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  117. package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -1
  118. package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -1
  119. package/dist/subscribers/field-metadata.subscriber.d.ts.map +1 -1
  120. package/dist/subscribers/field-metadata.subscriber.js.map +1 -1
  121. package/dist/subscribers/scheduled-job.subscriber.d.ts.map +1 -1
  122. package/dist/subscribers/scheduled-job.subscriber.js +2 -3
  123. package/dist/subscribers/scheduled-job.subscriber.js.map +1 -1
  124. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  125. package/dist/subscribers/security-rule.subscriber.js +3 -5
  126. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  127. package/package.json +1 -1
  128. package/src/controllers/chatter-message.controller.ts +7 -7
  129. package/src/controllers/media.controller.ts +1 -1
  130. package/src/guards/access-token.guard.ts +43 -3
  131. package/src/guards/authentication.guard.ts +22 -1
  132. package/src/helpers/bootstrap.helper.ts +9 -3
  133. package/src/helpers/environment.helper.ts +0 -11
  134. package/src/helpers/model-metadata-helper.service.ts +2 -7
  135. package/src/helpers/module-metadata-helper.service.ts +1 -1
  136. package/src/helpers/solid-core-error-codes-provider.service.ts +20 -1
  137. package/src/helpers/solid-registry.ts +1 -7
  138. package/src/index.ts +1 -1
  139. package/src/interfaces/active-user-data.interface.ts +6 -0
  140. package/src/interfaces.ts +1 -0
  141. package/src/repository/scheduled-job.repository.ts +4 -10
  142. package/src/repository/security-rule.repository.ts +4 -10
  143. package/src/seeders/module-metadata-seeder.service.ts +23 -2
  144. package/src/seeders/seed-data/solid-core-metadata.json +62 -34
  145. package/src/services/active-session-storage.service.ts +24 -0
  146. package/src/services/authentication.service.ts +76 -15
  147. package/src/services/chatter-message.service.ts +32 -2
  148. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +5 -11
  149. package/src/services/crud-helper.service.ts +7 -0
  150. package/src/services/crud.service.ts +1 -0
  151. package/src/services/datasource-introspection.service.ts +176 -16
  152. package/src/services/menu-item-metadata.service.ts +2 -1
  153. package/src/services/model-metadata.service.ts +63 -22
  154. package/src/services/module-metadata.service.ts +0 -36
  155. package/src/services/refresh-token-ids-storage.service.ts +9 -8
  156. package/src/services/settings/default-settings-provider.service.ts +116 -1
  157. package/src/services/solid-ts-morph.service.ts +61 -1
  158. package/src/solid-core.module.ts +2 -0
  159. package/src/subscribers/audit.subscriber.ts +2 -11
  160. package/src/subscribers/computed-entity-field.subscriber.ts +6 -63
  161. package/src/subscribers/created-by-updated-by.subscriber.ts +0 -3
  162. package/src/subscribers/field-metadata.subscriber.ts +0 -3
  163. package/src/subscribers/scheduled-job.subscriber.ts +2 -3
  164. package/src/subscribers/security-rule.subscriber.ts +3 -8
  165. package/dist/helpers/nodemon-heartbeat.d.ts +0 -5
  166. package/dist/helpers/nodemon-heartbeat.d.ts.map +0 -1
  167. package/dist/helpers/nodemon-heartbeat.js +0 -67
  168. package/dist/helpers/nodemon-heartbeat.js.map +0 -1
  169. package/src/helpers/nodemon-heartbeat.ts +0 -59
@@ -5304,7 +5304,6 @@
5304
5304
  "SavedFiltersController.update",
5305
5305
  "SavedFiltersController.insertMany",
5306
5306
  "SavedFiltersController.create",
5307
- "ChatterMessageController.create",
5308
5307
  "ChatterMessageController.getChatterMessages",
5309
5308
  "ChatterMessageController.postMessage",
5310
5309
  "ChatterMessageController.findMany",
@@ -6116,7 +6115,8 @@
6116
6115
  "sequenceNumber": 1,
6117
6116
  "actionUserKey": "moduleMetadata-list-action",
6118
6117
  "moduleUserKey": "solid-core",
6119
- "parentMenuItemUserKey": "appBuilder-menu-item"
6118
+ "parentMenuItemUserKey": "appBuilder-menu-item",
6119
+ "iconName": "view_module"
6120
6120
  },
6121
6121
  {
6122
6122
  "displayName": "Model",
@@ -6124,7 +6124,8 @@
6124
6124
  "sequenceNumber": 2,
6125
6125
  "actionUserKey": "modelMetadata-list-action",
6126
6126
  "moduleUserKey": "solid-core",
6127
- "parentMenuItemUserKey": "appBuilder-menu-item"
6127
+ "parentMenuItemUserKey": "appBuilder-menu-item",
6128
+ "iconName": "table_rows"
6128
6129
  },
6129
6130
  {
6130
6131
  "displayName": "Field",
@@ -6132,7 +6133,8 @@
6132
6133
  "sequenceNumber": 3,
6133
6134
  "actionUserKey": "fieldMetadata-list-action",
6134
6135
  "moduleUserKey": "solid-core",
6135
- "parentMenuItemUserKey": "appBuilder-menu-item"
6136
+ "parentMenuItemUserKey": "appBuilder-menu-item",
6137
+ "iconName": "label"
6136
6138
  },
6137
6139
  {
6138
6140
  "displayName": "Datasources",
@@ -6140,7 +6142,8 @@
6140
6142
  "sequenceNumber": 4,
6141
6143
  "actionUserKey": "datasource-management-action",
6142
6144
  "moduleUserKey": "solid-core",
6143
- "parentMenuItemUserKey": "appBuilder-menu-item"
6145
+ "parentMenuItemUserKey": "appBuilder-menu-item",
6146
+ "iconName": "storage"
6144
6147
  },
6145
6148
  {
6146
6149
  "displayName": "Menu Item",
@@ -6148,7 +6151,8 @@
6148
6151
  "sequenceNumber": 1,
6149
6152
  "actionUserKey": "menuItemMetadata-list-action",
6150
6153
  "moduleUserKey": "solid-core",
6151
- "parentMenuItemUserKey": "layoutBuilder-menu-item"
6154
+ "parentMenuItemUserKey": "layoutBuilder-menu-item",
6155
+ "iconName": "menu"
6152
6156
  },
6153
6157
  {
6154
6158
  "displayName": "View",
@@ -6156,7 +6160,8 @@
6156
6160
  "sequenceNumber": 2,
6157
6161
  "actionUserKey": "viewMetadata-list-action",
6158
6162
  "moduleUserKey": "solid-core",
6159
- "parentMenuItemUserKey": "layoutBuilder-menu-item"
6163
+ "parentMenuItemUserKey": "layoutBuilder-menu-item",
6164
+ "iconName": "pageview"
6160
6165
  },
6161
6166
  {
6162
6167
  "displayName": "Action",
@@ -6164,7 +6169,8 @@
6164
6169
  "sequenceNumber": 3,
6165
6170
  "actionUserKey": "actionMetadata-list-action",
6166
6171
  "moduleUserKey": "solid-core",
6167
- "parentMenuItemUserKey": "layoutBuilder-menu-item"
6172
+ "parentMenuItemUserKey": "layoutBuilder-menu-item",
6173
+ "iconName": "bolt"
6168
6174
  },
6169
6175
  {
6170
6176
  "displayName": "User View",
@@ -6172,7 +6178,8 @@
6172
6178
  "sequenceNumber": 5,
6173
6179
  "actionUserKey": "userViewMetadata-list-action",
6174
6180
  "moduleUserKey": "solid-core",
6175
- "parentMenuItemUserKey": "layoutBuilder-menu-item"
6181
+ "parentMenuItemUserKey": "layoutBuilder-menu-item",
6182
+ "iconName": "person"
6176
6183
  },
6177
6184
  {
6178
6185
  "displayName": "Media Management",
@@ -6189,7 +6196,8 @@
6189
6196
  "sequenceNumber": 1,
6190
6197
  "actionUserKey": "media-list-action",
6191
6198
  "moduleUserKey": "solid-core",
6192
- "parentMenuItemUserKey": "mediaManagement-menu-item"
6199
+ "parentMenuItemUserKey": "mediaManagement-menu-item",
6200
+ "iconName": "perm_media"
6193
6201
  },
6194
6202
  {
6195
6203
  "displayName": "Media Storage Provider",
@@ -6197,7 +6205,8 @@
6197
6205
  "sequenceNumber": 2,
6198
6206
  "actionUserKey": "mediaStorageProviderMetadata-list-action",
6199
6207
  "moduleUserKey": "solid-core",
6200
- "parentMenuItemUserKey": "mediaManagement-menu-item"
6208
+ "parentMenuItemUserKey": "mediaManagement-menu-item",
6209
+ "iconName": "cloud"
6201
6210
  },
6202
6211
  {
6203
6212
  "displayName": "IAM",
@@ -6206,7 +6215,7 @@
6206
6215
  "actionUserKey": "",
6207
6216
  "moduleUserKey": "solid-core",
6208
6217
  "parentMenuItemUserKey": "",
6209
- "iconName": "person_shield"
6218
+ "iconName": "manage_accounts"
6210
6219
  },
6211
6220
  {
6212
6221
  "displayName": "User",
@@ -6214,7 +6223,8 @@
6214
6223
  "sequenceNumber": 1,
6215
6224
  "actionUserKey": "user-list-action",
6216
6225
  "moduleUserKey": "solid-core",
6217
- "parentMenuItemUserKey": "iam-menu-item"
6226
+ "parentMenuItemUserKey": "iam-menu-item",
6227
+ "iconName": "person"
6218
6228
  },
6219
6229
  {
6220
6230
  "displayName": "Role",
@@ -6222,7 +6232,8 @@
6222
6232
  "sequenceNumber": 2,
6223
6233
  "actionUserKey": "roleMetadata-list-action",
6224
6234
  "moduleUserKey": "solid-core",
6225
- "parentMenuItemUserKey": "iam-menu-item"
6235
+ "parentMenuItemUserKey": "iam-menu-item",
6236
+ "iconName": "admin_panel_settings"
6226
6237
  },
6227
6238
  {
6228
6239
  "displayName": "Permission",
@@ -6230,7 +6241,8 @@
6230
6241
  "sequenceNumber": 3,
6231
6242
  "actionUserKey": "permissionMetadata-list-action",
6232
6243
  "moduleUserKey": "solid-core",
6233
- "parentMenuItemUserKey": "iam-menu-item"
6244
+ "parentMenuItemUserKey": "iam-menu-item",
6245
+ "iconName": "key"
6234
6246
  },
6235
6247
  {
6236
6248
  "displayName": "Security rules",
@@ -6238,7 +6250,8 @@
6238
6250
  "sequenceNumber": 4,
6239
6251
  "actionUserKey": "securityRule-list-action",
6240
6252
  "moduleUserKey": "solid-core",
6241
- "parentMenuItemUserKey": "iam-menu-item"
6253
+ "parentMenuItemUserKey": "iam-menu-item",
6254
+ "iconName": "gavel"
6242
6255
  },
6243
6256
  {
6244
6257
  "displayName": "User Activity History",
@@ -6246,7 +6259,8 @@
6246
6259
  "sequenceNumber": 5,
6247
6260
  "actionUserKey": "userActivityHistory-list-action",
6248
6261
  "moduleUserKey": "solid-core",
6249
- "parentMenuItemUserKey": "iam-menu-item"
6262
+ "parentMenuItemUserKey": "iam-menu-item",
6263
+ "iconName": "history"
6250
6264
  },
6251
6265
  {
6252
6266
  "displayName": "Queues",
@@ -6263,7 +6277,8 @@
6263
6277
  "sequenceNumber": 1,
6264
6278
  "actionUserKey": "solid-core-queue-health-dashboard-action",
6265
6279
  "moduleUserKey": "solid-core",
6266
- "parentMenuItemUserKey": "queues-menu-item"
6280
+ "parentMenuItemUserKey": "queues-menu-item",
6281
+ "iconName": "analytics"
6267
6282
  },
6268
6283
  {
6269
6284
  "displayName": "Queues",
@@ -6271,7 +6286,8 @@
6271
6286
  "sequenceNumber": 2,
6272
6287
  "actionUserKey": "mqMessageQueue-list-action",
6273
6288
  "moduleUserKey": "solid-core",
6274
- "parentMenuItemUserKey": "queues-menu-item"
6289
+ "parentMenuItemUserKey": "queues-menu-item",
6290
+ "iconName": "dns"
6275
6291
  },
6276
6292
  {
6277
6293
  "displayName": "Messages",
@@ -6279,7 +6295,8 @@
6279
6295
  "sequenceNumber": 3,
6280
6296
  "actionUserKey": "mqMessage-list-action",
6281
6297
  "moduleUserKey": "solid-core",
6282
- "parentMenuItemUserKey": "queues-menu-item"
6298
+ "parentMenuItemUserKey": "queues-menu-item",
6299
+ "iconName": "message"
6283
6300
  },
6284
6301
  {
6285
6302
  "displayName": "Notification",
@@ -6288,7 +6305,7 @@
6288
6305
  "actionUserKey": "",
6289
6306
  "moduleUserKey": "solid-core",
6290
6307
  "parentMenuItemUserKey": "",
6291
- "iconName": "notification_settings"
6308
+ "iconName": "notification_add"
6292
6309
  },
6293
6310
  {
6294
6311
  "displayName": "Email",
@@ -6296,7 +6313,8 @@
6296
6313
  "sequenceNumber": 1,
6297
6314
  "actionUserKey": "emailTemplate-list-action",
6298
6315
  "moduleUserKey": "solid-core",
6299
- "parentMenuItemUserKey": "notification-menu-item"
6316
+ "parentMenuItemUserKey": "notification-menu-item",
6317
+ "iconName": "email"
6300
6318
  },
6301
6319
  {
6302
6320
  "displayName": "SMS",
@@ -6304,7 +6322,8 @@
6304
6322
  "sequenceNumber": 2,
6305
6323
  "actionUserKey": "smsTemplate-list-action",
6306
6324
  "moduleUserKey": "solid-core",
6307
- "parentMenuItemUserKey": "notification-menu-item"
6325
+ "parentMenuItemUserKey": "notification-menu-item",
6326
+ "iconName": "sms"
6308
6327
  },
6309
6328
  {
6310
6329
  "displayName": "Other",
@@ -6313,7 +6332,7 @@
6313
6332
  "actionUserKey": "",
6314
6333
  "moduleUserKey": "solid-core",
6315
6334
  "parentMenuItemUserKey": "",
6316
- "iconName": "other_admission"
6335
+ "iconName": "more_horiz"
6317
6336
  },
6318
6337
  {
6319
6338
  "displayName": "List of Values",
@@ -6321,7 +6340,8 @@
6321
6340
  "sequenceNumber": 1,
6322
6341
  "actionUserKey": "listOfValues-list-action",
6323
6342
  "moduleUserKey": "solid-core",
6324
- "parentMenuItemUserKey": "other-menu-item"
6343
+ "parentMenuItemUserKey": "other-menu-item",
6344
+ "iconName": "list"
6325
6345
  },
6326
6346
  {
6327
6347
  "displayName": "Scheduled Jobs",
@@ -6329,7 +6349,8 @@
6329
6349
  "sequenceNumber": 2,
6330
6350
  "actionUserKey": "scheduledJob-list-action",
6331
6351
  "moduleUserKey": "solid-core",
6332
- "parentMenuItemUserKey": "other-menu-item"
6352
+ "parentMenuItemUserKey": "other-menu-item",
6353
+ "iconName": "event_repeat"
6333
6354
  },
6334
6355
  {
6335
6356
  "displayName": "Saved Filters",
@@ -6337,7 +6358,8 @@
6337
6358
  "sequenceNumber": 4,
6338
6359
  "actionUserKey": "savedFilters-list-action",
6339
6360
  "moduleUserKey": "solid-core",
6340
- "parentMenuItemUserKey": "other-menu-item"
6361
+ "parentMenuItemUserKey": "other-menu-item",
6362
+ "iconName": "filter_list_alt"
6341
6363
  },
6342
6364
  {
6343
6365
  "displayName": "Chatter Message",
@@ -6345,7 +6367,8 @@
6345
6367
  "sequenceNumber": 5,
6346
6368
  "actionUserKey": "chatterMessage-list-action",
6347
6369
  "moduleUserKey": "solid-core",
6348
- "parentMenuItemUserKey": "other-menu-item"
6370
+ "parentMenuItemUserKey": "other-menu-item",
6371
+ "iconName": "forum"
6349
6372
  },
6350
6373
  {
6351
6374
  "displayName": "Locale",
@@ -6353,7 +6376,8 @@
6353
6376
  "sequenceNumber": 7,
6354
6377
  "actionUserKey": "locale-list-action",
6355
6378
  "moduleUserKey": "solid-core",
6356
- "parentMenuItemUserKey": "other-menu-item"
6379
+ "parentMenuItemUserKey": "other-menu-item",
6380
+ "iconName": "language"
6357
6381
  },
6358
6382
  {
6359
6383
  "displayName": "Import Transactions",
@@ -6361,7 +6385,8 @@
6361
6385
  "sequenceNumber": 8,
6362
6386
  "actionUserKey": "importTransaction-list-action",
6363
6387
  "moduleUserKey": "solid-core",
6364
- "parentMenuItemUserKey": "other-menu-item"
6388
+ "parentMenuItemUserKey": "other-menu-item",
6389
+ "iconName": "upload_file"
6365
6390
  },
6366
6391
  {
6367
6392
  "displayName": "Settings",
@@ -6378,7 +6403,8 @@
6378
6403
  "sequenceNumber": 1,
6379
6404
  "actionUserKey": "modelSequence-list-action",
6380
6405
  "moduleUserKey": "solid-core",
6381
- "parentMenuItemUserKey": "other-menu-item"
6406
+ "parentMenuItemUserKey": "other-menu-item",
6407
+ "iconName": "format_list_numbered"
6382
6408
  },
6383
6409
  {
6384
6410
  "displayName": "Dashboard User Layout",
@@ -6387,7 +6413,7 @@
6387
6413
  "actionUserKey": "dashboardUserLayout-list-action",
6388
6414
  "moduleUserKey": "solid-core",
6389
6415
  "parentMenuItemUserKey": "",
6390
- "iconName": ""
6416
+ "iconName": "dashboard_customize"
6391
6417
  },
6392
6418
  {
6393
6419
  "displayName": "Agent",
@@ -6404,7 +6430,8 @@
6404
6430
  "sequenceNumber": 1,
6405
6431
  "actionUserKey": "agentSession-list-action",
6406
6432
  "moduleUserKey": "solid-core",
6407
- "parentMenuItemUserKey": "agent-menu-item"
6433
+ "parentMenuItemUserKey": "agent-menu-item",
6434
+ "iconName": "chat"
6408
6435
  },
6409
6436
  {
6410
6437
  "displayName": "MCP Audit Log",
@@ -6412,7 +6439,8 @@
6412
6439
  "sequenceNumber": 3,
6413
6440
  "actionUserKey": "mcpAuditLog-list-action",
6414
6441
  "moduleUserKey": "solid-core",
6415
- "parentMenuItemUserKey": "agent-menu-item"
6442
+ "parentMenuItemUserKey": "agent-menu-item",
6443
+ "iconName": "fact_check"
6416
6444
  }
6417
6445
  ],
6418
6446
  "views": [
@@ -0,0 +1,24 @@
1
+ import { CACHE_MANAGER } from "@nestjs/cache-manager";
2
+ import { Inject, Injectable } from "@nestjs/common";
3
+ import { Cache } from "cache-manager";
4
+
5
+ @Injectable()
6
+ export class ActiveSessionStorageService {
7
+ constructor(@Inject(CACHE_MANAGER) private readonly cacheManager: Cache) {}
8
+
9
+ async setActiveSession(userId: number, sessionId: string): Promise<void> {
10
+ await this.cacheManager.set(this.getKey(userId), sessionId);
11
+ }
12
+
13
+ async getActiveSession(userId: number): Promise<string | undefined> {
14
+ return this.cacheManager.get(this.getKey(userId));
15
+ }
16
+
17
+ async clearActiveSession(userId: number): Promise<void> {
18
+ await this.cacheManager.del(this.getKey(userId));
19
+ }
20
+
21
+ private getKey(userId: number): string {
22
+ return `active-session-${userId}`;
23
+ }
24
+ }
@@ -39,6 +39,7 @@ import { SignUpDto } from "../dtos/sign-up.dto";
39
39
  import { User } from "../entities/user.entity";
40
40
  import { EventDetails, EventType } from "../interfaces";
41
41
  import { ActiveUserData } from "../interfaces/active-user-data.interface";
42
+ import { ActiveSessionStorageService } from "./active-session-storage.service";
42
43
  import { HashingService } from "./hashing.service";
43
44
  import {
44
45
  InvalidatedRefreshTokenError,
@@ -74,6 +75,7 @@ export class AuthenticationService {
74
75
  private readonly userRepository: UserRepository,
75
76
  private readonly hashingService: HashingService,
76
77
  private readonly jwtService: JwtService,
78
+ private readonly activeSessionStorage: ActiveSessionStorageService,
77
79
  private readonly refreshTokenIdsStorage: RefreshTokenIdsStorageService,
78
80
  private readonly httpService: HttpService,
79
81
  // private readonly mailService: SMTPEMailService,
@@ -1042,13 +1044,15 @@ export class AuthenticationService {
1042
1044
  }
1043
1045
 
1044
1046
  const type = this.resolveLoginType(signInDto);
1045
- const user = await this.findUserForLogin(type, signInDto.identifier);
1046
- const dummyOtp = this.getDummyOtpForUser(user);
1047
- if (!dummyOtp) {
1048
- await this.assignLoginOtp(user, type);
1049
- await this.notifyUserOnOtpInititateLogin(user, type);
1047
+ const user = await this.findUserForLoginOrNull(type, signInDto.identifier);
1048
+ if (user) {
1049
+ const dummyOtp = this.getDummyOtpForUser(user);
1050
+ if (!dummyOtp) {
1051
+ await this.assignLoginOtp(user, type);
1052
+ await this.notifyUserOnOtpInititateLogin(user, type);
1053
+ }
1050
1054
  }
1051
- return this.buildLoginOtpResponse(user, type);
1055
+ return this.buildLoginOtpResponse(type, signInDto.identifier, user);
1052
1056
  }
1053
1057
 
1054
1058
  private resolveLoginType(
@@ -1100,6 +1104,25 @@ export class AuthenticationService {
1100
1104
  return user;
1101
1105
  }
1102
1106
 
1107
+ private async findUserForLoginOrNull(
1108
+ type: PasswordlessLoginValidateWhatSources,
1109
+ identifier: string,
1110
+ options: { withRoles?: boolean } = {},
1111
+ ): Promise<User | null> {
1112
+ try {
1113
+ return await this.findUserForLogin(type, identifier, options);
1114
+ } catch (error) {
1115
+ if (
1116
+ error instanceof UnauthorizedException &&
1117
+ (error.message === ERROR_MESSAGES.USER_NOT_FOUND ||
1118
+ error.message === ERROR_MESSAGES.USER_INACTIVE)
1119
+ ) {
1120
+ return null;
1121
+ }
1122
+ throw error;
1123
+ }
1124
+ }
1125
+
1103
1126
  private async assignLoginOtp(
1104
1127
  user: User,
1105
1128
  type: PasswordlessLoginValidateWhatSources,
@@ -1123,19 +1146,29 @@ export class AuthenticationService {
1123
1146
  }
1124
1147
 
1125
1148
  private buildLoginOtpResponse(
1126
- user: User,
1127
1149
  type: PasswordlessLoginValidateWhatSources,
1150
+ identifier: string,
1151
+ user?: User | null,
1128
1152
  ) {
1129
- const maskedIdentifier =
1130
- type === PasswordlessLoginValidateWhatSources.EMAIL
1131
- ? { email: this.maskEmail(user.email) }
1132
- : { mobile: this.maskMobile(user.mobile) };
1153
+ const maskedIdentifier = this.buildMaskedLoginIdentifier(
1154
+ type,
1155
+ user?.email ?? user?.mobile ?? identifier,
1156
+ );
1133
1157
  return {
1134
1158
  message: SUCCESS_MESSAGES.OTP_SENT_SUCCESS_LOGIN,
1135
1159
  user: maskedIdentifier,
1136
1160
  };
1137
1161
  }
1138
1162
 
1163
+ private buildMaskedLoginIdentifier(
1164
+ type: PasswordlessLoginValidateWhatSources,
1165
+ identifier: string,
1166
+ ) {
1167
+ return type === PasswordlessLoginValidateWhatSources.EMAIL
1168
+ ? { email: this.maskEmail(identifier) }
1169
+ : { mobile: this.maskMobile(identifier) };
1170
+ }
1171
+
1139
1172
  private async notifyUserOnOtpInititateLogin(
1140
1173
  user: User,
1141
1174
  loginType: PasswordlessLoginValidateWhatSources,
@@ -1273,9 +1306,12 @@ export class AuthenticationService {
1273
1306
  throw new BadRequestException(ERROR_MESSAGES.INVALID_VERIFICATION_TYPE);
1274
1307
  }
1275
1308
 
1276
- const user = await this.findUserForLogin(type, identifier, {
1309
+ const user = await this.findUserForLoginOrNull(type, identifier, {
1277
1310
  withRoles: true,
1278
1311
  });
1312
+ if (!user) {
1313
+ throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);
1314
+ }
1279
1315
  this.checkAccountBlocked(user);
1280
1316
  const dummyOtp = this.getDummyOtpForUser(user);
1281
1317
 
@@ -1677,8 +1713,16 @@ export class AuthenticationService {
1677
1713
  }
1678
1714
 
1679
1715
  async generateTokens(user: User) {
1716
+ const sessionId = this.shouldPreventConcurrentLogins()
1717
+ ? randomUUID()
1718
+ : undefined;
1719
+ if (sessionId) {
1720
+ await this.activeSessionStorage.setActiveSession(user.id, sessionId);
1721
+ } else {
1722
+ await this.activeSessionStorage.clearActiveSession(user.id);
1723
+ }
1680
1724
  const [accessToken, refreshToken] = await Promise.all([
1681
- await this.generateAccessToken(user),
1725
+ await this.generateAccessToken(user, sessionId),
1682
1726
  await this.generateRefreshToken(user),
1683
1727
  ]);
1684
1728
 
@@ -1688,16 +1732,24 @@ export class AuthenticationService {
1688
1732
  };
1689
1733
  }
1690
1734
 
1691
- async generateAccessToken(user: User) {
1735
+ async generateAccessToken(user: User, sessionId?: string) {
1692
1736
  // const userRoleNames = user.roles.map((role) => role.name).join(';')
1693
1737
  const userRoleNames = user.roles.map((role) => role.name);
1738
+ const resolvedSessionId = this.shouldPreventConcurrentLogins()
1739
+ ? sessionId ?? (await this.activeSessionStorage.getActiveSession(user.id))
1740
+ : undefined;
1694
1741
 
1695
1742
  const accessTokenTtl =
1696
1743
  this.settingService.getConfigValue<SolidCoreSetting>("accessTokenTtl");
1697
1744
  const accessToken = await this.signToken<Partial<ActiveUserData>>(
1698
1745
  user.id,
1699
1746
  accessTokenTtl,
1700
- { username: user.username, email: user.email, roles: userRoleNames },
1747
+ {
1748
+ username: user.username,
1749
+ email: user.email,
1750
+ roles: userRoleNames,
1751
+ ...(resolvedSessionId ? { sessionId: resolvedSessionId } : {}),
1752
+ },
1701
1753
  );
1702
1754
 
1703
1755
  return accessToken;
@@ -2116,6 +2168,14 @@ export class AuthenticationService {
2116
2168
  );
2117
2169
  }
2118
2170
 
2171
+ private shouldPreventConcurrentLogins(): boolean {
2172
+ return (
2173
+ this.settingService.getConfigValue<SolidCoreSetting>(
2174
+ "preventConcurrentLogins",
2175
+ ) === true
2176
+ );
2177
+ }
2178
+
2119
2179
  private checkAccountBlocked(user: User): void {
2120
2180
  const maxFailedAttempts =
2121
2181
  this.settingService.getConfigValue<SolidCoreSetting>(
@@ -2172,6 +2232,7 @@ export class AuthenticationService {
2172
2232
 
2173
2233
  const userId = payload.sub;
2174
2234
  await this.refreshTokenIdsStorage.invalidate(userId);
2235
+ await this.activeSessionStorage.clearActiveSession(userId);
2175
2236
  const user = await this.userRepository.findOne({
2176
2237
  where: {
2177
2238
  id: userId,
@@ -23,6 +23,7 @@ import { ChatterMessage } from '../entities/chatter-message.entity';
23
23
  import { getMediaStorageProvider } from './mediaStorageProviders';
24
24
  import { RequestContextService } from './request-context.service';
25
25
  import { Logger } from '@nestjs/common';
26
+ import { SolidIntrospectService } from './solid-introspect.service';
26
27
 
27
28
  @Injectable()
28
29
  export class ChatterMessageService extends CRUDService<ChatterMessage> {
@@ -50,6 +51,26 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
50
51
  super(entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);
51
52
  }
52
53
 
54
+ private getCoModelService(coModelName: string): CRUDService<any> {
55
+ const introspectService = this.moduleRef.get(SolidIntrospectService, { strict: false });
56
+ const modelSingularName = lowerFirst(coModelName);
57
+ const coModelService = introspectService?.getCRUDService(modelSingularName);
58
+ if (!coModelService) {
59
+ throw new BadRequestException(ERROR_MESSAGES.MODEL_SERVICE_NOT_FOUND(modelSingularName));
60
+ }
61
+ return coModelService;
62
+ }
63
+
64
+ private async assertRecordAccess(coModelName: string, coModelEntityId: number) {
65
+ const activeUser = this.requestContextService.getActiveUser();
66
+ if (!activeUser) {
67
+ throw new ForbiddenException(ERROR_MESSAGES.FORBIDDEN);
68
+ }
69
+
70
+ const coModelService = this.getCoModelService(coModelName);
71
+ await coModelService.findOne(coModelEntityId, {}, { activeUser });
72
+ }
73
+
53
74
  private resolveMessageUserId(userId?: number | null): number | null {
54
75
  if (userId) {
55
76
  return userId;
@@ -96,6 +117,8 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
96
117
  throw new NotFoundException(`Entity [solid-core.chatterMessage] with id ${id} not found`);
97
118
  }
98
119
 
120
+ await this.assertRecordAccess(message.coModelName, message.coModelEntityId);
121
+
99
122
  message.status = CHATTER_MESSAGE_STATUS.COMPLETED;
100
123
  return this.repo.save(message);
101
124
  }
@@ -111,6 +134,8 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
111
134
  throw new NotFoundException(`Entity [solid-core.chatterMessage] with id ${id} not found`);
112
135
  }
113
136
 
137
+ await this.assertRecordAccess(message.coModelName, message.coModelEntityId);
138
+
114
139
  if (!this.isEditableCustomNoteMessage(message)) {
115
140
  throw new BadRequestException('Only custom note messages can be edited.');
116
141
  }
@@ -193,17 +218,20 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
193
218
  }
194
219
 
195
220
  async postMessage(postDto: PostChatterMessageDto, files: Express.Multer.File[] = []) {
221
+ const coModelName = lowerFirst(postDto.coModelName);
222
+ await this.assertRecordAccess(coModelName, postDto.coModelEntityId);
223
+
196
224
  const chatterMessage = new ChatterMessage();
197
225
  chatterMessage.messageType = CHATTER_MESSAGE_TYPE.CUSTOM;
198
226
  chatterMessage.messageSubType = postDto.messageSubType || CHATTER_MESSAGE_SUBTYPE.CUSTOM;
199
227
  chatterMessage.status = postDto.status ?? CHATTER_MESSAGE_STATUS.PENDING;
200
228
  chatterMessage.messageBody = postDto.messageBody;
201
229
  chatterMessage.coModelEntityId = postDto.coModelEntityId;
202
- chatterMessage.coModelName = postDto.coModelName;
230
+ chatterMessage.coModelName = coModelName;
203
231
  chatterMessage.modelUserKey = postDto.modelUserKey ?? null;
204
232
 
205
233
  const model = await this.modelMetadataRepo.findOne({
206
- where: { singularName: lowerFirst(postDto.coModelName) },
234
+ where: { singularName: coModelName },
207
235
  relations: { userKeyField: true }
208
236
  });
209
237
  chatterMessage.modelDisplayName = model?.displayName ?? null;
@@ -683,6 +711,8 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
683
711
  const { limit = 25, offset = 0, populate = [], populateMedia = [], filters } = query;
684
712
  this.logHeapUsed('getChatterMessages-start');
685
713
 
714
+ await this.assertRecordAccess(lowerFirst(entityName), entityId);
715
+
686
716
  const model = await this.modelMetadataRepo.findOne({
687
717
  where: {
688
718
  singularName: entityName
@@ -2,7 +2,6 @@ import { Injectable } from '@nestjs/common';
2
2
  import { InjectEntityManager } from '@nestjs/typeorm';
3
3
  import { ComputedFieldProvider } from 'src/decorators/computed-field-provider.decorator';
4
4
  import { CommonEntity } from 'src/entities/common.entity';
5
- import { isEmbeddedDb } from 'src/helpers/environment.helper';
6
5
  import { ComputedFieldMetadata } from 'src/helpers/solid-registry';
7
6
  import { IEntityPreComputeFieldProvider } from 'src/interfaces';
8
7
  import { EntityManager } from 'typeorm';
@@ -46,12 +45,7 @@ export class AlphaNumExternalIdComputationProvider<T extends CommonEntity> imple
46
45
  }
47
46
  }
48
47
 
49
- // On embedded PGlite (pool size 1), use the originating transaction's EntityManager
50
- // so the uniqueness check runs on the active connection. On regular Postgres, use the
51
- // injected EntityManager (original behaviour).
52
- const manager = isEmbeddedDb() ? (eventContext?.manager ?? this.entityManager) : this.entityManager;
53
-
54
- const uniqueCode = await this.generateUniqueExternalId(manager, resolvedPrefix, codeLength, computedFieldMetadata.fieldName, entityName);
48
+ const uniqueCode = await this.generateUniqueExternalId(resolvedPrefix, codeLength, computedFieldMetadata.fieldName, entityName);
55
49
  const finalExternalId = resolvedPrefix ? `${resolvedPrefix}-${uniqueCode}` : uniqueCode;
56
50
 
57
51
  triggerEntity[computedFieldMetadata.fieldName] = finalExternalId;
@@ -66,8 +60,8 @@ export class AlphaNumExternalIdComputationProvider<T extends CommonEntity> imple
66
60
  return result;
67
61
  }
68
62
 
69
- private async isExternalIdUnique(manager: EntityManager, externalId: string, fieldName: string, entityName: string): Promise<boolean> {
70
- const count = await manager.count(entityName as any,
63
+ private async isExternalIdUnique(externalId: string, fieldName: string, entityName: string): Promise<boolean> {
64
+ const count = await this.entityManager.count(entityName as any,
71
65
  {
72
66
  where: { [fieldName]: externalId },
73
67
  }
@@ -75,7 +69,7 @@ export class AlphaNumExternalIdComputationProvider<T extends CommonEntity> imple
75
69
  return count === 0;
76
70
  }
77
71
 
78
- private async generateUniqueExternalId(manager: EntityManager, resolvedPrefix: string, codeLength: number, fieldName: string, entityName: string): Promise<string> {
72
+ private async generateUniqueExternalId(resolvedPrefix: string, codeLength: number, fieldName: string, entityName: string): Promise<string> {
79
73
  const maxAttempts = 10;
80
74
 
81
75
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
@@ -84,7 +78,7 @@ export class AlphaNumExternalIdComputationProvider<T extends CommonEntity> imple
84
78
 
85
79
  const fullId = resolvedPrefix ? `${resolvedPrefix}-${newId}` : newId;
86
80
 
87
- const isUnique = await this.isExternalIdUnique(manager, fullId, fieldName, entityName);
81
+ const isUnique = await this.isExternalIdUnique(fullId, fieldName, entityName);
88
82
 
89
83
  if (isUnique) {
90
84
  return newId;