@solidxai/core 0.1.13-beta.7 → 0.1.13-beta.8

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 (257) hide show
  1. package/.claude/settings.local.json +16 -0
  2. package/CHANGELOG.md +548 -0
  3. package/CLAUDE.md +26 -0
  4. package/dist/constants/draft-publish-fields.d.ts +2 -0
  5. package/dist/constants/draft-publish-fields.d.ts.map +1 -0
  6. package/dist/constants/draft-publish-fields.js +5 -0
  7. package/dist/constants/draft-publish-fields.js.map +1 -0
  8. package/dist/constants/media-file-types.d.ts +9 -0
  9. package/dist/constants/media-file-types.d.ts.map +1 -1
  10. package/dist/constants/media-file-types.js +27 -1
  11. package/dist/constants/media-file-types.js.map +1 -1
  12. package/dist/controllers/action-metadata.controller.d.ts +1 -1
  13. package/dist/controllers/action-metadata.controller.js +1 -1
  14. package/dist/controllers/agent-event.controller.d.ts +1 -1
  15. package/dist/controllers/agent-event.controller.js +1 -1
  16. package/dist/controllers/agent-session.controller.d.ts +1 -1
  17. package/dist/controllers/agent-session.controller.js +1 -1
  18. package/dist/controllers/dashboard-user-layout.controller.d.ts +1 -1
  19. package/dist/controllers/dashboard-user-layout.controller.js +1 -1
  20. package/dist/controllers/email-template.controller.d.ts +1 -1
  21. package/dist/controllers/email-template.controller.js +1 -1
  22. package/dist/controllers/export-template.controller.d.ts +1 -1
  23. package/dist/controllers/export-template.controller.d.ts.map +1 -1
  24. package/dist/controllers/export-template.controller.js +6 -4
  25. package/dist/controllers/export-template.controller.js.map +1 -1
  26. package/dist/controllers/export-transaction.controller.d.ts +1 -1
  27. package/dist/controllers/export-transaction.controller.js +1 -1
  28. package/dist/controllers/import-transaction-error-log.controller.d.ts +1 -1
  29. package/dist/controllers/import-transaction-error-log.controller.js +1 -1
  30. package/dist/controllers/import-transaction.controller.d.ts +1 -1
  31. package/dist/controllers/import-transaction.controller.d.ts.map +1 -1
  32. package/dist/controllers/import-transaction.controller.js +7 -7
  33. package/dist/controllers/import-transaction.controller.js.map +1 -1
  34. package/dist/controllers/list-of-values.controller.d.ts +1 -1
  35. package/dist/controllers/list-of-values.controller.js +1 -1
  36. package/dist/controllers/locale.controller.d.ts +1 -1
  37. package/dist/controllers/locale.controller.js +1 -1
  38. package/dist/controllers/mcp-audit-log.controller.d.ts +1 -1
  39. package/dist/controllers/mcp-audit-log.controller.js +1 -1
  40. package/dist/controllers/media.controller.d.ts +1 -1
  41. package/dist/controllers/media.controller.d.ts.map +1 -1
  42. package/dist/controllers/media.controller.js +12 -7
  43. package/dist/controllers/media.controller.js.map +1 -1
  44. package/dist/controllers/menu-item-metadata.controller.d.ts +1 -1
  45. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  46. package/dist/controllers/model-sequence.controller.d.ts +1 -1
  47. package/dist/controllers/model-sequence.controller.js +1 -1
  48. package/dist/controllers/module-package.controller.d.ts.map +1 -1
  49. package/dist/controllers/module-package.controller.js +2 -3
  50. package/dist/controllers/module-package.controller.js.map +1 -1
  51. package/dist/controllers/mq-message-queue.controller.d.ts +1 -1
  52. package/dist/controllers/mq-message-queue.controller.js +1 -1
  53. package/dist/controllers/mq-message.controller.d.ts +1 -1
  54. package/dist/controllers/mq-message.controller.js +1 -1
  55. package/dist/controllers/permission-metadata.controller.d.ts +1 -1
  56. package/dist/controllers/permission-metadata.controller.js +1 -1
  57. package/dist/controllers/role-metadata.controller.d.ts +1 -1
  58. package/dist/controllers/role-metadata.controller.js +1 -1
  59. package/dist/controllers/saved-filters.controller.d.ts +1 -1
  60. package/dist/controllers/saved-filters.controller.js +1 -1
  61. package/dist/controllers/scheduled-job.controller.d.ts +1 -1
  62. package/dist/controllers/scheduled-job.controller.js +1 -1
  63. package/dist/controllers/security-rule.controller.d.ts +1 -1
  64. package/dist/controllers/security-rule.controller.js +1 -1
  65. package/dist/controllers/sms-template.controller.d.ts +1 -1
  66. package/dist/controllers/sms-template.controller.js +1 -1
  67. package/dist/controllers/user-activity-history.controller.d.ts +1 -1
  68. package/dist/controllers/user-activity-history.controller.js +1 -1
  69. package/dist/controllers/user-view-metadata.controller.d.ts +1 -1
  70. package/dist/controllers/user-view-metadata.controller.js +1 -1
  71. package/dist/controllers/user.controller.d.ts +2 -2
  72. package/dist/controllers/user.controller.js +2 -2
  73. package/dist/controllers/view-metadata.controller.d.ts +2 -2
  74. package/dist/controllers/view-metadata.controller.js +1 -1
  75. package/dist/controllers/workflow-definition.controller.d.ts +1 -1
  76. package/dist/controllers/workflow-definition.controller.js +1 -1
  77. package/dist/controllers/workflow-execution-artifact.controller.d.ts +1 -1
  78. package/dist/controllers/workflow-execution-artifact.controller.js +1 -1
  79. package/dist/controllers/workflow-execution-log.controller.d.ts +1 -1
  80. package/dist/controllers/workflow-execution-log.controller.js +1 -1
  81. package/dist/controllers/workflow-execution.controller.d.ts +1 -1
  82. package/dist/controllers/workflow-execution.controller.js +1 -1
  83. package/dist/controllers/workflow-secret.controller.d.ts +1 -1
  84. package/dist/controllers/workflow-secret.controller.js +1 -1
  85. package/dist/controllers/workflow-step-execution.controller.d.ts +1 -1
  86. package/dist/controllers/workflow-step-execution.controller.js +1 -1
  87. package/dist/controllers/workflow-trigger-execution.controller.d.ts +1 -1
  88. package/dist/controllers/workflow-trigger-execution.controller.js +1 -1
  89. package/dist/dtos/basic-filters.dto.d.ts +0 -1
  90. package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
  91. package/dist/dtos/basic-filters.dto.js +1 -6
  92. package/dist/dtos/basic-filters.dto.js.map +1 -1
  93. package/dist/entities/common.entity.d.ts +4 -0
  94. package/dist/entities/common.entity.d.ts.map +1 -1
  95. package/dist/entities/common.entity.js +25 -1
  96. package/dist/entities/common.entity.js.map +1 -1
  97. package/dist/entities/user.entity.js +2 -2
  98. package/dist/entities/user.entity.js.map +1 -1
  99. package/dist/factories/mail.factory.d.ts.map +1 -1
  100. package/dist/factories/mail.factory.js +4 -0
  101. package/dist/factories/mail.factory.js.map +1 -1
  102. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +1 -0
  103. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
  104. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +18 -11
  105. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
  106. package/dist/helpers/file-download.helper.d.ts +9 -0
  107. package/dist/helpers/file-download.helper.d.ts.map +1 -0
  108. package/dist/helpers/file-download.helper.js +14 -0
  109. package/dist/helpers/file-download.helper.js.map +1 -0
  110. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  111. package/dist/helpers/model-metadata-helper.service.js +30 -1
  112. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  113. package/dist/helpers/solid-registry.js +1 -1
  114. package/dist/helpers/solid-registry.js.map +1 -1
  115. package/dist/index.d.ts +2 -0
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +2 -0
  118. package/dist/index.js.map +1 -1
  119. package/dist/seeders/module-test-data.service.d.ts +3 -1
  120. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  121. package/dist/seeders/module-test-data.service.js +8 -2
  122. package/dist/seeders/module-test-data.service.js.map +1 -1
  123. package/dist/seeders/seed-data/solid-core-metadata.json +2 -0
  124. package/dist/services/authentication.service.d.ts +4 -1
  125. package/dist/services/authentication.service.d.ts.map +1 -1
  126. package/dist/services/authentication.service.js +52 -4
  127. package/dist/services/authentication.service.js.map +1 -1
  128. package/dist/services/chatter-message.service.d.ts +1 -0
  129. package/dist/services/chatter-message.service.d.ts.map +1 -1
  130. package/dist/services/chatter-message.service.js +8 -0
  131. package/dist/services/chatter-message.service.js.map +1 -1
  132. package/dist/services/crud-helper.service.d.ts +5 -2
  133. package/dist/services/crud-helper.service.d.ts.map +1 -1
  134. package/dist/services/crud-helper.service.js +30 -32
  135. package/dist/services/crud-helper.service.js.map +1 -1
  136. package/dist/services/crud.service.d.ts +11 -1
  137. package/dist/services/crud.service.d.ts.map +1 -1
  138. package/dist/services/crud.service.js +79 -66
  139. package/dist/services/crud.service.js.map +1 -1
  140. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  141. package/dist/services/datasource-introspection.service.js.map +1 -1
  142. package/dist/services/draft-publish-helper.service.d.ts +52 -0
  143. package/dist/services/draft-publish-helper.service.d.ts.map +1 -0
  144. package/dist/services/draft-publish-helper.service.js +368 -0
  145. package/dist/services/draft-publish-helper.service.js.map +1 -0
  146. package/dist/services/internationalisation-helper.service.d.ts +19 -0
  147. package/dist/services/internationalisation-helper.service.d.ts.map +1 -0
  148. package/dist/services/internationalisation-helper.service.js +107 -0
  149. package/dist/services/internationalisation-helper.service.js.map +1 -0
  150. package/dist/services/locale.service.d.ts +1 -1
  151. package/dist/services/media.service.d.ts +2 -1
  152. package/dist/services/media.service.d.ts.map +1 -1
  153. package/dist/services/media.service.js +28 -2
  154. package/dist/services/media.service.js.map +1 -1
  155. package/dist/services/metadata-validation.service.d.ts +7 -0
  156. package/dist/services/metadata-validation.service.d.ts.map +1 -0
  157. package/dist/services/metadata-validation.service.js +42 -0
  158. package/dist/services/metadata-validation.service.js.map +1 -0
  159. package/dist/services/model-metadata.service.d.ts.map +1 -1
  160. package/dist/services/model-metadata.service.js +2 -1
  161. package/dist/services/model-metadata.service.js.map +1 -1
  162. package/dist/services/object.utils.d.ts +2 -0
  163. package/dist/services/object.utils.d.ts.map +1 -0
  164. package/dist/services/object.utils.js +11 -0
  165. package/dist/services/object.utils.js.map +1 -0
  166. package/dist/services/settings/default-settings-provider.service.d.ts +6 -6
  167. package/dist/services/settings/default-settings-provider.service.js +3 -3
  168. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  169. package/dist/services/user.service.d.ts +2 -2
  170. package/dist/services/user.service.d.ts.map +1 -1
  171. package/dist/services/user.service.js +9 -3
  172. package/dist/services/user.service.js.map +1 -1
  173. package/dist/services/view-metadata.service.d.ts +1 -2
  174. package/dist/services/view-metadata.service.d.ts.map +1 -1
  175. package/dist/services/view-metadata.service.js +3 -55
  176. package/dist/services/view-metadata.service.js.map +1 -1
  177. package/dist/services/workflow-definition.service.d.ts +1 -1
  178. package/dist/solid-core.module.d.ts.map +1 -1
  179. package/dist/solid-core.module.js +10 -1
  180. package/dist/solid-core.module.js.map +1 -1
  181. package/package.json +1 -1
  182. package/src/constants/draft-publish-fields.ts +5 -0
  183. package/src/constants/media-file-types.ts +50 -0
  184. package/src/controllers/export-template.controller.ts +5 -3
  185. package/src/controllers/import-transaction.controller.ts +6 -6
  186. package/src/controllers/media.controller.ts +17 -6
  187. package/src/controllers/module-package.controller.ts +2 -3
  188. package/src/dtos/basic-filters.dto.ts +0 -4
  189. package/src/entities/common.entity.ts +20 -0
  190. package/src/entities/user.entity.ts +2 -2
  191. package/src/factories/mail.factory.ts +7 -1
  192. package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +26 -12
  193. package/src/helpers/file-download.helper.ts +31 -0
  194. package/src/helpers/model-metadata-helper.service.ts +32 -1
  195. package/src/helpers/solid-registry.ts +1 -1
  196. package/src/index.ts +2 -0
  197. package/src/seeders/module-test-data.service.ts +6 -0
  198. package/src/seeders/seed-data/solid-core-metadata.json +2 -0
  199. package/src/services/1.js +6 -0
  200. package/src/services/authentication.service.ts +76 -5
  201. package/src/services/chatter-message.service.ts +16 -0
  202. package/src/services/crud-helper.service.ts +16 -34
  203. package/src/services/crud.service.ts +98 -103
  204. package/src/services/datasource-introspection.service.ts +5 -0
  205. package/src/services/draft-publish-helper.service.ts +529 -0
  206. package/src/services/internationalisation-helper.service.ts +148 -0
  207. package/src/services/media.service.ts +48 -3
  208. package/src/services/metadata-validation.service.ts +39 -0
  209. package/src/services/model-metadata.service.ts +4 -1
  210. package/src/services/object.utils.ts +10 -0
  211. package/src/services/settings/default-settings-provider.service.ts +3 -3
  212. package/src/services/user.service.ts +18 -3
  213. package/src/services/view-metadata.service.ts +5 -145
  214. package/src/solid-core.module.ts +16 -3
  215. package/dist-tests/api/authenticate.spec.js +0 -119
  216. package/dist-tests/api/authenticate.spec.js.map +0 -1
  217. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
  218. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
  219. package/dist-tests/api/ping.spec.js +0 -21
  220. package/dist-tests/api/ping.spec.js.map +0 -1
  221. package/dist-tests/helpers/auth.js +0 -41
  222. package/dist-tests/helpers/auth.js.map +0 -1
  223. package/dist-tests/helpers/env.js +0 -11
  224. package/dist-tests/helpers/env.js.map +0 -1
  225. package/docs/agent-builder/notebook-lm-prompt-for-agent-builder.md +0 -136
  226. package/docs/agent-builder/team-ready-note-agent-builder.md +0 -305
  227. package/docs/agent-hub-grooming.md +0 -301
  228. package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +0 -438
  229. package/docs/dashboards/dashboard-curl-smoke-tests.txt +0 -146
  230. package/docs/dashboards/delete-legacy-dashboard-metadata.sql +0 -172
  231. package/docs/datasource-introspection-ddl-analysis.md +0 -326
  232. package/docs/datasource-introspection-implementation-plan.md +0 -306
  233. package/docs/grouping-enhancements.md +0 -89
  234. package/docs/java-spring/README.md +0 -3
  235. package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
  236. package/docs/module-package-import-handoff.md +0 -691
  237. package/docs/seed-changes.md +0 -65
  238. package/docs/test-data-workflow.md +0 -200
  239. package/docs/type-declaration-import-issue.md +0 -24
  240. package/docs/workflow/business-automation-example-notes.md +0 -309
  241. package/docs/workflow/control-flow-node-addition-sop.md +0 -324
  242. package/docs/workflow/data-engineering-pipeline-example-notes.md +0 -330
  243. package/docs/workflow/foreach-example-notes.md +0 -187
  244. package/docs/workflow/hello-world-example-notes.md +0 -271
  245. package/docs/workflow/kestra-concepts-plugins-blueprints.md +0 -315
  246. package/docs/workflow/loop-until-example-notes.md +0 -198
  247. package/docs/workflow/microservices-and-apis-example-notes.md +0 -264
  248. package/docs/workflow/samples.md +0 -25
  249. package/docs/workflow/what-is-kestra.md +0 -79
  250. package/docs/workflow/workflow-core-module-handoff-summary.md +0 -191
  251. package/docs/workflow/workflow-module-brd.md +0 -185
  252. package/docs/workflow/workflow-module-domain-model.md +0 -252
  253. package/docs/workflow/workflow-module-metadata-dsl.md +0 -302
  254. package/docs/workflow/workflow-module-technical-spec.md +0 -293
  255. package/docs/workflow/workflow-node-type-contracts.md +0 -635
  256. package/docs/workflow/workflow-node-ui-metadata-contract.md +0 -1262
  257. package/docs/workflow/workflow-solidx-model-field-spec.md +0 -284
