@solidxai/core 0.1.11-beta.0 → 0.1.11-beta.11

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 (226) hide show
  1. package/.claude/settings.local.json +2 -1
  2. package/CLAUDE.md +26 -0
  3. package/dist/commands/migrate-removed-fields.command.d.ts +19 -0
  4. package/dist/commands/migrate-removed-fields.command.d.ts.map +1 -0
  5. package/dist/commands/migrate-removed-fields.command.js +77 -0
  6. package/dist/commands/migrate-removed-fields.command.js.map +1 -0
  7. package/dist/controllers/datasource-introspection.controller.d.ts +46 -1
  8. package/dist/controllers/datasource-introspection.controller.d.ts.map +1 -1
  9. package/dist/controllers/datasource-introspection.controller.js +38 -0
  10. package/dist/controllers/datasource-introspection.controller.js.map +1 -1
  11. package/dist/controllers/service.controller.d.ts +1 -0
  12. package/dist/controllers/service.controller.d.ts.map +1 -1
  13. package/dist/controllers/service.controller.js +2 -2
  14. package/dist/controllers/service.controller.js.map +1 -1
  15. package/dist/dtos/datasource-introspection-mapping.dto.d.ts +5 -0
  16. package/dist/dtos/datasource-introspection-mapping.dto.d.ts.map +1 -1
  17. package/dist/dtos/datasource-introspection-mapping.dto.js +24 -2
  18. package/dist/dtos/datasource-introspection-mapping.dto.js.map +1 -1
  19. package/dist/entities/{legacy-common-with-id.entity.d.ts → legacy-common-with-generated-id.entity.d.ts} +2 -2
  20. package/dist/entities/legacy-common-with-generated-id.entity.d.ts.map +1 -0
  21. package/dist/entities/{legacy-common-with-id.entity.js → legacy-common-with-generated-id.entity.js} +4 -4
  22. package/dist/entities/legacy-common-with-generated-id.entity.js.map +1 -0
  23. package/dist/entities/{legacy-common.entity.d.ts → legacy-common.entity-with-existing-id.entity.d.ts} +1 -1
  24. package/dist/entities/legacy-common.entity-with-existing-id.entity.d.ts.map +1 -0
  25. package/dist/entities/{legacy-common.entity.js → legacy-common.entity-with-existing-id.entity.js} +1 -1
  26. package/dist/entities/legacy-common.entity-with-existing-id.entity.js.map +1 -0
  27. package/dist/helpers/command.service.d.ts +2 -0
  28. package/dist/helpers/command.service.d.ts.map +1 -1
  29. package/dist/helpers/command.service.js +6 -2
  30. package/dist/helpers/command.service.js.map +1 -1
  31. package/dist/helpers/environment.helper.d.ts +1 -0
  32. package/dist/helpers/environment.helper.d.ts.map +1 -1
  33. package/dist/helpers/environment.helper.js +4 -0
  34. package/dist/helpers/environment.helper.js.map +1 -1
  35. package/dist/helpers/field-crud-managers/IntFieldCrudManager.d.ts.map +1 -1
  36. package/dist/helpers/field-crud-managers/IntFieldCrudManager.js +4 -1
  37. package/dist/helpers/field-crud-managers/IntFieldCrudManager.js.map +1 -1
  38. package/dist/helpers/model-metadata-helper.service.d.ts +2 -1
  39. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  40. package/dist/helpers/model-metadata-helper.service.js +9 -5
  41. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  42. package/dist/helpers/nodemon-heartbeat.d.ts +5 -0
  43. package/dist/helpers/nodemon-heartbeat.d.ts.map +1 -0
  44. package/dist/helpers/nodemon-heartbeat.js +67 -0
  45. package/dist/helpers/nodemon-heartbeat.js.map +1 -0
  46. package/dist/helpers/solid-registry.d.ts +2 -1
  47. package/dist/helpers/solid-registry.d.ts.map +1 -1
  48. package/dist/helpers/solid-registry.js.map +1 -1
  49. package/dist/helpers/typeorm-db-helper.d.ts +1 -0
  50. package/dist/helpers/typeorm-db-helper.d.ts.map +1 -1
  51. package/dist/helpers/typeorm-db-helper.js +12 -0
  52. package/dist/helpers/typeorm-db-helper.js.map +1 -1
  53. package/dist/index.d.ts +3 -2
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +3 -2
  56. package/dist/index.js.map +1 -1
  57. package/dist/interfaces/datasource-introspection-provider.interface.d.ts +1 -0
  58. package/dist/interfaces/datasource-introspection-provider.interface.d.ts.map +1 -1
  59. package/dist/interfaces/datasource-introspection-provider.interface.js.map +1 -1
  60. package/dist/interfaces.d.ts +1 -0
  61. package/dist/interfaces.d.ts.map +1 -1
  62. package/dist/interfaces.js.map +1 -1
  63. package/dist/repository/scheduled-job.repository.d.ts +5 -2
  64. package/dist/repository/scheduled-job.repository.d.ts.map +1 -1
  65. package/dist/repository/scheduled-job.repository.js +66 -3
  66. package/dist/repository/scheduled-job.repository.js.map +1 -1
  67. package/dist/repository/security-rule.repository.d.ts +2 -2
  68. package/dist/repository/security-rule.repository.d.ts.map +1 -1
  69. package/dist/repository/security-rule.repository.js +6 -3
  70. package/dist/repository/security-rule.repository.js.map +1 -1
  71. package/dist/seeders/module-metadata-seeder.service.d.ts +43 -2
  72. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  73. package/dist/seeders/module-metadata-seeder.service.js +1173 -232
  74. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  75. package/dist/seeders/seed-data/solid-core-metadata.json +128 -34
  76. package/dist/services/action-metadata.service.d.ts +7 -0
  77. package/dist/services/action-metadata.service.d.ts.map +1 -1
  78. package/dist/services/action-metadata.service.js +76 -3
  79. package/dist/services/action-metadata.service.js.map +1 -1
  80. package/dist/services/api-key.service.d.ts.map +1 -1
  81. package/dist/services/api-key.service.js.map +1 -1
  82. package/dist/services/authentication.service.d.ts +2 -0
  83. package/dist/services/authentication.service.d.ts.map +1 -1
  84. package/dist/services/authentication.service.js +32 -11
  85. package/dist/services/authentication.service.js.map +1 -1
  86. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  87. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +7 -5
  88. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  89. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts +4 -0
  90. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts.map +1 -1
  91. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js +18 -1
  92. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js.map +1 -1
  93. package/dist/services/crud-helper.service.d.ts.map +1 -1
  94. package/dist/services/crud-helper.service.js +25 -12
  95. package/dist/services/crud-helper.service.js.map +1 -1
  96. package/dist/services/crud.service.d.ts +1 -0
  97. package/dist/services/crud.service.d.ts.map +1 -1
  98. package/dist/services/crud.service.js +27 -0
  99. package/dist/services/crud.service.js.map +1 -1
  100. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.d.ts.map +1 -1
  101. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.js +12 -0
  102. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.js.map +1 -1
  103. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.d.ts.map +1 -1
  104. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.js +2 -0
  105. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.js.map +1 -1
  106. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.d.ts.map +1 -1
  107. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.js +28 -15
  108. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.js.map +1 -1
  109. package/dist/services/datasource-introspection.service.d.ts +62 -2
  110. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  111. package/dist/services/datasource-introspection.service.js +654 -186
  112. package/dist/services/datasource-introspection.service.js.map +1 -1
  113. package/dist/services/import-transaction.service.d.ts.map +1 -1
  114. package/dist/services/import-transaction.service.js +3 -0
  115. package/dist/services/import-transaction.service.js.map +1 -1
  116. package/dist/services/locale.service.d.ts +14 -0
  117. package/dist/services/locale.service.d.ts.map +1 -1
  118. package/dist/services/locale.service.js +83 -0
  119. package/dist/services/locale.service.js.map +1 -1
  120. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +10 -10
  121. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  122. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  123. package/dist/services/menu-item-metadata.service.js +1 -0
  124. package/dist/services/menu-item-metadata.service.js.map +1 -1
  125. package/dist/services/model-metadata.service.d.ts +3 -0
  126. package/dist/services/model-metadata.service.d.ts.map +1 -1
  127. package/dist/services/model-metadata.service.js +78 -0
  128. package/dist/services/model-metadata.service.js.map +1 -1
  129. package/dist/services/module-metadata.service.d.ts.map +1 -1
  130. package/dist/services/module-metadata.service.js +28 -0
  131. package/dist/services/module-metadata.service.js.map +1 -1
  132. package/dist/services/removed-field-migration.service.d.ts +30 -0
  133. package/dist/services/removed-field-migration.service.d.ts.map +1 -0
  134. package/dist/services/removed-field-migration.service.js +319 -0
  135. package/dist/services/removed-field-migration.service.js.map +1 -0
  136. package/dist/services/role-metadata.service.d.ts +5 -0
  137. package/dist/services/role-metadata.service.d.ts.map +1 -1
  138. package/dist/services/role-metadata.service.js +95 -33
  139. package/dist/services/role-metadata.service.js.map +1 -1
  140. package/dist/services/settings/default-settings-provider.service.d.ts +244 -0
  141. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  142. package/dist/services/settings/default-settings-provider.service.js +120 -0
  143. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  144. package/dist/services/solid-ts-morph.service.d.ts +6 -0
  145. package/dist/services/solid-ts-morph.service.d.ts.map +1 -1
  146. package/dist/services/solid-ts-morph.service.js +43 -0
  147. package/dist/services/solid-ts-morph.service.js.map +1 -1
  148. package/dist/services/view-metadata.service.d.ts +6 -0
  149. package/dist/services/view-metadata.service.d.ts.map +1 -1
  150. package/dist/services/view-metadata.service.js +70 -8
  151. package/dist/services/view-metadata.service.js.map +1 -1
  152. package/dist/solid-core.module.d.ts.map +1 -1
  153. package/dist/solid-core.module.js +4 -0
  154. package/dist/solid-core.module.js.map +1 -1
  155. package/dist/subscribers/audit.subscriber.d.ts +5 -1
  156. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  157. package/dist/subscribers/audit.subscriber.js +76 -12
  158. package/dist/subscribers/audit.subscriber.js.map +1 -1
  159. package/dist/subscribers/computed-entity-field.subscriber.d.ts +9 -1
  160. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  161. package/dist/subscribers/computed-entity-field.subscriber.js +45 -11
  162. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  163. package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -1
  164. package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -1
  165. package/dist/subscribers/field-metadata.subscriber.d.ts.map +1 -1
  166. package/dist/subscribers/field-metadata.subscriber.js.map +1 -1
  167. package/dist/subscribers/scheduled-job.subscriber.d.ts.map +1 -1
  168. package/dist/subscribers/scheduled-job.subscriber.js +3 -2
  169. package/dist/subscribers/scheduled-job.subscriber.js.map +1 -1
  170. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  171. package/dist/subscribers/security-rule.subscriber.js +5 -3
  172. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  173. package/package.json +1 -1
  174. package/src/commands/migrate-removed-fields.command.ts +81 -0
  175. package/src/controllers/datasource-introspection.controller.ts +27 -1
  176. package/src/controllers/service.controller.ts +3 -2
  177. package/src/dtos/datasource-introspection-mapping.dto.ts +15 -0
  178. package/src/entities/{legacy-common-with-id.entity.ts → legacy-common-with-generated-id.entity.ts} +1 -1
  179. package/src/helpers/command.service.ts +10 -2
  180. package/src/helpers/environment.helper.ts +11 -0
  181. package/src/helpers/field-crud-managers/IntFieldCrudManager.ts +4 -1
  182. package/src/helpers/model-metadata-helper.service.ts +8 -3
  183. package/src/helpers/nodemon-heartbeat.ts +59 -0
  184. package/src/helpers/solid-registry.ts +7 -1
  185. package/src/helpers/typeorm-db-helper.ts +15 -0
  186. package/src/index.ts +3 -2
  187. package/src/interfaces/datasource-introspection-provider.interface.ts +1 -0
  188. package/src/interfaces.ts +1 -0
  189. package/src/repository/scheduled-job.repository.ts +83 -4
  190. package/src/repository/security-rule.repository.ts +10 -4
  191. package/src/seeders/module-metadata-seeder.service.ts +1415 -264
  192. package/src/seeders/seed-data/solid-core-metadata.json +128 -34
  193. package/src/services/action-metadata.service.ts +87 -2
  194. package/src/services/api-key.service.ts +36 -36
  195. package/src/services/authentication.service.ts +46 -12
  196. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +11 -5
  197. package/src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts +15 -1
  198. package/src/services/crud-helper.service.ts +25 -12
  199. package/src/services/crud.service.ts +36 -11
  200. package/src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts +12 -0
  201. package/src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts +2 -0
  202. package/src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts +28 -15
  203. package/src/services/datasource-introspection.service.ts +811 -161
  204. package/src/services/import-transaction.service.ts +5 -0
  205. package/src/services/locale.service.ts +111 -3
  206. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +2 -2
  207. package/src/services/menu-item-metadata.service.ts +2 -1
  208. package/src/services/model-metadata.service.ts +109 -1
  209. package/src/services/module-metadata.service.ts +36 -0
  210. package/src/services/removed-field-migration.service.ts +334 -0
  211. package/src/services/role-metadata.service.ts +112 -49
  212. package/src/services/settings/default-settings-provider.service.ts +120 -0
  213. package/src/services/solid-ts-morph.service.ts +61 -1
  214. package/src/services/view-metadata.service.ts +83 -9
  215. package/src/solid-core.module.ts +4 -0
  216. package/src/subscribers/audit.subscriber.ts +101 -18
  217. package/src/subscribers/computed-entity-field.subscriber.ts +81 -28
  218. package/src/subscribers/created-by-updated-by.subscriber.ts +3 -0
  219. package/src/subscribers/field-metadata.subscriber.ts +3 -0
  220. package/src/subscribers/scheduled-job.subscriber.ts +3 -2
  221. package/src/subscribers/security-rule.subscriber.ts +8 -3
  222. package/dist/entities/legacy-common-with-id.entity.d.ts.map +0 -1
  223. package/dist/entities/legacy-common-with-id.entity.js.map +0 -1
  224. package/dist/entities/legacy-common.entity.d.ts.map +0 -1
  225. package/dist/entities/legacy-common.entity.js.map +0 -1
  226. /package/src/entities/{legacy-common.entity.ts → legacy-common.entity-with-existing-id.entity.ts} +0 -0
