@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.
- package/CHANGELOG.md +456 -0
- package/dist/controllers/authentication.controller.d.ts +1 -1
- package/dist/controllers/chatter-message.controller.d.ts +0 -2
- package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
- package/dist/controllers/chatter-message.controller.js +0 -16
- package/dist/controllers/chatter-message.controller.js.map +1 -1
- package/dist/controllers/datasource-introspection.controller.d.ts +8 -0
- package/dist/controllers/datasource-introspection.controller.d.ts.map +1 -1
- package/dist/controllers/media.controller.js +0 -2
- package/dist/controllers/media.controller.js.map +1 -1
- package/dist/guards/access-token.guard.d.ts +5 -1
- package/dist/guards/access-token.guard.d.ts.map +1 -1
- package/dist/guards/access-token.guard.js +31 -3
- package/dist/guards/access-token.guard.js.map +1 -1
- package/dist/guards/authentication.guard.d.ts +1 -0
- package/dist/guards/authentication.guard.d.ts.map +1 -1
- package/dist/guards/authentication.guard.js +16 -1
- package/dist/guards/authentication.guard.js.map +1 -1
- package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
- package/dist/helpers/bootstrap.helper.js +3 -1
- package/dist/helpers/bootstrap.helper.js.map +1 -1
- package/dist/helpers/environment.helper.d.ts +0 -1
- package/dist/helpers/environment.helper.d.ts.map +1 -1
- package/dist/helpers/environment.helper.js +0 -4
- package/dist/helpers/environment.helper.js.map +1 -1
- package/dist/helpers/model-metadata-helper.service.d.ts +1 -2
- package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
- package/dist/helpers/model-metadata-helper.service.js +2 -6
- package/dist/helpers/model-metadata-helper.service.js.map +1 -1
- package/dist/helpers/module-metadata-helper.service.js +1 -1
- package/dist/helpers/module-metadata-helper.service.js.map +1 -1
- package/dist/helpers/solid-core-error-codes-provider.service.d.ts.map +1 -1
- package/dist/helpers/solid-core-error-codes-provider.service.js +19 -0
- package/dist/helpers/solid-core-error-codes-provider.service.js.map +1 -1
- package/dist/helpers/solid-registry.d.ts +1 -2
- package/dist/helpers/solid-registry.d.ts.map +1 -1
- package/dist/helpers/solid-registry.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces/active-user-data.interface.d.ts +1 -0
- package/dist/interfaces/active-user-data.interface.d.ts.map +1 -1
- package/dist/interfaces/active-user-data.interface.js.map +1 -1
- package/dist/interfaces.d.ts +1 -0
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/repository/scheduled-job.repository.d.ts +2 -2
- package/dist/repository/scheduled-job.repository.d.ts.map +1 -1
- package/dist/repository/scheduled-job.repository.js +3 -6
- package/dist/repository/scheduled-job.repository.js.map +1 -1
- package/dist/repository/security-rule.repository.d.ts +2 -2
- package/dist/repository/security-rule.repository.d.ts.map +1 -1
- package/dist/repository/security-rule.repository.js +3 -6
- package/dist/repository/security-rule.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +18 -1
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +62 -34
- package/dist/services/active-session-storage.service.d.ts +10 -0
- package/dist/services/active-session-storage.service.d.ts.map +1 -0
- package/dist/services/active-session-storage.service.js +41 -0
- package/dist/services/active-session-storage.service.js.map +1 -0
- package/dist/services/authentication.service.d.ts +8 -3
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +61 -16
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts +2 -0
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +25 -2
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
- package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +5 -7
- package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
- package/dist/services/crud-helper.service.d.ts.map +1 -1
- package/dist/services/crud-helper.service.js +7 -0
- package/dist/services/crud-helper.service.js.map +1 -1
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +1 -0
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/datasource-introspection.service.d.ts +10 -0
- package/dist/services/datasource-introspection.service.d.ts.map +1 -1
- package/dist/services/datasource-introspection.service.js +109 -17
- package/dist/services/datasource-introspection.service.js.map +1 -1
- package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
- package/dist/services/menu-item-metadata.service.js +1 -0
- package/dist/services/menu-item-metadata.service.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +2 -0
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +49 -16
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +0 -28
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/refresh-token-ids-storage.service.d.ts +6 -1
- package/dist/services/refresh-token-ids-storage.service.d.ts.map +1 -1
- package/dist/services/refresh-token-ids-storage.service.js +0 -2
- package/dist/services/refresh-token-ids-storage.service.js.map +1 -1
- package/dist/services/settings/default-settings-provider.service.d.ts +230 -0
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +116 -0
- package/dist/services/settings/default-settings-provider.service.js.map +1 -1
- package/dist/services/solid-ts-morph.service.d.ts +6 -0
- package/dist/services/solid-ts-morph.service.d.ts.map +1 -1
- package/dist/services/solid-ts-morph.service.js +43 -0
- package/dist/services/solid-ts-morph.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +2 -0
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
- package/dist/subscribers/audit.subscriber.js +2 -8
- package/dist/subscribers/audit.subscriber.js.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.d.ts +0 -8
- package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.js +3 -36
- package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
- package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -1
- package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -1
- package/dist/subscribers/field-metadata.subscriber.d.ts.map +1 -1
- package/dist/subscribers/field-metadata.subscriber.js.map +1 -1
- package/dist/subscribers/scheduled-job.subscriber.d.ts.map +1 -1
- package/dist/subscribers/scheduled-job.subscriber.js +2 -3
- package/dist/subscribers/scheduled-job.subscriber.js.map +1 -1
- package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
- package/dist/subscribers/security-rule.subscriber.js +3 -5
- package/dist/subscribers/security-rule.subscriber.js.map +1 -1
- package/package.json +1 -1
- package/src/controllers/chatter-message.controller.ts +7 -7
- package/src/controllers/media.controller.ts +1 -1
- package/src/guards/access-token.guard.ts +43 -3
- package/src/guards/authentication.guard.ts +22 -1
- package/src/helpers/bootstrap.helper.ts +9 -3
- package/src/helpers/environment.helper.ts +0 -11
- package/src/helpers/model-metadata-helper.service.ts +2 -7
- package/src/helpers/module-metadata-helper.service.ts +1 -1
- package/src/helpers/solid-core-error-codes-provider.service.ts +20 -1
- package/src/helpers/solid-registry.ts +1 -7
- package/src/index.ts +1 -1
- package/src/interfaces/active-user-data.interface.ts +6 -0
- package/src/interfaces.ts +1 -0
- package/src/repository/scheduled-job.repository.ts +4 -10
- package/src/repository/security-rule.repository.ts +4 -10
- package/src/seeders/module-metadata-seeder.service.ts +23 -2
- package/src/seeders/seed-data/solid-core-metadata.json +62 -34
- package/src/services/active-session-storage.service.ts +24 -0
- package/src/services/authentication.service.ts +76 -15
- package/src/services/chatter-message.service.ts +32 -2
- package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +5 -11
- package/src/services/crud-helper.service.ts +7 -0
- package/src/services/crud.service.ts +1 -0
- package/src/services/datasource-introspection.service.ts +176 -16
- package/src/services/menu-item-metadata.service.ts +2 -1
- package/src/services/model-metadata.service.ts +63 -22
- package/src/services/module-metadata.service.ts +0 -36
- package/src/services/refresh-token-ids-storage.service.ts +9 -8
- package/src/services/settings/default-settings-provider.service.ts +116 -1
- package/src/services/solid-ts-morph.service.ts +61 -1
- package/src/solid-core.module.ts +2 -0
- package/src/subscribers/audit.subscriber.ts +2 -11
- package/src/subscribers/computed-entity-field.subscriber.ts +6 -63
- package/src/subscribers/created-by-updated-by.subscriber.ts +0 -3
- package/src/subscribers/field-metadata.subscriber.ts +0 -3
- package/src/subscribers/scheduled-job.subscriber.ts +2 -3
- package/src/subscribers/security-rule.subscriber.ts +3 -8
- package/dist/helpers/nodemon-heartbeat.d.ts +0 -5
- package/dist/helpers/nodemon-heartbeat.d.ts.map +0 -1
- package/dist/helpers/nodemon-heartbeat.js +0 -67
- package/dist/helpers/nodemon-heartbeat.js.map +0 -1
- 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": "
|
|
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": "
|
|
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": "
|
|
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.
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
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(
|
|
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
|
|
1131
|
-
|
|
1132
|
-
|
|
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.
|
|
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
|
-
{
|
|
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 =
|
|
230
|
+
chatterMessage.coModelName = coModelName;
|
|
203
231
|
chatterMessage.modelUserKey = postDto.modelUserKey ?? null;
|
|
204
232
|
|
|
205
233
|
const model = await this.modelMetadataRepo.findOne({
|
|
206
|
-
where: { singularName:
|
|
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
|
package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
70
|
-
const count = await
|
|
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(
|
|
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(
|
|
81
|
+
const isUnique = await this.isExternalIdUnique(fullId, fieldName, entityName);
|
|
88
82
|
|
|
89
83
|
if (isUnique) {
|
|
90
84
|
return newId;
|