@@ -1 +1 @@
1
- {"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BadRequestException,\n forwardRef,\n Inject,\n Injectable,\n} from \"@nestjs/common\";\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from \"@nestjs/typeorm\";\nimport { CRUDService } from \"src/services/crud.service\";\nimport { EntityManager, Repository } from \"typeorm\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\nimport { OauthUserDto } from \"../dtos/oauth-user-dto\";\nimport { RoleMetadata } from \"../entities/role-metadata.entity\";\nimport { User } from \"../entities/user.entity\";\nimport { ActiveUserData } from \"../interfaces/active-user-data.interface\";\nimport { ERROR_MESSAGES } from \"src/constants/error-messages\";\nimport { UserRepository } from \"src/repository/user.repository\";\nimport { RoleMetadataRepository } from \"src/repository/role-metadata.repository\";\nimport { HashingService } from \"./hashing.service\";\n\n@Injectable()\nexport class UserService extends CRUDService<User> {\n private buildFacebookUsernameBase(name?: string): string {\n const normalized = (name || \"\")\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return normalized || \"facebook_user\";\n }\n\n private buildMicrosoftActiveDirectoryUsernameBase(\n email?: string,\n providerId?: string,\n name?: string,\n ): string {\n const source =\n email ||\n name ||\n (providerId ? `microsoft_active_directory_${providerId}` : \"\");\n const normalized = source\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9@._-]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return normalized || \"microsoft_active_directory_user\";\n }\n\n private async resolveUniqueUsername(\n preferredUsername: string,\n // fallbackUsername: string,\n ): Promise<string> {\n let candidate = preferredUsername;\n let suffix = 0;\n\n while (await this.repo.findOne({ where: { username: candidate } })) {\n suffix += 1;\n candidate = `${preferredUsername}_${suffix}`;\n }\n\n if (candidate) {\n return candidate;\n }\n\n // return fallbackUsername;\n }\n\n constructor(\n readonly hashingService: HashingService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(User, 'default')\n readonly repo: UserRepository,\n @InjectRepository(User, \"default\")\n readonly nonSecurityRuleAwareRepo: Repository<User>,\n // @InjectRepository(RoleMetadata)\n // private readonly roleRepository: Repository<RoleMetadata>,\n private readonly roleRepository: RoleMetadataRepository,\n readonly moduleRef: ModuleRef,\n ) {\n super(entityManager, repo, \"user\", \"solid-core\", moduleRef);\n }\n\n override async delete(id: number, solidRequestContext: any = {}) {\n // Prevent user from deleting themselves\n if (solidRequestContext?.activeUser?.sub === id) {\n throw new BadRequestException(ERROR_MESSAGES.DELETE_SELF_NOT_ALLOWED);\n }\n\n // ✅ Proceed with the default deletion logic\n return super.delete(id, solidRequestContext);\n }\n\n override async deleteMany(\n ids: number[],\n solidRequestContext: any = {},\n ): Promise<any> {\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n\n // ❌ If the active user is trying to delete themselves\n if (\n solidRequestContext?.activeUser?.sub &&\n ids.includes(solidRequestContext.activeUser.id)\n ) {\n throw new BadRequestException(ERROR_MESSAGES.DELETE_SELF_NOT_ALLOWED);\n }\n\n return super.deleteMany(ids, solidRequestContext);\n }\n\n async findOneByEmail(email: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n email: email,\n },\n relations: {},\n });\n // if (!entity) {\n // throw new NotFoundException(`user with email #${email} not found`);\n // }\n // return entity;\n }\n\n async findOneByAccessCode(accessCode: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n accessCode: accessCode,\n },\n relations: {},\n });\n }\n\n async findOneByUsername(username: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n username: username,\n },\n relations: {},\n });\n // if (!entity) {\n // throw new NotFoundException(`user with username ${username} not found`);\n // }\n // return entity;\n }\n\n async updateUser(id: any, updateDto, files, solidRequestContext: any = {}) {\n const user = await this.repo.findOne({\n where: { id: id },\n relations: {\n roles: true,\n },\n });\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n if (updateDto.roles != null) {\n await this.addRolesToUser(user.username, updateDto.roles);\n }\n await this.update(id, updateDto, files, true);\n }\n\n async addRoleToUser(username: string, roleName: string): Promise<User> {\n // Find the role, find the user and populate the many 2 many table.\n const user = await this.repo.findOne({\n where: { username: username },\n relations: {\n roles: true,\n },\n });\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n const role = await this.roleRepository.findOne({\n where: { name: roleName },\n });\n if (!role) {\n throw new Error(ERROR_MESSAGES.ROLE_NOT_FOUND(roleName));\n }\n\n if (user.roles && user.roles.length > 0) {\n user.roles.push(role);\n } else {\n user.roles = [role];\n }\n\n return await this.repo.save(user);\n }\n\n async addRolesToUser(username: string, roleNames: string[]): Promise<User> {\n const user = await this.nonSecurityRuleAwareRepo.findOne({\n where: { username: username },\n relations: { roles: true },\n });\n\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n\n const roles = await this.roleRepository.find({\n where: roleNames.map((roleName) => ({ name: roleName })),\n });\n\n if (roles.length !== roleNames.length) {\n const foundRoleNames = roles.map((role) => role.name);\n const missingRoles = roleNames.filter(\n (roleName) => !foundRoleNames.includes(roleName),\n );\n throw new Error(ERROR_MESSAGES.ROLES_NOT_FOUND(missingRoles));\n }\n\n const currentRoles = user.roles.map((role) => role.name);\n\n const rolesToAdd = roles.filter(\n (role) => !currentRoles.includes(role.name),\n );\n\n const rolesToRemove = user.roles.filter(\n (role) => !roleNames.includes(role.name),\n );\n\n if (rolesToAdd.length > 0) {\n user.roles.push(...rolesToAdd);\n }\n\n if (rolesToRemove.length > 0) {\n user.roles = user.roles.filter((role) => !rolesToRemove.includes(role));\n }\n\n return await this.nonSecurityRuleAwareRepo.save(user);\n }\n\n async removeRoleFromUser(username: string, roleName: string): Promise<User> {\n // load the role with the respective permissions.\n const user = await this.repo.findOne({\n where: {\n username: username,\n },\n relations: {\n roles: true,\n },\n });\n\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n\n // modify the permissions array.\n user.roles = user.roles.filter((role) => role.name !== roleName);\n\n return await this.repo.save(user);\n }\n\n // PROVIDER SPECIFIC CODE\n async resolveUserOnOauthGoogle(oauthUserDto: OauthUserDto): Promise<User> {\n const user = await this.repo.findOne({\n where: {\n email: oauthUserDto.email,\n },\n relations: {\n roles: true,\n },\n });\n\n // if we are unable to find a user then we need to create one.\n if (!user) {\n const user = new User();\n user.username = oauthUserDto.email;\n user.email = oauthUserDto.email;\n user.fullName = oauthUserDto.name;\n user.lastLoginProvider = oauthUserDto.provider;\n user.accessCode = oauthUserDto.accessCode;\n user.googleAccessToken = oauthUserDto.accessToken;\n user.googleId = oauthUserDto.providerId;\n user.googleProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(user);\n\n // Initialize the user roles\n await this.initializeRolesForNewUser(\n [this.settingService.getConfigValue<SolidCoreSetting>(\"defaultRole\")],\n savedUser,\n );\n }\n // else we update the user and store the generated code & access token.\n else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n googleAccessToken: oauthUserDto.accessToken,\n googleId: oauthUserDto.providerId,\n googleProfilePicture: oauthUserDto.picture,\n });\n\n await this.repo.save(entity);\n }\n\n return user;\n }\n\n async resolveUserOnOauthFacebook(oauthUserDto: OauthUserDto): Promise<User> {\n const normalizedEmail = oauthUserDto.email?.trim().toLowerCase();\n let user: User | null = null;\n\n if (oauthUserDto.providerId) {\n user = await this.repo.findOne({\n where: {\n facebookId: oauthUserDto.providerId,\n },\n relations: {\n roles: true,\n },\n });\n }\n\n if (!user) {\n const facebookProviderFallback = `facebook_${oauthUserDto.providerId}`;\n const facebookNameUsername = this.buildFacebookUsernameBase(\n oauthUserDto.name,\n );\n // let username = normalizedEmail || facebookNameUsername;\n let username = facebookNameUsername;\n\n let email = normalizedEmail;\n\n // Avoid clashing with local users that already own the same email/username.\n if (normalizedEmail) {\n const existingByEmail = await this.repo.findOne({\n where: { email: normalizedEmail },\n });\n if (existingByEmail) {\n username = facebookNameUsername;\n email = null;\n }\n }\n username = await this.resolveUniqueUsername(\n username,\n // facebookProviderFallback,\n );\n\n const newUser = new User();\n newUser.username = username;\n newUser.email = email;\n newUser.fullName = oauthUserDto.name;\n newUser.lastLoginProvider = oauthUserDto.provider;\n newUser.accessCode = oauthUserDto.accessCode;\n newUser.facebookAccessToken = oauthUserDto.accessToken;\n newUser.facebookId = oauthUserDto.providerId;\n newUser.facebookProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(newUser);\n\n await this.initializeRolesForNewUser(\n [this.settingService.getConfigValue<SolidCoreSetting>(\"defaultRole\")],\n savedUser,\n );\n return savedUser;\n } else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n facebookAccessToken: oauthUserDto.accessToken,\n facebookId: oauthUserDto.providerId,\n facebookProfilePicture: oauthUserDto.picture,\n });\n await this.repo.save(entity);\n return entity;\n }\n }\n\n async resolveUserOnOauthMicrosoft(oauthUserDto: OauthUserDto): Promise<User> {\n const user = await this.repo.findOne({\n where: {\n email: oauthUserDto.email,\n },\n relations: {\n roles: true,\n },\n });\n\n if (!user) {\n const newUser = new User();\n newUser.username = oauthUserDto.email;\n newUser.email = oauthUserDto.email;\n newUser.fullName = oauthUserDto.name;\n newUser.lastLoginProvider = oauthUserDto.provider;\n newUser.accessCode = oauthUserDto.accessCode;\n newUser.microsoftAccessToken = oauthUserDto.accessToken;\n newUser.microsoftId = oauthUserDto.providerId;\n newUser.microsoftProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(newUser);\n\n await this.initializeRolesForNewUser(\n [this.settingService.getConfigValue<SolidCoreSetting>(\"defaultRole\")],\n savedUser,\n );\n } else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n microsoftAccessToken: oauthUserDto.accessToken,\n microsoftId: oauthUserDto.providerId,\n microsoftProfilePicture: oauthUserDto.picture,\n });\n\n await this.repo.save(entity);\n }\n return user;\n }\n\n async resolveUserOnOauthMicrosoftActiveDirectory(\n oauthUserDto: OauthUserDto,\n ): Promise<User> {\n const user = await this.repo.findOne({\n where: {\n email: oauthUserDto.email,\n },\n relations: {\n roles: true,\n },\n });\n\n if (!user) {\n const newUser = new User();\n newUser.username = oauthUserDto.email;\n newUser.email = oauthUserDto.email;\n newUser.fullName = oauthUserDto.name;\n newUser.lastLoginProvider = oauthUserDto.provider;\n newUser.accessCode = oauthUserDto.accessCode;\n newUser.microsoftActiveDirectoryAccessToken = oauthUserDto.accessToken;\n newUser.microsoftActiveDirectoryId = oauthUserDto.providerId;\n newUser.microsoftActiveDirectoryProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(newUser);\n\n await this.initializeRolesForNewUser(\n [this.settingService.getConfigValue<SolidCoreSetting>(\"defaultRole\")],\n savedUser,\n );\n } else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n microsoftActiveDirectoryAccessToken: oauthUserDto.accessToken,\n microsoftActiveDirectoryId: oauthUserDto.providerId,\n microsoftActiveDirectoryProfilePicture: oauthUserDto.picture,\n });\n\n await this.repo.save(entity);\n }\n return user;\n }\n\n async findUsersByRole(\n roleName: string,\n relations: any = {},\n ): Promise<User[]> {\n return await this.repo.find({\n where: {\n roles: {\n name: roleName,\n },\n },\n relations: relations,\n });\n }\n\n async checkIfPermissionExists(query: any, activeUser: ActiveUserData) {\n const matchingPermssions = activeUser.permissions.filter((p) =>\n query.permissionNames.includes(p),\n );\n return matchingPermssions;\n }\n\n async initializeRolesForNewUser(roles: string[], user: User) {\n if (!user.id) {\n throw new BadRequestException(ERROR_MESSAGES.USER_MISSING_ID);\n }\n let userRoles = [];\n // Default Internal user role assigned\n userRoles.push(\"Internal User\");\n if (roles) {\n userRoles = [...userRoles, ...roles];\n }\n userRoles = Array.from(new Set([...userRoles]));\n if (userRoles.length > 0) {\n await this.addRolesToUser(user.username, userRoles);\n }\n }\n\n async hashPassword(password: string): Promise<{\n password: string;\n passwordScheme: string;\n passwordSchemeVersion: number;\n }> {\n const hashedPassword = await this.hashingService.hash(password);\n\n return {\n password: hashedPassword,\n passwordScheme: this.hashingService.name(),\n passwordSchemeVersion: this.hashingService.currentVersion(),\n };\n }\n}\n"]}
1
+ {"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BadRequestException,\n forwardRef,\n Inject,\n Injectable,\n} from \"@nestjs/common\";\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from \"@nestjs/typeorm\";\nimport { CRUDService } from \"src/services/crud.service\";\nimport { EntityManager, Repository } from \"typeorm\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\nimport { OauthUserDto } from \"../dtos/oauth-user-dto\";\nimport { RoleMetadata } from \"../entities/role-metadata.entity\";\nimport { User } from \"../entities/user.entity\";\nimport { ActiveUserData } from \"../interfaces/active-user-data.interface\";\nimport { ERROR_MESSAGES } from \"src/constants/error-messages\";\nimport { UserRepository } from \"src/repository/user.repository\";\nimport { RoleMetadataRepository } from \"src/repository/role-metadata.repository\";\nimport { HashingService } from \"./hashing.service\";\n\n@Injectable()\nexport class UserService extends CRUDService<User> {\n private buildFacebookUsernameBase(name?: string): string {\n const normalized = (name || \"\")\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return normalized || \"facebook_user\";\n }\n\n private buildMicrosoftActiveDirectoryUsernameBase(\n email?: string,\n providerId?: string,\n name?: string,\n ): string {\n const source =\n email ||\n name ||\n (providerId ? `microsoft_active_directory_${providerId}` : \"\");\n const normalized = source\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9@._-]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return normalized || \"microsoft_active_directory_user\";\n }\n\n private async resolveUniqueUsername(\n preferredUsername: string,\n // fallbackUsername: string,\n ): Promise<string> {\n let candidate = preferredUsername;\n let suffix = 0;\n\n while (await this.repo.findOne({ where: { username: candidate } })) {\n suffix += 1;\n candidate = `${preferredUsername}_${suffix}`;\n }\n\n if (candidate) {\n return candidate;\n }\n\n // return fallbackUsername;\n }\n\n constructor(\n readonly hashingService: HashingService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(User, 'default')\n readonly repo: UserRepository,\n @InjectRepository(User, \"default\")\n readonly nonSecurityRuleAwareRepo: Repository<User>,\n // @InjectRepository(RoleMetadata)\n // private readonly roleRepository: Repository<RoleMetadata>,\n private readonly roleRepository: RoleMetadataRepository,\n readonly moduleRef: ModuleRef,\n ) {\n super(entityManager, repo, \"user\", \"solid-core\", moduleRef);\n }\n\n override async delete(id: number, solidRequestContext: any = {}) {\n // Prevent user from deleting themselves\n if (solidRequestContext?.activeUser?.sub === id) {\n throw new BadRequestException(ERROR_MESSAGES.DELETE_SELF_NOT_ALLOWED);\n }\n\n // ✅ Proceed with the default deletion logic\n return super.delete(id, solidRequestContext);\n }\n\n override async deleteMany(\n ids: number[],\n solidRequestContext: any = {},\n ): Promise<any> {\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n\n // ❌ If the active user is trying to delete themselves\n if (\n solidRequestContext?.activeUser?.sub &&\n ids.includes(solidRequestContext.activeUser.id)\n ) {\n throw new BadRequestException(ERROR_MESSAGES.DELETE_SELF_NOT_ALLOWED);\n }\n\n return super.deleteMany(ids, solidRequestContext);\n }\n\n async findOneByEmail(email: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n email: email,\n },\n relations: {},\n });\n // if (!entity) {\n // throw new NotFoundException(`user with email #${email} not found`);\n // }\n // return entity;\n }\n\n async findOneByAccessCode(accessCode: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n accessCode: accessCode,\n },\n relations: {},\n });\n }\n\n async findOneByUsername(username: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n username: username,\n },\n relations: {},\n });\n // if (!entity) {\n // throw new NotFoundException(`user with username ${username} not found`);\n // }\n // return entity;\n }\n\n async updateUser(id: any, updateDto, files, solidRequestContext: any = {}) {\n const user = await this.repo.findOne({\n where: { id: id },\n relations: {\n roles: true,\n },\n });\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n\n const { roles, ...userUpdateDto } = updateDto || {};\n const savedUser = await this.update(\n id,\n userUpdateDto,\n files,\n true,\n solidRequestContext,\n );\n\n if (roles != null) {\n await this.addRolesToUser(savedUser.username, roles);\n return this.repo.findOne({\n where: { id: savedUser.id },\n relations: { roles: true },\n });\n }\n\n return savedUser;\n }\n\n async addRoleToUser(username: string, roleName: string): Promise<User> {\n // Find the role, find the user and populate the many 2 many table.\n const user = await this.repo.findOne({\n where: { username: username },\n relations: {\n roles: true,\n },\n });\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n const role = await this.roleRepository.findOne({\n where: { name: roleName },\n });\n if (!role) {\n throw new Error(ERROR_MESSAGES.ROLE_NOT_FOUND(roleName));\n }\n\n if (user.roles && user.roles.length > 0) {\n user.roles.push(role);\n } else {\n user.roles = [role];\n }\n\n return await this.repo.save(user);\n }\n\n async addRolesToUser(username: string, roleNames: string[]): Promise<User> {\n const user = await this.nonSecurityRuleAwareRepo.findOne({\n where: { username: username },\n relations: { roles: true },\n });\n\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n\n const roles = await this.roleRepository.find({\n where: roleNames.map((roleName) => ({ name: roleName })),\n });\n\n if (roles.length !== roleNames.length) {\n const foundRoleNames = roles.map((role) => role.name);\n const missingRoles = roleNames.filter(\n (roleName) => !foundRoleNames.includes(roleName),\n );\n throw new Error(ERROR_MESSAGES.ROLES_NOT_FOUND(missingRoles));\n }\n\n const currentRoles = user.roles.map((role) => role.name);\n\n const rolesToAdd = roles.filter(\n (role) => !currentRoles.includes(role.name),\n );\n\n const rolesToRemove = user.roles.filter(\n (role) => !roleNames.includes(role.name),\n );\n\n if (rolesToAdd.length > 0) {\n user.roles.push(...rolesToAdd);\n }\n\n if (rolesToRemove.length > 0) {\n user.roles = user.roles.filter((role) => !rolesToRemove.includes(role));\n }\n\n return await this.nonSecurityRuleAwareRepo.save(user);\n }\n\n async removeRoleFromUser(username: string, roleName: string): Promise<User> {\n // load the role with the respective permissions.\n const user = await this.repo.findOne({\n where: {\n username: username,\n },\n relations: {\n roles: true,\n },\n });\n\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n\n // modify the permissions array.\n user.roles = user.roles.filter((role) => role.name !== roleName);\n\n return await this.repo.save(user);\n }\n\n // PROVIDER SPECIFIC CODE\n async resolveUserOnOauthGoogle(oauthUserDto: OauthUserDto): Promise<User> {\n const user = await this.repo.findOne({\n where: {\n email: oauthUserDto.email,\n },\n relations: {\n roles: true,\n },\n });\n\n // if we are unable to find a user then we need to create one.\n if (!user) {\n const user = new User();\n user.username = oauthUserDto.email;\n user.email = oauthUserDto.email;\n user.fullName = oauthUserDto.name;\n user.lastLoginProvider = oauthUserDto.provider;\n user.accessCode = oauthUserDto.accessCode;\n user.googleAccessToken = oauthUserDto.accessToken;\n user.googleId = oauthUserDto.providerId;\n user.googleProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(user);\n\n // Initialize the user roles\n await this.initializeRolesForNewUser(\n [this.settingService.getConfigValue<SolidCoreSetting>(\"defaultRole\")],\n savedUser,\n );\n }\n // else we update the user and store the generated code & access token.\n else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n googleAccessToken: oauthUserDto.accessToken,\n googleId: oauthUserDto.providerId,\n googleProfilePicture: oauthUserDto.picture,\n });\n\n await this.repo.save(entity);\n }\n\n return user;\n }\n\n async resolveUserOnOauthFacebook(oauthUserDto: OauthUserDto): Promise<User> {\n const normalizedEmail = oauthUserDto.email?.trim().toLowerCase();\n let user: User | null = null;\n\n if (oauthUserDto.providerId) {\n user = await this.repo.findOne({\n where: {\n facebookId: oauthUserDto.providerId,\n },\n relations: {\n roles: true,\n },\n });\n }\n\n if (!user) {\n const facebookProviderFallback = `facebook_${oauthUserDto.providerId}`;\n const facebookNameUsername = this.buildFacebookUsernameBase(\n oauthUserDto.name,\n );\n // let username = normalizedEmail || facebookNameUsername;\n let username = facebookNameUsername;\n\n let email = normalizedEmail;\n\n // Avoid clashing with local users that already own the same email/username.\n if (normalizedEmail) {\n const existingByEmail = await this.repo.findOne({\n where: { email: normalizedEmail },\n });\n if (existingByEmail) {\n username = facebookNameUsername;\n email = null;\n }\n }\n username = await this.resolveUniqueUsername(\n username,\n // facebookProviderFallback,\n );\n\n const newUser = new User();\n newUser.username = username;\n newUser.email = email;\n newUser.fullName = oauthUserDto.name;\n newUser.lastLoginProvider = oauthUserDto.provider;\n newUser.accessCode = oauthUserDto.accessCode;\n newUser.facebookAccessToken = oauthUserDto.accessToken;\n newUser.facebookId = oauthUserDto.providerId;\n newUser.facebookProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(newUser);\n\n await this.initializeRolesForNewUser(\n [this.settingService.getConfigValue<SolidCoreSetting>(\"defaultRole\")],\n savedUser,\n );\n return savedUser;\n } else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n facebookAccessToken: oauthUserDto.accessToken,\n facebookId: oauthUserDto.providerId,\n facebookProfilePicture: oauthUserDto.picture,\n });\n await this.repo.save(entity);\n return entity;\n }\n }\n\n async resolveUserOnOauthMicrosoft(oauthUserDto: OauthUserDto): Promise<User> {\n const user = await this.repo.findOne({\n where: {\n email: oauthUserDto.email,\n },\n relations: {\n roles: true,\n },\n });\n\n if (!user) {\n const newUser = new User();\n newUser.username = oauthUserDto.email;\n newUser.email = oauthUserDto.email;\n newUser.fullName = oauthUserDto.name;\n newUser.lastLoginProvider = oauthUserDto.provider;\n newUser.accessCode = oauthUserDto.accessCode;\n newUser.microsoftAccessToken = oauthUserDto.accessToken;\n newUser.microsoftId = oauthUserDto.providerId;\n newUser.microsoftProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(newUser);\n\n await this.initializeRolesForNewUser(\n [this.settingService.getConfigValue<SolidCoreSetting>(\"defaultRole\")],\n savedUser,\n );\n } else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n microsoftAccessToken: oauthUserDto.accessToken,\n microsoftId: oauthUserDto.providerId,\n microsoftProfilePicture: oauthUserDto.picture,\n });\n\n await this.repo.save(entity);\n }\n return user;\n }\n\n async resolveUserOnOauthMicrosoftActiveDirectory(\n oauthUserDto: OauthUserDto,\n ): Promise<User> {\n const user = await this.repo.findOne({\n where: {\n email: oauthUserDto.email,\n },\n relations: {\n roles: true,\n },\n });\n\n if (!user) {\n const newUser = new User();\n newUser.username = oauthUserDto.email;\n newUser.email = oauthUserDto.email;\n newUser.fullName = oauthUserDto.name;\n newUser.lastLoginProvider = oauthUserDto.provider;\n newUser.accessCode = oauthUserDto.accessCode;\n newUser.microsoftActiveDirectoryAccessToken = oauthUserDto.accessToken;\n newUser.microsoftActiveDirectoryId = oauthUserDto.providerId;\n newUser.microsoftActiveDirectoryProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(newUser);\n\n await this.initializeRolesForNewUser(\n [this.settingService.getConfigValue<SolidCoreSetting>(\"defaultRole\")],\n savedUser,\n );\n } else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n microsoftActiveDirectoryAccessToken: oauthUserDto.accessToken,\n microsoftActiveDirectoryId: oauthUserDto.providerId,\n microsoftActiveDirectoryProfilePicture: oauthUserDto.picture,\n });\n\n await this.repo.save(entity);\n }\n return user;\n }\n\n async findUsersByRole(\n roleName: string,\n relations: any = {},\n ): Promise<User[]> {\n return await this.repo.find({\n where: {\n roles: {\n name: roleName,\n },\n },\n relations: relations,\n });\n }\n\n async checkIfPermissionExists(query: any, activeUser: ActiveUserData) {\n const matchingPermssions = activeUser.permissions.filter((p) =>\n query.permissionNames.includes(p),\n );\n return matchingPermssions;\n }\n\n async initializeRolesForNewUser(roles: string[], user: User) {\n if (!user.id) {\n throw new BadRequestException(ERROR_MESSAGES.USER_MISSING_ID);\n }\n let userRoles = [];\n // Default Internal user role assigned\n userRoles.push(\"Internal User\");\n if (roles) {\n userRoles = [...userRoles, ...roles];\n }\n userRoles = Array.from(new Set([...userRoles]));\n if (userRoles.length > 0) {\n await this.addRolesToUser(user.username, userRoles);\n }\n }\n\n async hashPassword(password: string): Promise<{\n password: string;\n passwordScheme: string;\n passwordSchemeVersion: number;\n }> {\n const hashedPassword = await this.hashingService.hash(password);\n\n return {\n password: hashedPassword,\n passwordScheme: this.hashingService.name(),\n passwordSchemeVersion: this.hashingService.currentVersion(),\n };\n }\n}\n"]}
@@ -33,14 +33,13 @@ export declare class ViewMetadataService extends CRUDService<ViewMetadata> {
33
33
  private parseJsonObject;
34
34
  private getDefaultWorkflowFieldData;
35
35
  private getWorkflowFieldData;
36
- private getEntityRecordsInAllLocales;
37
36
  getLayout(query: any, activeUser: any): Promise<{
38
37
  solidView: ViewMetadata;
39
38
  solidFieldsMetadata: {
40
39
  [k: string]: FieldMetadata;
41
40
  };
42
41
  solidFormViewWorkflowData: readonly IWorkflowFieldDataProviderValues[];
43
- applicableLocales: any;
42
+ applicableLocales: any[];
44
43
  viewModes: any[];
45
44
  }>;
46
45
  private loadFieldHierarchy;
@@ -1 +1 @@
1
- {"version":3,"file":"view-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/view-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,EAAE,MAAM,SAAS,CAAC;AAIxC,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AAEvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAElE,qBACa,mBAAoB,SAAQ,WAAW,CAAC,YAAY,CAAC;IAsE9D,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,uBAAuB,EAAE,uBAAuB;IACzD,QAAQ,CAAC,iBAAiB,EAAE,sBAAsB;IAClD,QAAQ,CAAC,uBAAuB,EAAE,uBAAuB;IAEzD,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,sBAAsB;IAMrC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,0BAA0B;IAC3C,QAAQ,CAAC,SAAS,EAAE,SAAS;IApF/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAQtB;IACX,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAgC;IACtE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAkC;IAEpE,OAAO,CAAC,uBAAuB;IAgC/B,OAAO,CAAC,2BAA2B;IAInC,OAAO,CAAC,UAAU;gBAqBP,qBAAqB,EAAE,qBAAqB,EAC5C,uBAAuB,EAAE,uBAAuB,EAChD,iBAAiB,EAAE,sBAAsB,EACzC,uBAAuB,EAAE,uBAAuB,EAEhD,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,sBAAsB,EAMpB,iBAAiB,EAAE,uBAAuB,EAC1C,0BAA0B,EAAE,0BAA0B,EAC9D,SAAS,EAAE,SAAS;IAK/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAE/D,OAAO,CAAC,eAAe;YAoBT,2BAA2B;YA8B3B,oBAAoB;YAmCpB,4BAA4B;IA0DpC,SAAS,CAAC,KAAK,KAAA,EAAE,UAAU,KAAA;;;;;;;;;YAmRnB,kBAAkB;IAyB1B,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,KAAK;IAU7C,MAAM,CAAC,kBAAkB,EAAE,qBAAqB;IA0BhD,kBAAkB,CAAC,kBAAkB,EAAE,qBAAqB;CAgBnE"}
1
+ {"version":3,"file":"view-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/view-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,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AAEvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAElE,qBACa,mBAAoB,SAAQ,WAAW,CAAC,YAAY,CAAC;IAsE9D,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,uBAAuB,EAAE,uBAAuB;IACzD,QAAQ,CAAC,iBAAiB,EAAE,sBAAsB;IAClD,QAAQ,CAAC,uBAAuB,EAAE,uBAAuB;IAEzD,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,sBAAsB;IAMrC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,0BAA0B;IAC3C,QAAQ,CAAC,SAAS,EAAE,SAAS;IApF/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAQtB;IACX,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAgC;IACtE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAkC;IAEpE,OAAO,CAAC,uBAAuB;IAgC/B,OAAO,CAAC,2BAA2B;IAInC,OAAO,CAAC,UAAU;gBAqBP,qBAAqB,EAAE,qBAAqB,EAC5C,uBAAuB,EAAE,uBAAuB,EAChD,iBAAiB,EAAE,sBAAsB,EACzC,uBAAuB,EAAE,uBAAuB,EAEhD,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,sBAAsB,EAMpB,iBAAiB,EAAE,uBAAuB,EAC1C,0BAA0B,EAAE,0BAA0B,EAC9D,SAAS,EAAE,SAAS;IAK/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAE/D,OAAO,CAAC,eAAe;YAoBT,2BAA2B;YA8B3B,oBAAoB;IAmC5B,SAAS,CAAC,KAAK,KAAA,EAAE,UAAU,KAAA;;;;;;;;;YAmMnB,kBAAkB;IAyB1B,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,KAAK;IAU7C,MAAM,CAAC,kBAAkB,EAAE,qBAAqB;IA0BhD,kBAAkB,CAAC,kBAAkB,EAAE,qBAAqB;CAgBnE"}
@@ -19,8 +19,6 @@ const core_1 = require("@nestjs/core");
19
19
  const typeorm_1 = require("@nestjs/typeorm");
20
20
  const crud_service_1 = require("./crud.service");
21
21
  const typeorm_2 = require("typeorm");
22
- const string_helper_1 = require("../helpers/string.helper");
23
- const locale_entity_1 = require("../entities/locale.entity");
24
22
  const model_metadata_helper_service_1 = require("../helpers/model-metadata-helper.service");
25
23
  const solid_registry_1 = require("../helpers/solid-registry");
26
24
  const model_metadata_repository_1 = require("../repository/model-metadata.repository");
@@ -162,45 +160,6 @@ let ViewMetadataService = ViewMetadataService_1 = class ViewMetadataService exte
162
160
  }
