@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removed-field-migration.service.js","sourceRoot":"","sources":["../../src/services/removed-field-migration.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA4F;AAC5F,uCAAyC;AACzC,6CAAqD;AACrD,mCAA8C;AAC9C,2CAA6B;AAC7B,gEAA8D;AAC9D,iFAAkF;AAGlF,8FAAyF;AACzF,4DAAqD;AACrD,uFAAmF;AACnF,uFAAmF;AAW5E,IAAM,4BAA4B,oCAAlC,MAAM,4BAA4B;IACrC,YACqB,iBAA0C,EAC1C,iBAA0C,EAC1C,2BAAwD,EACxD,SAAoB;QAHpB,sBAAiB,GAAjB,iBAAiB,CAAyB;QAC1C,sBAAiB,GAAjB,iBAAiB,CAAyB;QAC1C,gCAA2B,GAA3B,2BAA2B,CAA6B;QACxD,cAAS,GAAT,SAAS,CAAW;QAGxB,WAAM,GAAG,IAAI,eAAM,CAAC,8BAA4B,CAAC,IAAI,CAAC,CAAC;IAFpE,CAAC;IAKL,KAAK,CAAC,mBAAmB,CAAC,YAAoB,EAAE,SAAkB,KAAK;QACnE,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,4BAAmB,CAAC,wBAAwB,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;YAC/C,KAAK,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE;YACrC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;SAC5C,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,0BAAiB,CAAC,+BAAc,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAClF,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,sDAAsD,KAAK,CAAC,YAAY,IAAI,CAAC;YAC7F,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO;gBACH,MAAM;gBACN,SAAS,EAAE,KAAK,CAAC,YAAY;gBAC7B,UAAU;gBACV,iBAAiB,EAAE,EAAE;aACxB,CAAC;QACN,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAClE,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACrE,MAAM,WAAW,GAAG,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAEnD,IAAI,CAAC;YACD,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;YAE5B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,WAAW,CAAC,gBAAgB,EAAE,CAAC;YACzC,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;gBACnC,MAAM,IAAI,CAAC,kBAAkB,CAAC;oBAC1B,KAAK;oBACL,KAAK;oBACL,cAAc;oBACd,WAAW;oBACX,MAAM;oBACN,UAAU;iBACb,CAAC,CAAC;YACP,CAAC;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,WAAW,CAAC,iBAAiB,EAAE,CAAC;YAC1C,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,mBAAmB,EAAE,CAAC;gBAC7C,MAAM,WAAW,CAAC,mBAAmB,EAAE,CAAC;YAC5C,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;gBAAS,CAAC;YACP,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAChC,CAAC;QAED,OAAO;YACH,MAAM;YACN,SAAS,EAAE,KAAK,CAAC,YAAY;YAC7B,UAAU;YACV,iBAAiB,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SACjE,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,MAAyJ;QACtL,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QACjF,MAAM,gBAAgB,GAAG,cAAc,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5G,MAAM,iBAAiB,GAAG,cAAc,EAAE,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;QAEvE,IAAI,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;YAC7F,MAAM,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAC5G,OAAO;QACX,CAAC;QAED,IAAI,KAAK,CAAC,YAAY,KAAK,wCAAY,CAAC,SAAS,EAAE,CAAC;YAChD,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;YAC7F,MAAM,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAC5G,OAAO;QACX,CAAC;QAED,IAAI,KAAK,CAAC,YAAY,KAAK,wCAAY,CAAC,UAAU,EAAE,CAAC;YACjD,MAAM,aAAa,GAAG,gBAAgB,EAAE,sBAAsB,EAAE,SAAS,IAAI,KAAK,CAAC,qBAAqB,CAAC;YACzG,MAAM,aAAa,GAAG,gBAAgB,EAAE,QAAQ,IAAI,KAAK,CAAC,yBAAyB,CAAC;YAEpF,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,UAAU,CAAC,IAAI,CAAC,uEAAuE,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;gBACvG,OAAO;YACX,CAAC;YAED,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,UAAU,CAAC,IAAI,CAAC,oCAAoC,KAAK,CAAC,IAAI,iDAAiD,CAAC,CAAC;gBACjH,OAAO;YACX,CAAC;YAED,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAChF,OAAO;QACX,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,2DAA2D,KAAK,CAAC,IAAI,gBAAgB,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;IACjI,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,SAAiB,EAAE,KAAoB,EAAE,gBAA0B,EAAE,WAAwB,EAAE,MAAe,EAAE,UAAoB;QAClK,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,UAAU,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,uDAAuD,CAAC,CAAC;YACtG,OAAO;QACX,CAAC;QAED,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,mDAAmD,CAAC,CAAC;YAClG,OAAO;QACX,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAE7B,KAAK,MAAM,UAAU,IAAI,gBAAgB,EAAE,CAAC;YACxC,IAAI,CAAC,UAAU,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChD,SAAS;YACb,CAAC;YAED,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YAErF,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,SAAS;YACb,CAAC;YAED,gBAAgB,GAAG,IAAI,CAAC;YACxB,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QACvF,CAAC;QAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,uCAAuC,KAAK,CAAC,IAAI,eAAe,SAAS,yCAAyC,CAAC,CAAC;QACxI,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,KAAY,EAAE,UAAkB,EAAE,WAAwB,EAAE,MAAe,EAAE,UAAoB;QAC/H,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACjG,UAAU,CAAC,IAAI,CAAC,qBAAqB,UAAU,CAAC,IAAI,SAAS,KAAK,CAAC,IAAI,IAAI,UAAU,GAAG,CAAC,CAAC;YAC1F,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,WAAW,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACxD,CAAC;QACL,CAAC;QAED,KAAK,MAAM,gBAAgB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACnG,UAAU,CAAC,IAAI,CAAC,2BAA2B,gBAAgB,CAAC,IAAI,SAAS,KAAK,CAAC,IAAI,IAAI,UAAU,GAAG,CAAC,CAAC;YACtG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,WAAW,CAAC,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YACpE,CAAC;QACL,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACxF,UAAU,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,IAAI,IAAI,UAAU,GAAG,CAAC,CAAC;YAC/E,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,IAAI,UAAU,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,aAAqB,EAAE,KAAoB,EAAE,WAAwB,EAAE,MAAe,EAAE,UAAoB;QACpI,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,UAAU,CAAC,IAAI,CAAC,eAAe,aAAa,gBAAgB,KAAK,CAAC,IAAI,wDAAwD,CAAC,CAAC;YAChI,OAAO;QACX,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,oBAAoB,aAAa,gBAAgB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QAChF,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IAEO,qBAAqB,CAAC,KAAoB,EAAE,cAA+B,EAAE,gBAAsD;QACvI,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;QAE3C,gBAAgB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9C,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBACtB,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,cAAc,EAAE,OAAO;aAClB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,KAAK,KAAK,CAAC,IAAI,CAAC;aACtD,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAChB,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBACtB,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC,CAAC,CAAC;QAEP,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,KAAK,CAAC,yBAAyB,EAAE,CAAC;YAClC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,QAAQ,IAAI,KAAK,CAAC,YAAY,KAAK,wCAAY,CAAC,SAAS,EAAE,CAAC;YAC1F,gBAAgB,CAAC,GAAG,CAAC,GAAG,IAAA,kBAAS,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACJ,gBAAgB,CAAC,GAAG,CAAC,IAAA,kBAAS,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,CAAC,GAAG,gBAAgB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,cAAuB;QACnD,MAAM,wBAAwB,GAAG,cAAc,IAAI,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7G,MAAM,KAAK,GAAG,wBAAwB,CAAC,CAAC,CAAC,IAAA,4BAAkB,EAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,IAAA,4BAAkB,GAAE,CAAC;QAC7G,IAAI,UAAkC,CAAC;QAEvC,IAAI,CAAC;YACD,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAa,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,IAAI,0BAAiB,CAAC,eAAe,wBAAwB,IAAI,SAAS,4BAA4B,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;QAC3I,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,MAAM,IAAI,0BAAiB,CAAC,eAAe,wBAAwB,IAAI,SAAS,0BAA0B,CAAC,CAAC;QAChH,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;YAC5B,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC;QAClC,CAAC;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;IAEO,qBAAqB,CAAC,UAAsB,EAAE,KAAoB;QACtE,MAAM,UAAU,GAAG,CAAC,IAAA,wBAAQ,EAAC,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvG,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC;gBACD,OAAO,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC;YAET,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;IACjG,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,UAAkB;QACpD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC;QACjG,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,OAAO,WAAW,CAAC;QACvB,CAAC;QAED,MAAM,cAAc,GAAG,IAAA,kBAAS,EAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CACvC,OAAO,CAAC,GAAG,EAAE,EACb,iBAAiB,EACjB,cAAc,EACd,GAAG,cAAc,gBAAgB,CACpC,CAAC;QAEF,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAChD,OAAO,sBAAsB,CAAC;QAClC,CAAC;QAED,OAAO,WAAW,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,QAAgB;QACrC,IAAI,CAAC;YACD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,WAAwB,EAAE,SAAiB;QAC/D,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,OAAO,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IACxD,CAAC;CACJ,CAAA;AArTY,oEAA4B;uCAA5B,4BAA4B;IADxC,IAAA,mBAAU,GAAE;qCAG+B,mDAAuB;QACvB,mDAAuB;QACb,4DAA2B;QAC7C,gBAAS;GALhC,4BAA4B,CAqTxC","sourcesContent":["import * as fs from \"fs/promises\";\nimport { BadRequestException, Injectable, Logger, NotFoundException } from \"@nestjs/common\";\nimport { ModuleRef } from \"@nestjs/core\";\nimport { getDataSourceToken } from \"@nestjs/typeorm\";\nimport { kebabCase, snakeCase } from \"lodash\";\nimport * as path from \"path\";\nimport { ERROR_MESSAGES } from \"src/constants/error-messages\";\nimport { RelationType, SolidFieldType } from \"src/dtos/create-field-metadata.dto\";\nimport { FieldMetadata } from \"src/entities/field-metadata.entity\";\nimport { ModelMetadata } from \"src/entities/model-metadata.entity\";\nimport { ModuleMetadataHelperService } from \"src/helpers/module-metadata-helper.service\";\nimport { classify } from \"src/helpers/string.helper\";\nimport { FieldMetadataRepository } from \"src/repository/field-metadata.repository\";\nimport { ModelMetadataRepository } from \"src/repository/model-metadata.repository\";\nimport { DataSource, EntityMetadata, QueryRunner, Table } from \"typeorm\";\n\nexport interface RemovedFieldMigrationResult {\n dryRun: boolean;\n modelName: string;\n operations: string[];\n removedFieldNames: string[];\n}\n\n@Injectable()\nexport class RemovedFieldMigrationService {\n constructor(\n private readonly modelMetadataRepo: ModelMetadataRepository,\n private readonly fieldMetadataRepo: FieldMetadataRepository,\n private readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n private readonly moduleRef: ModuleRef,\n ) { }\n\n private readonly logger = new Logger(RemovedFieldMigrationService.name);\n\n // Cleans fields marked for removal by updating schema state and metadata for a single model.\n async migrateMarkedFields(modelUserKey: string, dryRun: boolean = false): Promise<RemovedFieldMigrationResult> {\n if (!modelUserKey) {\n throw new BadRequestException(\"Model name is required\");\n }\n\n const model = await this.modelMetadataRepo.findOne({\n where: { singularName: modelUserKey },\n relations: { fields: true, module: true },\n });\n\n if (!model) {\n throw new NotFoundException(ERROR_MESSAGES.MODEL_NOT_FOUND(modelUserKey));\n }\n\n const fieldsForRemoval = model.fields.filter((field) => field.isMarkedForRemoval);\n const operations: string[] = [];\n\n if (fieldsForRemoval.length === 0) {\n const message = `No fields marked for removal were found for model \"${model.singularName}\".`;\n this.logger.log(message);\n operations.push(message);\n return {\n dryRun,\n modelName: model.singularName,\n operations,\n removedFieldNames: [],\n };\n }\n\n const dataSource = await this.resolveDataSource(model.dataSource);\n const entityMetadata = this.resolveEntityMetadata(dataSource, model);\n const queryRunner = dataSource.createQueryRunner();\n\n try {\n await queryRunner.connect();\n\n if (!dryRun) {\n await queryRunner.startTransaction();\n }\n\n for (const field of fieldsForRemoval) {\n await this.cleanupMarkedField({\n field,\n model,\n entityMetadata,\n queryRunner,\n dryRun,\n operations,\n });\n }\n\n if (!dryRun) {\n await queryRunner.commitTransaction();\n }\n } catch (error) {\n if (!dryRun && queryRunner.isTransactionActive) {\n await queryRunner.rollbackTransaction();\n }\n throw error;\n } finally {\n await queryRunner.release();\n }\n\n return {\n dryRun,\n modelName: model.singularName,\n operations,\n removedFieldNames: fieldsForRemoval.map((field) => field.name),\n };\n }\n\n private async cleanupMarkedField(params: { field: FieldMetadata; model: ModelMetadata; entityMetadata?: EntityMetadata; queryRunner: QueryRunner; dryRun: boolean; operations: string[]; }): Promise<void> {\n const { field, model, entityMetadata, queryRunner, dryRun, operations } = params;\n const relationMetadata = entityMetadata?.relations.find((relation) => relation.propertyName === field.name);\n const resolvedTableName = entityMetadata?.tableName || model.tableName;\n\n if (field.type !== SolidFieldType.relation) {\n const columnCandidates = this.buildColumnCandidates(field, entityMetadata, relationMetadata);\n await this.dropColumnsForField(resolvedTableName, field, columnCandidates, queryRunner, dryRun, operations);\n return;\n }\n\n if (field.relationType === RelationType.manyToOne) {\n const columnCandidates = this.buildColumnCandidates(field, entityMetadata, relationMetadata);\n await this.dropColumnsForField(resolvedTableName, field, columnCandidates, queryRunner, dryRun, operations);\n return;\n }\n\n if (field.relationType === RelationType.manyTomany) {\n const joinTableName = relationMetadata?.junctionEntityMetadata?.tableName || field.relationJoinTableName;\n const ownsJoinTable = relationMetadata?.isOwning || field.isRelationManyToManyOwner;\n\n if (!ownsJoinTable) {\n operations.push(`No direct database cleanup required for inverse many-to-many field \"${field.name}\".`);\n return;\n }\n\n if (!joinTableName) {\n operations.push(`Skipping join-table cleanup for \"${field.name}\" because no join table name could be resolved.`);\n return;\n }\n\n await this.dropJoinTable(joinTableName, field, queryRunner, dryRun, operations);\n return;\n }\n\n operations.push(`No direct database cleanup required for relation field \"${field.name}\" with type \"${field.relationType}\".`);\n }\n\n private async dropColumnsForField(tableName: string, field: FieldMetadata, columnCandidates: string[], queryRunner: QueryRunner, dryRun: boolean, operations: string[],): Promise<void> {\n if (!tableName) {\n operations.push(`Skipping field \"${field.name}\" because the model table name could not be resolved.`);\n return;\n }\n\n if (columnCandidates.length === 0) {\n operations.push(`Skipping field \"${field.name}\" because no column candidates could be resolved.`);\n return;\n }\n\n const handledColumns = new Set<string>();\n let droppedAnyColumn = false;\n\n for (const columnName of columnCandidates) {\n if (!columnName || handledColumns.has(columnName)) {\n continue;\n }\n\n handledColumns.add(columnName);\n const table = await this.loadTable(queryRunner, tableName);\n const column = table?.columns.find((tableColumn) => tableColumn.name === columnName);\n\n if (!column) {\n continue;\n }\n\n droppedAnyColumn = true;\n await this.dropColumnArtifacts(table, columnName, queryRunner, dryRun, operations);\n }\n\n if (!droppedAnyColumn) {\n operations.push(`No database column found for field \"${field.name}\" on table \"${tableName}\". Metadata cleanup will still proceed.`);\n }\n }\n\n private async dropColumnArtifacts(table: Table, columnName: string, queryRunner: QueryRunner, dryRun: boolean, operations: string[],): Promise<void> {\n for (const foreignKey of table.foreignKeys.filter((item) => item.columnNames.includes(columnName))) {\n operations.push(`Drop foreign key \"${foreignKey.name}\" on \"${table.name}.${columnName}\"`);\n if (!dryRun) {\n await queryRunner.dropForeignKey(table, foreignKey);\n }\n }\n\n for (const uniqueConstraint of table.uniques.filter((item) => item.columnNames.includes(columnName))) {\n operations.push(`Drop unique constraint \"${uniqueConstraint.name}\" on \"${table.name}.${columnName}\"`);\n if (!dryRun) {\n await queryRunner.dropUniqueConstraint(table, uniqueConstraint);\n }\n }\n\n for (const index of table.indices.filter((item) => item.columnNames.includes(columnName))) {\n operations.push(`Drop index \"${index.name}\" on \"${table.name}.${columnName}\"`);\n if (!dryRun) {\n await queryRunner.dropIndex(table, index);\n }\n }\n\n operations.push(`Drop column \"${table.name}.${columnName}\"`);\n if (!dryRun) {\n await queryRunner.dropColumn(table, columnName);\n }\n }\n\n private async dropJoinTable(joinTableName: string, field: FieldMetadata, queryRunner: QueryRunner, dryRun: boolean, operations: string[]): Promise<void> {\n const table = await this.loadTable(queryRunner, joinTableName);\n if (!table) {\n operations.push(`Join table \"${joinTableName}\" for field \"${field.name}\" does not exist. Metadata cleanup will still proceed.`);\n return;\n }\n\n operations.push(`Drop join table \"${joinTableName}\" for field \"${field.name}\"`);\n if (!dryRun) {\n await queryRunner.dropTable(joinTableName);\n }\n }\n\n private buildColumnCandidates(field: FieldMetadata, entityMetadata?: EntityMetadata, relationMetadata?: EntityMetadata[\"relations\"][number]): string[] {\n const columnCandidates = new Set<string>();\n\n relationMetadata?.joinColumns?.forEach((column) => {\n if (column.databaseName) {\n columnCandidates.add(column.databaseName);\n }\n });\n\n entityMetadata?.columns\n .filter((column) => column.propertyName === field.name)\n .forEach((column) => {\n if (column.databaseName) {\n columnCandidates.add(column.databaseName);\n }\n });\n\n if (field.columnName) {\n columnCandidates.add(field.columnName);\n }\n\n if (field.relationCoModelColumnName) {\n columnCandidates.add(field.relationCoModelColumnName);\n }\n\n if (field.type === SolidFieldType.relation && field.relationType === RelationType.manyToOne) {\n columnCandidates.add(`${snakeCase(field.name)}_id`);\n } else {\n columnCandidates.add(snakeCase(field.name));\n }\n\n return [...columnCandidates].filter(Boolean);\n }\n\n private async resolveDataSource(dataSourceName?: string): Promise<DataSource> {\n const normalizedDataSourceName = dataSourceName && dataSourceName !== \"default\" ? dataSourceName : undefined;\n const token = normalizedDataSourceName ? getDataSourceToken(normalizedDataSourceName) : getDataSourceToken();\n let dataSource: DataSource | undefined;\n\n try {\n dataSource = this.moduleRef.get<DataSource>(token, { strict: false });\n } catch (error: any) {\n throw new NotFoundException(`Datasource \"${normalizedDataSourceName ?? \"default\"}\" could not be resolved: ${error?.message ?? error}`);\n }\n\n if (!dataSource) {\n throw new NotFoundException(`Datasource \"${normalizedDataSourceName ?? \"default\"}\" could not be resolved.`);\n }\n\n if (!dataSource.isInitialized) {\n await dataSource.initialize();\n }\n\n return dataSource;\n }\n\n private resolveEntityMetadata(dataSource: DataSource, model: ModelMetadata): EntityMetadata | undefined {\n const candidates = [classify(model.singularName), model.singularName, model.tableName].filter(Boolean);\n\n for (const candidate of candidates) {\n try {\n return dataSource.getMetadata(candidate);\n } catch {\n // Try the next candidate.\n }\n }\n\n return dataSource.entityMetadatas.find((metadata) => metadata.tableName === model.tableName);\n }\n\n private async resolveMetadataFilePath(moduleName: string): Promise<string> {\n const defaultPath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);\n if (await this.fileExists(defaultPath)) {\n return defaultPath;\n }\n\n const dashModuleName = kebabCase(moduleName);\n const moduleMetadataFilePath = path.resolve(\n process.cwd(),\n \"module-metadata\",\n dashModuleName,\n `${dashModuleName}-metadata.json`,\n );\n\n if (await this.fileExists(moduleMetadataFilePath)) {\n return moduleMetadataFilePath;\n }\n\n return defaultPath;\n }\n\n private async fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n private async loadTable(queryRunner: QueryRunner, tableName: string): Promise<Table | undefined> {\n if (!tableName) {\n return undefined;\n }\n\n const hasTable = await queryRunner.hasTable(tableName);\n if (!hasTable) {\n return undefined;\n }\n\n return queryRunner.getTable(tableName) ?? undefined;\n }\n}"]}
@@ -11,15 +11,20 @@ export declare class RoleMetadataService extends CRUDService<RoleMetadata> {
11
11
  readonly permissionRepository: PermissionMetadataRepository;
12
12
  readonly moduleRef: ModuleRef;
13
13
  private readonly logger;
14
+ private readonly permissionAssignmentBatchSize;
14
15
  constructor(entityManager: EntityManager, repo: RoleMetadataRepository, permissionRepository: PermissionMetadataRepository, moduleRef: ModuleRef);
15
16
  findRoleByName(roleName: string): Promise<RoleMetadata>;
16
17
  assertRoleExistsByName(roleName: string): Promise<void>;
17
18
  createRolesIfNotExists(roles: CreateRoleMetadataDto[]): Promise<void>;
19
+ private resolveRoleModule;
18
20
  addAllPermissionsToRole(roleName: string): Promise<RoleMetadata>;
19
21
  addPermissionsToRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata>;
20
22
  addPermissionToRole(roleName: string, permissionName: string[]): Promise<RoleMetadata>;
21
23
  private _addPermissionsToRole;
22
24
  removePermissionsFromRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata>;
23
25
  private preloadPermissionByName;
26
+ private loadTargetPermissions;
27
+ private getRolePermissionJoinInfo;
28
+ private insertRolePermissionMappings;
24
29
  }
