@solidxai/core 0.1.11-beta.1 → 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 (244) hide show
  1. package/.claude/settings.local.json +16 -0
  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 +2 -2
  64. package/dist/repository/scheduled-job.repository.d.ts.map +1 -1
  65. package/dist/repository/scheduled-job.repository.js +6 -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 +11 -1
  72. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  73. package/dist/seeders/module-metadata-seeder.service.js +163 -3
  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/api-key.service.d.ts.map +1 -1
  77. package/dist/services/api-key.service.js.map +1 -1
  78. package/dist/services/authentication.service.d.ts +2 -0
  79. package/dist/services/authentication.service.d.ts.map +1 -1
  80. package/dist/services/authentication.service.js +32 -11
  81. package/dist/services/authentication.service.js.map +1 -1
  82. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  83. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +7 -5
  84. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  85. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts +4 -0
  86. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts.map +1 -1
  87. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js +18 -1
  88. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js.map +1 -1
  89. package/dist/services/crud-helper.service.d.ts.map +1 -1
  90. package/dist/services/crud-helper.service.js +25 -12
  91. package/dist/services/crud-helper.service.js.map +1 -1
  92. package/dist/services/crud.service.d.ts +1 -0
  93. package/dist/services/crud.service.d.ts.map +1 -1
  94. package/dist/services/crud.service.js +27 -0
  95. package/dist/services/crud.service.js.map +1 -1
  96. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.d.ts.map +1 -1
  97. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.js +12 -0
  98. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.js.map +1 -1
  99. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.d.ts.map +1 -1
  100. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.js +2 -0
  101. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.js.map +1 -1
  102. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.d.ts.map +1 -1
  103. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.js +28 -15
  104. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.js.map +1 -1
  105. package/dist/services/datasource-introspection.service.d.ts +62 -2
  106. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  107. package/dist/services/datasource-introspection.service.js +654 -186
  108. package/dist/services/datasource-introspection.service.js.map +1 -1
  109. package/dist/services/import-transaction.service.d.ts.map +1 -1
  110. package/dist/services/import-transaction.service.js +3 -0
  111. package/dist/services/import-transaction.service.js.map +1 -1
  112. package/dist/services/locale.service.d.ts +14 -0
  113. package/dist/services/locale.service.d.ts.map +1 -1
  114. package/dist/services/locale.service.js +83 -0
  115. package/dist/services/locale.service.js.map +1 -1
  116. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +10 -10
  117. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  118. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  119. package/dist/services/menu-item-metadata.service.js +1 -0
  120. package/dist/services/menu-item-metadata.service.js.map +1 -1
  121. package/dist/services/model-metadata.service.d.ts +3 -0
  122. package/dist/services/model-metadata.service.d.ts.map +1 -1
  123. package/dist/services/model-metadata.service.js +78 -0
  124. package/dist/services/model-metadata.service.js.map +1 -1
  125. package/dist/services/module-metadata.service.d.ts.map +1 -1
  126. package/dist/services/module-metadata.service.js +28 -0
  127. package/dist/services/module-metadata.service.js.map +1 -1
  128. package/dist/services/removed-field-migration.service.d.ts +30 -0
  129. package/dist/services/removed-field-migration.service.d.ts.map +1 -0
  130. package/dist/services/removed-field-migration.service.js +319 -0
  131. package/dist/services/removed-field-migration.service.js.map +1 -0
  132. package/dist/services/role-metadata.service.d.ts +1 -0
  133. package/dist/services/role-metadata.service.d.ts.map +1 -1
  134. package/dist/services/role-metadata.service.js +23 -2
  135. package/dist/services/role-metadata.service.js.map +1 -1
  136. package/dist/services/settings/default-settings-provider.service.d.ts +244 -0
  137. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  138. package/dist/services/settings/default-settings-provider.service.js +120 -0
  139. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  140. package/dist/services/solid-ts-morph.service.d.ts +6 -0
  141. package/dist/services/solid-ts-morph.service.d.ts.map +1 -1
  142. package/dist/services/solid-ts-morph.service.js +43 -0
  143. package/dist/services/solid-ts-morph.service.js.map +1 -1
  144. package/dist/services/view-metadata.service.d.ts.map +1 -1
  145. package/dist/services/view-metadata.service.js +4 -7
  146. package/dist/services/view-metadata.service.js.map +1 -1
  147. package/dist/solid-core.module.d.ts.map +1 -1
  148. package/dist/solid-core.module.js +4 -0
  149. package/dist/solid-core.module.js.map +1 -1
  150. package/dist/subscribers/audit.subscriber.d.ts +5 -1
  151. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  152. package/dist/subscribers/audit.subscriber.js +76 -12
  153. package/dist/subscribers/audit.subscriber.js.map +1 -1
  154. package/dist/subscribers/computed-entity-field.subscriber.d.ts +9 -1
  155. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  156. package/dist/subscribers/computed-entity-field.subscriber.js +45 -11
  157. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  158. package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -1
  159. package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -1
  160. package/dist/subscribers/field-metadata.subscriber.d.ts.map +1 -1
  161. package/dist/subscribers/field-metadata.subscriber.js.map +1 -1
  162. package/dist/subscribers/scheduled-job.subscriber.d.ts.map +1 -1
  163. package/dist/subscribers/scheduled-job.subscriber.js +3 -2
  164. package/dist/subscribers/scheduled-job.subscriber.js.map +1 -1
  165. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  166. package/dist/subscribers/security-rule.subscriber.js +5 -3
  167. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  168. package/package.json +1 -1
  169. package/src/commands/migrate-removed-fields.command.ts +81 -0
  170. package/src/controllers/datasource-introspection.controller.ts +27 -1
  171. package/src/controllers/service.controller.ts +3 -2
  172. package/src/dtos/datasource-introspection-mapping.dto.ts +15 -0
  173. package/src/entities/{legacy-common-with-id.entity.ts → legacy-common-with-generated-id.entity.ts} +1 -1
  174. package/src/helpers/command.service.ts +10 -2
  175. package/src/helpers/environment.helper.ts +11 -0
  176. package/src/helpers/field-crud-managers/IntFieldCrudManager.ts +4 -1
  177. package/src/helpers/model-metadata-helper.service.ts +8 -3
  178. package/src/helpers/nodemon-heartbeat.ts +59 -0
  179. package/src/helpers/solid-registry.ts +7 -1
  180. package/src/helpers/typeorm-db-helper.ts +15 -0
  181. package/src/index.ts +3 -2
  182. package/src/interfaces/datasource-introspection-provider.interface.ts +1 -0
  183. package/src/interfaces.ts +1 -0
  184. package/src/repository/scheduled-job.repository.ts +10 -4
  185. package/src/repository/security-rule.repository.ts +10 -4
  186. package/src/seeders/module-metadata-seeder.service.ts +192 -2
  187. package/src/seeders/seed-data/solid-core-metadata.json +128 -34
  188. package/src/services/1.js +6 -0
  189. package/src/services/api-key.service.ts +36 -36
  190. package/src/services/authentication.service.ts +46 -12
  191. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +11 -5
  192. package/src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts +15 -1
  193. package/src/services/crud-helper.service.ts +25 -12
  194. package/src/services/crud.service.ts +36 -11
  195. package/src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts +12 -0
  196. package/src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts +2 -0
  197. package/src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts +28 -15
  198. package/src/services/datasource-introspection.service.ts +811 -161
  199. package/src/services/import-transaction.service.ts +5 -0
  200. package/src/services/locale.service.ts +111 -3
  201. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +2 -2
  202. package/src/services/menu-item-metadata.service.ts +2 -1
  203. package/src/services/model-metadata.service.ts +109 -1
  204. package/src/services/module-metadata.service.ts +36 -0
  205. package/src/services/removed-field-migration.service.ts +334 -0
  206. package/src/services/role-metadata.service.ts +26 -2
  207. package/src/services/settings/default-settings-provider.service.ts +120 -0
  208. package/src/services/solid-ts-morph.service.ts +61 -1
  209. package/src/services/view-metadata.service.ts +4 -8
  210. package/src/solid-core.module.ts +4 -0
  211. package/src/subscribers/audit.subscriber.ts +101 -18
  212. package/src/subscribers/computed-entity-field.subscriber.ts +81 -28
  213. package/src/subscribers/created-by-updated-by.subscriber.ts +3 -0
  214. package/src/subscribers/field-metadata.subscriber.ts +3 -0
  215. package/src/subscribers/scheduled-job.subscriber.ts +3 -2
  216. package/src/subscribers/security-rule.subscriber.ts +8 -3
  217. package/dist/entities/legacy-common-with-id.entity.d.ts.map +0 -1
  218. package/dist/entities/legacy-common-with-id.entity.js.map +0 -1
  219. package/dist/entities/legacy-common.entity.d.ts.map +0 -1
  220. package/dist/entities/legacy-common.entity.js.map +0 -1
  221. package/dist-tests/api/authenticate.spec.js +0 -119
  222. package/dist-tests/api/authenticate.spec.js.map +0 -1
  223. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
  224. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
  225. package/dist-tests/api/ping.spec.js +0 -21
  226. package/dist-tests/api/ping.spec.js.map +0 -1
  227. package/dist-tests/helpers/auth.js +0 -41
  228. package/dist-tests/helpers/auth.js.map +0 -1
  229. package/dist-tests/helpers/env.js +0 -11
  230. package/dist-tests/helpers/env.js.map +0 -1
  231. package/docs/agent-hub-grooming.md +0 -301
  232. package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +0 -438
  233. package/docs/dashboards/dashboard-curl-smoke-tests.txt +0 -146
  234. package/docs/dashboards/delete-legacy-dashboard-metadata.sql +0 -172
  235. package/docs/datasource-introspection-ddl-analysis.md +0 -326
  236. package/docs/datasource-introspection-implementation-plan.md +0 -306
  237. package/docs/grouping-enhancements.md +0 -89
  238. package/docs/java-spring/README.md +0 -3
  239. package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
  240. package/docs/module-package-import-handoff.md +0 -691
  241. package/docs/seed-changes.md +0 -65
  242. package/docs/test-data-workflow.md +0 -200
  243. package/docs/type-declaration-import-issue.md +0 -24
  244. /package/src/entities/{legacy-common.entity.ts → legacy-common.entity-with-existing-id.entity.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"menu-item-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/menu-item-metadata.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAG3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAEjF,qBACa,uBAAwB,SAAQ,WAAW,CAAC,gBAAgB,CAAC;IAGtE,QAAQ,CAAC,aAAa,EAAE,aAAa;IAGrC,QAAQ,CAAC,IAAI,EAAE,0BAA0B;IACzC,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB;IACjD,QAAQ,CAAC,SAAS,EAAE,SAAS;gBALpB,aAAa,EAAE,aAAa,EAG5B,IAAI,EAAE,0BAA0B,EAChC,gBAAgB,EAAE,sBAAsB,EACxC,SAAS,EAAE,SAAS;IAOzB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,KAAK;IAU7C,MAAM,CAAC,sBAAsB,EAAE,yBAAyB;IA2BxD,aAAa,CAAC,UAAU,EAAE,cAAc;YAiFhC,aAAa;CAmE5B"}