163
161
  return this.getDefaultWorkflowFieldData(workflowField, workflowFieldName, fieldsMap);
164
162
  }
165
- async getEntityRecordsInAllLocales(modelName, id, defaultEntityLocaleIdFromQuery) {
166
- const solidRegistry = await this.moduleRef.get(solid_registry_1.SolidRegistry, { strict: false });
167
- const currentEntityRepository = this.entityManager.getRepository((0, string_helper_1.classify)(modelName));
168
- if (id === 'new' && !defaultEntityLocaleIdFromQuery) {
169
- this.logger.debug(`Creating new record without cloning from any defaultEntityLocaleId.`);
170
- return { records: [], defaultEntityLocaleId: null };
171
- }
172
- if (id === 'new' && defaultEntityLocaleIdFromQuery) {
173
- this.logger.debug(`Creating new record by cloning translations from defaultEntityLocaleId: ${defaultEntityLocaleIdFromQuery}`);
174
- const records = await currentEntityRepository.find({
175
- where: [
176
- { defaultEntityLocaleId: defaultEntityLocaleIdFromQuery },
177
- { id: defaultEntityLocaleIdFromQuery }
178
- ]
179
- });
180
- this.logger.debug(`Found ${records.length} cloned records for new entity.`);
181
- return { records, defaultEntityLocaleId: defaultEntityLocaleIdFromQuery };
182
- }
183
- const entityRecord = await currentEntityRepository.findOne({ where: { id } });
184
- if (!entityRecord) {
185
- this.logger.warn(`No entity found for id ${id}`);
186
- return { records: [], defaultEntityLocaleId: null };
187
- }
188
- const defaultEntityLocaleId = entityRecord.defaultEntityLocaleId || entityRecord.id;
189
- if (entityRecord.defaultEntityLocaleId) {
190
- this.logger.debug(`Editing translated locale record. Translation root id: ${defaultEntityLocaleId}`);
191
- }
192
- else {
193
- this.logger.debug(`Editing translation root record with id ${defaultEntityLocaleId}`);
194
- }
195
- const records = await currentEntityRepository.find({
196
- where: [
197
- { defaultEntityLocaleId: defaultEntityLocaleId },
198
- { id: defaultEntityLocaleId }
199
- ]
200
- });
201
- this.logger.debug(`Found ${records.length} records in all locales for existing entity.`);
202
- return { records, defaultEntityLocaleId };
203
- }
204
163
  async getLayout(query, activeUser) {
205
164
  let { modelName, moduleName, viewType, id, populate, menuItemId, menuItemName, actionId, actionName } = query;
206
165
  const solidRequestContext = {
@@ -336,21 +295,10 @@ let ViewMetadataService = ViewMetadataService_1 = class ViewMetadataService exte
336
295
  if (viewType === 'form' && workflowField) {
337
296
  solidFormViewWorkflowData = await this.getWorkflowFieldData(entity, workflowField, workflowFieldName, fieldsMap, query, activeUser);
338
297
  }
339
- const applicableLocales = [];
298
+ let applicableLocales = [];
340
299
  if (entity.model.internationalisation) {
341
- const defaultEntityLocaleIdFromQuery = query?.defaultEntityLocaleId;
342
- const { records: entityRecordsInAllLocales, defaultEntityLocaleId } = await this.getEntityRecordsInAllLocales(modelName, id, defaultEntityLocaleIdFromQuery);
343
- const allLocales = await this.entityManager.getRepository(locale_entity_1.Locale).find({});
344
- for (const locale of allLocales) {
345
- const matchingRecord = entityRecordsInAllLocales.find(record => record.localeName === locale.locale);
346
- applicableLocales.push({
347
- locale: locale.locale,
348
- displayName: locale.displayName,
349
- isDefault: locale.isDefault ? 'yes' : 'no',
350
- defaultEntityLocaleId: defaultEntityLocaleId,
351
- entityId: matchingRecord ? matchingRecord.id : null
352
- });
353
- }
300
+ const draftPublishEnabled = entity.model.draftPublishWorkflow === true;
301
+ applicableLocales = await this.internationalisationHelperService.buildApplicableLocales(this.entityManager, modelName, id, query?.defaultEntityLocaleId, draftPublishEnabled);
354
302
  }
355
303
  const r = {
356
304
  'solidView': entity,
@@ -1 +1 @@
1
- {"version":3,"file":"view-metadata.service.js","sourceRoot":"","sources":["../../src/services/view-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, forwardRef, Inject, Injectable, Logger } from '@nestjs/common';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { CRUDService } from 'src/services/crud.service';\nimport { EntityManager } from 'typeorm';\n\nimport { classify } from '../helpers/string.helper';\nimport { Locale } from 'src/entities/locale.entity';\nimport { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';\nimport { SolidRegistry } from 'src/helpers/solid-registry';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { ViewMetadataRepository } from 'src/repository/view-metadata.repository';\nimport { UpdateViewMetadataDto } from '../dtos/update-view-metadata.dto';\nimport { FieldMetadata } from '../entities/field-metadata.entity';\nimport { ViewMetadata } from '../entities/view-metadata.entity';\nimport { ActionMetadataService } from './action-metadata.service';\nimport { MenuItemMetadataService } from './menu-item-metadata.service';\nimport { SolidIntrospectService } from './solid-introspect.service';\nimport { UserViewMetadataService } from './user-view-metadata.service';\nimport { MenuItemMetadata } from 'src/entities/menu-item-metadata.entity';\nimport { IWorkflowFieldDataProviderValues } from 'src/interfaces';\n\n@Injectable()\nexport class ViewMetadataService extends CRUDService<ViewMetadata> {\n private readonly comparableFields = [\n 'name',\n 'displayName',\n 'type',\n 'context',\n 'layout',\n 'module',\n 'model',\n ] as const;\n private readonly relationCompareFields = new Set(['module', 'model']);\n private readonly jsonCompareFields = new Set(['layout', 'context']);\n\n private normalizeJsonFieldValue(value: any): any {\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n if (\n (trimmedValue.startsWith('{') && trimmedValue.endsWith('}')) ||\n (trimmedValue.startsWith('[') && trimmedValue.endsWith(']'))\n ) {\n try {\n return this.normalizeJsonFieldValue(JSON.parse(trimmedValue));\n } catch {\n return value;\n }\n }\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.normalizeJsonFieldValue(item));\n }\n\n if (value && typeof value === 'object') {\n return Object.keys(value)\n .sort()\n .reduce((result, key) => {\n result[key] = this.normalizeJsonFieldValue(value[key]);\n return result;\n }, {} as Record<string, any>);\n }\n\n return value;\n }\n\n private getCanonicalJsonFieldString(value: any): string {\n return JSON.stringify(this.normalizeJsonFieldValue(value) ?? null);\n }\n\n private hasChanges(existingSolidView: ViewMetadata, updateSolidViewDto: UpdateViewMetadataDto): boolean {\n return this.comparableFields.some((key) => {\n const value = (updateSolidViewDto as any)[key];\n if (typeof value === 'undefined') {\n return false;\n }\n\n if (this.relationCompareFields.has(key)) {\n const relationValue = value as any;\n return (existingSolidView as any)[key]?.id !== relationValue?.id;\n }\n\n if (this.jsonCompareFields.has(key)) {\n return this.getCanonicalJsonFieldString((existingSolidView as any)[key]) !== this.getCanonicalJsonFieldString(value);\n }\n\n return (existingSolidView as any)[key] !== value;\n });\n }\n\n constructor(\n readonly actionMetadataService: ActionMetadataService,\n readonly menuItemMetadataService: MenuItemMetadataService,\n readonly introspectService: SolidIntrospectService,\n readonly userViewMetadataService: UserViewMetadataService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(ViewMetadata, 'default')\n readonly repo: ViewMetadataRepository,\n // @InjectRepository(FieldMetadata)\n // private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n readonly moduleRef: ModuleRef\n ) {\n super(entityManager, repo, 'viewMetadata', 'solid-core', moduleRef);\n }\n\n private readonly logger = new Logger(ViewMetadataService.name);\n\n private parseJsonObject(value: any): Record<string, any> {\n if (!value) {\n return {};\n }\n\n if (typeof value === 'object') {\n return value;\n }\n\n if (typeof value === 'string') {\n try {\n return JSON.parse(value);\n } catch (error: any) {\n this.logger.warn(`Unable to parse workflow field provider context: ${error?.message ?? error}`);\n }\n }\n\n return {};\n }\n\n private async getDefaultWorkflowFieldData(\n workflowField: FieldMetadata,\n workflowFieldName: string,\n fieldsMap: Map<string, FieldMetadata>,\n ): Promise<IWorkflowFieldDataProviderValues[]> {\n if (workflowField.type === 'selectionStatic') {\n return workflowField.selectionStaticValues.map(item => {\n const [value, label] = item.split(\":\");\n return { label, value };\n });\n }\n\n if (workflowField.type === 'relation' && workflowField.relationType === 'many-to-one') {\n const comodelCrudService = this.introspectService.getCRUDService(workflowField.relationCoModelSingularName);\n const data = await comodelCrudService.find({ limit: 100, offset: 0, });\n const records = data.records ?? [];\n const workflowFieldMetadata = fieldsMap.get(workflowFieldName);\n const workflowFieldUserKey = (workflowFieldMetadata as any)?.relationModel?.userKeyField?.name;\n\n if (!workflowFieldUserKey) {\n this.logger.warn(`Unable to identify relation user key for workflow field: ${workflowFieldName}`);\n return [];\n }\n\n return records.map(item => ({ label: item[workflowFieldUserKey], value: item['id'] }));\n }\n\n return [];\n }\n\n private async getWorkflowFieldData(\n entity: ViewMetadata,\n workflowField: FieldMetadata,\n workflowFieldName: string,\n fieldsMap: Map<string, FieldMetadata>,\n query: Record<string, any>,\n activeUser: any,\n ): Promise<readonly IWorkflowFieldDataProviderValues[]> {\n const workflowFieldDataProviderName = entity.layout?.attrs?.workflowFieldDataProvider;\n if (workflowFieldDataProviderName) {\n const solidRegistry = await this.moduleRef.get(SolidRegistry, { strict: false });\n const provider = solidRegistry.getWorkflowFieldDataProviderInstance(workflowFieldDataProviderName);\n if (!provider) {\n throw new BadRequestException(`Workflow field data provider ${workflowFieldDataProviderName} not found`);\n }\n\n return provider.values({\n entityId: query?.id,\n modelName: entity.model?.singularName ?? query?.modelName,\n moduleName: entity.module?.name ?? query?.moduleName,\n workflowFieldName,\n workflowField,\n solidModel: entity.model,\n solidView: entity,\n solidFieldsMetadata: Object.fromEntries(fieldsMap),\n query,\n providerContext: this.parseJsonObject(entity.layout?.attrs?.workflowFieldDataProviderCtxt),\n activeUser,\n });\n }\n\n return this.getDefaultWorkflowFieldData(workflowField, workflowFieldName, fieldsMap);\n }\n\n //for locales \n private async getEntityRecordsInAllLocales(\n modelName: string,\n id: string,\n defaultEntityLocaleIdFromQuery?: string\n ): Promise<{ records: any[], defaultEntityLocaleId: string | null }> {\n const solidRegistry = await this.moduleRef.get(SolidRegistry, { strict: false });\n // const currentEntityTarget = solidRegistry.getEntityTarget(this.entityManager, classify(modelName));\n const currentEntityRepository = this.entityManager.getRepository(classify(modelName));\n\n // Case 1: Creating a new record with no defaultEntityLocaleId to clone\n if (id === 'new' && !defaultEntityLocaleIdFromQuery) {\n this.logger.debug(`Creating new record without cloning from any defaultEntityLocaleId.`);\n return { records: [], defaultEntityLocaleId: null };\n }\n\n // Case 2: Creating a new record and cloning from an existing defaultEntityLocaleId\n if (id === 'new' && defaultEntityLocaleIdFromQuery) {\n this.logger.debug(`Creating new record by cloning translations from defaultEntityLocaleId: ${defaultEntityLocaleIdFromQuery}`);\n\n const records = await currentEntityRepository.find({\n where: [\n { defaultEntityLocaleId: defaultEntityLocaleIdFromQuery },\n { id: defaultEntityLocaleIdFromQuery }\n ]\n });\n\n this.logger.debug(`Found ${records.length} cloned records for new entity.`);\n return { records, defaultEntityLocaleId: defaultEntityLocaleIdFromQuery };\n }\n\n // Case 3: Editing an existing entity\n const entityRecord = await currentEntityRepository.findOne({ where: { id } });\n\n if (!entityRecord) {\n this.logger.warn(`No entity found for id ${id}`);\n return { records: [], defaultEntityLocaleId: null };\n }\n\n const defaultEntityLocaleId = entityRecord.defaultEntityLocaleId || entityRecord.id;\n if (entityRecord.defaultEntityLocaleId) {\n this.logger.debug(`Editing translated locale record. Translation root id: ${defaultEntityLocaleId}`);\n } else {\n this.logger.debug(`Editing translation root record with id ${defaultEntityLocaleId}`);\n }\n\n const records = await currentEntityRepository.find({\n where: [\n { defaultEntityLocaleId: defaultEntityLocaleId },\n { id: defaultEntityLocaleId }\n ]\n });\n\n this.logger.debug(`Found ${records.length} records in all locales for existing entity.`);\n\n return { records, defaultEntityLocaleId };\n }\n\n // START: Custom Service Methods\n async getLayout(query, activeUser) {\n let { modelName, moduleName, viewType, id, populate, menuItemId, menuItemName, actionId, actionName } = query;\n\n // 1. Fetch the action based on actionId.\n const solidRequestContext = {\n activeUser: activeUser\n }\n const actionQuery = {\n populate: [\"view\"]\n }\n let action = null;\n if (actionId) {\n action = await this.actionMetadataService.findOne(actionId, actionQuery, solidRequestContext);\n }\n\n // 2. Fetch the menu based on menuItemId.\n const menuItemQuery = {\n populate: ['action', 'action.model', 'module']\n }\n let menuItem: MenuItemMetadata = null;\n if (menuItemId) {\n menuItem = await this.menuItemMetadataService.findOne(menuItemId, menuItemQuery, solidRequestContext);\n }\n\n let viewModes = [];\n const menuItemModelId = menuItem?.action?.model?.id;\n const menuItemModuleId = menuItem?.module?.id;\n const collectionViewTypes = ['card', 'list', 'kanban', 'tree'];\n if (menuItemModelId && menuItemModuleId) {\n const actionQb = await this.actionMetadataService.repo.createSecurityRuleAwareQueryBuilder('action');\n const actionsForViewModes = await actionQb\n .leftJoinAndSelect('action.model', 'model')\n .leftJoinAndSelect('action.module', 'module')\n .leftJoinAndSelect('action.view', 'view')\n .where('model.id = :modelId', { modelId: menuItemModelId })\n .andWhere('module.id = :moduleId', { moduleId: menuItemModuleId })\n .andWhere('view.type IN (:...viewTypes)', { viewTypes: collectionViewTypes })\n .getMany();\n\n const canonicalActionsByViewType = new Map();\n for (const actionItem of actionsForViewModes) {\n const resolvedViewType = actionItem.view?.type;\n if (!resolvedViewType || canonicalActionsByViewType.has(resolvedViewType)) {\n continue;\n }\n canonicalActionsByViewType.set(resolvedViewType, actionItem);\n }\n\n if (action?.view?.type && collectionViewTypes.includes(action.view.type) && action?.id) {\n canonicalActionsByViewType.set(action.view.type, action);\n }\n\n viewModes = collectionViewTypes\n .map((resolvedViewType) => canonicalActionsByViewType.get(resolvedViewType))\n .filter(Boolean)\n .map(actionItem => ({\n type: actionItem.view?.type ?? '',\n menuItemId: menuItem.id,\n menuItemName: menuItem.displayName,\n actionId: actionItem.id ?? '',\n actionName: actionItem.displayName ?? '',\n }));\n }\n\n const viewId = action?.view?.id\n // 3. Fetch the view based on module, model & view name.\n const entity = await this.repo.findOne({\n where: {\n model: { singularName: modelName },\n module: { name: moduleName },\n ...(actionId && viewId ? { id: action.view.id } : { type: viewType })\n },\n relations: {\n model: {\n userKeyField: true,\n },\n module: true,\n }\n });\n\n if (!entity) {\n throw new BadRequestException(`Unable to identify view for module: ${moduleName}, model: ${modelName} and viewType: ${viewType}`);\n }\n if (!activeUser?.sub) {\n throw new BadRequestException(`Unable to identify user for module: ${moduleName}, model: ${modelName} and viewType: ${viewType}`);\n }\n\n // 4. add action and menuItem to Entity which is our solid View\n if (actionId) {\n delete action.view;\n entity['action'] = action\n }\n if (menuItemId) {\n entity['menu'] = menuItem\n }\n\n // 5. See if we have a user specific layout for this view.\n const userLayout = await this.userViewMetadataService.repo.findOne({\n where: {\n user: { id: activeUser?.sub },\n viewMetadata: { id: entity.id },\n },\n });\n // Based on where we found the layout we are converting it from string to json.\n if (userLayout) {\n entity.layout = JSON.parse(userLayout.layout);\n } else {\n entity.layout = JSON.parse(entity.layout);\n }\n\n // 6. We are resolving the create & edit actions if specified in the layout.\n if (entity?.layout?.attrs?.createAction) {\n const actionName: string = entity.layout.attrs.createAction;\n entity.layout.attrs.createAction = await this.actionMetadataService.findOneByUserKey(actionName)\n }\n if (entity?.layout?.attrs?.editAction) {\n const actionName: string = entity.layout.attrs.editAction;\n entity.layout.attrs.editAction = await this.actionMetadataService.findOneByUserKey(actionName)\n }\n\n // 7. For form views we need to fetch the workflow field metadata if specified.\n let workflowFieldName = null;\n let workflowField = null;\n if (viewType === 'form') {\n workflowFieldName = entity.layout?.attrs?.workflowField;\n }\n\n // 8. Create an easy to use map of field metadata, rather than sending an array of fields it becomes easier to use in the frontend.\n const fields = await this.modelMetadataHelperService.loadFieldHierarchy(modelName);\n const fieldsMap = new Map<string, FieldMetadata>();\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n\n // We need to identify the workflowField metadata if specified. \n if (workflowFieldName && field.name === workflowFieldName) {\n workflowField = field;\n }\n\n // For fields of type relation & relationType many-to-one\n // We fetch metadata regarding the relationCoModelSingularName\n if (field.type === 'relation') {\n const relationModel = await this.modelMetadataRepo.find({\n where: {\n singularName: field.relationCoModelSingularName\n },\n relations: {\n userKeyField: true\n }\n });\n\n if (relationModel) {\n field['relationModel'] = relationModel[0];\n }\n }\n if (!fieldsMap.has(field.name)) {\n fieldsMap.set(field.name, field);\n }\n }\n\n // 9. Use the resolved workflowField to populate workflow specific metadata.\n let solidFormViewWorkflowData: readonly IWorkflowFieldDataProviderValues[] = [];\n if (viewType === 'form' && workflowField) {\n solidFormViewWorkflowData = await this.getWorkflowFieldData(entity, workflowField, workflowFieldName, fieldsMap, query, activeUser);\n }\n\n // 10. If this model supports internationalisation, we need to load the locales applicable with the id of an actual record for each locale if present.\n // This is the shape of locales that will be returned \n /**\n * [\n * {locale: 'en', displayName: 'English', isDefault: 'yes', defaultEntityLocaleId: '', entityId: '1'}, \n * {locale: 'en-IN', displayName: 'English (India)', isDefault: 'no', defaultEntityLocaleId: '1', entityId: '2'}, \n * {locale: 'en-SG', displayName: 'English (Singapore)', isDefault: 'no', defaultEntityLocaleId: '', entityId: '3'}, \n * {locale: 'fr', displayName: 'French', isDefault: 'no', defaultEntityLocaleId: '', entityId: ''}\n * ]\n */\n\n const applicableLocales: any = []\n // if (entity.model.internationalisation) {\n // const allLocales = await this.entityManager.getRepository(Locale).find({});\n\n // if (id === 'new') {\n // allLocales.forEach(locale => {\n // applicableLocales.push({\n // locale: locale.locale,\n // displayName: locale.displayName,\n // isDefault: locale.isDefault ? 'yes' : 'no',\n // defaultEntityLocaleId: null,\n // entityId: null\n // });\n // });\n // }\n // else {\n // const defaultLocale = allLocales.find(locale => locale.isDefault);\n // this.logger.debug(`Default locale is: ${defaultLocale.locale}`);\n\n // // Get hold of the repository for the current model\n // const solidRegistry = await this.moduleRef.get(SolidRegistry, { strict: false });\n // const currentEntityTarget = solidRegistry.getEntityTarget(this.entityManager, classify(modelName));\n // const currentEntityRepository = this.entityManager.getRepository(currentEntityTarget);\n\n // // We are in edit mode, the id that is being edited could be a record tagged with the default locale or it could be tagged with a non-default locale.\n // const entityRecord = await currentEntityRepository.findOne({\n // where: {\n // id: id,\n // }\n // });\n // if(entityRecord){\n // // Resolve the default entity locale id....\n // let defaultEntityLocaleId = null;\n // if (entityRecord.localeName === defaultLocale.locale) {\n // defaultEntityLocaleId = entityRecord.id;\n // this.logger.debug(`You are editing a record tagged with the default locale: ${entityRecord.localeName}.`);\n // }\n // else {\n // defaultEntityLocaleId = entityRecord.defaultEntityLocaleId;\n // this.logger.debug(`You are editing a record tagged with the non-default locale: ${entityRecord.localeName}. `);\n // }\n // this.logger.debug(`Identified default Entity Locale Id: ${defaultEntityLocaleId}`);\n\n // // Now we query for all records in the same model matching the defaultEntityLocaleId\n // // Get all records mathcing the defaultEntityLocaleId or where the id is same as the defaultEntityLocaleId\n // const entityRecordsInAllLocales = await currentEntityRepository.find({\n // where: [\n // { defaultEntityLocaleId: defaultEntityLocaleId },\n // { id: defaultEntityLocaleId }\n // ],\n // });\n // this.logger.debug(`Found ${entityRecordsInAllLocales.length} records in all locales for the defaultEntityLocaleId: ${defaultEntityLocaleId}`);\n\n // // Loop over all locales and populate the applicableLocales array\n // for (const locale of allLocales) {\n // // Find the record in the entityRecordsInAllLocales that matches the current locale\n // const matchingRecord = entityRecordsInAllLocales.find(record => record.localeName === locale.locale);\n\n // applicableLocales.push({\n // locale: locale.locale,\n // displayName: locale.displayName,\n // isDefault: locale.isDefault ? 'yes' : 'no',\n // defaultEntityLocaleId: defaultEntityLocaleId,\n // entityId: (matchingRecord ? matchingRecord.id : null)\n // });\n // }\n // }else{\n // this.logger.warn(`No record found for id: ${id} in model: ${modelName}. Cannot determine applicable locales.`);\n // }\n // }\n // }\n if (entity.model.internationalisation) {\n const defaultEntityLocaleIdFromQuery = query?.defaultEntityLocaleId;\n const { records: entityRecordsInAllLocales, defaultEntityLocaleId } =\n await this.getEntityRecordsInAllLocales(modelName, id, defaultEntityLocaleIdFromQuery);\n const allLocales = await this.entityManager.getRepository(Locale).find({});\n for (const locale of allLocales) {\n const matchingRecord = entityRecordsInAllLocales.find(record => record.localeName === locale.locale);\n applicableLocales.push({\n locale: locale.locale,\n displayName: locale.displayName,\n isDefault: locale.isDefault ? 'yes' : 'no',\n defaultEntityLocaleId: defaultEntityLocaleId,\n entityId: matchingRecord ? matchingRecord.id : null\n });\n }\n }\n\n const r = {\n 'solidView': entity,\n 'solidFieldsMetadata': Object.fromEntries(fieldsMap),\n 'solidFormViewWorkflowData': solidFormViewWorkflowData,\n 'applicableLocales': applicableLocales,\n 'viewModes': viewModes\n }\n\n return r;\n }\n\n private async loadFieldHierarchy(modelName: any) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: modelName,\n },\n relations: {\n fields: true,\n parentModel: {\n fields: true,\n }\n }\n });\n const fields = [];\n if (model) {\n // Add the fields of the current model\n fields.push(...model.fields);\n\n // Add the fields of the parent model\n if (model.parentModel) {\n fields.push(...model.parentModel.fields);\n }\n }\n return fields;\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(updateSolidViewDto: UpdateViewMetadataDto) {\n // First check if module already exists using name\n const existingSolidView = await this.findOneByUserKey(updateSolidViewDto.name, {\n module: true,\n model: true,\n });\n\n // if found\n if (existingSolidView) {\n const hasChanges = this.hasChanges(existingSolidView, updateSolidViewDto);\n\n if (!hasChanges) {\n this.logger.debug(`Skipping view upsert for ${updateSolidViewDto.name}; no changes detected.`);\n return existingSolidView;\n }\n\n const updatedSolidViewDto = { ...existingSolidView, ...updateSolidViewDto };\n return this.repo.save(updatedSolidViewDto);\n }\n // if not found - create new \n else {\n const viewData = this.repo.create(updateSolidViewDto);\n return this.repo.save(viewData);\n }\n }\n\n async createIfNotPresent(updateSolidViewDto: UpdateViewMetadataDto) {\n // First check if module already exists using name\n const existingSolidView = await this.findOneByUserKey(updateSolidViewDto.name);\n\n // if found\n if (existingSolidView) {\n }\n // if not found - create new \n else {\n const viewData = this.repo.create(updateSolidViewDto);\n return this.repo.save(viewData);\n }\n }\n\n // END: Custom Service Methods\n\n}\n"]}
1
+ {"version":3,"file":"view-metadata.service.js","sourceRoot":"","sources":["../../src/services/view-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, forwardRef, Inject, Injectable, Logger } from '@nestjs/common';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { CRUDService } from 'src/services/crud.service';\nimport { EntityManager } from 'typeorm';\n\nimport { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';\nimport { SolidRegistry } from 'src/helpers/solid-registry';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { ViewMetadataRepository } from 'src/repository/view-metadata.repository';\nimport { UpdateViewMetadataDto } from '../dtos/update-view-metadata.dto';\nimport { FieldMetadata } from '../entities/field-metadata.entity';\nimport { ViewMetadata } from '../entities/view-metadata.entity';\nimport { ActionMetadataService } from './action-metadata.service';\nimport { MenuItemMetadataService } from './menu-item-metadata.service';\nimport { SolidIntrospectService } from './solid-introspect.service';\nimport { UserViewMetadataService } from './user-view-metadata.service';\nimport { MenuItemMetadata } from 'src/entities/menu-item-metadata.entity';\nimport { IWorkflowFieldDataProviderValues } from 'src/interfaces';\n\n@Injectable()\nexport class ViewMetadataService extends CRUDService<ViewMetadata> {\n private readonly comparableFields = [\n 'name',\n 'displayName',\n 'type',\n 'context',\n 'layout',\n 'module',\n 'model',\n ] as const;\n private readonly relationCompareFields = new Set(['module', 'model']);\n private readonly jsonCompareFields = new Set(['layout', 'context']);\n\n private normalizeJsonFieldValue(value: any): any {\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n if (\n (trimmedValue.startsWith('{') && trimmedValue.endsWith('}')) ||\n (trimmedValue.startsWith('[') && trimmedValue.endsWith(']'))\n ) {\n try {\n return this.normalizeJsonFieldValue(JSON.parse(trimmedValue));\n } catch {\n return value;\n }\n }\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.normalizeJsonFieldValue(item));\n }\n\n if (value && typeof value === 'object') {\n return Object.keys(value)\n .sort()\n .reduce((result, key) => {\n result[key] = this.normalizeJsonFieldValue(value[key]);\n return result;\n }, {} as Record<string, any>);\n }\n\n return value;\n }\n\n private getCanonicalJsonFieldString(value: any): string {\n return JSON.stringify(this.normalizeJsonFieldValue(value) ?? null);\n }\n\n private hasChanges(existingSolidView: ViewMetadata, updateSolidViewDto: UpdateViewMetadataDto): boolean {\n return this.comparableFields.some((key) => {\n const value = (updateSolidViewDto as any)[key];\n if (typeof value === 'undefined') {\n return false;\n }\n\n if (this.relationCompareFields.has(key)) {\n const relationValue = value as any;\n return (existingSolidView as any)[key]?.id !== relationValue?.id;\n }\n\n if (this.jsonCompareFields.has(key)) {\n return this.getCanonicalJsonFieldString((existingSolidView as any)[key]) !== this.getCanonicalJsonFieldString(value);\n }\n\n return (existingSolidView as any)[key] !== value;\n });\n }\n\n constructor(\n readonly actionMetadataService: ActionMetadataService,\n readonly menuItemMetadataService: MenuItemMetadataService,\n readonly introspectService: SolidIntrospectService,\n readonly userViewMetadataService: UserViewMetadataService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(ViewMetadata, 'default')\n readonly repo: ViewMetadataRepository,\n // @InjectRepository(FieldMetadata)\n // private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n readonly moduleRef: ModuleRef\n ) {\n super(entityManager, repo, 'viewMetadata', 'solid-core', moduleRef);\n }\n\n private readonly logger = new Logger(ViewMetadataService.name);\n\n private parseJsonObject(value: any): Record<string, any> {\n if (!value) {\n return {};\n }\n\n if (typeof value === 'object') {\n return value;\n }\n\n if (typeof value === 'string') {\n try {\n return JSON.parse(value);\n } catch (error: any) {\n this.logger.warn(`Unable to parse workflow field provider context: ${error?.message ?? error}`);\n }\n }\n\n return {};\n }\n\n private async getDefaultWorkflowFieldData(\n workflowField: FieldMetadata,\n workflowFieldName: string,\n fieldsMap: Map<string, FieldMetadata>,\n ): Promise<IWorkflowFieldDataProviderValues[]> {\n if (workflowField.type === 'selectionStatic') {\n return workflowField.selectionStaticValues.map(item => {\n const [value, label] = item.split(\":\");\n return { label, value };\n });\n }\n\n if (workflowField.type === 'relation' && workflowField.relationType === 'many-to-one') {\n const comodelCrudService = this.introspectService.getCRUDService(workflowField.relationCoModelSingularName);\n const data = await comodelCrudService.find({ limit: 100, offset: 0, });\n const records = data.records ?? [];\n const workflowFieldMetadata = fieldsMap.get(workflowFieldName);\n const workflowFieldUserKey = (workflowFieldMetadata as any)?.relationModel?.userKeyField?.name;\n\n if (!workflowFieldUserKey) {\n this.logger.warn(`Unable to identify relation user key for workflow field: ${workflowFieldName}`);\n return [];\n }\n\n return records.map(item => ({ label: item[workflowFieldUserKey], value: item['id'] }));\n }\n\n return [];\n }\n\n private async getWorkflowFieldData(\n entity: ViewMetadata,\n workflowField: FieldMetadata,\n workflowFieldName: string,\n fieldsMap: Map<string, FieldMetadata>,\n query: Record<string, any>,\n activeUser: any,\n ): Promise<readonly IWorkflowFieldDataProviderValues[]> {\n const workflowFieldDataProviderName = entity.layout?.attrs?.workflowFieldDataProvider;\n if (workflowFieldDataProviderName) {\n const solidRegistry = await this.moduleRef.get(SolidRegistry, { strict: false });\n const provider = solidRegistry.getWorkflowFieldDataProviderInstance(workflowFieldDataProviderName);\n if (!provider) {\n throw new BadRequestException(`Workflow field data provider ${workflowFieldDataProviderName} not found`);\n }\n\n return provider.values({\n entityId: query?.id,\n modelName: entity.model?.singularName ?? query?.modelName,\n moduleName: entity.module?.name ?? query?.moduleName,\n workflowFieldName,\n workflowField,\n solidModel: entity.model,\n solidView: entity,\n solidFieldsMetadata: Object.fromEntries(fieldsMap),\n query,\n providerContext: this.parseJsonObject(entity.layout?.attrs?.workflowFieldDataProviderCtxt),\n activeUser,\n });\n }\n\n return this.getDefaultWorkflowFieldData(workflowField, workflowFieldName, fieldsMap);\n }\n\n // START: Custom Service Methods\n async getLayout(query, activeUser) {\n let { modelName, moduleName, viewType, id, populate, menuItemId, menuItemName, actionId, actionName } = query;\n\n // 1. Fetch the action based on actionId.\n const solidRequestContext = {\n activeUser: activeUser\n }\n const actionQuery = {\n populate: [\"view\"]\n }\n let action = null;\n if (actionId) {\n action = await this.actionMetadataService.findOne(actionId, actionQuery, solidRequestContext);\n }\n\n // 2. Fetch the menu based on menuItemId.\n const menuItemQuery = {\n populate: ['action', 'action.model', 'module']\n }\n let menuItem: MenuItemMetadata = null;\n if (menuItemId) {\n menuItem = await this.menuItemMetadataService.findOne(menuItemId, menuItemQuery, solidRequestContext);\n }\n\n let viewModes = [];\n const menuItemModelId = menuItem?.action?.model?.id;\n const menuItemModuleId = menuItem?.module?.id;\n const collectionViewTypes = ['card', 'list', 'kanban', 'tree'];\n if (menuItemModelId && menuItemModuleId) {\n const actionQb = await this.actionMetadataService.repo.createSecurityRuleAwareQueryBuilder('action');\n const actionsForViewModes = await actionQb\n .leftJoinAndSelect('action.model', 'model')\n .leftJoinAndSelect('action.module', 'module')\n .leftJoinAndSelect('action.view', 'view')\n .where('model.id = :modelId', { modelId: menuItemModelId })\n .andWhere('module.id = :moduleId', { moduleId: menuItemModuleId })\n .andWhere('view.type IN (:...viewTypes)', { viewTypes: collectionViewTypes })\n .getMany();\n\n const canonicalActionsByViewType = new Map();\n for (const actionItem of actionsForViewModes) {\n const resolvedViewType = actionItem.view?.type;\n if (!resolvedViewType || canonicalActionsByViewType.has(resolvedViewType)) {\n continue;\n }\n canonicalActionsByViewType.set(resolvedViewType, actionItem);\n }\n\n if (action?.view?.type && collectionViewTypes.includes(action.view.type) && action?.id) {\n canonicalActionsByViewType.set(action.view.type, action);\n }\n\n viewModes = collectionViewTypes\n .map((resolvedViewType) => canonicalActionsByViewType.get(resolvedViewType))\n .filter(Boolean)\n .map(actionItem => ({\n type: actionItem.view?.type ?? '',\n menuItemId: menuItem.id,\n menuItemName: menuItem.displayName,\n actionId: actionItem.id ?? '',\n actionName: actionItem.displayName ?? '',\n }));\n }\n\n const viewId = action?.view?.id\n // 3. Fetch the view based on module, model & view name.\n const entity = await this.repo.findOne({\n where: {\n model: { singularName: modelName },\n module: { name: moduleName },\n ...(actionId && viewId ? { id: action.view.id } : { type: viewType })\n },\n relations: {\n model: {\n userKeyField: true,\n },\n module: true,\n }\n });\n\n if (!entity) {\n throw new BadRequestException(`Unable to identify view for module: ${moduleName}, model: ${modelName} and viewType: ${viewType}`);\n }\n if (!activeUser?.sub) {\n throw new BadRequestException(`Unable to identify user for module: ${moduleName}, model: ${modelName} and viewType: ${viewType}`);\n }\n\n // 4. add action and menuItem to Entity which is our solid View\n if (actionId) {\n delete action.view;\n entity['action'] = action\n }\n if (menuItemId) {\n entity['menu'] = menuItem\n }\n\n // 5. See if we have a user specific layout for this view.\n const userLayout = await this.userViewMetadataService.repo.findOne({\n where: {\n user: { id: activeUser?.sub },\n viewMetadata: { id: entity.id },\n },\n });\n // Based on where we found the layout we are converting it from string to json.\n if (userLayout) {\n entity.layout = JSON.parse(userLayout.layout);\n } else {\n entity.layout = JSON.parse(entity.layout);\n }\n\n // 6. We are resolving the create & edit actions if specified in the layout.\n if (entity?.layout?.attrs?.createAction) {\n const actionName: string = entity.layout.attrs.createAction;\n entity.layout.attrs.createAction = await this.actionMetadataService.findOneByUserKey(actionName)\n }\n if (entity?.layout?.attrs?.editAction) {\n const actionName: string = entity.layout.attrs.editAction;\n entity.layout.attrs.editAction = await this.actionMetadataService.findOneByUserKey(actionName)\n }\n\n // 7. For form views we need to fetch the workflow field metadata if specified.\n let workflowFieldName = null;\n let workflowField = null;\n if (viewType === 'form') {\n workflowFieldName = entity.layout?.attrs?.workflowField;\n }\n\n // 8. Create an easy to use map of field metadata, rather than sending an array of fields it becomes easier to use in the frontend.\n const fields = await this.modelMetadataHelperService.loadFieldHierarchy(modelName);\n const fieldsMap = new Map<string, FieldMetadata>();\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n\n // We need to identify the workflowField metadata if specified. \n if (workflowFieldName && field.name === workflowFieldName) {\n workflowField = field;\n }\n\n // For fields of type relation & relationType many-to-one\n // We fetch metadata regarding the relationCoModelSingularName\n if (field.type === 'relation') {\n const relationModel = await this.modelMetadataRepo.find({\n where: {\n singularName: field.relationCoModelSingularName\n },\n relations: {\n userKeyField: true\n }\n });\n\n if (relationModel) {\n field['relationModel'] = relationModel[0];\n }\n }\n if (!fieldsMap.has(field.name)) {\n fieldsMap.set(field.name, field);\n }\n }\n\n // 9. Use the resolved workflowField to populate workflow specific metadata.\n let solidFormViewWorkflowData: readonly IWorkflowFieldDataProviderValues[] = [];\n if (viewType === 'form' && workflowField) {\n solidFormViewWorkflowData = await this.getWorkflowFieldData(entity, workflowField, workflowFieldName, fieldsMap, query, activeUser);\n }\n\n // 10. If this model supports internationalisation, we need to load the locales applicable with the id of an actual record for each locale if present.\n // This is the shape of locales that will be returned \n /**\n * [\n * {locale: 'en', displayName: 'English', isDefault: 'yes', defaultEntityLocaleId: '', entityId: '1'}, \n * {locale: 'en-IN', displayName: 'English (India)', isDefault: 'no', defaultEntityLocaleId: '1', entityId: '2'}, \n * {locale: 'en-SG', displayName: 'English (Singapore)', isDefault: 'no', defaultEntityLocaleId: '', entityId: '3'}, \n * {locale: 'fr', displayName: 'French', isDefault: 'no', defaultEntityLocaleId: '', entityId: ''}\n * ]\n */\n\n let applicableLocales: any[] = [];\n if (entity.model.internationalisation) {\n const draftPublishEnabled = entity.model.draftPublishWorkflow === true;\n applicableLocales = await this.internationalisationHelperService.buildApplicableLocales(\n this.entityManager, modelName, id, query?.defaultEntityLocaleId, draftPublishEnabled,\n );\n }\n\n const r = {\n 'solidView': entity,\n 'solidFieldsMetadata': Object.fromEntries(fieldsMap),\n 'solidFormViewWorkflowData': solidFormViewWorkflowData,\n 'applicableLocales': applicableLocales,\n 'viewModes': viewModes\n }\n\n return r;\n }\n\n private async loadFieldHierarchy(modelName: any) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: modelName,\n },\n relations: {\n fields: true,\n parentModel: {\n fields: true,\n }\n }\n });\n const fields = [];\n if (model) {\n // Add the fields of the current model\n fields.push(...model.fields);\n\n // Add the fields of the parent model\n if (model.parentModel) {\n fields.push(...model.parentModel.fields);\n }\n }\n return fields;\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(updateSolidViewDto: UpdateViewMetadataDto) {\n // First check if module already exists using name\n const existingSolidView = await this.findOneByUserKey(updateSolidViewDto.name, {\n module: true,\n model: true,\n });\n\n // if found\n if (existingSolidView) {\n const hasChanges = this.hasChanges(existingSolidView, updateSolidViewDto);\n\n if (!hasChanges) {\n this.logger.debug(`Skipping view upsert for ${updateSolidViewDto.name}; no changes detected.`);\n return existingSolidView;\n }\n\n const updatedSolidViewDto = { ...existingSolidView, ...updateSolidViewDto };\n return this.repo.save(updatedSolidViewDto);\n }\n // if not found - create new \n else {\n const viewData = this.repo.create(updateSolidViewDto);\n return this.repo.save(viewData);\n }\n }\n\n async createIfNotPresent(updateSolidViewDto: UpdateViewMetadataDto) {\n // First check if module already exists using name\n const existingSolidView = await this.findOneByUserKey(updateSolidViewDto.name);\n\n // if found\n if (existingSolidView) {\n }\n // if not found - create new \n else {\n const viewData = this.repo.create(updateSolidViewDto);\n return this.repo.save(viewData);\n }\n }\n\n // END: Custom Service Methods\n\n}\n"]}
@@ -18,7 +18,7 @@ export declare class WorkflowDefinitionService extends CRUDService<WorkflowDefin
18
18
  create(createDto: any, files?: Express.Multer.File[], solidRequestContext?: any): Promise<WorkflowDefinition>;
19
19
  insertMany(createDtos: any[], filesArray?: Express.Multer.File[][], solidRequestContext?: any): Promise<WorkflowDefinition[]>;
20
20
  update(id: number, updateDto: any, files?: Express.Multer.File[], isPartialUpdate?: boolean, solidRequestContext?: any, isUpdate?: boolean): Promise<WorkflowDefinition>;
21
- delete(id: number, solidRequestContext?: any): Promise<WorkflowDefinition>;
21
+ delete(id: number, solidRequestContext?: any): Promise<WorkflowDefinition[]>;
22
22
  deleteMany(ids: number[], solidRequestContext?: any): Promise<any>;
23
23
  recover(id: number, solidRequestContext?: any): Promise<{
24
24
  message: string;
@@ -1 +1 @@
1
- {"version":3,"file":"solid-core.module.d.ts","sourceRoot":"","sources":["../src/solid-core.module.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC;AAChB,OAAO,EAAU,kBAAkB,EAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAgdhF,qBA8jBa,eAAgB,YAAW,UAAU;IAChD,SAAS,CAAC,QAAQ,EAAE,kBAAkB;CAQvC"}
1
+ {"version":3,"file":"solid-core.module.d.ts","sourceRoot":"","sources":["../src/solid-core.module.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC;AAChB,OAAO,EAAU,kBAAkB,EAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAmdhF,qBAwkBa,eAAgB,YAAW,UAAU;IAChD,SAAS,CAAC,QAAQ,EAAE,kBAAkB;CAQvC"}
@@ -73,6 +73,8 @@ const mq_dashboard_queue_name_variable_options_provider_service_1 = require("./s
73
73
  const pseudo_foreign_key_selection_provider_service_1 = require("./services/selection-providers/pseudo-foreign-key-selection-provider.service");
74
74
  const module_metadata_seeder_service_1 = require("./seeders/module-metadata-seeder.service");
75
75
  const module_test_data_service_1 = require("./seeders/module-test-data.service");
76
+ const draft_publish_helper_service_1 = require("./services/draft-publish-helper.service");
77
+ const internationalisation_helper_service_1 = require("./services/internationalisation-helper.service");
76
78
  const crud_helper_service_1 = require("./services/crud-helper.service");
77
79
  const datasource_management_service_1 = require("./services/datasource-management.service");
78
80
  const datasource_introspection_service_1 = require("./services/datasource-introspection.service");
@@ -194,6 +196,7 @@ const google_oauth_strategy_1 = require("./passport-strategies/google-oauth.stra
194
196
  const api_key_service_1 = require("./services/api-key.service");
195
197
  const active_session_storage_service_1 = require("./services/active-session-storage.service");
196
198
  const authentication_service_1 = require("./services/authentication.service");
199
+ const metadata_validation_service_1 = require("./services/metadata-validation.service");
197
200
  const bcrypt_service_1 = require("./services/bcrypt.service");
198
201
  const uuid_externalid_entity_computed_field_provider_service_1 = require("./services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service");
199
202
  const uuid_external_id_computed_field_provider_service_1 = require("./services/computed-fields/uuid-external-id-computed-field-provider.service");
@@ -529,7 +532,7 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
529
532
  setHeaders: (res, path) => {
530
533
  res.setHeader("Cross-Origin-Resource-Policy", "cross-origin");
531
534
  res.setHeader("X-Content-Type-Options", "nosniff");
532
- if (!media_file_types_1.INLINE_SAFE_EXTENSIONS.has((0, path_1.extname)(path).toLowerCase().replace(/^\./, ''))) {
535
+ if (!media_file_types_1.INLINE_SAFE_EXTENSIONS.has((0, media_file_types_1.getLowercaseFileExtension)((0, path_1.basename)(path)) ?? '')) {
533
536
  res.setHeader("Content-Type", "application/octet-stream");
534
537
  res.setHeader("Content-Disposition", "attachment");
535
538
  }
@@ -638,6 +641,7 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
638
641
  module_metadata_explorer_service_1.ModuleMetadataExplorerService,
639
642
  module_metadata_helper_service_1.ModuleMetadataHelperService,
640
643
  module_package_service_1.ModulePackageService,
644
+ metadata_validation_service_1.MetadataValidationService,
641
645
  model_metadata_service_1.ModelMetadataService,
642
646
  model_metadata_helper_service_1.ModelMetadataHelperService,
643
647
  field_metadata_service_1.FieldMetadataService,
@@ -650,6 +654,8 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
650
654
  info_service_1.InfoService,
651
655
  solid_introspect_service_1.SolidIntrospectService,
652
656
  core_1.DiscoveryService,
657
+ draft_publish_helper_service_1.DraftPublishHelperService,
658
+ internationalisation_helper_service_1.InternationalisationHelperService,
653
659
  crud_helper_service_1.CrudHelperService,
654
660
  crud_service_1.CRUDService,
655
661
  core_1.Reflector,
@@ -964,6 +970,8 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
964
970
  chatter_message_repository_1.ChatterMessageRepository,
965
971
  chatter_message_service_1.ChatterMessageService,
966
972
  config_1.ConfigModule,
973
+ draft_publish_helper_service_1.DraftPublishHelperService,
974
+ internationalisation_helper_service_1.InternationalisationHelperService,
967
975
  crud_helper_service_1.CrudHelperService,
968
976
  crud_service_1.CRUDService,
969
977
  csv_service_1.CsvService,
@@ -986,6 +994,7 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
986
994
  sms_factory_1.SmsFactory,
987
995
  media_service_1.MediaService,
988
996
  media_storage_provider_metadata_service_1.MediaStorageProviderMetadataService,
997
+ metadata_validation_service_1.MetadataValidationService,
989
998
  model_metadata_helper_service_1.ModelMetadataHelperService,
990
999
  model_metadata_service_1.ModelMetadataService,
991
1000
  module_metadata_service_1.ModuleMetadataService,