25
30
  //# sourceMappingURL=role-metadata.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"role-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/role-metadata.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAM,MAAM,SAAS,CAAC;AAG5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAEhE,qBACa,mBAAoB,SAAQ,WAAW,CAAC,YAAY,CAAC;IAK9D,QAAQ,CAAC,aAAa,EAAE,aAAa;IAGrC,QAAQ,CAAC,IAAI,EAAE,sBAAsB;IAGrC,QAAQ,CAAC,oBAAoB,EAAE,4BAA4B;IAC3D,QAAQ,CAAC,SAAS,EAAE,SAAS;IAX/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;gBAIpD,aAAa,EAAE,aAAa,EAG5B,IAAI,EAAE,sBAAsB,EAG5B,oBAAoB,EAAE,4BAA4B,EAClD,SAAS,EAAE,SAAS;IAMzB,cAAc,CAAC,QAAQ,EAAE,MAAM;IAe/B,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAevD,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,EAAE;IAmDrD,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAIxF,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE;YAItD,qBAAqB;IAiE7B,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;YAsBrF,uBAAuB;CAWtC"}
1
+ {"version":3,"file":"role-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/role-metadata.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAM,MAAM,SAAS,CAAC;AAG5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAEhE,qBACa,mBAAoB,SAAQ,WAAW,CAAC,YAAY,CAAC;IAM9D,QAAQ,CAAC,aAAa,EAAE,aAAa;IAGrC,QAAQ,CAAC,IAAI,EAAE,sBAAsB;IAGrC,QAAQ,CAAC,oBAAoB,EAAE,4BAA4B;IAC3D,QAAQ,CAAC,SAAS,EAAE,SAAS;IAZ/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAO;gBAI1C,aAAa,EAAE,aAAa,EAG5B,IAAI,EAAE,sBAAsB,EAG5B,oBAAoB,EAAE,4BAA4B,EAClD,SAAS,EAAE,SAAS;IAMzB,cAAc,CAAC,QAAQ,EAAE,MAAM;IAe/B,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAevD,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,EAAE;YA0D7C,iBAAiB;IAgBzB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAIxF,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE;YAItD,qBAAqB;IA8C7B,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;YAsBrF,uBAAuB;YAUvB,qBAAqB;IAiBnC,OAAO,CAAC,yBAAyB;YAmBnB,4BAA4B;CAsB3C"}
@@ -22,6 +22,7 @@ const typeorm_2 = require("typeorm");
22
22
  const error_messages_1 = require("../constants/error-messages");