1
+ {"version":3,"file":"menu-item-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/menu-item-metadata.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAG3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAEjF,qBACa,uBAAwB,SAAQ,WAAW,CAAC,gBAAgB,CAAC;IAGtE,QAAQ,CAAC,aAAa,EAAE,aAAa;IAGrC,QAAQ,CAAC,IAAI,EAAE,0BAA0B;IACzC,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB;IACjD,QAAQ,CAAC,SAAS,EAAE,SAAS;gBALpB,aAAa,EAAE,aAAa,EAG5B,IAAI,EAAE,0BAA0B,EAChC,gBAAgB,EAAE,sBAAsB,EACxC,SAAS,EAAE,SAAS;IAOzB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,KAAK;IAU7C,MAAM,CAAC,sBAAsB,EAAE,yBAAyB;IA2BxD,aAAa,CAAC,UAAU,EAAE,cAAc;YAiFhC,aAAa;CAoE5B"}
@@ -137,6 +137,7 @@ let MenuItemMetadataService = class MenuItemMetadataService extends crud_service
137
137
  path: path,
138
138
  key: rootItem.name.toLowerCase().replace(/\s+/g, '-'),
139
139
  icon: rootItem.iconName,
140
+ isSystem: (rootItem.action?.model?.isSystem ?? false) || rootItem.module?.name === "solid-core",
140
141
  };