@@ -1077,15 +1077,24 @@
1077
1077
  {
1078
1078
  "name": "type",
1079
1079
  "displayName": "Type",
1080
- "type": "shortText",
1080
+ "type": "selectionStatic",
1081
1081
  "ormType": "varchar",
1082
+ "length": 256,
1082
1083
  "required": true,
1083
1084
  "unique": false,
1084
1085
  "index": true,
1085
1086
  "private": false,
1086
1087
  "encrypt": false,
1087
1088
  "columnName": "type",
1088
- "isSystem": true
1089
+ "isSystem": true,
1090
+ "selectionValueType": "string",
1091
+ "selectionStaticValues": [
1092
+ "list:List",
1093
+ "form:Form",
1094
+ "tree:Tree",
1095
+ "kanban:Kanban",
1096
+ "card:Card"
1097
+ ]
1089
1098
  },
1090
1099
  {
1091
1100
  "name": "context",
@@ -1584,7 +1593,7 @@
1584
1593
  "name": "roles",
1585
1594
  "displayName": "Roles",
1586
1595
  "type": "relation",
1587
- "required": true,
1596
+ "required": false,
1588
1597
  "unique": false,
1589
1598
  "index": true,
1590
1599
  "private": false,
@@ -5244,6 +5253,13 @@
5244
5253
  }