23
23
  const permission_metadata_repository_1 = require("../repository/permission-metadata.repository");
24
24
  const role_metadata_repository_1 = require("../repository/role-metadata.repository");
25
+ const module_metadata_entity_1 = require("../entities/module-metadata.entity");
25
26
  let RoleMetadataService = RoleMetadataService_1 = class RoleMetadataService extends crud_service_1.CRUDService {
26
27
  constructor(entityManager, repo, permissionRepository, moduleRef) {
27
28
  super(entityManager, repo, 'roleMetadata', 'solid-core', moduleRef);
@@ -30,6 +31,7 @@ let RoleMetadataService = RoleMetadataService_1 = class RoleMetadataService exte
30
31
  this.permissionRepository = permissionRepository;
31
32
  this.moduleRef = moduleRef;
32
33
  this.logger = new common_1.Logger(RoleMetadataService_1.name);
34
+ this.permissionAssignmentBatchSize = 500;
33
35
  }
34
36
  async findRoleByName(roleName) {
35
37
  const entity = await this.repo.findOne({
@@ -62,11 +64,14 @@ let RoleMetadataService = RoleMetadataService_1 = class RoleMetadataService exte
62
64
  for (let id = 0; id < roles.length; id++) {
63
65
  try {
64
66
  const roleObj = roles[id];
67
+ const module = await this.resolveRoleModule(roleObj);
65
68
  const existingRole = await this.repo.findOne({
66
69
  where: {
67
70
  name: roleObj.name,
68
71
  },
69
- relations: {},
72
+ relations: {
73
+ module: true,
74
+ },
70
75
  });
71
76
  if (!existingRole) {
72
77
  this.logger.debug(`Role ${roleObj.name} does not exist, hence creating`);
@@ -74,10 +79,14 @@ let RoleMetadataService = RoleMetadataService_1 = class RoleMetadataService exte
74
79
  if (roleObj.permissions && roleObj.permissions.length > 0) {
75
80
  await Promise.all(roleObj.permissions.map(permission => this.preloadPermissionByName(permission.name)));
76
81
  }
77
- const role = this.repo.create({ ...roleObj });
82
+ const role = this.repo.create({ ...roleObj, ...(module ? { module } : {}) });
78
83
  await this.repo.save(role);
79
84
  }
80
85
  else {
86
+ if (module && existingRole.module?.id !== module.id) {
87
+ existingRole.module = module;
88
+ await this.repo.save(existingRole);
89
+ }
81
90
  }
82
91
  }
83
92
  catch (error) {
@@ -85,6 +94,19 @@ let RoleMetadataService = RoleMetadataService_1 = class RoleMetadataService exte
85
94
  }
86
95
  }
87
96
  }
97
+ async resolveRoleModule(roleObj) {
98
+ if (roleObj.moduleId) {
99
+ return await this.entityManager.getRepository(module_metadata_entity_1.ModuleMetadata).findOne({
100
+ where: { id: roleObj.moduleId },
101
+ });
102
+ }
103
+ if (roleObj.moduleUserKey) {
104
+ return await this.entityManager.getRepository(module_metadata_entity_1.ModuleMetadata).findOne({
105
+ where: { name: roleObj.moduleUserKey },
106
+ });
107
+ }
108
+ return null;
109
+ }
88
110
  async addAllPermissionsToRole(roleName) {
89
111
  return await this._addPermissionsToRole(roleName, null);
90
112
  }
@@ -97,46 +119,41 @@ let RoleMetadataService = RoleMetadataService_1 = class RoleMetadataService exte
97
119
  async _addPermissionsToRole(roleName, permissionNames) {
98
120
  const role = await this.repo.findOne({
99
121
  where: { name: roleName },
100
- relations: {
101
- permissions: true
122
+ select: {
123
+ id: true,
124
+ name: true,
102
125
  }
103
126
  });
104
127
  if (!role) {
105
128
  throw new Error(`Role '${roleName}' not found.`);
106
129
  }
107
- let newPermissions;
108
- if (permissionNames && permissionNames.length != 0) {
109
- newPermissions = await this.permissionRepository.find({ where: { name: (0, typeorm_2.In)(permissionNames) } });
110
- if (newPermissions.length !== permissionNames.length) {
111
- throw new Error(`One or more permissions not found.`);
112
- }
130
+ const joinInfo = this.getRolePermissionJoinInfo();
131
+ const targetPermissions = await this.loadTargetPermissions(permissionNames);
132
+ if (!permissionNames || permissionNames.length === 0) {
133
+ await this.entityManager
134
+ .createQueryBuilder()
135
+ .delete()
136
+ .from(joinInfo.tableName)
137
+ .where(`${joinInfo.roleIdColumn} = :roleId`, { roleId: role.id })
138
+ .execute();
139
+ await this.insertRolePermissionMappings(role.id, targetPermissions.map((permission) => permission.id), joinInfo);
113
140
  }
114
141
  else {
115
- newPermissions = await this.permissionRepository.find();
116
- if (newPermissions.length == 0) {
117
- throw new Error(`No permissions configured in the system. Did you forget to run the PermissionSeederService?`);
118
- }
119
- }
120
- if (role.permissions && role.permissions.length > 0) {
121
- for (let i = 0; i < newPermissions.length; i++) {
122
- const newPermission = newPermissions[i];
123
- let newPermissionFound = true;
124
- for (let j = 0; j < role.permissions.length; j++) {
125
- const existingPermission = role.permissions[j];
126
- if (existingPermission.name === newPermission.name) {
127
- newPermissionFound = false;
128
- break;
129
- }
130
- }
131
- if (newPermissionFound) {
132
- role.permissions.push(newPermission);
133
- }
142
+ const existingRows = await this.entityManager
143
+ .createQueryBuilder()
144
+ .select(joinInfo.permissionIdColumn, 'permissionId')
145
+ .from(joinInfo.tableName, 'role_permission')
146
+ .where(`${joinInfo.roleIdColumn} = :roleId`, { roleId: role.id })
147
+ .getRawMany();
148
+ const existingPermissionIds = new Set(existingRows.map((row) => Number(row.permissionId)));
149
+ const missingPermissionIds = targetPermissions
150
+ .map((permission) => permission.id)
151
+ .filter((permissionId) => !existingPermissionIds.has(permissionId));
152
+ if (missingPermissionIds.length > 0) {
153
+ await this.insertRolePermissionMappings(role.id, missingPermissionIds, joinInfo);
134
154
  }
135
155
  }
136
- else {
137
- role.permissions = newPermissions;
138
- }
139
- return await this.repo.save(role);
156
+ return await this.findRoleByName(roleName);
140
157
  }
141
158
  async removePermissionsFromRole(roleName, permissionNames) {
142
159
  const role = await this.repo.findOne({
@@ -162,6 +179,51 @@ let RoleMetadataService = RoleMetadataService_1 = class RoleMetadataService exte
162
179
  }
163
180
  return existingPermission;
164
181
  }
182
+ async loadTargetPermissions(permissionNames) {
183
+ if (permissionNames && permissionNames.length !== 0) {
184
+ const uniquePermissionNames = [...new Set(permissionNames)];
185
+ const permissions = await this.permissionRepository.find({ where: { name: (0, typeorm_2.In)(uniquePermissionNames) } });
186
+ if (permissions.length !== uniquePermissionNames.length) {
187
+ throw new Error(`One or more permissions not found.`);
188
+ }
189
+ return permissions;
190
+ }
191
+ const permissions = await this.permissionRepository.find();
192
+ if (permissions.length === 0) {
193
+ throw new Error(`No permissions configured in the system. Did you forget to run the PermissionSeederService?`);
194
+ }
195
+ return permissions;
196
+ }
197
+ getRolePermissionJoinInfo() {
198
+ const relation = this.repo.metadata.relations.find((candidate) => candidate.propertyName === 'permissions');
199
+ if (!relation?.junctionEntityMetadata) {
200
+ throw new Error('Role-permission join table metadata not found.');
201
+ }
202
+ const roleIdColumn = relation.joinColumns[0]?.databaseName;
203
+ const permissionIdColumn = relation.inverseJoinColumns[0]?.databaseName;
204
+ if (!roleIdColumn || !permissionIdColumn) {
205
+ throw new Error('Role-permission join table column metadata not found.');
206
+ }
207
+ return {
208
+ tableName: relation.junctionEntityMetadata.tableName,
209
+ roleIdColumn,
210
+ permissionIdColumn,
211
+ };
212
+ }
213
+ async insertRolePermissionMappings(roleId, permissionIds, joinInfo) {
214
+ for (let index = 0; index < permissionIds.length; index += this.permissionAssignmentBatchSize) {
215
+ const batch = permissionIds.slice(index, index + this.permissionAssignmentBatchSize);
216
+ await this.entityManager
217
+ .createQueryBuilder()
218
+ .insert()
219
+ .into(joinInfo.tableName)
220
+ .values(batch.map((permissionId) => ({
221
+ [joinInfo.roleIdColumn]: roleId,
222
+ [joinInfo.permissionIdColumn]: permissionId,
223
+ })))
224
+ .execute();
225
+ }
226
+ }
165
227
  };
166
228
  exports.RoleMetadataService = RoleMetadataService;
167
229
  exports.RoleMetadataService = RoleMetadataService = RoleMetadataService_1 = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"role-metadata.service.js","sourceRoot":"","sources":["../../src/services/role-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger, NotFoundException } from '@nestjs/common';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { CRUDService } from 'src/services/crud.service';\nimport { EntityManager, In } from 'typeorm';\n\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { PermissionMetadataRepository } from 'src/repository/permission-metadata.repository';\nimport { RoleMetadataRepository } from 'src/repository/role-metadata.repository';\nimport { CreateRoleMetadataDto } from '../dtos/create-role-metadata.dto';\nimport { PermissionMetadata } from '../entities/permission-metadata.entity';\nimport { RoleMetadata } from '../entities/role-metadata.entity';\n\n@Injectable()\nexport class RoleMetadataService extends CRUDService<RoleMetadata> {\n private readonly logger = new Logger(RoleMetadataService.name);\n\n constructor(\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(RoleMetadata, 'default')\n // readonly repo: Repository<RoleMetadata>,\n readonly repo: RoleMetadataRepository,\n // @InjectRepository(PermissionMetadata)\n // private readonly permissionRepository: Repository<PermissionMetadata>,\n readonly permissionRepository: PermissionMetadataRepository,\n readonly moduleRef: ModuleRef\n\n ) {\n super(entityManager, repo, 'roleMetadata', 'solid-core', moduleRef);\n }\n\n async findRoleByName(roleName: string) {\n const entity = await this.repo.findOne({\n where: {\n name: roleName\n },\n relations: {\n permissions: true\n }\n });\n if (!entity) {\n throw new NotFoundException(`Entity #${roleName} not found`);\n }\n return entity;\n }\n\n async assertRoleExistsByName(roleName: string): Promise<void> {\n const entity = await this.repo.findOne({\n where: {\n name: roleName\n },\n select: {\n id: true\n }\n });\n if (!entity) {\n throw new NotFoundException(`Entity #${roleName} not found`);\n }\n }\n\n // OK\n async createRolesIfNotExists(roles: CreateRoleMetadataDto[]) {\n for (let id = 0; id < roles.length; id++) {\n try {\n const roleObj = roles[id];\n // this.logger.log(`Resolving role: ${JSON.stringify(roleObj)}`);\n\n const existingRole = await this.repo.findOne({\n where: {\n name: roleObj.name,\n },\n relations: {},\n });\n\n // Create only if not existing already.\n if (!existingRole) {\n this.logger.debug(`Role ${roleObj.name} does not exist, hence creating`);\n\n let permissions = [];\n\n if (roleObj.permissions && roleObj.permissions.length > 0) {\n await Promise.all(\n roleObj.permissions.map(permission => this.preloadPermissionByName(permission.name)),\n );\n }\n\n // const role = this.repo.create({ ...roleObj, permissions });\n const role = this.repo.create({ ...roleObj });\n await this.repo.save(role);\n } else {\n /*\n this.logger.debug(`Role ${roleObj.name} already exists`);\n const existingPermissions = existingRole.permissions.map(permission => permission.name);\n const newPermissions = roleObj.permissions.map(permission => permission.name);\n const permissionsToAdd = newPermissions.filter(permission => !existingPermissions.includes(permission));\n const permissionsToRemove = existingPermissions.filter(permission => !newPermissions.includes(permission));\n this.logger.debug(`Permissions to add: ${JSON.stringify(permissionsToAdd)}`);\n if (permissionsToAdd.length > 0) {\n await this.addPermissionsToRole(roleObj.name, permissionsToAdd);\n }\n this.logger.debug(`Permissions to remove: ${JSON.stringify(permissionsToRemove)}`);\n if (permissionsToRemove.length > 0) {\n await this.removePermissionsFromRole(roleObj.name, permissionsToRemove);\n }\n */\n }\n } catch (error: any) {\n this.logger.error(error);\n }\n }\n }\n\n async addAllPermissionsToRole(roleName: string): Promise<RoleMetadata> {\n return await this._addPermissionsToRole(roleName, null);\n }\n\n async addPermissionsToRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata> {\n return await this._addPermissionsToRole(roleName, permissionNames);\n }\n\n async addPermissionToRole(roleName: string, permissionName: string[]) {\n return await this._addPermissionsToRole(roleName, permissionName);\n }\n\n private async _addPermissionsToRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata> {\n const role = await this.repo.findOne({\n where: { name: roleName },\n relations: {\n permissions: true\n }\n });\n if (!role) {\n throw new Error(`Role '${roleName}' not found.`);\n }\n\n // this.logger.log(`Found role ${roleName}`);\n\n // The new set of permissions which are to be added to this role.\n let newPermissions: PermissionMetadata[];\n\n // Load all the specified permissions in the system. \n if (permissionNames && permissionNames.length != 0) {\n // this.logger.log(`Loading specified permissions.`);\n\n newPermissions = await this.permissionRepository.find({ where: { name: In(permissionNames) } });\n if (newPermissions.length !== permissionNames.length) {\n throw new Error(`One or more permissions not found.`);\n }\n }\n else {\n // this.logger.log(`Loading all permissions in system.`);\n\n // Load all permissions in the system. \n // TODO: Do we want to convert this to a paginated query to avoid having to load a very large permissions table into memory?\n newPermissions = await this.permissionRepository.find();\n if (newPermissions.length == 0) {\n throw new Error(`No permissions configured in the system. Did you forget to run the PermissionSeederService?`);\n }\n }\n\n // this.logger.log(`Adding ${newPermissions.length} permissions to role ${roleName}.`);\n\n // if there are already permissions assigned. \n if (role.permissions && role.permissions.length > 0) {\n for (let i = 0; i < newPermissions.length; i++) {\n const newPermission = newPermissions[i];\n let newPermissionFound = true;\n for (let j = 0; j < role.permissions.length; j++) {\n const existingPermission = role.permissions[j];\n if (existingPermission.name === newPermission.name) {\n newPermissionFound = false;\n break;\n }\n }\n\n if (newPermissionFound) {\n role.permissions.push(newPermission);\n }\n }\n\n }\n // else we create a new permissions set. \n else {\n role.permissions = newPermissions;\n }\n\n return await this.repo.save(role);\n }\n\n async removePermissionsFromRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata> {\n\n // load the role with the respective permissions.\n const role = await this.repo.findOne({\n where: {\n name: roleName\n },\n relations: {\n permissions: true\n }\n });\n\n if (!role) {\n throw new Error(ERROR_MESSAGES.ROLE_NOT_FOUND(roleName));\n }\n\n // modify the permissions array.\n role.permissions = role.permissions.filter(permission => !permissionNames.includes(permission.name));\n\n return await this.repo.save(role);\n }\n\n private async preloadPermissionByName(name: string): Promise<PermissionMetadata> {\n const existingPermission = await this.permissionRepository.findOne({\n where: { name },\n });\n if (!existingPermission) {\n throw new NotFoundException(ERROR_MESSAGES.PERMISSION_NOT_EXIST(name));\n }\n return existingPermission;\n }\n\n\n}\n"]}
1
+ {"version":3,"file":"role-metadata.service.js","sourceRoot":"","sources":["../../src/services/role-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger, NotFoundException } from '@nestjs/common';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { CRUDService } from 'src/services/crud.service';\nimport { EntityManager, In } from 'typeorm';\n\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { PermissionMetadataRepository } from 'src/repository/permission-metadata.repository';\nimport { RoleMetadataRepository } from 'src/repository/role-metadata.repository';\nimport { CreateRoleMetadataDto } from '../dtos/create-role-metadata.dto';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\nimport { PermissionMetadata } from '../entities/permission-metadata.entity';\nimport { RoleMetadata } from '../entities/role-metadata.entity';\n\n@Injectable()\nexport class RoleMetadataService extends CRUDService<RoleMetadata> {\n private readonly logger = new Logger(RoleMetadataService.name);\n private readonly permissionAssignmentBatchSize = 500;\n\n constructor(\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(RoleMetadata, 'default')\n // readonly repo: Repository<RoleMetadata>,\n readonly repo: RoleMetadataRepository,\n // @InjectRepository(PermissionMetadata)\n // private readonly permissionRepository: Repository<PermissionMetadata>,\n readonly permissionRepository: PermissionMetadataRepository,\n readonly moduleRef: ModuleRef\n\n ) {\n super(entityManager, repo, 'roleMetadata', 'solid-core', moduleRef);\n }\n\n async findRoleByName(roleName: string) {\n const entity = await this.repo.findOne({\n where: {\n name: roleName\n },\n relations: {\n permissions: true\n }\n });\n if (!entity) {\n throw new NotFoundException(`Entity #${roleName} not found`);\n }\n return entity;\n }\n\n async assertRoleExistsByName(roleName: string): Promise<void> {\n const entity = await this.repo.findOne({\n where: {\n name: roleName\n },\n select: {\n id: true\n }\n });\n if (!entity) {\n throw new NotFoundException(`Entity #${roleName} not found`);\n }\n }\n\n // OK\n async createRolesIfNotExists(roles: CreateRoleMetadataDto[]) {\n for (let id = 0; id < roles.length; id++) {\n try {\n const roleObj = roles[id];\n const module = await this.resolveRoleModule(roleObj);\n // this.logger.log(`Resolving role: ${JSON.stringify(roleObj)}`);\n\n const existingRole = await this.repo.findOne({\n where: {\n name: roleObj.name,\n },\n relations: {\n module: true,\n },\n });\n\n // Create only if not existing already.\n if (!existingRole) {\n this.logger.debug(`Role ${roleObj.name} does not exist, hence creating`);\n\n let permissions = [];\n\n if (roleObj.permissions && roleObj.permissions.length > 0) {\n await Promise.all(\n roleObj.permissions.map(permission => this.preloadPermissionByName(permission.name)),\n );\n }\n\n // const role = this.repo.create({ ...roleObj, permissions });\n const role = this.repo.create({ ...roleObj, ...(module ? { module } : {}) });\n await this.repo.save(role);\n } else {\n if (module && existingRole.module?.id !== module.id) {\n existingRole.module = module;\n await this.repo.save(existingRole);\n }\n /*\n this.logger.debug(`Role ${roleObj.name} already exists`);\n const existingPermissions = existingRole.permissions.map(permission => permission.name);\n const newPermissions = roleObj.permissions.map(permission => permission.name);\n const permissionsToAdd = newPermissions.filter(permission => !existingPermissions.includes(permission));\n const permissionsToRemove = existingPermissions.filter(permission => !newPermissions.includes(permission));\n this.logger.debug(`Permissions to add: ${JSON.stringify(permissionsToAdd)}`);\n if (permissionsToAdd.length > 0) {\n await this.addPermissionsToRole(roleObj.name, permissionsToAdd);\n }\n this.logger.debug(`Permissions to remove: ${JSON.stringify(permissionsToRemove)}`);\n if (permissionsToRemove.length > 0) {\n await this.removePermissionsFromRole(roleObj.name, permissionsToRemove);\n }\n */\n }\n } catch (error: any) {\n this.logger.error(error);\n }\n }\n }\n\n private async resolveRoleModule(roleObj: CreateRoleMetadataDto): Promise<ModuleMetadata | null> {\n if (roleObj.moduleId) {\n return await this.entityManager.getRepository(ModuleMetadata).findOne({\n where: { id: roleObj.moduleId },\n });\n }\n\n if (roleObj.moduleUserKey) {\n return await this.entityManager.getRepository(ModuleMetadata).findOne({\n where: { name: roleObj.moduleUserKey },\n });\n }\n\n return null;\n }\n\n async addAllPermissionsToRole(roleName: string): Promise<RoleMetadata> {\n return await this._addPermissionsToRole(roleName, null);\n }\n\n async addPermissionsToRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata> {\n return await this._addPermissionsToRole(roleName, permissionNames);\n }\n\n async addPermissionToRole(roleName: string, permissionName: string[]) {\n return await this._addPermissionsToRole(roleName, permissionName);\n }\n\n private async _addPermissionsToRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata> {\n const role = await this.repo.findOne({\n where: { name: roleName },\n select: {\n id: true,\n name: true,\n }\n });\n if (!role) {\n throw new Error(`Role '${roleName}' not found.`);\n }\n\n const joinInfo = this.getRolePermissionJoinInfo();\n const targetPermissions = await this.loadTargetPermissions(permissionNames);\n\n if (!permissionNames || permissionNames.length === 0) {\n await this.entityManager\n .createQueryBuilder()\n .delete()\n .from(joinInfo.tableName)\n .where(`${joinInfo.roleIdColumn} = :roleId`, { roleId: role.id })\n .execute();\n\n await this.insertRolePermissionMappings(role.id, targetPermissions.map((permission) => permission.id), joinInfo);\n }\n else {\n const existingRows = await this.entityManager\n .createQueryBuilder()\n .select(joinInfo.permissionIdColumn, 'permissionId')\n .from(joinInfo.tableName, 'role_permission')\n .where(`${joinInfo.roleIdColumn} = :roleId`, { roleId: role.id })\n .getRawMany();\n\n const existingPermissionIds = new Set(existingRows.map((row) => Number(row.permissionId)));\n const missingPermissionIds = targetPermissions\n .map((permission) => permission.id)\n .filter((permissionId) => !existingPermissionIds.has(permissionId));\n\n if (missingPermissionIds.length > 0) {\n await this.insertRolePermissionMappings(role.id, missingPermissionIds, joinInfo);\n }\n }\n\n return await this.findRoleByName(roleName);\n }\n\n async removePermissionsFromRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata> {\n\n // load the role with the respective permissions.\n const role = await this.repo.findOne({\n where: {\n name: roleName\n },\n relations: {\n permissions: true\n }\n });\n\n if (!role) {\n throw new Error(ERROR_MESSAGES.ROLE_NOT_FOUND(roleName));\n }\n\n // modify the permissions array.\n role.permissions = role.permissions.filter(permission => !permissionNames.includes(permission.name));\n\n return await this.repo.save(role);\n }\n\n private async preloadPermissionByName(name: string): Promise<PermissionMetadata> {\n const existingPermission = await this.permissionRepository.findOne({\n where: { name },\n });\n if (!existingPermission) {\n throw new NotFoundException(ERROR_MESSAGES.PERMISSION_NOT_EXIST(name));\n }\n return existingPermission;\n }\n\n private async loadTargetPermissions(permissionNames: string[] | null): Promise<PermissionMetadata[]> {\n if (permissionNames && permissionNames.length !== 0) {\n const uniquePermissionNames = [...new Set(permissionNames)];\n const permissions = await this.permissionRepository.find({ where: { name: In(uniquePermissionNames) } });\n if (permissions.length !== uniquePermissionNames.length) {\n throw new Error(`One or more permissions not found.`);\n }\n return permissions;\n }\n\n const permissions = await this.permissionRepository.find();\n if (permissions.length === 0) {\n throw new Error(`No permissions configured in the system. Did you forget to run the PermissionSeederService?`);\n }\n return permissions;\n }\n\n private getRolePermissionJoinInfo(): { tableName: string; roleIdColumn: string; permissionIdColumn: string } {\n const relation = this.repo.metadata.relations.find((candidate) => candidate.propertyName === 'permissions');\n if (!relation?.junctionEntityMetadata) {\n throw new Error('Role-permission join table metadata not found.');\n }\n\n const roleIdColumn = relation.joinColumns[0]?.databaseName;\n const permissionIdColumn = relation.inverseJoinColumns[0]?.databaseName;\n if (!roleIdColumn || !permissionIdColumn) {\n throw new Error('Role-permission join table column metadata not found.');\n }\n\n return {\n tableName: relation.junctionEntityMetadata.tableName,\n roleIdColumn,\n permissionIdColumn,\n };\n }\n\n private async insertRolePermissionMappings(\n roleId: number,\n permissionIds: number[],\n joinInfo: { tableName: string; roleIdColumn: string; permissionIdColumn: string },\n ): Promise<void> {\n for (let index = 0; index < permissionIds.length; index += this.permissionAssignmentBatchSize) {\n const batch = permissionIds.slice(index, index + this.permissionAssignmentBatchSize);\n await this.entityManager\n .createQueryBuilder()\n .insert()\n .into(joinInfo.tableName)\n .values(\n batch.map((permissionId) => ({\n [joinInfo.roleIdColumn]: roleId,\n [joinInfo.permissionIdColumn]: permissionId,\n })),\n )\n .execute();\n }\n }\n\n\n}\n"]}