141
142
  if (children.length > 0) {
142
143
  data["children"] = await this.buildMenuTree(children, allMenuItems, activeUser);
@@ -1 +1 @@
1
- {"version":3,"file":"menu-item-metadata.service.js","sourceRoot":"","sources":["../../src/services/menu-item-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { EntityManager } from 'typeorm';\nimport { CRUDService } from 'src/services/crud.service';\n\n\nimport { MenuItemMetadata } from '../entities/menu-item-metadata.entity';\nimport { UpdateMenuItemMetadataDto } from '../dtos/update-menu-item-metadata.dto';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\nimport { kebabCase } from 'lodash';\nimport { MenuItemMetadataRepository } from 'src/repository/menu-item-metadata.repository';\nimport { SavedFiltersRepository } from 'src/repository/saved-filters.repository';\n\n@Injectable()\nexport class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {\n constructor(\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(MenuItemMetadata, 'default')\n // readonly repo: Repository<MenuItemMetadata>,\n readonly repo: MenuItemMetadataRepository,\n readonly savedFiltersRepo: SavedFiltersRepository,\n readonly moduleRef: ModuleRef\n\n ) {\n super(entityManager, repo, 'menuItemMetadata', 'solid-core', moduleRef);\n }\n\n\n async findOneByUserKey(name: string, relations = {}) {\n const entity = await this.repo.findOne({\n where: {\n name: name,\n },\n relations: relations,\n });\n return entity;\n }\n\n async upsert(updateSolidMenuItemDto: UpdateMenuItemMetadataDto) {\n // Leave out all the extra attributes only keep the ones we are interested in updating.\n const { moduleUserKey, parentMenuItemUserKey, actionUserKey, rolesIds, rolesCommand, ...cleanUpdateSolidMenuItemDto } = updateSolidMenuItemDto;\n\n // First check if module already exists using name\n const existingMenuItem = await this.repo.findOne({\n where: {\n name: updateSolidMenuItemDto.name\n },\n relations: [\"roles\"]\n });\n\n // if found\n if (existingMenuItem) {\n // TODO: This is very slow disabling this for now..\n // const updatedSolidActionDto = { ...existingMenuItem, ...cleanUpdateSolidMenuItemDto };\n // return this.repo.save(updatedSolidActionDto);\n }\n // if not found - create new \n else {\n // @ts-ignore\n const moduleMetadata = this.repo.create(cleanUpdateSolidMenuItemDto);\n return this.repo.save(moduleMetadata);\n }\n }\n\n\n async findUserMenus(activeUser: ActiveUserData) {\n // 1. For the users role, fire a query to load all menus that this role has access to. \n // const usersMenuItems = this.solidMenuItemRepo.find({\n // where: {\n // roles: {\n // name: In(activeUser.roles)\n // }\n // },\n // relations: ['module', 'parentMenuItem', 'action']\n // });\n const qb = await this.repo.createSecurityRuleAwareQueryBuilder('menuItem')\n\n const menuItems = await qb\n .leftJoinAndSelect('menuItem.module', 'module')\n .leftJoinAndSelect('menuItem.parentMenuItem', 'parentMenuItem')\n .leftJoinAndSelect('menuItem.action', 'action')\n .leftJoinAndSelect('action.model', 'model') // Join the model relation of action\n .leftJoinAndSelect('action.view', 'view') // Join the view relation of action\n .leftJoinAndSelect('menuItem.roles', 'roles')\n .where('roles.name IN (:...roleNames)', { roleNames: activeUser.roles })\n .addOrderBy('module.menuSequenceNumber', 'ASC')\n .addOrderBy('menuItem.sequenceNumber', 'ASC')\n .getMany();\n\n // 2. First arrange the output of the above query by module based on module\n const modulesToMenuItemsMap = new Map<string, MenuItemMetadata[]>();\n const modulesMap = new Map<string, ModuleMetadata>();\n menuItems.forEach(menuItem => {\n const moduleName = menuItem.module.name;\n\n // Keep track of all menu items under a given module.\n if (!modulesToMenuItemsMap.has(moduleName)) {\n modulesToMenuItemsMap.set(moduleName, []);\n }\n modulesToMenuItemsMap.get(moduleName).push(menuItem);\n\n // Keep track of the modules information separately.\n if (!modulesMap.has(moduleName)) {\n modulesMap.set(moduleName, menuItem.module);\n }\n });\n\n // 3. Then for each module, do a recursive compilation of children based on parentMenuItem, while doing this use the relation - action to get hold of the path. \n const menu: any[] = [];\n\n // modulesToMenuItemsMap.forEach((menuItems, moduleName) => {\n // const rootMenuItems = menuItems.filter(item => !item.parentMenuItem);\n // const moduleMetadata = modulesMap.get(moduleName);\n\n // const moduleMenu = {\n // title: moduleMetadata.displayName,\n // // No need for path the module level.\n // // path: ``,\n // key: moduleName.toLowerCase().replace(/\\s+/g, '-'),\n // // TODO: We need to add the module icon as part of the metadata so it can be brought here. \n // // icon: `/images/menu/${moduleName.toLowerCase().replace(/\\s+/g, '-')}.svg`,\n // children: this.buildMenuTree(rootMenuItems, menuItems, activeUser),\n // icon: moduleMetadata.menuIconUrl,\n // };\n\n // menu.push(moduleMenu);\n // });\n for (const [moduleName, menuItemsForModule] of modulesToMenuItemsMap.entries()) {\n const rootMenuItems = menuItemsForModule.filter(item => !item.parentMenuItem);\n const moduleMetadata = modulesMap.get(moduleName);\n\n const moduleMenu = {\n title: moduleMetadata.displayName,\n key: moduleName.toLowerCase().replace(/\\s+/g, '-'),\n children: await this.buildMenuTree(rootMenuItems, menuItemsForModule, activeUser), // ✅ await here\n icon: moduleMetadata.menuIconUrl,\n };\n\n menu.push(moduleMenu);\n }\n\n\n return menu.filter(m => m.children.length > 0);\n }\n\n // Recursive function to build the tree\n private async buildMenuTree(rootItems: MenuItemMetadata[], allMenuItems: MenuItemMetadata[], activeUser: ActiveUserData): Promise<any[]> {\n const menuItemsData = await Promise.all(\n rootItems.map(async rootItem => {\n const allowedMenuItems = allMenuItems.filter(i => {\n if (!i.parentMenuItem) {\n return true\n } else {\n if(i.action.type === 'custom'){\n return true;\n }\n return this.crudHelperService.hasReadPermissionOnModel(activeUser, i.action.model.singularName)\n }\n });\n // Get immediate children of the current loop variable menuItem.\n const children = allowedMenuItems.filter(item => item.parentMenuItem && item.parentMenuItem.id === rootItem.id);\n const menuItemId = rootItem?.id ?? \"\";\n const menuItemName = rootItem?.name ?? \"\";\n const actionId = rootItem?.action?.id ?? \"\";\n const actionName = rootItem?.action?.name ?? \"\";\n // TODO: We should specify path only if there are no more children present. \n // For now adding path everywhere. \n let path = '';\n\n const layout = rootItem?.action?.view && rootItem?.action?.view?.layout ? JSON.parse(rootItem?.action?.view?.layout) : null\n let savedFilterId = null;\n if (layout && layout?.attrs?.defaultSavedFilter) {\n const savedFilter = await this.savedFiltersRepo.findOne({\n where: {\n name: layout?.attrs?.defaultSavedFilter,\n isPrivate: false\n },\n });\n if (savedFilter) {\n savedFilterId = savedFilter.id\n }\n }\n if (rootItem.action && rootItem.action.type === 'custom') {\n path = `${rootItem.action.customComponent}?menuItemId=${menuItemId}&menuItemName=${menuItemName}&actionId=${actionId}&actionName=${actionName}${savedFilterId ? `&savedQuery=${savedFilterId}` : ''}`;\n }\n if (rootItem.action && rootItem.action.type === 'solid') {\n if (this.crudHelperService.hasReadPermissionOnModel(activeUser, rootItem.action.model.singularName)) {\n // TODO: Here we are assuming that we will always take the user to collection view of a model. \n // We can make provision to take them other views also in the future. \n // path = `/admin/core/${rootItem.module.name}/${rootItem.action.model.singularName}/${rootItem.action.view.name}`;\n path = `/admin/core/${rootItem.module.name}/${kebabCase(rootItem.action?.model?.singularName ?? 'unknown')}/${rootItem.action?.view?.type ?? 'list'}?menuItemId=${menuItemId}&menuItemName=${menuItemName}&actionId=${actionId}&actionName=${actionName}${savedFilterId ? `&savedQuery=${savedFilterId}` : ''}`;\n\n }\n }\n\n // We are not checking for empty path coz, this is required for parent menu items.\n const data = {\n title: rootItem.displayName || rootItem.name,\n path: path,\n key: rootItem.name.toLowerCase().replace(/\\s+/g, '-'),\n icon: rootItem.iconName,\n // iconVariant : rootItem.iconVariant\n }\n if (children.length > 0) {\n data[\"children\"] = await this.buildMenuTree(children, allMenuItems, activeUser);\n }\n return data;\n\n }));\n return menuItemsData.filter(mi => mi && mi)\n }\n\n\n}\n"]}
1
+ {"version":3,"file":"menu-item-metadata.service.js","sourceRoot":"","sources":["../../src/services/menu-item-metadata.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAsD;AACtD,uCAAyC;AACzC,qCAAwC;AACxC,iDAAwD;AAOxD,mCAAmC;AACnC,+FAA0F;AAC1F,qFAAiF;AAG1E,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,0BAA6B;IACxE,YAEW,aAA4B,EAG5B,IAAgC,EAChC,gBAAwC,EACxC,SAAoB;QAG7B,KAAK,CAAC,aAAa,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QAR/D,kBAAa,GAAb,aAAa,CAAe;QAG5B,SAAI,GAAJ,IAAI,CAA4B;QAChC,qBAAgB,GAAhB,gBAAgB,CAAwB;QACxC,cAAS,GAAT,SAAS,CAAW;IAI/B,CAAC;IAGD,KAAK,CAAC,gBAAgB,CAAC,IAAY,EAAE,SAAS,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YACrC,KAAK,EAAE;gBACL,IAAI,EAAE,IAAI;aACX;YACD,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,sBAAiD;QAE5D,MAAM,EAAE,aAAa,EAAE,qBAAqB,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,2BAA2B,EAAE,GAAG,sBAAsB,CAAC;QAG/I,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YAC/C,KAAK,EAAE;gBACL,IAAI,EAAE,sBAAsB,CAAC,IAAI;aAClC;YACD,SAAS,EAAE,CAAC,OAAO,CAAC;SACrB,CAAC,CAAC;QAGH,IAAI,gBAAgB,EAAE,CAAC;QAIvB,CAAC;aAEI,CAAC;YAEJ,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAGD,KAAK,CAAC,aAAa,CAAC,UAA0B;QAU5C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,UAAU,CAAC,CAAA;QAE1E,MAAM,SAAS,GAAG,MAAM,EAAE;aACvB,iBAAiB,CAAC,iBAAiB,EAAE,QAAQ,CAAC;aAC9C,iBAAiB,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;aAC9D,iBAAiB,CAAC,iBAAiB,EAAE,QAAQ,CAAC;aAC9C,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC;aAC1C,iBAAiB,CAAC,aAAa,EAAE,MAAM,CAAC;aACxC,iBAAiB,CAAC,gBAAgB,EAAE,OAAO,CAAC;aAC5C,KAAK,CAAC,+BAA+B,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;aACvE,UAAU,CAAC,2BAA2B,EAAE,KAAK,CAAC;aAC9C,UAAU,CAAC,yBAAyB,EAAE,KAAK,CAAC;aAC5C,OAAO,EAAE,CAAC;QAGb,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAA8B,CAAC;QACpE,MAAM,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;QACrD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC3B,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;YAGxC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3C,qBAAqB,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAGrD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC,CAAC,CAAC;QAGH,MAAM,IAAI,GAAU,EAAE,CAAC;QAmBvB,KAAK,MAAM,CAAC,UAAU,EAAE,kBAAkB,CAAC,IAAI,qBAAqB,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/E,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC9E,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAElD,MAAM,UAAU,GAAG;gBACjB,KAAK,EAAE,cAAc,CAAC,WAAW;gBACjC,GAAG,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;gBAClD,QAAQ,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,kBAAkB,EAAE,UAAU,CAAC;gBACjF,IAAI,EAAE,cAAc,CAAC,WAAW;aACjC,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;QAGD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAGO,KAAK,CAAC,aAAa,CAAC,SAA6B,EAAE,YAAgC,EAAE,UAA0B;QACrH,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CACrC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAC,QAAQ,EAAC,EAAE;YAC7B,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBAC/C,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;oBACtB,OAAO,IAAI,CAAA;gBACb,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC/B,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,OAAO,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;gBACjG,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC;YAChH,MAAM,UAAU,GAAG,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;YACtC,MAAM,YAAY,GAAG,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC;YAC5C,MAAM,UAAU,GAAG,QAAQ,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;YAGhD,IAAI,IAAI,GAAG,EAAE,CAAC;YAEd,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAM,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAC3H,IAAI,aAAa,GAAG,IAAI,CAAC;YACzB,IAAI,MAAM,IAAI,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;gBAChD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;oBACtD,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB;wBACvC,SAAS,EAAE,KAAK;qBACjB;iBACF,CAAC,CAAC;gBACH,IAAI,WAAW,EAAE,CAAC;oBAChB,aAAa,GAAG,WAAW,CAAC,EAAE,CAAA;gBAChC,CAAC;YACH,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzD,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,eAAe,eAAe,UAAU,iBAAiB,YAAY,aAAa,QAAQ,eAAe,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACxM,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACxD,IAAI,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;oBAIpG,IAAI,GAAG,eAAe,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,IAAA,kBAAS,EAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,IAAI,SAAS,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,MAAM,eAAe,UAAU,iBAAiB,YAAY,aAAa,QAAQ,eAAe,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAElT,CAAC;YACH,CAAC;YAGD,MAAM,IAAI,GAAG;gBACX,KAAK,EAAE,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI;gBAC5C,IAAI,EAAE,IAAI;gBACV,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;gBACrD,IAAI,EAAE,QAAQ,CAAC,QAAQ;gBAEvB,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,IAAI,KAAK,YAAY;aAChG,CAAA;YACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;YAClF,CAAC;YACD,OAAO,IAAI,CAAC;QAEd,CAAC,CAAC,CAAC,CAAC;QACN,OAAO,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,CAAC;CAGF,CAAA;AAzMY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,6BAAmB,GAAE,CAAA;qCACE,uBAAa;QAGtB,0DAA0B;QACd,iDAAsB;QAC7B,gBAAS;GARpB,uBAAuB,CAyMnC","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { EntityManager } from 'typeorm';\nimport { CRUDService } from 'src/services/crud.service';\n\n\nimport { MenuItemMetadata } from '../entities/menu-item-metadata.entity';\nimport { UpdateMenuItemMetadataDto } from '../dtos/update-menu-item-metadata.dto';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\nimport { kebabCase } from 'lodash';\nimport { MenuItemMetadataRepository } from 'src/repository/menu-item-metadata.repository';\nimport { SavedFiltersRepository } from 'src/repository/saved-filters.repository';\n\n@Injectable()\nexport class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {\n constructor(\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(MenuItemMetadata, 'default')\n // readonly repo: Repository<MenuItemMetadata>,\n readonly repo: MenuItemMetadataRepository,\n readonly savedFiltersRepo: SavedFiltersRepository,\n readonly moduleRef: ModuleRef\n\n ) {\n super(entityManager, repo, 'menuItemMetadata', 'solid-core', moduleRef);\n }\n\n\n async findOneByUserKey(name: string, relations = {}) {\n const entity = await this.repo.findOne({\n where: {\n name: name,\n },\n relations: relations,\n });\n return entity;\n }\n\n async upsert(updateSolidMenuItemDto: UpdateMenuItemMetadataDto) {\n // Leave out all the extra attributes only keep the ones we are interested in updating.\n const { moduleUserKey, parentMenuItemUserKey, actionUserKey, rolesIds, rolesCommand, ...cleanUpdateSolidMenuItemDto } = updateSolidMenuItemDto;\n\n // First check if module already exists using name\n const existingMenuItem = await this.repo.findOne({\n where: {\n name: updateSolidMenuItemDto.name\n },\n relations: [\"roles\"]\n });\n\n // if found\n if (existingMenuItem) {\n // TODO: This is very slow disabling this for now..\n // const updatedSolidActionDto = { ...existingMenuItem, ...cleanUpdateSolidMenuItemDto };\n // return this.repo.save(updatedSolidActionDto);\n }\n // if not found - create new \n else {\n // @ts-ignore\n const moduleMetadata = this.repo.create(cleanUpdateSolidMenuItemDto);\n return this.repo.save(moduleMetadata);\n }\n }\n\n\n async findUserMenus(activeUser: ActiveUserData) {\n // 1. For the users role, fire a query to load all menus that this role has access to. \n // const usersMenuItems = this.solidMenuItemRepo.find({\n // where: {\n // roles: {\n // name: In(activeUser.roles)\n // }\n // },\n // relations: ['module', 'parentMenuItem', 'action']\n // });\n const qb = await this.repo.createSecurityRuleAwareQueryBuilder('menuItem')\n\n const menuItems = await qb\n .leftJoinAndSelect('menuItem.module', 'module')\n .leftJoinAndSelect('menuItem.parentMenuItem', 'parentMenuItem')\n .leftJoinAndSelect('menuItem.action', 'action')\n .leftJoinAndSelect('action.model', 'model') // Join the model relation of action\n .leftJoinAndSelect('action.view', 'view') // Join the view relation of action\n .leftJoinAndSelect('menuItem.roles', 'roles')\n .where('roles.name IN (:...roleNames)', { roleNames: activeUser.roles })\n .addOrderBy('module.menuSequenceNumber', 'ASC')\n .addOrderBy('menuItem.sequenceNumber', 'ASC')\n .getMany();\n\n // 2. First arrange the output of the above query by module based on module\n const modulesToMenuItemsMap = new Map<string, MenuItemMetadata[]>();\n const modulesMap = new Map<string, ModuleMetadata>();\n menuItems.forEach(menuItem => {\n const moduleName = menuItem.module.name;\n\n // Keep track of all menu items under a given module.\n if (!modulesToMenuItemsMap.has(moduleName)) {\n modulesToMenuItemsMap.set(moduleName, []);\n }\n modulesToMenuItemsMap.get(moduleName).push(menuItem);\n\n // Keep track of the modules information separately.\n if (!modulesMap.has(moduleName)) {\n modulesMap.set(moduleName, menuItem.module);\n }\n });\n\n // 3. Then for each module, do a recursive compilation of children based on parentMenuItem, while doing this use the relation - action to get hold of the path. \n const menu: any[] = [];\n\n // modulesToMenuItemsMap.forEach((menuItems, moduleName) => {\n // const rootMenuItems = menuItems.filter(item => !item.parentMenuItem);\n // const moduleMetadata = modulesMap.get(moduleName);\n\n // const moduleMenu = {\n // title: moduleMetadata.displayName,\n // // No need for path the module level.\n // // path: ``,\n // key: moduleName.toLowerCase().replace(/\\s+/g, '-'),\n // // TODO: We need to add the module icon as part of the metadata so it can be brought here. \n // // icon: `/images/menu/${moduleName.toLowerCase().replace(/\\s+/g, '-')}.svg`,\n // children: this.buildMenuTree(rootMenuItems, menuItems, activeUser),\n // icon: moduleMetadata.menuIconUrl,\n // };\n\n // menu.push(moduleMenu);\n // });\n for (const [moduleName, menuItemsForModule] of modulesToMenuItemsMap.entries()) {\n const rootMenuItems = menuItemsForModule.filter(item => !item.parentMenuItem);\n const moduleMetadata = modulesMap.get(moduleName);\n\n const moduleMenu = {\n title: moduleMetadata.displayName,\n key: moduleName.toLowerCase().replace(/\\s+/g, '-'),\n children: await this.buildMenuTree(rootMenuItems, menuItemsForModule, activeUser), // ✅ await here\n icon: moduleMetadata.menuIconUrl,\n };\n\n menu.push(moduleMenu);\n }\n\n\n return menu.filter(m => m.children.length > 0);\n }\n\n // Recursive function to build the tree\n private async buildMenuTree(rootItems: MenuItemMetadata[], allMenuItems: MenuItemMetadata[], activeUser: ActiveUserData): Promise<any[]> {\n const menuItemsData = await Promise.all(\n rootItems.map(async rootItem => {\n const allowedMenuItems = allMenuItems.filter(i => {\n if (!i.parentMenuItem) {\n return true\n } else {\n if (i.action.type === 'custom') {\n return true;\n }\n return this.crudHelperService.hasReadPermissionOnModel(activeUser, i.action.model.singularName)\n }\n });\n // Get immediate children of the current loop variable menuItem.\n const children = allowedMenuItems.filter(item => item.parentMenuItem && item.parentMenuItem.id === rootItem.id);\n const menuItemId = rootItem?.id ?? \"\";\n const menuItemName = rootItem?.name ?? \"\";\n const actionId = rootItem?.action?.id ?? \"\";\n const actionName = rootItem?.action?.name ?? \"\";\n // TODO: We should specify path only if there are no more children present. \n // For now adding path everywhere. \n let path = '';\n\n const layout = rootItem?.action?.view && rootItem?.action?.view?.layout ? JSON.parse(rootItem?.action?.view?.layout) : null\n let savedFilterId = null;\n if (layout && layout?.attrs?.defaultSavedFilter) {\n const savedFilter = await this.savedFiltersRepo.findOne({\n where: {\n name: layout?.attrs?.defaultSavedFilter,\n isPrivate: false\n },\n });\n if (savedFilter) {\n savedFilterId = savedFilter.id\n }\n }\n if (rootItem.action && rootItem.action.type === 'custom') {\n path = `${rootItem.action.customComponent}?menuItemId=${menuItemId}&menuItemName=${menuItemName}&actionId=${actionId}&actionName=${actionName}${savedFilterId ? `&savedQuery=${savedFilterId}` : ''}`;\n }\n if (rootItem.action && rootItem.action.type === 'solid') {\n if (this.crudHelperService.hasReadPermissionOnModel(activeUser, rootItem.action.model.singularName)) {\n // TODO: Here we are assuming that we will always take the user to collection view of a model. \n // We can make provision to take them other views also in the future. \n // path = `/admin/core/${rootItem.module.name}/${rootItem.action.model.singularName}/${rootItem.action.view.name}`;\n path = `/admin/core/${rootItem.module.name}/${kebabCase(rootItem.action?.model?.singularName ?? 'unknown')}/${rootItem.action?.view?.type ?? 'list'}?menuItemId=${menuItemId}&menuItemName=${menuItemName}&actionId=${actionId}&actionName=${actionName}${savedFilterId ? `&savedQuery=${savedFilterId}` : ''}`;\n\n }\n }\n\n // We are not checking for empty path coz, this is required for parent menu items.\n const data = {\n title: rootItem.displayName || rootItem.name,\n path: path,\n key: rootItem.name.toLowerCase().replace(/\\s+/g, '-'),\n icon: rootItem.iconName,\n // iconVariant : rootItem.iconVariant\n isSystem: (rootItem.action?.model?.isSystem ?? false) || rootItem.module?.name === \"solid-core\",\n }\n if (children.length > 0) {\n data[\"children\"] = await this.buildMenuTree(children, allMenuItems, activeUser);\n }\n return data;\n\n }));\n return menuItemsData.filter(mi => mi && mi)\n }\n\n\n}\n"]}
@@ -46,6 +46,8 @@ export declare class ModelMetadataService {
46
46
  deleteMany(ids: number[]): Promise<any>;
47
47
  remove(id: number): Promise<ModelMetadata>;
48
48
  cleanupOnDelete(modelEntityId: number): Promise<void>;
49
+ private resolveSolidApiRoot;
50
+ private cleanupAssociatedTypeormDatasourceFiles;
49
51
  private cleanupAssociatedViewsActionsAndMenus;
50
52
  private cleanupAssociatedImports;
51
53
  private cleanupAssociatedPermissions;
@@ -67,6 +69,7 @@ export declare class ModelMetadataService {
67
69
  generateModelCode(options: CodeGenerationOptions): Promise<string>;
68
70
  private executeRefreshModelCommand;
69
71
  private executeRemoveFieldsCommand;
72
+ private executeMigrationRemoveFieldsCommand;
70
73
  updateUserKey(data: any): Promise<{
71
74
  message: string;
72
75
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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"}
@@ -49,6 +49,7 @@ exports.ModelMetadataService = void 0;
49
49
  const common_1 = require("@nestjs/common");
50
50
  const typeorm_1 = require("@nestjs/typeorm");
51
51
  const fs = __importStar(require("fs/promises"));
52
+ const fs_1 = require("fs");
52
53
  const path = __importStar(require("path"));
53
54
  const typeorm_2 = require("typeorm");
54
55
  const model_metadata_entity_1 = require("../entities/model-metadata.entity");
@@ -70,6 +71,8 @@ const permission_metadata_entity_1 = require("../entities/permission-metadata.en
70
71
  const role_metadata_entity_1 = require("../entities/role-metadata.entity");
71
72
  const view_metadata_entity_1 = require("../entities/view-metadata.entity");
72
73
  const command_service_1 = require("../helpers/command.service");
74
+ const environment_helper_1 = require("../helpers/environment.helper");
75
+ const nodemon_heartbeat_1 = require("../helpers/nodemon-heartbeat");
73
76
  const schematic_service_1 = require("../helpers/schematic.service");
74
77
  const string_helper_1 = require("../helpers/string.helper");
75
78
  const crud_helper_service_1 = require("./crud-helper.service");
@@ -605,6 +608,54 @@ let ModelMetadataService = class ModelMetadataService {
605
608
  this.logger.error(`Failed to clean up module file for model '${modelEntity.singularName}':`, error);
606
609
  }
607
610
  }
611
+ await this.cleanupAssociatedTypeormDatasourceFiles(modelEntity, modulePath);
612
+ }
613
+ resolveSolidApiRoot() {
614
+ const cwd = process.cwd();
615
+ const candidates = [
616
+ cwd,
617
+ path.join(cwd, 'solid-api'),
618
+ ];
619
+ for (const candidate of candidates) {
620
+ const srcRoot = path.join(candidate, 'src');
621
+ if ((0, fs_1.existsSync)(srcRoot)) {
622
+ return candidate;
623
+ }
624
+ }
625
+ return null;
626
+ }
627
+ async cleanupAssociatedTypeormDatasourceFiles(modelEntity, modulePath) {
628
+ if (!modulePath) {
629
+ return;
630
+ }
631
+ const solidApiRoot = this.resolveSolidApiRoot();
632
+ if (!solidApiRoot) {
633
+ this.logger.warn(`Unable to locate consuming solid-api workspace while cleaning datasource files for model '${modelEntity.singularName}'`);
634
+ return;
635
+ }
636
+ const srcRoot = path.join(solidApiRoot, 'src');
637
+ const srcEntries = await fs.readdir(srcRoot).catch(() => []);
638
+ const datasourceFiles = srcEntries
639
+ .filter((entry) => /^typeorm-.*-datasource\.ts$/.test(entry))
640
+ .map((entry) => path.join(srcRoot, entry));
641
+ if (datasourceFiles.length === 0) {
642
+ return;
643
+ }
644
+ const moduleDirName = path.basename(modulePath);
645
+ const entityClassName = (0, string_helper_1.classify)(modelEntity.singularName);
646
+ const entityImportPath = `./${moduleDirName}/entities/${(0, lodash_1.kebabCase)(modelEntity.singularName)}.entity`;
647
+ this.logger.log(`Scanning ${datasourceFiles.length} TypeORM datasource file(s) for model '${modelEntity.singularName}' cleanup`);
648
+ try {
649
+ this.solidTsMorphService.begin();
650
+ for (const datasourceFile of datasourceFiles) {
651
+ this.solidTsMorphService.cleanupTypeormDatasourceEntity(datasourceFile, entityImportPath, entityClassName);
652
+ }
653
+ await this.solidTsMorphService.commit();
654
+ }
655
+ catch (error) {
656
+ this.solidTsMorphService.rollback();
657
+ this.logger.error(`Failed to clean datasource files for model '${modelEntity.singularName}':`, error);
658
+ }
608
659
  }
609
660
  async cleanupAssociatedViewsActionsAndMenus(modelId) {
610
661
  const viewRepo = this.dataSource.getRepository(view_metadata_entity_1.ViewMetadata);
@@ -789,6 +840,20 @@ let ModelMetadataService = class ModelMetadataService {
789
840
  }
790
841
  async generateCodeViaCtl(modelId) {
791
842
  const model = await this.findOne(modelId);
843
+ const isEmbedded = (0, environment_helper_1.isEmbeddedDb)();
844
+ if (isEmbedded) {
845
+ this.logger.log('Embedded database detected — generating API code in-process');
846
+ const heartbeat = (0, nodemon_heartbeat_1.startNodemonHeartbeat)(path.join(process.cwd(), 'src'));
847
+ try {
848
+ return await this.handleGenerateCode({
849
+ modelUserKey: model.singularName,
850
+ dryRun: false,
851
+ });
852
+ }
853
+ finally {
854
+ heartbeat.stop();
855
+ }
856
+ }
792
857
  return this.commandService.executeCommandWithArgs({
793
858
  command: 'npx',
794
859
  args: ['@solidxai/solidctl@latest', 'generate', 'model', `--name=${model.singularName}`],
@@ -1220,6 +1285,7 @@ let ModelMetadataService = class ModelMetadataService {
1220
1285
  const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);
1221
1286
  const fieldsForRemoval = model.fields.filter((field) => options.fieldIdsForRemoval.includes(+field.id));
1222
1287
  const removeOutput = await this.executeRemoveFieldsCommand(model, fieldsForRemoval, options.dryRun);
1288
+ const migrationOutput = await this.executeMigrationRemoveFieldsCommand(model, fieldsForRemoval, options.dryRun);
1223
1289
  for (const field of fieldsForRemoval) {
1224
1290
  if (field.isMarkedForRemoval) {
1225
1291
  await this.fieldMetadataService.delete(field.id);
@@ -1271,6 +1337,18 @@ let ModelMetadataService = class ModelMetadataService {
1271
1337
  this.logger.debug(`Schematic output : ${output}`);
1272
1338
  return output;
1273
1339
  }
1340
+ async executeMigrationRemoveFieldsCommand(model, fieldsForRemoval, dryRun = false) {
1341
+ if (!fieldsForRemoval || fieldsForRemoval.length === 0) {
1342
+ return "";
1343
+ }
1344
+ const output = await this.commandService.executeCommandWithArgs({
1345
+ command: 'npx',
1346
+ args: ['@solidxai/solidctl@latest', 'migration', '-n', model.singularName, 'remove-field', ...(dryRun ? [] : ['--apply'])],
1347
+ cwd: path.join(process.cwd(), '..'),
1348
+ });
1349
+ this.logger.debug(`Schematic output : ${output}`);
1350
+ return output;
1351
+ }
1274
1352
  async updateUserKey(data) {
1275
1353
  const { modelName, fieldName } = data;
1276
1354
  const model = await this.modelMetadataRepo.findOne({