5245
5254
  ]
5246
5255
  },
5256
+ "locales": [
5257
+ {
5258
+ "locale": "en",
5259
+ "displayName": "English",
5260
+ "isDefault": true
5261
+ }
5262
+ ],
5247
5263
  "permissions": [
5248
5264
  "mcp:invoke",
5249
5265
  "agent:invoke",
@@ -8730,12 +8746,15 @@
8730
8746
  48
8731
8747
  ],
8732
8748
  "enableGlobalSearch": true,
8733
- "create": true,
8734
- "edit": true,
8749
+ "create": false,
8750
+ "edit": false,
8735
8751
  "delete": true,
8752
+ "import": false,
8753
+ "export": false,
8736
8754
  "allowedViews": [
8737
8755
  "list",
8738
- "card"
8756
+ "card",
8757
+ "tree"
8739
8758
  ]
8740
8759
  },
8741
8760
  "children": [
@@ -8996,7 +9015,13 @@
8996
9015
  "enableGlobalSearch": true,
8997
9016
  "create": false,
8998
9017
  "edit": false,
8999
- "delete": false
9018
+ "delete": false,
9019
+ "import": false,
9020
+ "export": false,
9021
+ "allowedViews": [
9022
+ "list",
9023
+ "tree"
9024
+ ]
9000
9025
  },
9001
9026
  "children": [
9002
9027
  {
@@ -10088,15 +10113,11 @@
10088
10113
  "swimlanesCount": 5,
10089
10114
  "recordsInSwimlane": 10,
10090
10115
  "enableGlobalSearch": true,
10091
- "create": true,
10092
- "edit": true,
10093
- "delete": true,
10116
+ "create": false,
10117
+ "edit": false,
10118
+ "delete": false,
10094
10119
  "groupBy": "stage",
10095
- "draggable": false,
10096
- "allowedViews": [
10097
- "list",
10098
- "kanban"
10099
- ]
10120
+ "draggable": false
10100
10121
  },
10101
10122
  "children": [
10102
10123
  {
@@ -11922,7 +11943,11 @@
11922
11943
  "edit": false,
11923
11944
  "delete": false,
11924
11945
  "import": false,
11925
- "export": false
11946
+ "export": false,
11947
+ "allowedViews": [
11948
+ "list",
11949
+ "tree"
11950
+ ]
11926
11951
  },
11927
11952
  "children": [
11928
11953
  {
@@ -13417,7 +13442,13 @@
13417
13442
  "enableGlobalSearch": true,
13418
13443
  "create": false,
13419
13444
  "edit": true,
13420
- "delete": false
13445
+ "delete": false,
13446
+ "import": false,
13447
+ "export": false,
13448
+ "allowedViews": [
13449
+ "list",
13450
+ "tree"
13451
+ ]
13421
13452
  },
13422
13453
  "children": [
13423
13454
  {
@@ -13492,7 +13523,13 @@
13492
13523
  "enableGlobalSearch": true,
13493
13524
  "create": false,
13494
13525
  "edit": false,
13495
- "delete": false
13526
+ "delete": false,
13527
+ "import": false,
13528
+ "export": false,
13529
+ "allowedViews": [
13530
+ "list",
13531
+ "tree"
13532
+ ]
13496
13533
  },
13497
13534
  "children": [
13498
13535
  {
@@ -13576,7 +13613,13 @@
13576
13613
  "enableGlobalSearch": true,
13577
13614
  "create": false,
13578
13615
  "edit": false,
13579
- "delete": false
13616
+ "delete": false,
13617
+ "import": false,
13618
+ "export": false,
13619
+ "allowedViews": [
13620
+ "list",
13621
+ "tree"
13622
+ ]
13580
13623
  },
13581
13624
  "children": [
13582
13625
  {
@@ -13638,7 +13681,13 @@
13638
13681
  "enableGlobalSearch": true,
13639
13682
  "create": false,
13640
13683
  "edit": false,
13641
- "delete": false
13684
+ "delete": false,
13685
+ "import": false,
13686
+ "export": false,
13687
+ "allowedViews": [
13688
+ "list",
13689
+ "tree"
13690
+ ]
13642
13691
  },
13643
13692
  "children": [
13644
13693
  {
@@ -13707,7 +13756,13 @@
13707
13756
  "enableGlobalSearch": true,
13708
13757
  "create": false,
13709
13758
  "edit": false,
13710
- "delete": false
13759
+ "delete": true,
13760
+ "import": false,
13761
+ "export": false,
13762
+ "allowedViews": [
13763
+ "list",
13764
+ "tree"
13765
+ ]
13711
13766
  },
13712
13767
  "children": [
13713
13768
  {
@@ -13777,7 +13832,14 @@
13777
13832
  "enableGlobalSearch": true,
13778
13833
  "create": false,
13779
13834
  "edit": false,
13780
- "delete": false
13835
+ "delete": true,
13836
+ "import": false,
13837
+ "export": false,
13838
+ "allowedViews": [
13839
+ "list",
13840
+ "card",
13841
+ "tree"
13842
+ ]
13781
13843
  },
13782
13844
  "children": [
13783
13845
  {
@@ -13843,11 +13905,14 @@
13843
13905
  50
13844
13906
  ],
13845
13907
  "enableGlobalSearch": true,
13846
- "create": false,
13847
- "edit": false,
13848
- "delete": false,
13849
- "import": false,
13850
- "export": false
13908
+ "create": true,
13909
+ "edit": true,
13910
+ "delete": true,
13911
+ "import": true,
13912
+ "export": true,
13913
+ "allowedViews": [
13914
+ "list"
13915
+ ]
13851
13916
  },
13852
13917
  "children": [
13853
13918
  {
@@ -13882,7 +13947,11 @@
13882
13947
  "edit": false,
13883
13948
  "delete": false,
13884
13949
  "import": false,
13885
- "export": false
13950
+ "export": false,
13951
+ "allowedViews": [
13952
+ "list",
13953
+ "tree"
13954
+ ]
13886
13955
  },
13887
13956
  "children": [
13888
13957
  {
@@ -13944,7 +14013,11 @@
13944
14013
  "edit": false,
13945
14014
  "delete": false,
13946
14015
  "import": false,
13947
- "export": false
14016
+ "export": false,
14017
+ "allowedViews": [
14018
+ "list",
14019
+ "tree"
14020
+ ]
13948
14021
  },
13949
14022
  "children": [
13950
14023
  {
@@ -14013,7 +14086,11 @@
14013
14086
  "edit": true,
14014
14087
  "delete": true,
14015
14088
  "import": true,
14016
- "export": true
14089
+ "export": true,
14090
+ "allowedViews": [
14091
+ "list",
14092
+ "tree"
14093
+ ]
14017
14094
  },
14018
14095
  "children": [
14019
14096
  {
@@ -14073,7 +14150,11 @@
14073
14150
  "edit": false,
14074
14151
  "delete": false,
14075
14152
  "import": false,
14076
- "export": false
14153
+ "export": false,
14154
+ "allowedViews": [
14155
+ "list",
14156
+ "tree"
14157
+ ]
14077
14158
  },
14078
14159
  "children": [
14079
14160
  {
@@ -14133,7 +14214,11 @@
14133
14214
  "edit": false,
14134
14215
  "delete": false,
14135
14216
  "import": false,
14136
- "export": false
14217
+ "export": false,
14218
+ "allowedViews": [
14219
+ "list",
14220
+ "tree"
14221
+ ]
14137
14222
  },
14138
14223
  "children": [
14139
14224
  {
@@ -14203,7 +14288,11 @@
14203
14288
  "edit": false,
14204
14289
  "delete": false,
14205
14290
  "import": false,
14206
- "export": false
14291
+ "export": false,
14292
+ "allowedViews": [
14293
+ "list",
14294
+ "tree"
14295
+ ]
14207
14296
  },
14208
14297
  "children": [
14209
14298
  {
@@ -14272,7 +14361,12 @@
14272
14361
  "enableGlobalSearch": true,
14273
14362
  "create": true,
14274
14363
  "edit": true,
14275
- "delete": true
14364
+ "delete": true,
14365
+ "import": true,
14366
+ "export": true,
14367
+ "allowedViews": [
14368
+ "list"
14369
+ ]
14276
14370
  },
14277
14371
  "children": [
14278
14372
  {
@@ -1,4 +1,4 @@
1
- import { Injectable } from '@nestjs/common';
1
+ import { Injectable, Logger } from '@nestjs/common';
2
2
  import { ModuleRef } from "@nestjs/core";
3
3
  import { InjectEntityManager } from '@nestjs/typeorm';
4
4
  import { CRUDService } from 'src/services/crud.service';
@@ -10,6 +10,79 @@ import { ActionMetadata } from '../entities/action-metadata.entity';
10
10
 
11
11
  @Injectable()
12
12
  export class ActionMetadataService extends CRUDService<ActionMetadata> {
13
+ private readonly logger = new Logger(ActionMetadataService.name);
14
+ private readonly comparableFields = [
15
+ 'name',
16
+ 'displayName',
17
+ 'type',
18
+ 'domain',
19
+ 'context',
20
+ 'customComponent',
21
+ 'customIsModal',
22
+ 'serverEndpoint',
23
+ 'module',
24
+ 'model',
25
+ 'view',
26
+ ] as const;
27
+ private readonly relationCompareFields = new Set(['module', 'model', 'view']);
28
+ private readonly jsonCompareFields = new Set(['domain', 'context']);
29
+
30
+ private normalizeJsonFieldValue(value: any): any {
31
+ if (typeof value === 'string') {
32
+ const trimmedValue = value.trim();
33
+ if (
34
+ (trimmedValue.startsWith('{') && trimmedValue.endsWith('}')) ||
35
+ (trimmedValue.startsWith('[') && trimmedValue.endsWith(']'))
36
+ ) {
37
+ try {
38
+ return this.normalizeJsonFieldValue(JSON.parse(trimmedValue));
39
+ } catch {
40
+ return value;
41
+ }
42
+ }
43
+ return value;
44
+ }
45
+
46
+ if (Array.isArray(value)) {
47
+ return value.map((item) => this.normalizeJsonFieldValue(item));
48
+ }
49
+
50
+ if (value && typeof value === 'object') {
51
+ return Object.keys(value)
52
+ .sort()
53
+ .reduce((result, key) => {
54
+ result[key] = this.normalizeJsonFieldValue(value[key]);
55
+ return result;
56
+ }, {} as Record<string, any>);
57
+ }
58
+
59
+ return value;
60
+ }
61
+
62
+ private getCanonicalJsonFieldString(value: any): string {
63
+ return JSON.stringify(this.normalizeJsonFieldValue(value) ?? null);
64
+ }
65
+
66
+ private hasChanges(existingSolidAction: ActionMetadata, updateSolidActionDto: any): boolean {
67
+ return this.comparableFields.some((key) => {
68
+ const value = updateSolidActionDto[key];
69
+ if (typeof value === 'undefined') {
70
+ return false;
71
+ }
72
+
73
+ if (this.relationCompareFields.has(key)) {
74
+ const relationValue = value as any;
75
+ return (existingSolidAction as any)[key]?.id !== relationValue?.id;
76
+ }
77
+
78
+ if (this.jsonCompareFields.has(key)) {
79
+ return this.getCanonicalJsonFieldString((existingSolidAction as any)[key]) !== this.getCanonicalJsonFieldString(value);
80
+ }
81
+
82
+ return (existingSolidAction as any)[key] !== value;
83
+ });
84
+ }
85
+
13
86
  constructor(
14
87
  @InjectEntityManager()
15
88
  readonly entityManager: EntityManager,
@@ -37,11 +110,23 @@ export class ActionMetadataService extends CRUDService<ActionMetadata> {
37
110
  const existingSolidAction = await this.repo.findOne({
38
111
  where: {
39
112
  name: updateSolidActionDto.name
40
- }
113
+ },
114
+ relations: {
115
+ module: true,
116
+ model: true,
117
+ view: true,
118
+ },
41
119
  })
42
120
 
43
121
  // if found
44
122
  if (existingSolidAction) {
123
+ const hasChanges = this.hasChanges(existingSolidAction, updateSolidActionDto);
124
+
125
+ if (!hasChanges) {
126
+ this.logger.debug(`Skipping action upsert for ${updateSolidActionDto.name}; no changes detected.`);
127
+ return existingSolidAction;
128
+ }
129
+
45
130
  const updatedSolidActionDto = { ...existingSolidAction, ...updateSolidActionDto };
46
131
  return this.repo.save(updatedSolidActionDto);
47
132
  }
@@ -26,53 +26,53 @@ export class ApiKeyService {
26
26
  private readonly permissionMetadataService: PermissionMetadataService,
27
27
  private readonly authenticationService: AuthenticationService,
28
28
  private readonly userRepository: UserRepository,
29
- ) {}
29
+ ) { }
30
30
 
31
- async generate(userId: number, dto: CreateApiKeyDto): Promise < { apiKey: string; record: UserApiKey } > {
32
- const user = await this.apiKeyRepository.manager.findOne(User, {
33
- where: { id: userId },
34
- select: ['id', 'isAllowedToGenerateApiKeys'],
35
- });
31
+ async generate(userId: number, dto: CreateApiKeyDto): Promise<{ apiKey: string; record: UserApiKey }> {
32
+ const user = await this.apiKeyRepository.manager.findOne(User, {
33
+ where: { id: userId },
34
+ select: ['id', 'isAllowedToGenerateApiKeys'],
35
+ });
36
36
 
37
- if(!user?.isAllowedToGenerateApiKeys) {
38
- throw new ForbiddenException('You are not allowed to generate API keys');
39
- }
37
+ if (!user?.isAllowedToGenerateApiKeys) {
38
+ throw new ForbiddenException('You are not allowed to generate API keys');
39
+ }
40
40
 
41
41
  const rawKey = 'sldx_' + randomBytes(32).toString('hex');
42
- const hashedKey = this.hash(rawKey);
43
- const maskedKey = 'sldx_****' + rawKey.slice(-4);
44
-
45
- const record = this.apiKeyRepository.create({
46
- name: dto.name,
47
- hashedKey,
48
- maskedKey,
49
- isActive: true,
50
- expiresAt: dto.expiresAt ? new Date(dto.expiresAt) : null,
51
- user,
52
- });
42
+ const hashedKey = this.hash(rawKey);
43
+ const maskedKey = 'sldx_****' + rawKey.slice(-4);
44
+
45
+ const record = this.apiKeyRepository.create({
46
+ name: dto.name,
47
+ hashedKey,
48
+ maskedKey,
49
+ isActive: true,
50
+ expiresAt: dto.expiresAt ? new Date(dto.expiresAt) : null,
51
+ user,
52
+ });
53
53
 
54
- await this.apiKeyRepository.save(record);
54
+ await this.apiKeyRepository.save(record);
55
55
 
56
- // Strip hashedKey from the returned record — maskedKey is all the UI needs
57
- delete(record as any).hashedKey;
56
+ // Strip hashedKey from the returned record — maskedKey is all the UI needs
57
+ delete (record as any).hashedKey;
58
58
 
59
- return { apiKey: rawKey, record };
60
- }
59
+ return { apiKey: rawKey, record };
60
+ }
61
61
 
62
- async validate(rawKey: string): Promise < ActiveUserData > {
63
- const hashedKey = this.hash(rawKey);
62
+ async validate(rawKey: string): Promise<ActiveUserData> {
63
+ const hashedKey = this.hash(rawKey);
64
64
 
65
- // Bypass security rules for auth validation — must find the key regardless of caller context
66
- const keyRecord = await this.apiKeyRepository.findOne({
67
- where: { hashedKey, isActive: true },
68
- relations: ['user', 'user.roles'],
69
- });
65
+ // Bypass security rules for auth validation — must find the key regardless of caller context
66
+ const keyRecord = await this.apiKeyRepository.findOne({
67
+ where: { hashedKey, isActive: true },
68
+ relations: ['user', 'user.roles'],
69
+ });
70
70
 
71
- if(!keyRecord) {
72
- throw new UnauthorizedException();
73
- }
71
+ if (!keyRecord) {
72
+ throw new UnauthorizedException();
73
+ }
74
74
 
75
- if(keyRecord.expiresAt && keyRecord.expiresAt < new Date()) {
75
+ if (keyRecord.expiresAt && keyRecord.expiresAt < new Date()) {
76
76
  throw new UnauthorizedException('API key expired');
77
77
  }
78
78
 
@@ -1042,13 +1042,15 @@ export class AuthenticationService {
1042
1042
  }
1043
1043
 
1044
1044
  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);
1045
+ const user = await this.findUserForLoginOrNull(type, signInDto.identifier);
1046
+ if (user) {
1047
+ const dummyOtp = this.getDummyOtpForUser(user);
1048
+ if (!dummyOtp) {
1049
+ await this.assignLoginOtp(user, type);
1050
+ await this.notifyUserOnOtpInititateLogin(user, type);
1051
+ }
1050
1052
  }
1051
- return this.buildLoginOtpResponse(user, type);
1053
+ return this.buildLoginOtpResponse(type, signInDto.identifier, user);
1052
1054
  }
1053
1055
 
1054
1056
  private resolveLoginType(
@@ -1100,6 +1102,25 @@ export class AuthenticationService {
1100
1102
  return user;
1101
1103
  }
1102
1104
 
1105
+ private async findUserForLoginOrNull(
1106
+ type: PasswordlessLoginValidateWhatSources,
1107
+ identifier: string,
1108
+ options: { withRoles?: boolean } = {},
1109
+ ): Promise<User | null> {
1110
+ try {
1111
+ return await this.findUserForLogin(type, identifier, options);
1112
+ } catch (error) {
1113
+ if (
1114
+ error instanceof UnauthorizedException &&
1115
+ (error.message === ERROR_MESSAGES.USER_NOT_FOUND ||
1116
+ error.message === ERROR_MESSAGES.USER_INACTIVE)
1117
+ ) {
1118
+ return null;
1119
+ }
1120
+ throw error;
1121
+ }
1122
+ }
1123
+
1103
1124
  private async assignLoginOtp(
1104
1125
  user: User,
1105
1126
  type: PasswordlessLoginValidateWhatSources,
@@ -1123,19 +1144,29 @@ export class AuthenticationService {
1123
1144
  }
1124
1145
 
1125
1146
  private buildLoginOtpResponse(
1126
- user: User,
1127
1147
  type: PasswordlessLoginValidateWhatSources,
1148
+ identifier: string,
1149
+ user?: User | null,
1128
1150
  ) {
1129
- const maskedIdentifier =
1130
- type === PasswordlessLoginValidateWhatSources.EMAIL
1131
- ? { email: this.maskEmail(user.email) }
1132
- : { mobile: this.maskMobile(user.mobile) };
1151
+ const maskedIdentifier = this.buildMaskedLoginIdentifier(
1152
+ type,
1153
+ user?.email ?? user?.mobile ?? identifier,
1154
+ );
1133
1155
  return {
1134
1156
  message: SUCCESS_MESSAGES.OTP_SENT_SUCCESS_LOGIN,
1135
1157
  user: maskedIdentifier,
1136
1158
  };
1137
1159
  }
1138
1160
 
1161
+ private buildMaskedLoginIdentifier(
1162
+ type: PasswordlessLoginValidateWhatSources,
1163
+ identifier: string,
1164
+ ) {
1165
+ return type === PasswordlessLoginValidateWhatSources.EMAIL
1166
+ ? { email: this.maskEmail(identifier) }
1167
+ : { mobile: this.maskMobile(identifier) };
1168
+ }
1169
+
1139
1170
  private async notifyUserOnOtpInititateLogin(
1140
1171
  user: User,
1141
1172
  loginType: PasswordlessLoginValidateWhatSources,
@@ -1273,9 +1304,12 @@ export class AuthenticationService {
1273
1304
  throw new BadRequestException(ERROR_MESSAGES.INVALID_VERIFICATION_TYPE);
1274
1305
  }
1275
1306
 
1276
- const user = await this.findUserForLogin(type, identifier, {
1307
+ const user = await this.findUserForLoginOrNull(type, identifier, {
1277
1308
  withRoles: true,
1278
1309
  });
1310
+ if (!user) {
1311
+ throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);
1312
+ }
1279
1313
  this.checkAccountBlocked(user);
1280
1314
  const dummyOtp = this.getDummyOtpForUser(user);
1281
1315
 
@@ -2,6 +2,7 @@ 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';
5
6
  import { ComputedFieldMetadata } from 'src/helpers/solid-registry';
6
7
  import { IEntityPreComputeFieldProvider } from 'src/interfaces';
7
8
  import { EntityManager } from 'typeorm';
@@ -45,7 +46,12 @@ export class AlphaNumExternalIdComputationProvider<T extends CommonEntity> imple
45
46
  }
46
47
  }
47
48
 
48
- const uniqueCode = await this.generateUniqueExternalId(resolvedPrefix, codeLength, computedFieldMetadata.fieldName, entityName);
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);
49
55
  const finalExternalId = resolvedPrefix ? `${resolvedPrefix}-${uniqueCode}` : uniqueCode;
50
56
 
51
57
  triggerEntity[computedFieldMetadata.fieldName] = finalExternalId;
@@ -60,8 +66,8 @@ export class AlphaNumExternalIdComputationProvider<T extends CommonEntity> imple
60
66
  return result;
61
67
  }
62
68
 
63
- private async isExternalIdUnique(externalId: string, fieldName: string, entityName: string): Promise<boolean> {
64
- const count = await this.entityManager.count(entityName as any,
69
+ private async isExternalIdUnique(manager: EntityManager, externalId: string, fieldName: string, entityName: string): Promise<boolean> {
70
+ const count = await manager.count(entityName as any,
65
71
  {
66
72
  where: { [fieldName]: externalId },
67
73
  }
@@ -69,7 +75,7 @@ export class AlphaNumExternalIdComputationProvider<T extends CommonEntity> imple
69
75
  return count === 0;
70
76
  }
71
77
 
72
- private async generateUniqueExternalId(resolvedPrefix: string, codeLength: number, fieldName: string, entityName: string): Promise<string> {
78
+ private async generateUniqueExternalId(manager: EntityManager, resolvedPrefix: string, codeLength: number, fieldName: string, entityName: string): Promise<string> {
73
79
  const maxAttempts = 10;
74
80
 
75
81
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
@@ -78,7 +84,7 @@ export class AlphaNumExternalIdComputationProvider<T extends CommonEntity> imple
78
84
 
79
85
  const fullId = resolvedPrefix ? `${resolvedPrefix}-${newId}` : newId;
80
86
 
81
- const isUnique = await this.isExternalIdUnique(fullId, fieldName, entityName);
87
+ const isUnique = await this.isExternalIdUnique(manager, fullId, fieldName, entityName);
82
88
 
83
89
  if (isUnique) {
84
90
  return newId;