@solidstarters/solid-core 1.2.191 → 1.2.192

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 (531) hide show
  1. package/dist/config/iam.config.d.ts +6 -4
  2. package/dist/config/iam.config.d.ts.map +1 -1
  3. package/dist/config/iam.config.js +3 -2
  4. package/dist/config/iam.config.js.map +1 -1
  5. package/dist/constants/error-messages.d.ts +2 -0
  6. package/dist/constants/error-messages.d.ts.map +1 -1
  7. package/dist/constants/error-messages.js +2 -0
  8. package/dist/constants/error-messages.js.map +1 -1
  9. package/dist/controllers/authentication.controller.d.ts +1 -1
  10. package/dist/controllers/authentication.controller.d.ts.map +1 -1
  11. package/dist/controllers/authentication.controller.js +4 -3
  12. package/dist/controllers/authentication.controller.js.map +1 -1
  13. package/dist/controllers/email-template.controller.d.ts.map +1 -1
  14. package/dist/controllers/email-template.controller.js +8 -8
  15. package/dist/controllers/email-template.controller.js.map +1 -1
  16. package/dist/controllers/export-template.controller.d.ts +2 -1
  17. package/dist/controllers/export-template.controller.d.ts.map +1 -1
  18. package/dist/controllers/export-template.controller.js +5 -3
  19. package/dist/controllers/export-template.controller.js.map +1 -1
  20. package/dist/controllers/import-transaction.controller.d.ts +2 -1
  21. package/dist/controllers/import-transaction.controller.d.ts.map +1 -1
  22. package/dist/controllers/import-transaction.controller.js +6 -3
  23. package/dist/controllers/import-transaction.controller.js.map +1 -1
  24. package/dist/controllers/sms-template.controller.d.ts.map +1 -1
  25. package/dist/controllers/sms-template.controller.js +7 -7
  26. package/dist/controllers/sms-template.controller.js.map +1 -1
  27. package/dist/decorators/active-user.decorator.d.ts +1 -1
  28. package/dist/decorators/security-rule-config-provider.decorator.d.ts +3 -0
  29. package/dist/decorators/security-rule-config-provider.decorator.d.ts.map +1 -0
  30. package/dist/decorators/security-rule-config-provider.decorator.js +11 -0
  31. package/dist/decorators/security-rule-config-provider.decorator.js.map +1 -0
  32. package/dist/decorators/solid-password.decorator.d.ts +5 -1
  33. package/dist/decorators/solid-password.decorator.d.ts.map +1 -1
  34. package/dist/decorators/solid-password.decorator.js +18 -6
  35. package/dist/decorators/solid-password.decorator.js.map +1 -1
  36. package/dist/dtos/change-password.dto.js +1 -1
  37. package/dist/dtos/change-password.dto.js.map +1 -1
  38. package/dist/dtos/confirm-forgot-password.dto.js +1 -1
  39. package/dist/dtos/confirm-forgot-password.dto.js.map +1 -1
  40. package/dist/dtos/create-saved-filters.dto.d.ts +1 -0
  41. package/dist/dtos/create-saved-filters.dto.d.ts.map +1 -1
  42. package/dist/dtos/create-saved-filters.dto.js +7 -1
  43. package/dist/dtos/create-saved-filters.dto.js.map +1 -1
  44. package/dist/dtos/create-security-rule.dto.d.ts +1 -0
  45. package/dist/dtos/create-security-rule.dto.d.ts.map +1 -1
  46. package/dist/dtos/create-security-rule.dto.js +7 -1
  47. package/dist/dtos/create-security-rule.dto.js.map +1 -1
  48. package/dist/dtos/update-saved-filters.dto.d.ts +1 -0
  49. package/dist/dtos/update-saved-filters.dto.d.ts.map +1 -1
  50. package/dist/dtos/update-saved-filters.dto.js +7 -1
  51. package/dist/dtos/update-saved-filters.dto.js.map +1 -1
  52. package/dist/dtos/update-security-rule.dto.d.ts +1 -0
  53. package/dist/dtos/update-security-rule.dto.d.ts.map +1 -1
  54. package/dist/dtos/update-security-rule.dto.js +7 -1
  55. package/dist/dtos/update-security-rule.dto.js.map +1 -1
  56. package/dist/entities/field-metadata.entity.d.ts.map +1 -1
  57. package/dist/entities/field-metadata.entity.js +2 -1
  58. package/dist/entities/field-metadata.entity.js.map +1 -1
  59. package/dist/entities/saved-filters.entity.d.ts +1 -0
  60. package/dist/entities/saved-filters.entity.d.ts.map +1 -1
  61. package/dist/entities/saved-filters.entity.js +6 -2
  62. package/dist/entities/saved-filters.entity.js.map +1 -1
  63. package/dist/entities/security-rule.entity.d.ts +1 -0
  64. package/dist/entities/security-rule.entity.d.ts.map +1 -1
  65. package/dist/entities/security-rule.entity.js +5 -1
  66. package/dist/entities/security-rule.entity.js.map +1 -1
  67. package/dist/helpers/model-metadata-helper.service.d.ts +2 -3
  68. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  69. package/dist/helpers/model-metadata-helper.service.js +2 -8
  70. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  71. package/dist/helpers/module-metadata-helper.service.d.ts.map +1 -1
  72. package/dist/helpers/module-metadata-helper.service.js +9 -0
  73. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  74. package/dist/helpers/solid-registry.d.ts +5 -1
  75. package/dist/helpers/solid-registry.d.ts.map +1 -1
  76. package/dist/helpers/solid-registry.js +16 -0
  77. package/dist/helpers/solid-registry.js.map +1 -1
  78. package/dist/helpers/user-helper.d.ts +2 -0
  79. package/dist/helpers/user-helper.d.ts.map +1 -0
  80. package/dist/helpers/user-helper.js +41 -0
  81. package/dist/helpers/user-helper.js.map +1 -0
  82. package/dist/index.d.ts +0 -1
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +0 -1
  85. package/dist/index.js.map +1 -1
  86. package/dist/interfaces.d.ts +6 -0
  87. package/dist/interfaces.d.ts.map +1 -1
  88. package/dist/interfaces.js.map +1 -1
  89. package/dist/jobs/trigger-mcp-client-subscriber.service.d.ts +2 -2
  90. package/dist/jobs/trigger-mcp-client-subscriber.service.d.ts.map +1 -1
  91. package/dist/jobs/trigger-mcp-client-subscriber.service.js +2 -2
  92. package/dist/jobs/trigger-mcp-client-subscriber.service.js.map +1 -1
  93. package/dist/jobs/twilio-sms-subscriber.service.d.ts +2 -2
  94. package/dist/jobs/twilio-sms-subscriber.service.d.ts.map +1 -1
  95. package/dist/jobs/twilio-sms-subscriber.service.js +2 -2
  96. package/dist/jobs/twilio-sms-subscriber.service.js.map +1 -1
  97. package/dist/repository/action-metadata.repository.d.ts +12 -0
  98. package/dist/repository/action-metadata.repository.d.ts.map +1 -0
  99. package/dist/repository/action-metadata.repository.js +34 -0
  100. package/dist/repository/action-metadata.repository.js.map +1 -0
  101. package/dist/repository/ai-interaction.repository.d.ts +12 -0
  102. package/dist/repository/ai-interaction.repository.d.ts.map +1 -0
  103. package/dist/repository/ai-interaction.repository.js +34 -0
  104. package/dist/repository/ai-interaction.repository.js.map +1 -0
  105. package/dist/repository/chatter-message-details.repository.d.ts +1 -1
  106. package/dist/repository/chatter-message-details.repository.d.ts.map +1 -1
  107. package/dist/repository/chatter-message-details.repository.js +2 -2
  108. package/dist/repository/chatter-message-details.repository.js.map +1 -1
  109. package/dist/repository/chatter-message.repository.d.ts +1 -1
  110. package/dist/repository/chatter-message.repository.d.ts.map +1 -1
  111. package/dist/repository/chatter-message.repository.js +2 -2
  112. package/dist/repository/chatter-message.repository.js.map +1 -1
  113. package/dist/repository/dashboard-question-sql-dataset-config.repository.d.ts +12 -0
  114. package/dist/repository/dashboard-question-sql-dataset-config.repository.d.ts.map +1 -0
  115. package/dist/repository/dashboard-question-sql-dataset-config.repository.js +34 -0
  116. package/dist/repository/dashboard-question-sql-dataset-config.repository.js.map +1 -0
  117. package/dist/repository/dashboard-question.repository.d.ts +12 -0
  118. package/dist/repository/dashboard-question.repository.d.ts.map +1 -0
  119. package/dist/repository/dashboard-question.repository.js +34 -0
  120. package/dist/repository/dashboard-question.repository.js.map +1 -0
  121. package/dist/repository/dashboard-variable.repository.d.ts +12 -0
  122. package/dist/repository/dashboard-variable.repository.d.ts.map +1 -0
  123. package/dist/repository/dashboard-variable.repository.js +34 -0
  124. package/dist/repository/dashboard-variable.repository.js.map +1 -0
  125. package/dist/repository/dashboard.repository.d.ts +9 -5
  126. package/dist/repository/dashboard.repository.d.ts.map +1 -1
  127. package/dist/repository/dashboard.repository.js +11 -5
  128. package/dist/repository/dashboard.repository.js.map +1 -1
  129. package/dist/repository/email-template.repository.d.ts +12 -0
  130. package/dist/repository/email-template.repository.d.ts.map +1 -0
  131. package/dist/repository/email-template.repository.js +34 -0
  132. package/dist/repository/email-template.repository.js.map +1 -0
  133. package/dist/repository/export-template.repository.d.ts +12 -0
  134. package/dist/repository/export-template.repository.d.ts.map +1 -0
  135. package/dist/repository/export-template.repository.js +34 -0
  136. package/dist/repository/export-template.repository.js.map +1 -0
  137. package/dist/repository/export-transaction.repository.d.ts +12 -0
  138. package/dist/repository/export-transaction.repository.d.ts.map +1 -0
  139. package/dist/repository/export-transaction.repository.js +34 -0
  140. package/dist/repository/export-transaction.repository.js.map +1 -0
  141. package/dist/repository/field-metadata.repository.d.ts +4 -3
  142. package/dist/repository/field-metadata.repository.d.ts.map +1 -1
  143. package/dist/repository/field-metadata.repository.js +5 -5
  144. package/dist/repository/field-metadata.repository.js.map +1 -1
  145. package/dist/repository/import-transaction-error-log.repository.d.ts +12 -0
  146. package/dist/repository/import-transaction-error-log.repository.d.ts.map +1 -0
  147. package/dist/repository/import-transaction-error-log.repository.js +34 -0
  148. package/dist/repository/import-transaction-error-log.repository.js.map +1 -0
  149. package/dist/repository/import-transaction.repository.d.ts +12 -0
  150. package/dist/repository/import-transaction.repository.d.ts.map +1 -0
  151. package/dist/repository/import-transaction.repository.js +34 -0
  152. package/dist/repository/import-transaction.repository.js.map +1 -0
  153. package/dist/repository/list-of-values.repository.d.ts +12 -0
  154. package/dist/repository/list-of-values.repository.d.ts.map +1 -0
  155. package/dist/repository/list-of-values.repository.js +34 -0
  156. package/dist/repository/list-of-values.repository.js.map +1 -0
  157. package/dist/repository/locale.repository.d.ts +12 -0
  158. package/dist/repository/locale.repository.d.ts.map +1 -0
  159. package/dist/repository/locale.repository.js +34 -0
  160. package/dist/repository/locale.repository.js.map +1 -0
  161. package/dist/repository/media-storage-provider-metadata.repository.d.ts +8 -0
  162. package/dist/repository/media-storage-provider-metadata.repository.d.ts.map +1 -0
  163. package/dist/repository/media-storage-provider-metadata.repository.js +28 -0
  164. package/dist/repository/media-storage-provider-metadata.repository.js.map +1 -0
  165. package/dist/repository/media.repository.d.ts +13 -8
  166. package/dist/repository/media.repository.d.ts.map +1 -1
  167. package/dist/repository/media.repository.js +18 -18
  168. package/dist/repository/media.repository.js.map +1 -1
  169. package/dist/repository/menu-item-metadata.repository.d.ts +12 -0
  170. package/dist/repository/menu-item-metadata.repository.d.ts.map +1 -0
  171. package/dist/repository/menu-item-metadata.repository.js +34 -0
  172. package/dist/repository/menu-item-metadata.repository.js.map +1 -0
  173. package/dist/repository/model-metadata.repository.d.ts +8 -0
  174. package/dist/repository/model-metadata.repository.d.ts.map +1 -0
  175. package/dist/repository/model-metadata.repository.js +28 -0
  176. package/dist/repository/model-metadata.repository.js.map +1 -0
  177. package/dist/repository/module-metadata.repository.d.ts +8 -0
  178. package/dist/repository/module-metadata.repository.d.ts.map +1 -0
  179. package/dist/repository/module-metadata.repository.js +28 -0
  180. package/dist/repository/module-metadata.repository.js.map +1 -0
  181. package/dist/repository/mq-message-queue.repository.d.ts +12 -0
  182. package/dist/repository/mq-message-queue.repository.d.ts.map +1 -0
  183. package/dist/repository/mq-message-queue.repository.js +34 -0
  184. package/dist/repository/mq-message-queue.repository.js.map +1 -0
  185. package/dist/repository/mq-message.repository.d.ts +12 -0
  186. package/dist/repository/mq-message.repository.d.ts.map +1 -0
  187. package/dist/repository/mq-message.repository.js +34 -0
  188. package/dist/repository/mq-message.repository.js.map +1 -0
  189. package/dist/repository/permission-metadata.repository.d.ts +12 -0
  190. package/dist/repository/permission-metadata.repository.d.ts.map +1 -0
  191. package/dist/repository/permission-metadata.repository.js +34 -0
  192. package/dist/repository/permission-metadata.repository.js.map +1 -0
  193. package/dist/repository/role-metadata.repository.d.ts +12 -0
  194. package/dist/repository/role-metadata.repository.d.ts.map +1 -0
  195. package/dist/repository/role-metadata.repository.js +34 -0
  196. package/dist/repository/role-metadata.repository.js.map +1 -0
  197. package/dist/repository/saved-filters.repository.d.ts +12 -0
  198. package/dist/repository/saved-filters.repository.d.ts.map +1 -0
  199. package/dist/repository/saved-filters.repository.js +62 -0
  200. package/dist/repository/saved-filters.repository.js.map +1 -0
  201. package/dist/repository/scheduled-job.repository.d.ts +9 -9
  202. package/dist/repository/scheduled-job.repository.d.ts.map +1 -1
  203. package/dist/repository/scheduled-job.repository.js +11 -12
  204. package/dist/repository/scheduled-job.repository.js.map +1 -1
  205. package/dist/repository/security-rule.repository.d.ts +7 -7
  206. package/dist/repository/security-rule.repository.d.ts.map +1 -1
  207. package/dist/repository/security-rule.repository.js +28 -17
  208. package/dist/repository/security-rule.repository.js.map +1 -1
  209. package/dist/repository/setting.repository.d.ts +12 -0
  210. package/dist/repository/setting.repository.d.ts.map +1 -0
  211. package/dist/repository/setting.repository.js +34 -0
  212. package/dist/repository/setting.repository.js.map +1 -0
  213. package/dist/repository/sms-template.repository.d.ts +12 -0
  214. package/dist/repository/sms-template.repository.d.ts.map +1 -0
  215. package/dist/repository/sms-template.repository.js +34 -0
  216. package/dist/repository/sms-template.repository.js.map +1 -0
  217. package/dist/repository/solid-base.repository.d.ts +4 -3
  218. package/dist/repository/solid-base.repository.d.ts.map +1 -1
  219. package/dist/repository/solid-base.repository.js +12 -5
  220. package/dist/repository/solid-base.repository.js.map +1 -1
  221. package/dist/repository/user-activity-history.repository.d.ts +12 -0
  222. package/dist/repository/user-activity-history.repository.d.ts.map +1 -0
  223. package/dist/repository/user-activity-history.repository.js +34 -0
  224. package/dist/repository/user-activity-history.repository.js.map +1 -0
  225. package/dist/repository/user-view-metadata.repository.d.ts +12 -0
  226. package/dist/repository/user-view-metadata.repository.d.ts.map +1 -0
  227. package/dist/repository/user-view-metadata.repository.js +34 -0
  228. package/dist/repository/user-view-metadata.repository.js.map +1 -0
  229. package/dist/repository/view-metadata.repository.d.ts +9 -5
  230. package/dist/repository/view-metadata.repository.d.ts.map +1 -1
  231. package/dist/repository/view-metadata.repository.js +11 -5
  232. package/dist/repository/view-metadata.repository.js.map +1 -1
  233. package/dist/seeders/module-metadata-seeder.service.d.ts +9 -5
  234. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  235. package/dist/seeders/module-metadata-seeder.service.js +32 -13
  236. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  237. package/dist/seeders/permission-metadata-seeder.service.d.ts +2 -3
  238. package/dist/seeders/permission-metadata-seeder.service.d.ts.map +1 -1
  239. package/dist/seeders/permission-metadata-seeder.service.js +2 -5
  240. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  241. package/dist/seeders/seed-data/solid-core-metadata.json +109 -62
  242. package/dist/seeders/system-fields-seeder.service.d.ts +2 -3
  243. package/dist/seeders/system-fields-seeder.service.d.ts.map +1 -1
  244. package/dist/seeders/system-fields-seeder.service.js +4 -8
  245. package/dist/seeders/system-fields-seeder.service.js.map +1 -1
  246. package/dist/services/action-metadata.service.d.ts +7 -6
  247. package/dist/services/action-metadata.service.d.ts.map +1 -1
  248. package/dist/services/action-metadata.service.js +7 -8
  249. package/dist/services/action-metadata.service.js.map +1 -1
  250. package/dist/services/ai-interaction.service.d.ts +10 -9
  251. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  252. package/dist/services/ai-interaction.service.js +9 -10
  253. package/dist/services/ai-interaction.service.js.map +1 -1
  254. package/dist/services/authentication.service.d.ts +3 -4
  255. package/dist/services/authentication.service.d.ts.map +1 -1
  256. package/dist/services/authentication.service.js +11 -11
  257. package/dist/services/authentication.service.js.map +1 -1
  258. package/dist/services/chatter-message.service.d.ts +12 -12
  259. package/dist/services/chatter-message.service.d.ts.map +1 -1
  260. package/dist/services/chatter-message.service.js +16 -18
  261. package/dist/services/chatter-message.service.js.map +1 -1
  262. package/dist/services/crud.service.d.ts +5 -5
  263. package/dist/services/crud.service.d.ts.map +1 -1
  264. package/dist/services/crud.service.js +9 -9
  265. package/dist/services/crud.service.js.map +1 -1
  266. package/dist/services/dashboard-question-sql-dataset-config.service.d.ts +4 -3
  267. package/dist/services/dashboard-question-sql-dataset-config.service.d.ts.map +1 -1
  268. package/dist/services/dashboard-question-sql-dataset-config.service.js +2 -3
  269. package/dist/services/dashboard-question-sql-dataset-config.service.js.map +1 -1
  270. package/dist/services/dashboard-question.service.d.ts +4 -3
  271. package/dist/services/dashboard-question.service.d.ts.map +1 -1
  272. package/dist/services/dashboard-question.service.js +2 -2
  273. package/dist/services/dashboard-question.service.js.map +1 -1
  274. package/dist/services/dashboard-variable.service.d.ts +4 -3
  275. package/dist/services/dashboard-variable.service.d.ts.map +1 -1
  276. package/dist/services/dashboard-variable.service.js +2 -3
  277. package/dist/services/dashboard-variable.service.js.map +1 -1
  278. package/dist/services/email-template.service.d.ts +4 -3
  279. package/dist/services/email-template.service.d.ts.map +1 -1
  280. package/dist/services/email-template.service.js +2 -3
  281. package/dist/services/email-template.service.js.map +1 -1
  282. package/dist/services/export-template.service.d.ts +6 -4
  283. package/dist/services/export-template.service.d.ts.map +1 -1
  284. package/dist/services/export-template.service.js +14 -4
  285. package/dist/services/export-template.service.js.map +1 -1
  286. package/dist/services/export-transaction.service.d.ts +8 -7
  287. package/dist/services/export-transaction.service.d.ts.map +1 -1
  288. package/dist/services/export-transaction.service.js +11 -14
  289. package/dist/services/export-transaction.service.js.map +1 -1
  290. package/dist/services/field-metadata.service.js +1 -1
  291. package/dist/services/field-metadata.service.js.map +1 -1
  292. package/dist/services/import-transaction-error-log.service.d.ts +4 -3
  293. package/dist/services/import-transaction-error-log.service.d.ts.map +1 -1
  294. package/dist/services/import-transaction-error-log.service.js +2 -3
  295. package/dist/services/import-transaction-error-log.service.js.map +1 -1
  296. package/dist/services/import-transaction.service.d.ts +8 -4
  297. package/dist/services/import-transaction.service.d.ts.map +1 -1
  298. package/dist/services/import-transaction.service.js +43 -16
  299. package/dist/services/import-transaction.service.js.map +1 -1
  300. package/dist/services/list-of-values.service.d.ts +19 -6
  301. package/dist/services/list-of-values.service.d.ts.map +1 -1
  302. package/dist/services/list-of-values.service.js +164 -9
  303. package/dist/services/list-of-values.service.js.map +1 -1
  304. package/dist/services/locale.service.d.ts +9 -10
  305. package/dist/services/locale.service.d.ts.map +1 -1
  306. package/dist/services/locale.service.js +8 -14
  307. package/dist/services/locale.service.js.map +1 -1
  308. package/dist/services/mail/smtp-email.service.d.ts.map +1 -1
  309. package/dist/services/mail/smtp-email.service.js +6 -1
  310. package/dist/services/mail/smtp-email.service.js.map +1 -1
  311. package/dist/services/media-storage-provider-metadata.service.d.ts +4 -4
  312. package/dist/services/media-storage-provider-metadata.service.d.ts.map +1 -1
  313. package/dist/services/media-storage-provider-metadata.service.js +5 -11
  314. package/dist/services/media-storage-provider-metadata.service.js.map +1 -1
  315. package/dist/services/media.service.d.ts +7 -6
  316. package/dist/services/media.service.d.ts.map +1 -1
  317. package/dist/services/media.service.js +8 -12
  318. package/dist/services/media.service.js.map +1 -1
  319. package/dist/services/menu-item-metadata.service.d.ts +4 -3
  320. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  321. package/dist/services/menu-item-metadata.service.js +4 -5
  322. package/dist/services/menu-item-metadata.service.js.map +1 -1
  323. package/dist/services/model-metadata.service.d.ts +3 -2
  324. package/dist/services/model-metadata.service.d.ts.map +1 -1
  325. package/dist/services/model-metadata.service.js +45 -43
  326. package/dist/services/model-metadata.service.js.map +1 -1
  327. package/dist/services/module-metadata.service.d.ts +3 -2
  328. package/dist/services/module-metadata.service.d.ts.map +1 -1
  329. package/dist/services/module-metadata.service.js +3 -3
  330. package/dist/services/module-metadata.service.js.map +1 -1
  331. package/dist/services/mq-message-queue.service.d.ts +4 -3
  332. package/dist/services/mq-message-queue.service.d.ts.map +1 -1
  333. package/dist/services/mq-message-queue.service.js +2 -3
  334. package/dist/services/mq-message-queue.service.js.map +1 -1
  335. package/dist/services/mq-message.service.d.ts +4 -3
  336. package/dist/services/mq-message.service.d.ts.map +1 -1
  337. package/dist/services/mq-message.service.js +2 -2
  338. package/dist/services/mq-message.service.js.map +1 -1
  339. package/dist/services/permission-metadata.service.d.ts +4 -3
  340. package/dist/services/permission-metadata.service.d.ts.map +1 -1
  341. package/dist/services/permission-metadata.service.js +2 -3
  342. package/dist/services/permission-metadata.service.js.map +1 -1
  343. package/dist/services/queues/rabbitmq-publisher.service.d.ts +8 -3
  344. package/dist/services/queues/rabbitmq-publisher.service.d.ts.map +1 -1
  345. package/dist/services/queues/rabbitmq-publisher.service.js +79 -18
  346. package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
  347. package/dist/services/queues/rabbitmq-subscriber.service.d.ts.map +1 -1
  348. package/dist/services/queues/rabbitmq-subscriber.service.js +9 -3
  349. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  350. package/dist/services/role-metadata.service.d.ts +10 -9
  351. package/dist/services/role-metadata.service.d.ts.map +1 -1
  352. package/dist/services/role-metadata.service.js +9 -11
  353. package/dist/services/role-metadata.service.js.map +1 -1
  354. package/dist/services/saved-filters.service.d.ts +7 -6
  355. package/dist/services/saved-filters.service.d.ts.map +1 -1
  356. package/dist/services/saved-filters.service.js +6 -7
  357. package/dist/services/saved-filters.service.js.map +1 -1
  358. package/dist/services/scheduled-job.service.d.ts +4 -3
  359. package/dist/services/scheduled-job.service.d.ts.map +1 -1
  360. package/dist/services/scheduled-job.service.js +2 -3
  361. package/dist/services/scheduled-job.service.js.map +1 -1
  362. package/dist/services/scheduled-jobs/scheduler.service.d.ts +3 -4
  363. package/dist/services/scheduled-jobs/scheduler.service.d.ts.map +1 -1
  364. package/dist/services/scheduled-jobs/scheduler.service.js +6 -11
  365. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  366. package/dist/services/security-rule.service.d.ts +4 -3
  367. package/dist/services/security-rule.service.d.ts.map +1 -1
  368. package/dist/services/security-rule.service.js +3 -3
  369. package/dist/services/security-rule.service.js.map +1 -1
  370. package/dist/services/setting.service.d.ts +3 -2
  371. package/dist/services/setting.service.d.ts.map +1 -1
  372. package/dist/services/setting.service.js +25 -9
  373. package/dist/services/setting.service.js.map +1 -1
  374. package/dist/services/sms-template.service.d.ts +4 -3
  375. package/dist/services/sms-template.service.d.ts.map +1 -1
  376. package/dist/services/sms-template.service.js +2 -3
  377. package/dist/services/sms-template.service.js.map +1 -1
  378. package/dist/services/solid-introspect.service.d.ts +1 -0
  379. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  380. package/dist/services/solid-introspect.service.js +14 -0
  381. package/dist/services/solid-introspect.service.js.map +1 -1
  382. package/dist/services/user-activity-history.service.d.ts +4 -3
  383. package/dist/services/user-activity-history.service.d.ts.map +1 -1
  384. package/dist/services/user-activity-history.service.js +2 -3
  385. package/dist/services/user-activity-history.service.js.map +1 -1
  386. package/dist/services/user-view-metadata.service.d.ts +4 -3
  387. package/dist/services/user-view-metadata.service.d.ts.map +1 -1
  388. package/dist/services/user-view-metadata.service.js +2 -3
  389. package/dist/services/user-view-metadata.service.js.map +1 -1
  390. package/dist/services/user.service.d.ts +2 -2
  391. package/dist/services/user.service.d.ts.map +1 -1
  392. package/dist/services/user.service.js +3 -3
  393. package/dist/services/user.service.js.map +1 -1
  394. package/dist/services/view-metadata.service.d.ts +5 -6
  395. package/dist/services/view-metadata.service.d.ts.map +1 -1
  396. package/dist/services/view-metadata.service.js +5 -10
  397. package/dist/services/view-metadata.service.js.map +1 -1
  398. package/dist/solid-core.module.d.ts.map +1 -1
  399. package/dist/solid-core.module.js +164 -121
  400. package/dist/solid-core.module.js.map +1 -1
  401. package/dist/subscribers/audit.subscriber.d.ts +4 -4
  402. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  403. package/dist/subscribers/audit.subscriber.js +4 -5
  404. package/dist/subscribers/audit.subscriber.js.map +1 -1
  405. package/dist/subscribers/{list-of-values-metadata.subscriber.d.ts → list-of-values.subscriber.d.ts} +5 -5
  406. package/dist/subscribers/list-of-values.subscriber.d.ts.map +1 -0
  407. package/dist/subscribers/{list-of-values-metadata.subscriber.js → list-of-values.subscriber.js} +13 -13
  408. package/dist/subscribers/list-of-values.subscriber.js.map +1 -0
  409. package/dist/tsconfig.tsbuildinfo +1 -1
  410. package/package.json +5 -5
  411. package/rebuild.sh +2 -3
  412. package/src/config/iam.config.ts +3 -2
  413. package/src/constants/error-messages.ts +3 -0
  414. package/src/controllers/authentication.controller.ts +2 -2
  415. package/src/controllers/email-template.controller.ts +57 -64
  416. package/src/controllers/export-template.controller.ts +4 -2
  417. package/src/controllers/import-transaction.controller.ts +5 -2
  418. package/src/controllers/sms-template.controller.ts +55 -55
  419. package/src/decorators/security-rule-config-provider.decorator.ts +7 -0
  420. package/src/decorators/solid-password.decorator.ts +25 -17
  421. package/src/dtos/change-password.dto.ts +1 -1
  422. package/src/dtos/confirm-forgot-password.dto.ts +1 -1
  423. package/src/dtos/create-saved-filters.dto.ts +4 -0
  424. package/src/dtos/create-security-rule.dto.ts +5 -0
  425. package/src/dtos/update-saved-filters.dto.ts +4 -0
  426. package/src/dtos/update-security-rule.dto.ts +6 -1
  427. package/src/entities/field-metadata.entity.ts +2 -1
  428. package/src/entities/saved-filters.entity.ts +3 -1
  429. package/src/entities/security-rule.entity.ts +2 -0
  430. package/src/helpers/model-metadata-helper.service.ts +4 -5
  431. package/src/helpers/module-metadata-helper.service.ts +9 -0
  432. package/src/helpers/solid-registry.ts +21 -2
  433. package/src/helpers/user-helper.ts +37 -0
  434. package/src/index.ts +0 -1
  435. package/src/interfaces.ts +7 -0
  436. package/src/jobs/trigger-mcp-client-subscriber.service.ts +2 -2
  437. package/src/jobs/twilio-sms-subscriber.service.ts +2 -2
  438. package/src/repository/action-metadata.repository.ts +17 -0
  439. package/src/repository/ai-interaction.repository.ts +17 -0
  440. package/src/repository/chatter-message-details.repository.ts +3 -3
  441. package/src/repository/chatter-message.repository.ts +2 -2
  442. package/src/repository/dashboard-question-sql-dataset-config.repository.ts +17 -0
  443. package/src/repository/dashboard-question.repository.ts +17 -0
  444. package/src/repository/dashboard-variable.repository.ts +17 -0
  445. package/src/repository/dashboard.repository.ts +10 -10
  446. package/src/repository/email-template.repository.ts +17 -0
  447. package/src/repository/export-template.repository.ts +17 -0
  448. package/src/repository/export-transaction.repository.ts +17 -0
  449. package/src/repository/field-metadata.repository.ts +8 -6
  450. package/src/repository/import-transaction-error-log.repository.ts +17 -0
  451. package/src/repository/import-transaction.repository.ts +17 -0
  452. package/src/repository/list-of-values.repository.ts +17 -0
  453. package/src/repository/locale.repository.ts +17 -0
  454. package/src/repository/media-storage-provider-metadata.repository.ts +15 -0
  455. package/src/repository/media.repository.ts +21 -15
  456. package/src/repository/menu-item-metadata.repository.ts +17 -0
  457. package/src/repository/model-metadata.repository.ts +15 -0
  458. package/src/repository/module-metadata.repository.ts +15 -0
  459. package/src/repository/mq-message-queue.repository.ts +17 -0
  460. package/src/repository/mq-message.repository.ts +17 -0
  461. package/src/repository/permission-metadata.repository.ts +17 -0
  462. package/src/repository/role-metadata.repository.ts +17 -0
  463. package/src/repository/saved-filters.repository.ts +65 -0
  464. package/src/repository/scheduled-job.repository.ts +13 -14
  465. package/src/repository/security-rule.repository.ts +45 -25
  466. package/src/repository/setting.repository.ts +17 -0
  467. package/src/repository/sms-template.repository.ts +17 -0
  468. package/src/repository/solid-base.repository.ts +16 -8
  469. package/src/repository/user-activity-history.repository.ts +17 -0
  470. package/src/repository/user-view-metadata.repository.ts +17 -0
  471. package/src/repository/view-metadata.repository.ts +10 -8
  472. package/src/seeders/module-metadata-seeder.service.ts +35 -5
  473. package/src/seeders/permission-metadata-seeder.service.ts +4 -2
  474. package/src/seeders/seed-data/solid-core-metadata.json +111 -66
  475. package/src/seeders/system-fields-seeder.service.ts +6 -4
  476. package/src/services/action-metadata.service.ts +9 -7
  477. package/src/services/ai-interaction.service.ts +15 -13
  478. package/src/services/authentication.service.ts +26 -12
  479. package/src/services/chatter-message.service.ts +23 -21
  480. package/src/services/crud.service.ts +27 -32
  481. package/src/services/dashboard-question-sql-dataset-config.service.ts +4 -2
  482. package/src/services/dashboard-question.service.ts +4 -2
  483. package/src/services/dashboard-variable.service.ts +5 -2
  484. package/src/services/docker exec -it mssql //" +8 -0
  485. package/src/services/email-template.service.ts +4 -2
  486. package/src/services/export-template.service.ts +22 -4
  487. package/src/services/export-transaction.service.ts +16 -9
  488. package/src/services/field-metadata.service.ts +1 -1
  489. package/src/services/import-transaction-error-log.service.ts +4 -2
  490. package/src/services/import-transaction.service.ts +109 -30
  491. package/src/services/list-of-values.service.ts +192 -8
  492. package/src/services/locale.service.ts +16 -14
  493. package/src/services/mail/smtp-email.service.ts +7 -1
  494. package/src/services/media-storage-provider-metadata.service.ts +10 -9
  495. package/src/services/media.service.ts +16 -8
  496. package/src/services/menu-item-metadata.service.ts +7 -4
  497. package/src/services/model-metadata.service.ts +64 -58
  498. package/src/services/module-metadata.service.ts +6 -3
  499. package/src/services/mq-message-queue.service.ts +4 -2
  500. package/src/services/mq-message.service.ts +4 -2
  501. package/src/services/permission-metadata.service.ts +5 -3
  502. package/src/services/queues/rabbitmq-publisher.service.ts +99 -41
  503. package/src/services/queues/rabbitmq-subscriber.service.ts +18 -5
  504. package/src/services/role-metadata.service.ts +16 -12
  505. package/src/services/saved-filters.service.ts +10 -8
  506. package/src/services/scheduled-job.service.ts +4 -2
  507. package/src/services/scheduled-jobs/scheduler.service.ts +9 -9
  508. package/src/services/security-rule.service.ts +6 -3
  509. package/src/services/setting.service.ts +31 -14
  510. package/src/services/sms-template.service.ts +4 -2
  511. package/src/services/solid-introspect.service.ts +23 -2
  512. package/src/services/user-activity-history.service.ts +4 -2
  513. package/src/services/user-view-metadata.service.ts +4 -2
  514. package/src/services/user.service.ts +5 -2
  515. package/src/services/view-metadata.service.ts +11 -9
  516. package/src/solid-core.module.ts +166 -138
  517. package/src/subscribers/audit.subscriber.ts +8 -7
  518. package/src/subscribers/{list-of-values-metadata.subscriber.ts → list-of-values.subscriber.ts} +7 -7
  519. package/dist/repository/field.repository.d.ts +0 -9
  520. package/dist/repository/field.repository.d.ts.map +0 -1
  521. package/dist/repository/field.repository.js +0 -46
  522. package/dist/repository/field.repository.js.map +0 -1
  523. package/dist/services/list-of-values-metadata.service.d.ts +0 -34
  524. package/dist/services/list-of-values-metadata.service.d.ts.map +0 -1
  525. package/dist/services/list-of-values-metadata.service.js +0 -213
  526. package/dist/services/list-of-values-metadata.service.js.map +0 -1
  527. package/dist/subscribers/list-of-values-metadata.subscriber.d.ts.map +0 -1
  528. package/dist/subscribers/list-of-values-metadata.subscriber.js.map +0 -1
  529. package/solid_seed_fixes.ts.txt +0 -93
  530. package/src/repository/field.repository.ts +0 -33
  531. package/src/services/list-of-values-metadata.service.ts +0 -216
@@ -26,15 +26,18 @@ const model_metadata_service_1 = require("./model-metadata.service");
26
26
  const module_metadata_service_1 = require("./module-metadata.service");
27
27
  const strings_1 = require("@angular-devkit/core/src/utils/strings");
28
28
  const axios_1 = require("@nestjs/axios");
29
+ const error_messages_1 = require("../constants/error-messages");
29
30
  const create_field_metadata_dto_1 = require("../dtos/create-field-metadata.dto");
30
31
  const import_transaction_error_log_entity_1 = require("../entities/import-transaction-error-log.entity");
32
+ const date_helper_1 = require("../helpers/date.helper");
33
+ const import_transaction_repository_1 = require("../repository/import-transaction.repository");
31
34
  const uuid_1 = require("uuid");
32
- const import_transaction_entity_1 = require("../entities/import-transaction.entity");
33
35
  const csv_service_1 = require("./csv.service");
34
36
  const excel_service_1 = require("./excel.service");
35
37
  const solid_introspect_service_1 = require("./solid-introspect.service");
36
- const error_messages_1 = require("../constants/error-messages");
37
- const date_helper_1 = require("../helpers/date.helper");
38
+ const model_metadata_helper_service_1 = require("../helpers/model-metadata-helper.service");
39
+ const user_helper_1 = require("../helpers/user-helper");
40
+ const lodash_1 = require("lodash");
38
41
  var ImportFormat;
39
42
  (function (ImportFormat) {
40
43
  ImportFormat["CSV"] = "csv";
@@ -54,7 +57,7 @@ var ImportTransactionStatus;
54
57
  ImportTransactionStatus["import_failed"] = "import_failed";
55
58
  })(ImportTransactionStatus || (exports.ImportTransactionStatus = ImportTransactionStatus = {}));
56
59
  let ImportTransactionService = ImportTransactionService_1 = class ImportTransactionService extends crud_service_1.CRUDService {
57
- constructor(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, moduleRef, excelService, csvService, httpService, introspectService) {
60
+ constructor(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, moduleRef, excelService, csvService, httpService, introspectService, modelMetadataHelperService) {
58
61
  super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'importTransaction', 'solid-core', moduleRef);
59
62
  this.modelMetadataService = modelMetadataService;
60
63
  this.moduleMetadataService = moduleMetadataService;
@@ -69,6 +72,7 @@ let ImportTransactionService = ImportTransactionService_1 = class ImportTransact
69
72
  this.csvService = csvService;
70
73
  this.httpService = httpService;
71
74
  this.introspectService = introspectService;
75
+ this.modelMetadataHelperService = modelMetadataHelperService;
72
76
  this.logger = new common_1.Logger(ImportTransactionService_1.name);
73
77
  }
74
78
  async getImportTemplate(modelMetadataId, format = ImportFormat.CSV) {
@@ -78,7 +82,8 @@ let ImportTransactionService = ImportTransactionService_1 = class ImportTransact
78
82
  if (!modelMetadata) {
79
83
  throw new Error(error_messages_1.ERROR_MESSAGES.MODEL_METADATA_NOT_FOUND(modelMetadataId));
80
84
  }
81
- const headers = this.fieldsAllowedForImport(modelMetadata.fields)
85
+ const allFields = await this.modelMetadataHelperService.loadFieldHierarchy(modelMetadata.singularName);
86
+ const headers = this.fieldsAllowedForImport(allFields)
82
87
  .map(field => field.displayName);
83
88
  if (format === ImportFormat.CSV) {
84
89
  const stream = await this.csvService.createCsvStream(null, 0, headers);
@@ -111,6 +116,11 @@ let ImportTransactionService = ImportTransactionService_1 = class ImportTransact
111
116
  if (!modelMetadata) {
112
117
  throw new Error(error_messages_1.ERROR_MESSAGES.MODEL_METADATA_NOT_FOUND(modelMetadataId));
113
118
  }
119
+ const allFields = await this.modelMetadataHelperService.loadFieldHierarchy(modelMetadata.singularName);
120
+ const systemFieldNames = this.modelMetadataHelperService
121
+ .getSystemFieldsMetadata()
122
+ .map(field => field.name);
123
+ const userExcluded = (0, user_helper_1.getUserExcludedFields)();
114
124
  const standardInstructions = {
115
125
  requiredFields: [],
116
126
  dateFields: [],
@@ -121,9 +131,13 @@ let ImportTransactionService = ImportTransactionService_1 = class ImportTransact
121
131
  jsonFields: [],
122
132
  booleanFields: [],
123
133
  };
124
- for (const field of modelMetadata.fields) {
125
- if (field.isSystem)
134
+ for (const field of allFields) {
135
+ if (systemFieldNames.includes(field.name)) {
126
136
  continue;
137
+ }
138
+ if (userExcluded.includes(field.name)) {
139
+ continue;
140
+ }
127
141
  if (field.required) {
128
142
  standardInstructions.requiredFields.push(field.displayName);
129
143
  }
@@ -180,8 +194,17 @@ let ImportTransactionService = ImportTransactionService_1 = class ImportTransact
180
194
  importableFields: importableFields,
181
195
  };
182
196
  }
183
- async startImportSync(importTransactionId) {
197
+ async startImportSync(importTransactionId, activeUser) {
184
198
  const importTransaction = await this.loadImportTransaction(importTransactionId);
199
+ const modelName = (0, lodash_1.upperFirst)((0, lodash_1.camelCase)(importTransaction.modelMetadata.singularName));
200
+ const permissionKey = `${modelName}Controller.insertMany`;
201
+ const userPermissions = activeUser.permissions ?? [];
202
+ const hasPermission = Array.isArray(userPermissions)
203
+ ? userPermissions.includes(permissionKey)
204
+ : userPermissions[permissionKey] === true;
205
+ if (!hasPermission) {
206
+ throw new common_1.ForbiddenException(`Missing permission: ${permissionKey}`);
207
+ }
185
208
  const importFileMediaObject = this.getImportFileObject(importTransaction);
186
209
  const importFileStream = await this.getImportFileStream(importFileMediaObject);
187
210
  const { ids, errorLogIds } = await this.importFromFileToDB(importTransaction, importFileStream, importFileMediaObject.mimeType);
@@ -260,15 +283,18 @@ let ImportTransactionService = ImportTransactionService_1 = class ImportTransact
260
283
  }
261
284
  async loadImportTransaction(importTransactionId) {
262
285
  const importTransaction = await this.findOne(importTransactionId, {
263
- populate: ['modelMetadata', 'modelMetadata.fields'],
286
+ populate: ['modelMetadata'],
264
287
  populateMedia: ['fileLocation'],
265
288
  });
266
- if (!importTransaction) {
267
- throw new Error(`Import transaction with ID ${importTransactionId} not found.`);
268
- }
289
+ const modelFields = await this.modelMetadataHelperService.loadFieldHierarchy(importTransaction.modelMetadata.singularName);
290
+ importTransaction.modelMetadata.fields = modelFields;
269
291
  return importTransaction;
270
292
  }
271
293
  fieldsAllowedForImport(fields) {
294
+ const systemFieldNames = this.modelMetadataHelperService
295
+ .getSystemFieldsMetadata()
296
+ .map(field => field.name);
297
+ const userExcluded = (0, user_helper_1.getUserExcludedFields)();
272
298
  return fields.filter(field => field.type !== create_field_metadata_dto_1.SolidFieldType.mediaMultiple &&
273
299
  field.type !== create_field_metadata_dto_1.SolidFieldType.mediaSingle &&
274
300
  field.type !== create_field_metadata_dto_1.SolidFieldType.computed &&
@@ -276,7 +302,8 @@ let ImportTransactionService = ImportTransactionService_1 = class ImportTransact
276
302
  field.type !== create_field_metadata_dto_1.SolidFieldType.richText &&
277
303
  field.type !== create_field_metadata_dto_1.SolidFieldType.uuid &&
278
304
  field.relationType !== create_field_metadata_dto_1.RelationType.oneToMany &&
279
- field.isSystem !== true);
305
+ !systemFieldNames.includes(field.name) &&
306
+ !userExcluded.includes(field.name));
280
307
  }
281
308
  async getFileRecordsSample(importFileStream, mimeType) {
282
309
  if (mimeType === 'text/csv') {
@@ -544,7 +571,6 @@ exports.ImportTransactionService = ImportTransactionService;
544
571
  exports.ImportTransactionService = ImportTransactionService = ImportTransactionService_1 = __decorate([
545
572
  (0, common_1.Injectable)(),
546
573
  __param(6, (0, typeorm_1.InjectEntityManager)()),
547
- __param(7, (0, typeorm_1.InjectRepository)(import_transaction_entity_1.ImportTransaction, 'default')),
548
574
  __metadata("design:paramtypes", [model_metadata_service_1.ModelMetadataService,
549
575
  module_metadata_service_1.ModuleMetadataService,
550
576
  config_1.ConfigService,
@@ -552,11 +578,12 @@ exports.ImportTransactionService = ImportTransactionService = ImportTransactionS
552
578
  core_1.DiscoveryService,
553
579
  crud_helper_service_1.CrudHelperService,
554
580
  typeorm_2.EntityManager,
555
- typeorm_2.Repository,
581
+ import_transaction_repository_1.ImportTransactionRepository,
556
582
  core_1.ModuleRef,
557
583
  excel_service_1.ExcelService,
558
584
  csv_service_1.CsvService,
559
585
  axios_1.HttpService,
560
- solid_introspect_service_1.SolidIntrospectService])
586
+ solid_introspect_service_1.SolidIntrospectService,
587
+ model_metadata_helper_service_1.ModelMetadataHelperService])
561
588
  ], ImportTransactionService);
562
589
  //# sourceMappingURL=import-transaction.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"import-transaction.service.js","sourceRoot":"","sources":["../../src/services/import-transaction.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, Injectable, Logger } from '@nestjs/common';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { EntityManager, Repository } from 'typeorm';\n\nimport { ConfigService } from '@nestjs/config';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { CRUDService } from 'src/services/crud.service';\nimport { FileService } from 'src/services/file.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\n\n\nimport { classify } from '@angular-devkit/core/src/utils/strings';\nimport { HttpService } from '@nestjs/axios';\nimport { RelationFieldsCommand, RelationType, SolidFieldType } from 'src/dtos/create-field-metadata.dto';\nimport { ImportInstructionsResponseDto, StandardImportInstructionsResponseDto } from 'src/dtos/import-instructions.dto';\nimport { FieldMetadata } from 'src/entities/field-metadata.entity';\nimport { ImportTransactionErrorLog } from 'src/entities/import-transaction-error-log.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { MediaWithFullUrl } from 'src/interfaces';\nimport { Readable } from 'stream';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ImportTransaction } from '../entities/import-transaction.entity';\nimport { CsvService } from './csv.service';\nimport { ExcelService } from './excel.service';\nimport { SolidIntrospectService } from './solid-introspect.service';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { parseFlexibleDate } from 'src/helpers/date.helper';\n\ninterface ImportTemplateFileInfo {\n stream: NodeJS.ReadableStream;\n fileName: string;\n mimeType: string;\n}\n\nexport enum ImportFormat {\n CSV = 'csv',\n EXCEL = 'excel',\n}\n\nexport enum ImportMimeTypes {\n CSV = 'text/csv',\n EXCEL = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n}\nexport interface ImportMappingInfo {\n sampleImportedRecordInfo: SampleImportedRecordInfo[];\n importableFields: ImportableFieldInfo[];\n}\nexport interface SampleImportedRecordInfo {\n cellHeader: string; // The header of the cell in the import file\n cellValue: string; // The value of the cell in the import file\n defaultMappedFieldName: string; // The default mapped field name in the model metadata\n}\nexport interface ImportableFieldInfo {\n name: string;\n displayName: string;\n}\n\nexport interface ImportPaginatedReadResult {\n headers: string[]; // Headers of the CSV file\n data: Record<string, any>[]; // Data records in the current page\n}\n\ninterface ImportMapping {\n header: string; // The name of the field in the import file\n fieldName: string; // The name of the field in the model metadata to which the imported field is mapped\n}\n\nexport enum ImportTransactionStatus {\n draft = 'draft',\n mapping_created = 'mapping_created',\n import_started = 'import_started',\n import_succeeded = 'import_succeeded',\n import_failed = 'import_failed',\n}\n\nexport interface ImportSyncResult {\n status: string; // The status of the import transaction\n importedIds: Array<number>; // The IDs of the records created during the import\n importedCount: number; // The number of records created during the import\n failedCount: number; // The number of records that failed to import\n}\ninterface ImportRecordsResult {\n ids: Array<number>; // The IDs of the records created during the import\n errorLogIds: Array<number>; // The IDs of the error log entries created during the import\n}\n\n@Injectable()\nexport class ImportTransactionService extends CRUDService<ImportTransaction> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(ImportTransaction, 'default')\n readonly repo: Repository<ImportTransaction>,\n readonly moduleRef: ModuleRef,\n readonly excelService: ExcelService,\n readonly csvService: CsvService,\n readonly httpService: HttpService,\n readonly introspectService: SolidIntrospectService,\n // readonly fieldMetadataService: FieldMetadataService,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'importTransaction', 'solid-core', moduleRef);\n }\n\n private readonly logger = new Logger(ImportTransactionService.name);\n\n /**\n * This method is used to return a csv / excel template for the import transaction\n * It will contain the display names of the fields in the header row\n * @param modelMetadataId \n */\n async getImportTemplate(modelMetadataId: number, format: ImportFormat = ImportFormat.CSV): Promise<ImportTemplateFileInfo> {\n // Load the model metadata for the given ID\n const modelMetadata = await this.modelMetadataService.findOne(modelMetadataId, {\n populate: ['fields'],\n });\n if (!modelMetadata) {\n throw new Error(ERROR_MESSAGES.MODEL_METADATA_NOT_FOUND(modelMetadataId));\n }\n // Create a header row with the display names of the fields, excluding the media fields,computed fields\n const headers = this.fieldsAllowedForImport(modelMetadata.fields)\n .map(field => field.displayName);\n\n // Depending on the format, generate the template\n if (format === ImportFormat.CSV) {\n const stream = await this.csvService.createCsvStream(null, 0, headers); // Create a CSV stream with the header row\n const fileName = `${modelMetadata.singularName}-import-template.csv`;\n const mimeType = 'text/csv';\n return {\n stream,\n fileName,\n mimeType,\n };\n } else if (format === ImportFormat.EXCEL) {\n const stream = await this.excelService.createExcelStream(null, 0, headers); // Create an Excel stream with the header row\n const fileName = `${modelMetadata.singularName}-import-template.xlsx`;\n // Set the MIME type for Excel files\n const mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n return {\n stream,\n fileName,\n mimeType,\n };\n } else {\n throw new Error(ERROR_MESSAGES.INVALID_FORMAT('import' + format));\n }\n\n }\n\n async getImportInstructions(modelMetadataId: number): Promise<ImportInstructionsResponseDto> {\n // Load the model metadata for the given ID\n const modelMetadata = await this.modelMetadataService.findOne(modelMetadataId, {\n populate: ['fields'],\n });\n if (!modelMetadata) {\n throw new Error(ERROR_MESSAGES.MODEL_METADATA_NOT_FOUND(modelMetadataId));\n }\n\n // Create the standard import instructions\n const standardInstructions: StandardImportInstructionsResponseDto = {\n requiredFields: [],\n dateFields: [],\n dateTimeFields: [],\n numberFields: [],\n emailFields: [],\n regexFields: [],\n jsonFields: [],\n booleanFields: [],\n };\n\n // Iterate through the fields and populate the standard instructions\n for (const field of modelMetadata.fields) {\n if (field.isSystem) continue; // Skip system fields\n if (field.required) {\n standardInstructions.requiredFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.date) {\n standardInstructions.dateFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.datetime) {\n standardInstructions.dateTimeFields.push(field.displayName);\n }\n if ([SolidFieldType.bigint, SolidFieldType.int, SolidFieldType.decimal].includes(field.type as SolidFieldType)) {\n standardInstructions.numberFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.email) {\n standardInstructions.emailFields.push(field.displayName);\n }\n if (field.regexPattern) {\n standardInstructions.regexFields.push({\n fieldName: field.displayName,\n regexPattern: field.regexPattern,\n });\n }\n if (field.type === SolidFieldType.json) {\n standardInstructions.jsonFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.boolean) {\n standardInstructions.booleanFields.push(field.displayName);\n }\n }\n\n // Create the custom instructions\n const customInstructions: string[] = [];\n\n return {\n standard: standardInstructions,\n custom: customInstructions,\n };\n }\n\n async getImportMappingInfo(importTransactionId: number): Promise<ImportMappingInfo> {\n // Load the import transaction for the given ID\n const importTransaction = await this.loadImportTransaction(importTransactionId);\n\n // Get all the importable fields from the model metadata\n const importableFields: ImportableFieldInfo[] = this.fieldsAllowedForImport(importTransaction.modelMetadata.fields).map(field => ({\n name: field.name,\n displayName: field.displayName,\n required: field.required,\n }));\n\n // Get the import file media object from the import transaction\n const importFileMediaObject = this.getImportFileObject(importTransaction);\n\n // Get the import file stream for the import transaction\n const importFileStream = await this.getImportFileStream(importFileMediaObject);\n\n // Get a sample of records from the import file\n const sampleRecord = await this.getFileRecordsSample(importFileStream, importFileMediaObject.mimeType);\n\n // Convert sampleRecord to the format required for SampleImportedRecordInfo\n const wrappedRecords: SampleImportedRecordInfo[] = sampleRecord.data.map((record: Record<string, any>) => {\n return Object.entries(record).map(([key, value]) => ({\n cellHeader: key,\n cellValue: value,\n defaultMappedFieldName: importableFields.find(field => field.displayName === key)?.name || '',\n }));\n }).flat();\n\n // for await (const page of this.csvService.readCsvInPagesFromStream(importFileStream)) {\n // // await dbService.bulkInsert(page);\n // }\n\n return {\n sampleImportedRecordInfo: wrappedRecords, // This will hold the sample data from the file\n importableFields: importableFields, // This will hold the fields that can be imported\n };\n }\n\n async startImportSync(importTransactionId: number): Promise<ImportSyncResult> {\n // Load the import transaction for the given ID\n const importTransaction = await this.loadImportTransaction(importTransactionId);\n\n // Get the import file media object from the import transaction\n const importFileMediaObject = this.getImportFileObject(importTransaction);\n\n // Get the import file stream for the import transaction\n const importFileStream = await this.getImportFileStream(importFileMediaObject);\n\n const { ids, errorLogIds } = await this.importFromFileToDB(\n importTransaction,\n importFileStream,\n importFileMediaObject.mimeType,\n );\n\n // Update the import transaction status to 'completed'\n (errorLogIds.length > 0) ? importTransaction.status = ImportTransactionStatus.import_failed : importTransaction.status = ImportTransactionStatus.import_succeeded; //FIXME: We can probably have import_partially_failed status to differentiate\n // Save the import transaction\n await this.repo.save(importTransaction);\n return {\n status: importTransaction.status,\n importedIds: ids, // The IDs of the records created during the import\n importedCount: ids.length, // The number of records created during the import\n failedCount: errorLogIds.length, // The number of records that failed to import\n };\n }\n\n startImportAsync(importTransactionId: number): Promise<void> {\n throw new Error('Method not implemented.');\n }\n\n async exportFailedImportedImports(importTransactionId: number) {\n // Get the 1st error log entry to determine the headers for the export file\n const firstErrorLogEntry = await this.entityManager.getRepository(ImportTransactionErrorLog).findOne({\n where: {\n importTransaction: { id: importTransactionId },\n },\n });\n\n if (!firstErrorLogEntry) {\n throw new BadRequestException(ERROR_MESSAGES.NO_ERROR_LOG_FOR_IMPORT(importTransactionId));\n }\n\n // Create the headers for the export file\n const headers = [\n ...Object.keys(firstErrorLogEntry.rowData ? JSON.parse(firstErrorLogEntry.rowData) : {}), // Include all keys from the rowData JSON\n 'Error', // Error message for the failed record\n ];\n\n\n // Depending upon the format of the import tranaction file, create a readable stream of the error log entries\n const importTransaction = await this.loadImportTransaction(importTransactionId);\n const importFileMediaObject = this.getImportFileObject(importTransaction);\n const mimeType = importFileMediaObject.mimeType;\n const templateFormat = mimeType === ImportMimeTypes.CSV ? \"csv\" : \"excel\";\n const dataRecordsFunc = async (chunkIndex: number, chunkSize: number): Promise<any[]> => {\n // Get the error log entries for the import transaction\n const errorLogEntries = await this.entityManager.getRepository(ImportTransactionErrorLog).find({\n where: {\n importTransaction: { id: importTransactionId },\n },\n skip: chunkIndex * chunkSize,\n take: chunkSize,\n });\n\n if (!errorLogEntries || errorLogEntries.length === 0) {\n return []; // Return an empty array if no error log entries found\n }\n\n // Read the row data json from the error log entry, parse it and write it as a record to the stream\n return errorLogEntries.map(entry => {\n const rowData = entry.rowData ? JSON.parse(entry.rowData) : {};\n return {\n ...rowData, // Spread the row data into the record\n Error: entry.errorMessage,\n };\n });\n };\n\n // Get the export stream for the failed records\n const exportStream = await this.getFailedRecordsStream(templateFormat, headers, dataRecordsFunc);\n if (!exportStream) {\n throw new BadRequestException(`Failed to create export stream for import transaction ID ${importTransactionId}.`);\n }\n // Return the export stream\n const extension = templateFormat === \"excel\" ? 'xlsx' : 'csv';\n return {\n stream: exportStream,\n fileName: `${importTransaction.modelMetadata.singularName}-failed-imports.${extension}`,\n mimeType: templateFormat === \"excel\" ? ImportMimeTypes.EXCEL : ImportMimeTypes.CSV,\n };\n\n }\n\n private async getFailedRecordsStream(templateFormat: string, headers: string[], dataRecordsFunc: (chunkIndex: number, chunkSize: number) => Promise<any[]>) {\n let exportStream = null;\n switch (templateFormat) {\n case \"excel\":\n exportStream = await this.excelService.createExcelStream(dataRecordsFunc, 100, headers);\n break;\n case \"csv\":\n exportStream = await this.csvService.createCsvStream(dataRecordsFunc, 100, headers);\n break;\n default:\n throw new Error('Invalid export format');\n }\n return exportStream;\n }\n\n\n private async loadImportTransaction(importTransactionId: number) {\n const importTransaction = await this.findOne(importTransactionId, {\n populate: ['modelMetadata', 'modelMetadata.fields'],\n populateMedia: ['fileLocation'],\n });\n if (!importTransaction) {\n throw new Error(`Import transaction with ID ${importTransactionId} not found.`);\n }\n return importTransaction;\n }\n\n private fieldsAllowedForImport(fields: FieldMetadata[]): FieldMetadata[] {\n // Filter out fields that are not allowed for import\n return fields.filter(field =>\n field.type !== SolidFieldType.mediaMultiple && // Exclude media multiple fields\n field.type !== SolidFieldType.mediaSingle &&\n field.type !== SolidFieldType.computed && // Exclude computed fields\n field.type !== SolidFieldType.password &&\n field.type !== SolidFieldType.richText &&\n field.type !== SolidFieldType.uuid &&\n field.relationType !== RelationType.oneToMany &&\n field.isSystem !== true // Exclude system fields\n );\n }\n\n private async getFileRecordsSample(importFileStream: Readable, mimeType: string): Promise<ImportPaginatedReadResult> {\n // Depending upon the mime type of the file, read the file in pages\n // For CSV files, use the csvService to read the file in pages\n // For Excel files, use the excelService to read the file in pages\n if (mimeType === 'text/csv') {\n const generator = this.csvService.readCsvInPagesFromStream(importFileStream, { pageSize: 1 });\n const firstRecord = await generator.next(); // Get the first record to extract headers and sample data\n return firstRecord.value;\n } else if (mimeType === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {\n const generator = this.excelService.readExcelInPagesFromStream(importFileStream, { pageSize: 1 });\n const firstRecord = await generator.next(); // Get the first record to extract headers and sample data\n return firstRecord.value;\n }\n else { // If the file is neither CSV nor Excel, throw an error\n throw new Error(ERROR_MESSAGES.INVALID_FORMAT(mimeType));\n }\n }\n\n private getImportFileObject(importTransaction: ImportTransaction): MediaWithFullUrl {\n const importFileMediaObject = importTransaction['_media']['fileLocation'][0] as MediaWithFullUrl; // Since there can be only one fileLocation, we can safely access the first element\n if (!importFileMediaObject) {\n throw new Error(`Import file for transaction ID ${importTransaction.id} not found.`);\n }\n return importFileMediaObject;\n }\n\n private async getImportFileStream(importFileMediaObject: MediaWithFullUrl): Promise<Readable> {\n const fileUrl = importFileMediaObject['_full_url'];\n const mimeType = importFileMediaObject['mimeType'];\n if (!fileUrl) {\n throw new Error(`File URL ${fileUrl} not found.`);\n }\n // From the file URL, convert the file URL to a readable stream using nestjs http service and axios\n const fileUrlResponse = await this.httpService.axiosRef.get(fileUrl, {\n responseType: 'stream',\n });\n\n if (!fileUrlResponse || !fileUrlResponse.data) {\n throw new Error(ERROR_MESSAGES.FILE_READ_FAILED_FROM_URL(fileUrl));\n }\n // fileUrlResponse.data is a Node.js Readable stream\n return fileUrlResponse.data;\n }\n\n private async importFromFileToDB(\n importTransaction: ImportTransaction,\n importFileStream: Readable,\n mimeType: string,\n ): Promise<ImportRecordsResult> {\n if (!importTransaction.modelMetadata) {\n throw new Error(`Model metadata for import transaction ID ${importTransaction.id} not found.`);\n }\n\n const createdRecordIds = [];\n const createdErrorLogIds = [];\n\n // Get the model service for the model metadata name\n const modelService = this.getModelService(importTransaction.modelMetadata.singularName);\n\n // Depending upon the mime type of the file, read the file in pages and insert the records into the database\n if (mimeType === ImportMimeTypes.CSV) {\n for await (const page of this.csvService.readCsvInPagesFromStream(importFileStream)) {\n const { ids, errorLogIds } = await this.importRecords(page, importTransaction, modelService);\n createdRecordIds.push(...ids);\n createdErrorLogIds.push(...errorLogIds);\n }\n }\n else if (mimeType === ImportMimeTypes.EXCEL) {\n for await (const page of this.excelService.readExcelInPagesFromStream(importFileStream)) {\n const { ids, errorLogIds } = await this.importRecords(page, importTransaction, modelService);\n createdRecordIds.push(...ids);\n createdErrorLogIds.push(...errorLogIds);\n }\n } else { // If the file is neither CSV nor Excel, throw an error\n throw new Error(ERROR_MESSAGES.INVALID_FORMAT(mimeType));\n }\n\n return {\n ids: createdRecordIds, // Return the IDs of the created records\n errorLogIds: createdErrorLogIds, // Return the IDs of the error log entries created during the import\n }\n }\n\n private async importRecords(page: ImportPaginatedReadResult, importTransaction: ImportTransaction, modelService: CRUDService<any>): Promise<ImportRecordsResult> {\n if (!importTransaction.modelMetadata || !importTransaction.modelMetadata.fields) {\n throw new Error(`Model metadata with fields for import transaction ID ${importTransaction.id} not found.`);\n }\n\n const ids: Array<number> = [];\n const errorLogIds: Array<number> = [];\n for (const record of page.data) {\n try {\n const createdRecord = await this.insertRecord(record, JSON.parse(importTransaction.mapping) as ImportMapping[], importTransaction.modelMetadata, modelService);\n ids.push(createdRecord.id); // Add the ID of the created record to the ids array\n }\n catch (error) {\n this.logger.debug(`Error inserting record: ${JSON.stringify(record)}. Error: ${error.message}`);\n // Get the Import transaction error log repo\n const errorLog = await this.createErrorLogEntry(importTransaction, record, error);\n errorLogIds.push(errorLog.id); // Add the ID of the error log entry to the errorLogIds array\n }\n }\n return {\n ids: ids, // Return the IDs of the created records\n errorLogIds: errorLogIds, // Return the IDs of the error log entries created during the import\n };\n }\n\n async createErrorLogEntry(importTransaction: ImportTransaction, record: Record<string, any>, error: any) {\n const importTransactionRepo = this.entityManager.getRepository(ImportTransactionErrorLog);\n // Create a new ImportTransactionErrorLog entry\n const rowNumber = uuidv4(); // Generate a unique row number or use page.rowNumber if available \n\n const errorLogEntry = {\n importTransactionErrorLogId: `${importTransaction.id}-${rowNumber}`, // FIXME pending to retrieve the row number from the page\n rowNumber: 1, // FIXME pending to retrieve the row number from the page\n rowData: JSON.stringify(record), // Store the row data\n importTransaction: importTransaction, // Link to the import transaction\n errorMessage: error.message, // Store the error message\n errorTrace: error.stack || '', // Store the error stack trace if available\n } as ImportTransactionErrorLog;\n\n // Save the error log entry to the database\n const savedEntry = await importTransactionRepo.save(errorLogEntry);\n return savedEntry; // Return the ID of the saved error log entry\n }\n\n //FIXME Currently below method fails if any field in the record is not valid or if the record is not valid. It does not collect the errors for all fields in a record\n private async insertRecord(record: Record<string, any>, mapping: ImportMapping[], modelMetadataWithFields: ModelMetadata, modelService: CRUDService<any>): Promise<any> {\n // Convert the imported record to a DTO\n const dto = await this.convertImportedRecordToDto(record, mapping, modelMetadataWithFields);\n // Use the model service to create the record in the database\n const createdRecord = await modelService.create(dto, [], {}); //FIXME: Need to handle this part alongwith the refactoring of the CRUDService for permissions\n return createdRecord; // Return the created record\n }\n\n private getModelService(modelSingularName: string): CRUDService<any> {\n // Get the model service for the model metadata name\n const modelServiceWrapper = this.introspectService.getProvider(`${classify(modelSingularName)}Service`);\n const modelService = modelServiceWrapper.instance as CRUDService<any>;\n if (!modelService) {\n throw new Error(ERROR_MESSAGES.MODEL_SERVICE_NOT_FOUND(modelSingularName));\n }\n return modelService;\n }\n\n private async convertImportedRecordToDto(record: Record<string, any>, mapping: ImportMapping[], modelMetadataWithFields: ModelMetadata) {\n // Create a new record object\n const dtoRecord: Record<string, any> = {};\n\n // Iterate through every cell in the record\n // Using the saved mapping, populate the dtoRecord w.r.t the record and fields\n for (const key in record) {\n const mappedField = mapping.find(m => m.header === key);\n if (mappedField) {\n // If the field is found in the mapping, get the field metadata from the model metadata\n const fieldMetadata = modelMetadataWithFields.fields.find(f => f.name === mappedField.fieldName);\n // const userKeyField = modelMetadataWithFields.fields.find(f => f.isUserKey === true); // Assuming userKey is a field in the model metadata\n if (fieldMetadata) {\n // If the field is found in the model metadata, set the value in the dtoRecord\n await this.populateDtoForACell(dtoRecord, fieldMetadata, record, key);\n } else {\n this.logger.warn(`Field ${mappedField.fieldName} not found in model metadata ${modelMetadataWithFields.singularName}`);\n }\n }\n }\n return dtoRecord;\n }\n\n private async populateDtoForACell(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string): Promise<Record<string, any>> {\n const fieldType = fieldMetadata.type;\n // const userKeyFieldName = userKeyField?.name || 'id'; // Default to 'id' if not found\n\n // TODO Move this logic to field crud managers i.e add a parse method to the field crud manager interface\n switch (fieldType) {\n case SolidFieldType.relation: {\n return await this.populateDtoForRelations(fieldMetadata, record, key, dtoRecord); \n }\n case SolidFieldType.date:\n case SolidFieldType.datetime:\n return this.populateDtoForDate(record, key, fieldMetadata, dtoRecord);\n case SolidFieldType.int:\n case SolidFieldType.bigint:\n case SolidFieldType.decimal:\n return this.populateDtoForNumber(dtoRecord, fieldMetadata, record, key);\n case SolidFieldType.boolean:\n return this.populateDtoForBoolean(dtoRecord, fieldMetadata, record, key);\n case SolidFieldType.selectionStatic:\n case SolidFieldType.selectionDynamic:\n return this.populateDtoForSelectionValues(dtoRecord, fieldMetadata, record, key);\n case SolidFieldType.email:\n case SolidFieldType.shortText:\n case SolidFieldType.longtext:\n case SolidFieldType.richText: {\n dtoRecord[fieldMetadata.name] = record[key] ? String(record[key]).trim() : null; // Trim text fields and set to null if empty\n return dtoRecord;\n }\n default: {\n dtoRecord[fieldMetadata.name] = record[key];\n return dtoRecord;\n }\n }\n }\n \n private populateDtoForSelectionValues(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string) {\n const rawValue = record[key];\n\n if (rawValue == null || rawValue === '' || (typeof rawValue === 'string' && rawValue.trim() === '')) {\n dtoRecord[fieldMetadata.name] = null;\n return dtoRecord;\n }\n\n const isMultipleSelection = fieldMetadata.isMultiSelect;\n\n if (isMultipleSelection) {\n const selectionValues = String(rawValue)\n .split(',')\n .map(value => value.trim())\n .filter(value => value !== '');\n\n dtoRecord[fieldMetadata.name] = JSON.stringify(selectionValues);\n } else {\n dtoRecord[fieldMetadata.name] = rawValue; // Single select: assign directly\n }\n\n return dtoRecord;\n }\n\n\n private populateDtoForBoolean(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string) {\n const cellValue = record[key];\n if (cellValue === null || cellValue === undefined || cellValue === '') {\n dtoRecord[fieldMetadata.name] = null; // If the cell is empty, set the field to null\n return dtoRecord;\n }\n\n // If the cell contains values other than 'true', '1', 'yes', 'false', '0', 'no', throw an error\n const booleanValue = (String(cellValue).toLowerCase() === 'true' || String(cellValue) === '1' || String(cellValue).toLowerCase() === 'yes') ? true : (String(cellValue).toLowerCase() === 'false' || String(cellValue) === '0' || String(cellValue).toLowerCase() === 'no') ? false : null;\n if (booleanValue === null) {\n throw new Error(`Invalid boolean value for cell ${key} with value ${cellValue}`);\n }\n dtoRecord[fieldMetadata.name] = booleanValue;\n return dtoRecord;\n }\n\n private populateDtoForNumber(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string) {\n const cellValue = record[key];\n if (cellValue === null || cellValue === undefined || cellValue === '') {\n dtoRecord[fieldMetadata.name] = null; // If the cell is empty, set the field to null\n return dtoRecord;\n }\n const numberValue = Number(cellValue);\n if (isNaN(numberValue)) {\n throw new Error(`Invalid number value for cell ${key} with value ${record[key]}`);\n }\n dtoRecord[fieldMetadata.name] = numberValue;\n return dtoRecord;\n }\n\n private populateDtoForDate(record: Record<string, any>, key: string, fieldMetadata: FieldMetadata, dtoRecord: Record<string, any>) {\n {\n // Get the cell value\n const cellValue = record[key];\n if (!cellValue) { //If cell is a falsy value (empty)\n dtoRecord[fieldMetadata.name] = null; // If the cell is empty, set the field to null\n return dtoRecord;\n }\n // Use flexible date parser\n this.logger.verbose(cellValue,'cellValue');\n \n const dateValue = parseFlexibleDate(cellValue);\n this.logger.verbose(dateValue,'dateValue');\n\n if (!dateValue) {\n throw new Error(\n `Invalid date value for cell ${key} with value ${cellValue}`\n );\n }\n dtoRecord[fieldMetadata.name] = dateValue;\n return dtoRecord;\n }\n }\n\n private async populateDtoForRelations(fieldMetadata: FieldMetadata, record: Record<string, any>, key: string, dtoRecord: Record<string, any>) {\n if (!fieldMetadata.relationCoModelSingularName) {\n throw new Error(ERROR_MESSAGES.RELATION_CO_MODEL_NOT_DEFINED_FOR_FIELD(fieldMetadata.name));\n }\n\n const relatedRecordsIds = await this.getRelatedEntityIdsFromUserKeys(fieldMetadata, record, key);\n if (relatedRecordsIds.length === 0) {\n return dtoRecord; // If no related records found, return the dtoRecord as is\n }\n\n if (fieldMetadata.relationType === RelationType.manyTomany || fieldMetadata.relationType === RelationType.oneToMany) {\n dtoRecord[`${fieldMetadata.name}Ids`] = relatedRecordsIds;\n dtoRecord[`${fieldMetadata.name}Command`] = RelationFieldsCommand.set; // Reset the relation field association with the related records IDs\n }\n else if (fieldMetadata.relationType === RelationType.manyToOne) {\n dtoRecord[`${fieldMetadata.name}Id`] = relatedRecordsIds.pop(); // For many-to-one relations, we need only one ID\n }\n return dtoRecord;\n }\n\n private async getRelatedEntityIdsFromUserKeys(fieldMetadata: FieldMetadata, record: Record<string, any>, key: string): Promise<Array<number>> {\n // For many-to-many or one-to-many relations, we expect the record cell to contains a comma-separated list of userKeys\n const relationUserKeys = record[key] ? String(record[key]).split(',').map((userKey: string) => userKey.trim()) : [];\n if (relationUserKeys.length === 0) return [];\n\n const coModelService = this.getModelService(fieldMetadata.relationCoModelSingularName);\n const coModelWithUserKeyField = await this.modelMetadataService.findOneBySingularName(fieldMetadata.relationCoModelSingularName, ['userKeyField']);\n const coModelUserKeyFieldName = coModelWithUserKeyField?.userKeyField?.name || 'id'; // Default to 'id' if not found\n\n\n // Set the relation basic filter dto filters with the userkeys and call the find method of the model service to get the related records\n const relationFilterDto = {\n filters: {\n [coModelUserKeyFieldName]: {\n $in: relationUserKeys, // Use the userKeyFieldName to filter by userKeys\n },\n },\n };\n\n // From the userKeys, we will get the IDs of the related records using the userKeyFieldName and throw an error if any of the userKeys is not found\n const relatedRecordsResult = await coModelService.find(relationFilterDto);\n if (!relatedRecordsResult || !relatedRecordsResult.records || relatedRecordsResult.records.length === 0 || relatedRecordsResult.records.length !== relationUserKeys.length) {\n throw new Error(`Invalid related records userKey values found for cell ${key} with value ${record[key]}`);\n }\n const relatedRecordsIds = relatedRecordsResult.records.map(record => record.id);\n return relatedRecordsIds;\n }\n}"]}
1
+ {"version":3,"file":"import-transaction.service.js","sourceRoot":"","sources":["../../src/services/import-transaction.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA6F;AAC7F,uCAA2D;AAC3D,6CAAsD;AACtD,qCAAwC;AAExC,2CAA+C;AAC/C,+DAAqE;AACrE,iDAAwD;AACxD,iDAAwD;AACxD,qEAA2E;AAC3E,uEAA6E;AAG7E,oEAAkE;AAClE,yCAA4C;AAC5C,gEAA8D;AAC9D,iFAAyG;AAGzG,yGAA6F;AAE7F,wDAA4D;AAE5D,+FAA2F;AAE3F,+BAAoC;AAEpC,+CAA2C;AAC3C,mDAA+C;AAC/C,yEAAoE;AACpE,4FAAuF;AACvF,wDAAgE;AAEhE,mCAA6C;AAQ7C,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,2BAAW,CAAA;IACX,+BAAe,CAAA;AACjB,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB;AAED,IAAY,eAGX;AAHD,WAAY,eAAe;IACzB,mCAAgB,CAAA;IAChB,8FAA2E,CAAA;AAC7E,CAAC,EAHW,eAAe,+BAAf,eAAe,QAG1B;AAyBD,IAAY,uBAMX;AAND,WAAY,uBAAuB;IACjC,0CAAe,CAAA;IACf,8DAAmC,CAAA;IACnC,4DAAiC,CAAA;IACjC,gEAAqC,CAAA;IACrC,0DAA+B,CAAA;AACjC,CAAC,EANW,uBAAuB,uCAAvB,uBAAuB,QAMlC;AAcM,IAAM,wBAAwB,gCAA9B,MAAM,wBAAyB,SAAQ,0BAA8B;IAC1E,YACW,oBAA0C,EAC1C,qBAA4C,EAC5C,aAA4B,EAC5B,WAAwB,EACxB,gBAAkC,EAClC,iBAAoC,EAE7C,aAAqC,EAG5B,IAAiC,EACjC,SAAoB,EACpB,YAA0B,EAC1B,UAAsB,EACtB,WAAwB,EACxB,iBAAyC,EACjC,0BAAsD;QAGvE,KAAK,CAAC,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,IAAI,EAAE,mBAAmB,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QAnB9K,yBAAoB,GAApB,oBAAoB,CAAsB;QAC1C,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,kBAAa,GAAb,aAAa,CAAe;QAC5B,gBAAW,GAAX,WAAW,CAAa;QACxB,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,sBAAiB,GAAjB,iBAAiB,CAAmB;QAEpC,kBAAa,GAAb,aAAa,CAAe;QAG5B,SAAI,GAAJ,IAAI,CAA6B;QACjC,cAAS,GAAT,SAAS,CAAW;QACpB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,eAAU,GAAV,UAAU,CAAY;QACtB,gBAAW,GAAX,WAAW,CAAa;QACxB,sBAAiB,GAAjB,iBAAiB,CAAwB;QACjC,+BAA0B,GAA1B,0BAA0B,CAA4B;QAMxD,WAAM,GAAG,IAAI,eAAM,CAAC,0BAAwB,CAAC,IAAI,CAAC,CAAC;IAFpE,CAAC;IASD,KAAK,CAAC,iBAAiB,CAAC,eAAuB,EAAE,SAAuB,YAAY,CAAC,GAAG;QAEtF,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,eAAe,EAAE;YAC7E,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,+BAAc,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,kBAAkB,CACxE,aAAa,CAAC,YAAY,CAC3B,CAAC;QAMF,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC;aACnD,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAGnC,IAAI,MAAM,KAAK,YAAY,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YACvE,MAAM,QAAQ,GAAG,GAAG,aAAa,CAAC,YAAY,sBAAsB,CAAC;YACrE,MAAM,QAAQ,GAAG,UAAU,CAAC;YAC5B,OAAO;gBACL,MAAM;gBACN,QAAQ;gBACR,QAAQ;aACT,CAAC;QACJ,CAAC;aAAM,IAAI,MAAM,KAAK,YAAY,CAAC,KAAK,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YAC3E,MAAM,QAAQ,GAAG,GAAG,aAAa,CAAC,YAAY,uBAAuB,CAAC;YAEtE,MAAM,QAAQ,GAAG,mEAAmE,CAAC;YACrF,OAAO;gBACL,MAAM;gBACN,QAAQ;gBACR,QAAQ;aACT,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,+BAAc,CAAC,cAAc,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC;QACpE,CAAC;IAEH,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,eAAuB;QAEjD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,eAAe,EAAE;YAC7E,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,+BAAc,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC,CAAC;QAC5E,CAAC;QAGD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,kBAAkB,CACxE,aAAa,CAAC,YAAY,CAC3B,CAAC;QAEF,MAAM,gBAAgB,GAAG,IAAI,CAAC,0BAA0B;aACrD,uBAAuB,EAAE;aACzB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE5B,MAAM,YAAY,GAAG,IAAA,mCAAqB,GAAE,CAAC;QAK7C,MAAM,oBAAoB,GAA0C;YAClE,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,EAAE;YAClB,YAAY,EAAE,EAAE;YAChB,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,EAAE;YACf,UAAU,EAAE,EAAE;YACd,aAAa,EAAE,EAAE;SAClB,CAAC;QAGF,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAE9B,IAAI,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,SAAS;YACX,CAAC;YAGD,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,SAAS;YACX,CAAC;YAGD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,oBAAoB,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,IAAI,EAAE,CAAC;gBACvC,oBAAoB,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,QAAQ,EAAE,CAAC;gBAC3C,oBAAoB,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,CAAC,0CAAc,CAAC,MAAM,EAAE,0CAAc,CAAC,GAAG,EAAE,0CAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAsB,CAAC,EAAE,CAAC;gBAC/G,oBAAoB,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,KAAK,EAAE,CAAC;gBACxC,oBAAoB,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACvB,oBAAoB,CAAC,WAAW,CAAC,IAAI,CAAC;oBACpC,SAAS,EAAE,KAAK,CAAC,WAAW;oBAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;iBACjC,CAAC,CAAC;YACL,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,IAAI,EAAE,CAAC;gBACvC,oBAAoB,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,OAAO,EAAE,CAAC;gBAC1C,oBAAoB,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAGD,MAAM,kBAAkB,GAAa,EAAE,CAAC;QAExC,OAAO;YACL,QAAQ,EAAE,oBAAoB;YAC9B,MAAM,EAAE,kBAAkB;SAC3B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,mBAA2B;QAEpD,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;QAGhF,MAAM,gBAAgB,GAA0B,IAAI,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChI,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC,CAAC;QAGJ,MAAM,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;QAG1E,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;QAG/E,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAGvG,MAAM,cAAc,GAA+B,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAA2B,EAAE,EAAE;YACvG,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnD,UAAU,EAAE,GAAG;gBACf,SAAS,EAAE,KAAK;gBAChB,sBAAsB,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,KAAK,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE;aAC9F,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAMV,OAAO;YACL,wBAAwB,EAAE,cAAc;YACxC,gBAAgB,EAAE,gBAAgB;SACnC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,mBAA2B,EAAE,UAA0B;QAE3E,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;QAChF,MAAM,SAAS,GAAG,IAAA,mBAAU,EAAC,IAAA,kBAAS,EAAC,iBAAiB,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;QACtF,MAAM,aAAa,GAAG,GAAG,SAAS,uBAAuB,CAAC;QAE1D,MAAM,eAAe,GAAG,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC;QACrD,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;YAClD,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;QAE5C,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,2BAAkB,CAC1B,uBAAuB,aAAa,EAAE,CACvC,CAAC;QACJ,CAAC;QAGD,MAAM,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;QAG1E,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;QAE/E,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,kBAAkB,CACxD,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,CAAC,QAAQ,CAC/B,CAAC;QAGF,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,GAAG,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,GAAG,uBAAuB,CAAC,gBAAgB,CAAC;QAElK,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACxC,OAAO;YACL,MAAM,EAAE,iBAAiB,CAAC,MAAM;YAChC,WAAW,EAAE,GAAG;YAChB,aAAa,EAAE,GAAG,CAAC,MAAM;YACzB,WAAW,EAAE,WAAW,CAAC,MAAM;SAChC,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,mBAA2B;QAC1C,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,2BAA2B,CAAC,mBAA2B;QAE3D,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,+DAAyB,CAAC,CAAC,OAAO,CAAC;YACnG,KAAK,EAAE;gBACL,iBAAiB,EAAE,EAAE,EAAE,EAAE,mBAAmB,EAAE;aAC/C;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,MAAM,IAAI,4BAAmB,CAAC,+BAAc,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7F,CAAC;QAGD,MAAM,OAAO,GAAG;YACd,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxF,OAAO;SACR,CAAC;QAIF,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;QAChF,MAAM,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,CAAC;QAChD,MAAM,cAAc,GAAG,QAAQ,KAAK,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1E,MAAM,eAAe,GAAG,KAAK,EAAE,UAAkB,EAAE,SAAiB,EAAkB,EAAE;YAEtF,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,+DAAyB,CAAC,CAAC,IAAI,CAAC;gBAC7F,KAAK,EAAE;oBACL,iBAAiB,EAAE,EAAE,EAAE,EAAE,mBAAmB,EAAE;iBAC/C;gBACD,IAAI,EAAE,UAAU,GAAG,SAAS;gBAC5B,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;YAEH,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrD,OAAO,EAAE,CAAC;YACZ,CAAC;YAGD,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBACjC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,OAAO;oBACL,GAAG,OAAO;oBACV,KAAK,EAAE,KAAK,CAAC,YAAY;iBAC1B,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAGF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;QACjG,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,4BAAmB,CAAC,4DAA4D,mBAAmB,GAAG,CAAC,CAAC;QACpH,CAAC;QAED,MAAM,SAAS,GAAG,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9D,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,GAAG,iBAAiB,CAAC,aAAa,CAAC,YAAY,mBAAmB,SAAS,EAAE;YACvF,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG;SACnF,CAAC;IAEJ,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,cAAsB,EAAE,OAAiB,EAAE,eAA0E;QACxJ,IAAI,YAAY,GAAG,IAAI,CAAC;QACxB,QAAQ,cAAc,EAAE,CAAC;YACvB,KAAK,OAAO;gBACV,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;gBACxF,MAAM;YACR,KAAK,KAAK;gBACR,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;gBACpF,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAcO,KAAK,CAAC,qBAAqB,CAAC,mBAA2B;QAE7D,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;YAChE,QAAQ,EAAE,CAAC,eAAe,CAAC;YAC3B,aAAa,EAAE,CAAC,cAAc,CAAC;SAChC,CAAC,CAAC;QAGH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,kBAAkB,CAC1E,iBAAiB,CAAC,aAAa,CAAC,YAAY,CAC7C,CAAC;QAGF,iBAAiB,CAAC,aAAa,CAAC,MAAM,GAAG,WAAW,CAAC;QAErD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAEO,sBAAsB,CAAC,MAAuB;QAEpD,MAAM,gBAAgB,GAAG,IAAI,CAAC,0BAA0B;aACrD,uBAAuB,EAAE;aACzB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE5B,MAAM,YAAY,GAAG,IAAA,mCAAqB,GAAE,CAAC;QAG7C,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC3B,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,aAAa;YAC3C,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,WAAW;YACzC,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,QAAQ;YACtC,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,QAAQ;YACtC,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,QAAQ;YACtC,KAAK,CAAC,IAAI,KAAK,0CAAc,CAAC,IAAI;YAClC,KAAK,CAAC,YAAY,KAAK,wCAAY,CAAC,SAAS;YAC7C,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YAGtC,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CACnC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,gBAA0B,EAAE,QAAgB;QAI7E,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9F,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YAC3C,OAAO,WAAW,CAAC,KAAK,CAAC;QAC3B,CAAC;aAAM,IAAI,QAAQ,KAAK,mEAAmE,EAAE,CAAC;YAC5F,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,0BAA0B,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAClG,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YAC3C,OAAO,WAAW,CAAC,KAAK,CAAC;QAC3B,CAAC;aACI,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,+BAAc,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,iBAAoC;QAC9D,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAqB,CAAC;QACjG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,kCAAkC,iBAAiB,CAAC,EAAE,aAAa,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,qBAAuC;QACvE,MAAM,OAAO,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,aAAa,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE;YACnE,YAAY,EAAE,QAAQ;SACvB,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,+BAAc,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,eAAe,CAAC,IAAI,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,iBAAoC,EACpC,gBAA0B,EAC1B,QAAgB;QAEhB,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,4CAA4C,iBAAiB,CAAC,EAAE,aAAa,CAAC,CAAC;QACjG,CAAC;QAED,MAAM,gBAAgB,GAAG,EAAE,CAAC;QAC5B,MAAM,kBAAkB,GAAG,EAAE,CAAC;QAG9B,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAGxF,IAAI,QAAQ,KAAK,eAAe,CAAC,GAAG,EAAE,CAAC;YACrC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACpF,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;gBAC7F,gBAAgB,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;gBAC9B,kBAAkB,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;aACI,IAAI,QAAQ,KAAK,eAAe,CAAC,KAAK,EAAE,CAAC;YAC5C,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACxF,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;gBAC7F,gBAAgB,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;gBAC9B,kBAAkB,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,+BAAc,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO;YACL,GAAG,EAAE,gBAAgB;YACrB,WAAW,EAAE,kBAAkB;SAChC,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,IAA+B,EAAE,iBAAoC,EAAE,YAA8B;QAC/H,IAAI,CAAC,iBAAiB,CAAC,aAAa,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAChF,MAAM,IAAI,KAAK,CAAC,wDAAwD,iBAAiB,CAAC,EAAE,aAAa,CAAC,CAAC;QAC7G,CAAC;QAED,MAAM,GAAG,GAAkB,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAkB,EAAE,CAAC;QACtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAoB,EAAE,iBAAiB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;gBAC/J,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAEhG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBAClF,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,OAAO;YACL,GAAG,EAAE,GAAG;YACR,WAAW,EAAE,WAAW;SACzB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,iBAAoC,EAAE,MAA2B,EAAE,KAAU;QACrG,MAAM,qBAAqB,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,+DAAyB,CAAC,CAAC;QAE1F,MAAM,SAAS,GAAG,IAAA,SAAM,GAAE,CAAC;QAE3B,MAAM,aAAa,GAAG;YACpB,2BAA2B,EAAE,GAAG,iBAAiB,CAAC,EAAE,IAAI,SAAS,EAAE;YACnE,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAC/B,iBAAiB,EAAE,iBAAiB;YACpC,YAAY,EAAE,KAAK,CAAC,OAAO;YAC3B,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;SACD,CAAC;QAG/B,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnE,OAAO,UAAU,CAAC;IACpB,CAAC;IAGO,KAAK,CAAC,YAAY,CAAC,MAA2B,EAAE,OAAwB,EAAE,uBAAsC,EAAE,YAA8B;QAEtJ,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;QAE5F,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7D,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,eAAe,CAAC,iBAAyB;QAE/C,MAAM,mBAAmB,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,GAAG,IAAA,kBAAQ,EAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACxG,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAA4B,CAAC;QACtE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,+BAAc,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,0BAA0B,CAAC,MAA2B,EAAE,OAAwB,EAAE,uBAAsC;QAEpI,MAAM,SAAS,GAAwB,EAAE,CAAC;QAI1C,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;YACxD,IAAI,WAAW,EAAE,CAAC;gBAEhB,MAAM,aAAa,GAAG,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,SAAS,CAAC,CAAC;gBAEjG,IAAI,aAAa,EAAE,CAAC;oBAElB,MAAM,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;gBACxE,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,WAAW,CAAC,SAAS,gCAAgC,uBAAuB,CAAC,YAAY,EAAE,CAAC,CAAC;gBACzH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,SAA8B,EAAE,aAA4B,EAAE,MAA2B,EAAE,GAAW;QACtI,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC;QAIrC,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,0CAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC7B,OAAO,MAAM,IAAI,CAAC,uBAAuB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;YACnF,CAAC;YACD,KAAK,0CAAc,CAAC,IAAI,CAAC;YACzB,KAAK,0CAAc,CAAC,QAAQ;gBAC1B,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;YACxE,KAAK,0CAAc,CAAC,GAAG,CAAC;YACxB,KAAK,0CAAc,CAAC,MAAM,CAAC;YAC3B,KAAK,0CAAc,CAAC,OAAO;gBACzB,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAC1E,KAAK,0CAAc,CAAC,OAAO;gBACzB,OAAO,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAC3E,KAAK,0CAAc,CAAC,eAAe,CAAC;YACpC,KAAK,0CAAc,CAAC,gBAAgB;gBAClC,OAAO,IAAI,CAAC,6BAA6B,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YACnF,KAAK,0CAAc,CAAC,KAAK,CAAC;YAC1B,KAAK,0CAAc,CAAC,SAAS,CAAC;YAC9B,KAAK,0CAAc,CAAC,QAAQ,CAAC;YAC7B,KAAK,0CAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC7B,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChF,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC5C,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,6BAA6B,CAAC,SAA8B,EAAE,aAA4B,EAAE,MAA2B,EAAE,GAAW;QAC1I,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAE7B,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,EAAE,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACpG,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,mBAAmB,GAAG,aAAa,CAAC,aAAa,CAAC;QAExD,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC;iBACrC,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;iBAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YAEjC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;QAC3C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAGO,qBAAqB,CAAC,SAA8B,EAAE,aAA4B,EAAE,MAA2B,EAAE,GAAW;QAClI,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YACtE,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;QAGD,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3R,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,eAAe,SAAS,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,oBAAoB,CAAC,SAA8B,EAAE,aAA4B,EAAE,MAA2B,EAAE,GAAW;QACjI,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YACtE,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,eAAe,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,kBAAkB,CAAC,MAA2B,EAAE,GAAW,EAAE,aAA4B,EAAE,SAA8B;QAC/H,CAAC;YAEC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;gBACrC,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAE5C,MAAM,SAAS,GAAG,IAAA,+BAAiB,EAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAE5C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,+BAA+B,GAAG,eAAe,SAAS,EAAE,CAC7D,CAAC;YACJ,CAAC;YACD,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;YAC1C,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,aAA4B,EAAE,MAA2B,EAAE,GAAW,EAAE,SAA8B;QAC1I,IAAI,CAAC,aAAa,CAAC,2BAA2B,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,+BAAc,CAAC,uCAAuC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9F,CAAC;QAED,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACjG,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,aAAa,CAAC,YAAY,KAAK,wCAAY,CAAC,UAAU,IAAI,aAAa,CAAC,YAAY,KAAK,wCAAY,CAAC,SAAS,EAAE,CAAC;YACpH,SAAS,CAAC,GAAG,aAAa,CAAC,IAAI,KAAK,CAAC,GAAG,iBAAiB,CAAC;YAC1D,SAAS,CAAC,GAAG,aAAa,CAAC,IAAI,SAAS,CAAC,GAAG,iDAAqB,CAAC,GAAG,CAAC;QACxE,CAAC;aACI,IAAI,aAAa,CAAC,YAAY,KAAK,wCAAY,CAAC,SAAS,EAAE,CAAC;YAC/D,SAAS,CAAC,GAAG,aAAa,CAAC,IAAI,IAAI,CAAC,GAAG,iBAAiB,CAAC,GAAG,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,+BAA+B,CAAC,aAA4B,EAAE,MAA2B,EAAE,GAAW;QAElH,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpH,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAE7C,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC;QACvF,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,aAAa,CAAC,2BAA2B,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;QACnJ,MAAM,uBAAuB,GAAG,uBAAuB,EAAE,YAAY,EAAE,IAAI,IAAI,IAAI,CAAC;QAIpF,MAAM,iBAAiB,GAAG;YACxB,OAAO,EAAE;gBACP,CAAC,uBAAuB,CAAC,EAAE;oBACzB,GAAG,EAAE,gBAAgB;iBACtB;aACF;SACF,CAAC;QAGF,MAAM,oBAAoB,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC1E,IAAI,CAAC,oBAAoB,IAAI,CAAC,oBAAoB,CAAC,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC3K,MAAM,IAAI,KAAK,CAAC,yDAAyD,GAAG,eAAe,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5G,CAAC;QACD,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChF,OAAO,iBAAiB,CAAC;IAC3B,CAAC;CACF,CAAA;AApsBY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,mBAAU,GAAE;IASR,WAAA,IAAA,6BAAmB,GAAE,CAAA;qCANS,6CAAoB;QACnB,+CAAqB;QAC7B,sBAAa;QACf,0BAAW;QACN,uBAAgB;QACf,uCAAiB;QAErB,uBAAa;QAGtB,2DAA2B;QACtB,gBAAS;QACN,4BAAY;QACd,wBAAU;QACT,mBAAW;QACL,iDAAsB;QACL,0DAA0B;GAlB9D,wBAAwB,CAosBpC","sourcesContent":["import { BadRequestException, ForbiddenException, Injectable, Logger } from '@nestjs/common';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { EntityManager } from 'typeorm';\n\nimport { ConfigService } from '@nestjs/config';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { CRUDService } from 'src/services/crud.service';\nimport { FileService } from 'src/services/file.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\n\n\nimport { classify } from '@angular-devkit/core/src/utils/strings';\nimport { HttpService } from '@nestjs/axios';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { RelationFieldsCommand, RelationType, SolidFieldType } from 'src/dtos/create-field-metadata.dto';\nimport { ImportInstructionsResponseDto, StandardImportInstructionsResponseDto } from 'src/dtos/import-instructions.dto';\nimport { FieldMetadata } from 'src/entities/field-metadata.entity';\nimport { ImportTransactionErrorLog } from 'src/entities/import-transaction-error-log.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { parseFlexibleDate } from 'src/helpers/date.helper';\nimport { MediaWithFullUrl } from 'src/interfaces';\nimport { ImportTransactionRepository } from 'src/repository/import-transaction.repository';\nimport { Readable } from 'stream';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ImportTransaction } from '../entities/import-transaction.entity';\nimport { CsvService } from './csv.service';\nimport { ExcelService } from './excel.service';\nimport { SolidIntrospectService } from './solid-introspect.service';\nimport { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';\nimport { getUserExcludedFields } from 'src/helpers/user-helper';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport {upperFirst, camelCase} from 'lodash';\n\ninterface ImportTemplateFileInfo {\n stream: NodeJS.ReadableStream;\n fileName: string;\n mimeType: string;\n}\n\nexport enum ImportFormat {\n CSV = 'csv',\n EXCEL = 'excel',\n}\n\nexport enum ImportMimeTypes {\n CSV = 'text/csv',\n EXCEL = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n}\nexport interface ImportMappingInfo {\n sampleImportedRecordInfo: SampleImportedRecordInfo[];\n importableFields: ImportableFieldInfo[];\n}\nexport interface SampleImportedRecordInfo {\n cellHeader: string; // The header of the cell in the import file\n cellValue: string; // The value of the cell in the import file\n defaultMappedFieldName: string; // The default mapped field name in the model metadata\n}\nexport interface ImportableFieldInfo {\n name: string;\n displayName: string;\n}\n\nexport interface ImportPaginatedReadResult {\n headers: string[]; // Headers of the CSV file\n data: Record<string, any>[]; // Data records in the current page\n}\n\ninterface ImportMapping {\n header: string; // The name of the field in the import file\n fieldName: string; // The name of the field in the model metadata to which the imported field is mapped\n}\n\nexport enum ImportTransactionStatus {\n draft = 'draft',\n mapping_created = 'mapping_created',\n import_started = 'import_started',\n import_succeeded = 'import_succeeded',\n import_failed = 'import_failed',\n}\n\nexport interface ImportSyncResult {\n status: string; // The status of the import transaction\n importedIds: Array<number>; // The IDs of the records created during the import\n importedCount: number; // The number of records created during the import\n failedCount: number; // The number of records that failed to import\n}\ninterface ImportRecordsResult {\n ids: Array<number>; // The IDs of the records created during the import\n errorLogIds: Array<number>; // The IDs of the error log entries created during the import\n}\n\n@Injectable()\nexport class ImportTransactionService extends CRUDService<ImportTransaction> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(ImportTransaction, 'default')\n // readonly repo: Repository<ImportTransaction>,\n readonly repo: ImportTransactionRepository,\n readonly moduleRef: ModuleRef,\n readonly excelService: ExcelService,\n readonly csvService: CsvService,\n readonly httpService: HttpService,\n readonly introspectService: SolidIntrospectService,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n // readonly fieldMetadataService: FieldMetadataService,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'importTransaction', 'solid-core', moduleRef);\n }\n\n private readonly logger = new Logger(ImportTransactionService.name);\n\n /**\n * This method is used to return a csv / excel template for the import transaction\n * It will contain the display names of the fields in the header row\n * @param modelMetadataId \n */\n async getImportTemplate(modelMetadataId: number, format: ImportFormat = ImportFormat.CSV): Promise<ImportTemplateFileInfo> {\n // Load the model metadata for the given ID\n const modelMetadata = await this.modelMetadataService.findOne(modelMetadataId, {\n populate: ['fields'],\n });\n if (!modelMetadata) {\n throw new Error(ERROR_MESSAGES.MODEL_METADATA_NOT_FOUND(modelMetadataId));\n }\n\n const allFields = await this.modelMetadataHelperService.loadFieldHierarchy(\n modelMetadata.singularName,\n );\n\n // Replace original fields with full hierarchy fields\n // modelMetadata.fields = allFields; \n\n // Create a header row with the display names of the fields, excluding the media fields,computed fields\n const headers = this.fieldsAllowedForImport(allFields)\n .map(field => field.displayName);\n\n // Depending on the format, generate the template\n if (format === ImportFormat.CSV) {\n const stream = await this.csvService.createCsvStream(null, 0, headers); // Create a CSV stream with the header row\n const fileName = `${modelMetadata.singularName}-import-template.csv`;\n const mimeType = 'text/csv';\n return {\n stream,\n fileName,\n mimeType,\n };\n } else if (format === ImportFormat.EXCEL) {\n const stream = await this.excelService.createExcelStream(null, 0, headers); // Create an Excel stream with the header row\n const fileName = `${modelMetadata.singularName}-import-template.xlsx`;\n // Set the MIME type for Excel files\n const mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n return {\n stream,\n fileName,\n mimeType,\n };\n } else {\n throw new Error(ERROR_MESSAGES.INVALID_FORMAT('import' + format));\n }\n\n }\n\n async getImportInstructions(modelMetadataId: number): Promise<ImportInstructionsResponseDto> {\n // Load the model metadata for the given ID\n const modelMetadata = await this.modelMetadataService.findOne(modelMetadataId, {\n populate: ['fields'],\n });\n if (!modelMetadata) {\n throw new Error(ERROR_MESSAGES.MODEL_METADATA_NOT_FOUND(modelMetadataId));\n }\n\n // Step 2: Load full field hierarchy (includes parent model fields)\n const allFields = await this.modelMetadataHelperService.loadFieldHierarchy(\n modelMetadata.singularName,\n );\n\n const systemFieldNames = this.modelMetadataHelperService\n .getSystemFieldsMetadata()\n .map(field => field.name);\n\n const userExcluded = getUserExcludedFields();\n // Replace modelMetadata.fields with combined (child + parent) fields\n // modelMetadata.fields = allFields;\n\n // Create the standard import instructions\n const standardInstructions: StandardImportInstructionsResponseDto = {\n requiredFields: [],\n dateFields: [],\n dateTimeFields: [],\n numberFields: [],\n emailFields: [],\n regexFields: [],\n jsonFields: [],\n booleanFields: [],\n };\n\n // Iterate through the fields and populate the standard instructions\n for (const field of allFields) {\n // Skip system fields\n if (systemFieldNames.includes(field.name)) {\n continue;\n }\n\n // Skip excluded user fields (NO model name check needed)\n if (userExcluded.includes(field.name)) {\n continue;\n }\n\n // if (field.isSystem) continue; // Skip system fields\n if (field.required) {\n standardInstructions.requiredFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.date) {\n standardInstructions.dateFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.datetime) {\n standardInstructions.dateTimeFields.push(field.displayName);\n }\n if ([SolidFieldType.bigint, SolidFieldType.int, SolidFieldType.decimal].includes(field.type as SolidFieldType)) {\n standardInstructions.numberFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.email) {\n standardInstructions.emailFields.push(field.displayName);\n }\n if (field.regexPattern) {\n standardInstructions.regexFields.push({\n fieldName: field.displayName,\n regexPattern: field.regexPattern,\n });\n }\n if (field.type === SolidFieldType.json) {\n standardInstructions.jsonFields.push(field.displayName);\n }\n if (field.type === SolidFieldType.boolean) {\n standardInstructions.booleanFields.push(field.displayName);\n }\n }\n\n // Create the custom instructions\n const customInstructions: string[] = [];\n\n return {\n standard: standardInstructions,\n custom: customInstructions,\n };\n }\n\n async getImportMappingInfo(importTransactionId: number): Promise<ImportMappingInfo> {\n // Load the import transaction for the given ID\n const importTransaction = await this.loadImportTransaction(importTransactionId);\n\n // Get all the importable fields from the model metadata\n const importableFields: ImportableFieldInfo[] = this.fieldsAllowedForImport(importTransaction.modelMetadata.fields).map(field => ({\n name: field.name,\n displayName: field.displayName,\n required: field.required,\n }));\n\n // Get the import file media object from the import transaction\n const importFileMediaObject = this.getImportFileObject(importTransaction);\n\n // Get the import file stream for the import transaction\n const importFileStream = await this.getImportFileStream(importFileMediaObject);\n\n // Get a sample of records from the import file\n const sampleRecord = await this.getFileRecordsSample(importFileStream, importFileMediaObject.mimeType);\n\n // Convert sampleRecord to the format required for SampleImportedRecordInfo\n const wrappedRecords: SampleImportedRecordInfo[] = sampleRecord.data.map((record: Record<string, any>) => {\n return Object.entries(record).map(([key, value]) => ({\n cellHeader: key,\n cellValue: value,\n defaultMappedFieldName: importableFields.find(field => field.displayName === key)?.name || '',\n }));\n }).flat();\n\n // for await (const page of this.csvService.readCsvInPagesFromStream(importFileStream)) {\n // // await dbService.bulkInsert(page);\n // }\n\n return {\n sampleImportedRecordInfo: wrappedRecords, // This will hold the sample data from the file\n importableFields: importableFields, // This will hold the fields that can be imported\n };\n }\n\n async startImportSync(importTransactionId: number, activeUser: ActiveUserData): Promise<ImportSyncResult> {\n // Load the import transaction for the given ID\n const importTransaction = await this.loadImportTransaction(importTransactionId);\n const modelName = upperFirst(camelCase(importTransaction.modelMetadata.singularName));\n const permissionKey = `${modelName}Controller.insertMany`;\n\n const userPermissions = activeUser.permissions ?? [];\n const hasPermission = Array.isArray(userPermissions)\n ? userPermissions.includes(permissionKey)\n : userPermissions[permissionKey] === true;\n\n if (!hasPermission) {\n throw new ForbiddenException(\n `Missing permission: ${permissionKey}`\n );\n }\n\n // Get the import file media object from the import transaction\n const importFileMediaObject = this.getImportFileObject(importTransaction);\n\n // Get the import file stream for the import transaction\n const importFileStream = await this.getImportFileStream(importFileMediaObject);\n\n const { ids, errorLogIds } = await this.importFromFileToDB(\n importTransaction,\n importFileStream,\n importFileMediaObject.mimeType,\n );\n\n // Update the import transaction status to 'completed'\n (errorLogIds.length > 0) ? importTransaction.status = ImportTransactionStatus.import_failed : importTransaction.status = ImportTransactionStatus.import_succeeded; //FIXME: We can probably have import_partially_failed status to differentiate\n // Save the import transaction\n await this.repo.save(importTransaction);\n return {\n status: importTransaction.status,\n importedIds: ids, // The IDs of the records created during the import\n importedCount: ids.length, // The number of records created during the import\n failedCount: errorLogIds.length, // The number of records that failed to import\n };\n }\n\n startImportAsync(importTransactionId: number): Promise<void> {\n throw new Error('Method not implemented.');\n }\n\n async exportFailedImportedImports(importTransactionId: number) {\n // Get the 1st error log entry to determine the headers for the export file\n const firstErrorLogEntry = await this.entityManager.getRepository(ImportTransactionErrorLog).findOne({\n where: {\n importTransaction: { id: importTransactionId },\n },\n });\n\n if (!firstErrorLogEntry) {\n throw new BadRequestException(ERROR_MESSAGES.NO_ERROR_LOG_FOR_IMPORT(importTransactionId));\n }\n\n // Create the headers for the export file\n const headers = [\n ...Object.keys(firstErrorLogEntry.rowData ? JSON.parse(firstErrorLogEntry.rowData) : {}), // Include all keys from the rowData JSON\n 'Error', // Error message for the failed record\n ];\n\n\n // Depending upon the format of the import tranaction file, create a readable stream of the error log entries\n const importTransaction = await this.loadImportTransaction(importTransactionId);\n const importFileMediaObject = this.getImportFileObject(importTransaction);\n const mimeType = importFileMediaObject.mimeType;\n const templateFormat = mimeType === ImportMimeTypes.CSV ? \"csv\" : \"excel\";\n const dataRecordsFunc = async (chunkIndex: number, chunkSize: number): Promise<any[]> => {\n // Get the error log entries for the import transaction\n const errorLogEntries = await this.entityManager.getRepository(ImportTransactionErrorLog).find({\n where: {\n importTransaction: { id: importTransactionId },\n },\n skip: chunkIndex * chunkSize,\n take: chunkSize,\n });\n\n if (!errorLogEntries || errorLogEntries.length === 0) {\n return []; // Return an empty array if no error log entries found\n }\n\n // Read the row data json from the error log entry, parse it and write it as a record to the stream\n return errorLogEntries.map(entry => {\n const rowData = entry.rowData ? JSON.parse(entry.rowData) : {};\n return {\n ...rowData, // Spread the row data into the record\n Error: entry.errorMessage,\n };\n });\n };\n\n // Get the export stream for the failed records\n const exportStream = await this.getFailedRecordsStream(templateFormat, headers, dataRecordsFunc);\n if (!exportStream) {\n throw new BadRequestException(`Failed to create export stream for import transaction ID ${importTransactionId}.`);\n }\n // Return the export stream\n const extension = templateFormat === \"excel\" ? 'xlsx' : 'csv';\n return {\n stream: exportStream,\n fileName: `${importTransaction.modelMetadata.singularName}-failed-imports.${extension}`,\n mimeType: templateFormat === \"excel\" ? ImportMimeTypes.EXCEL : ImportMimeTypes.CSV,\n };\n\n }\n\n private async getFailedRecordsStream(templateFormat: string, headers: string[], dataRecordsFunc: (chunkIndex: number, chunkSize: number) => Promise<any[]>) {\n let exportStream = null;\n switch (templateFormat) {\n case \"excel\":\n exportStream = await this.excelService.createExcelStream(dataRecordsFunc, 100, headers);\n break;\n case \"csv\":\n exportStream = await this.csvService.createCsvStream(dataRecordsFunc, 100, headers);\n break;\n default:\n throw new Error('Invalid export format');\n }\n return exportStream;\n }\n\n\n // private async loadImportTransaction(importTransactionId: number) {\n // const importTransaction = await this.findOne(importTransactionId, {\n // populate: ['modelMetadata', 'modelMetadata.fields'],\n // populateMedia: ['fileLocation'],\n // });\n // if (!importTransaction) {\n // throw new Error(`Import transaction with ID ${importTransactionId} not found.`);\n // }\n // return importTransaction;\n // }\n\n private async loadImportTransaction(importTransactionId: number) {\n // Step 1: Load the transaction with model metadata\n const importTransaction = await this.findOne(importTransactionId, {\n populate: ['modelMetadata'],\n populateMedia: ['fileLocation'],\n });\n\n // Step 2: Load full field hierarchy (child + parent fields)\n const modelFields = await this.modelMetadataHelperService.loadFieldHierarchy(\n importTransaction.modelMetadata.singularName,\n );\n\n // Step 3: Attach the combined fields back into the modelMetadata\n importTransaction.modelMetadata.fields = modelFields;\n\n return importTransaction;\n }\n\n private fieldsAllowedForImport(fields: FieldMetadata[]): FieldMetadata[] {\n // Get system field names (e.g. id, createdAt, updatedAt...)\n const systemFieldNames = this.modelMetadataHelperService\n .getSystemFieldsMetadata()\n .map(field => field.name);\n\n const userExcluded = getUserExcludedFields();\n\n // Filter out fields that are not allowed for import\n return fields.filter(field =>\n field.type !== SolidFieldType.mediaMultiple && // Exclude media multiple fields\n field.type !== SolidFieldType.mediaSingle &&\n field.type !== SolidFieldType.computed && // Exclude computed fields\n field.type !== SolidFieldType.password &&\n field.type !== SolidFieldType.richText &&\n field.type !== SolidFieldType.uuid &&\n field.relationType !== RelationType.oneToMany &&\n !systemFieldNames.includes(field.name) &&\n // field.isSystem !== true // Exclude system fields\n\n !userExcluded.includes(field.name)\n );\n }\n\n private async getFileRecordsSample(importFileStream: Readable, mimeType: string): Promise<ImportPaginatedReadResult> {\n // Depending upon the mime type of the file, read the file in pages\n // For CSV files, use the csvService to read the file in pages\n // For Excel files, use the excelService to read the file in pages\n if (mimeType === 'text/csv') {\n const generator = this.csvService.readCsvInPagesFromStream(importFileStream, { pageSize: 1 });\n const firstRecord = await generator.next(); // Get the first record to extract headers and sample data\n return firstRecord.value;\n } else if (mimeType === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {\n const generator = this.excelService.readExcelInPagesFromStream(importFileStream, { pageSize: 1 });\n const firstRecord = await generator.next(); // Get the first record to extract headers and sample data\n return firstRecord.value;\n }\n else { // If the file is neither CSV nor Excel, throw an error\n throw new Error(ERROR_MESSAGES.INVALID_FORMAT(mimeType));\n }\n }\n\n private getImportFileObject(importTransaction: ImportTransaction): MediaWithFullUrl {\n const importFileMediaObject = importTransaction['_media']['fileLocation'][0] as MediaWithFullUrl; // Since there can be only one fileLocation, we can safely access the first element\n if (!importFileMediaObject) {\n throw new Error(`Import file for transaction ID ${importTransaction.id} not found.`);\n }\n return importFileMediaObject;\n }\n\n private async getImportFileStream(importFileMediaObject: MediaWithFullUrl): Promise<Readable> {\n const fileUrl = importFileMediaObject['_full_url'];\n const mimeType = importFileMediaObject['mimeType'];\n if (!fileUrl) {\n throw new Error(`File URL ${fileUrl} not found.`);\n }\n // From the file URL, convert the file URL to a readable stream using nestjs http service and axios\n const fileUrlResponse = await this.httpService.axiosRef.get(fileUrl, {\n responseType: 'stream',\n });\n\n if (!fileUrlResponse || !fileUrlResponse.data) {\n throw new Error(ERROR_MESSAGES.FILE_READ_FAILED_FROM_URL(fileUrl));\n }\n // fileUrlResponse.data is a Node.js Readable stream\n return fileUrlResponse.data;\n }\n\n private async importFromFileToDB(\n importTransaction: ImportTransaction,\n importFileStream: Readable,\n mimeType: string,\n ): Promise<ImportRecordsResult> {\n if (!importTransaction.modelMetadata) {\n throw new Error(`Model metadata for import transaction ID ${importTransaction.id} not found.`);\n }\n\n const createdRecordIds = [];\n const createdErrorLogIds = [];\n\n // Get the model service for the model metadata name\n const modelService = this.getModelService(importTransaction.modelMetadata.singularName);\n\n // Depending upon the mime type of the file, read the file in pages and insert the records into the database\n if (mimeType === ImportMimeTypes.CSV) {\n for await (const page of this.csvService.readCsvInPagesFromStream(importFileStream)) {\n const { ids, errorLogIds } = await this.importRecords(page, importTransaction, modelService);\n createdRecordIds.push(...ids);\n createdErrorLogIds.push(...errorLogIds);\n }\n }\n else if (mimeType === ImportMimeTypes.EXCEL) {\n for await (const page of this.excelService.readExcelInPagesFromStream(importFileStream)) {\n const { ids, errorLogIds } = await this.importRecords(page, importTransaction, modelService);\n createdRecordIds.push(...ids);\n createdErrorLogIds.push(...errorLogIds);\n }\n } else { // If the file is neither CSV nor Excel, throw an error\n throw new Error(ERROR_MESSAGES.INVALID_FORMAT(mimeType));\n }\n\n return {\n ids: createdRecordIds, // Return the IDs of the created records\n errorLogIds: createdErrorLogIds, // Return the IDs of the error log entries created during the import\n }\n }\n\n private async importRecords(page: ImportPaginatedReadResult, importTransaction: ImportTransaction, modelService: CRUDService<any>): Promise<ImportRecordsResult> {\n if (!importTransaction.modelMetadata || !importTransaction.modelMetadata.fields) {\n throw new Error(`Model metadata with fields for import transaction ID ${importTransaction.id} not found.`);\n }\n\n const ids: Array<number> = [];\n const errorLogIds: Array<number> = [];\n for (const record of page.data) {\n try {\n const createdRecord = await this.insertRecord(record, JSON.parse(importTransaction.mapping) as ImportMapping[], importTransaction.modelMetadata, modelService);\n ids.push(createdRecord.id); // Add the ID of the created record to the ids array\n }\n catch (error) {\n this.logger.debug(`Error inserting record: ${JSON.stringify(record)}. Error: ${error.message}`);\n // Get the Import transaction error log repo\n const errorLog = await this.createErrorLogEntry(importTransaction, record, error);\n errorLogIds.push(errorLog.id); // Add the ID of the error log entry to the errorLogIds array\n }\n }\n return {\n ids: ids, // Return the IDs of the created records\n errorLogIds: errorLogIds, // Return the IDs of the error log entries created during the import\n };\n }\n\n async createErrorLogEntry(importTransaction: ImportTransaction, record: Record<string, any>, error: any) {\n const importTransactionRepo = this.entityManager.getRepository(ImportTransactionErrorLog);\n // Create a new ImportTransactionErrorLog entry\n const rowNumber = uuidv4(); // Generate a unique row number or use page.rowNumber if available \n\n const errorLogEntry = {\n importTransactionErrorLogId: `${importTransaction.id}-${rowNumber}`, // FIXME pending to retrieve the row number from the page\n rowNumber: 1, // FIXME pending to retrieve the row number from the page\n rowData: JSON.stringify(record), // Store the row data\n importTransaction: importTransaction, // Link to the import transaction\n errorMessage: error.message, // Store the error message\n errorTrace: error.stack || '', // Store the error stack trace if available\n } as ImportTransactionErrorLog;\n\n // Save the error log entry to the database\n const savedEntry = await importTransactionRepo.save(errorLogEntry);\n return savedEntry; // Return the ID of the saved error log entry\n }\n\n //FIXME Currently below method fails if any field in the record is not valid or if the record is not valid. It does not collect the errors for all fields in a record\n private async insertRecord(record: Record<string, any>, mapping: ImportMapping[], modelMetadataWithFields: ModelMetadata, modelService: CRUDService<any>): Promise<any> {\n // Convert the imported record to a DTO\n const dto = await this.convertImportedRecordToDto(record, mapping, modelMetadataWithFields);\n // Use the model service to create the record in the database\n const createdRecord = await modelService.create(dto, [], {}); //FIXME: Need to handle this part alongwith the refactoring of the CRUDService for permissions\n return createdRecord; // Return the created record\n }\n\n private getModelService(modelSingularName: string): CRUDService<any> {\n // Get the model service for the model metadata name\n const modelServiceWrapper = this.introspectService.getProvider(`${classify(modelSingularName)}Service`);\n const modelService = modelServiceWrapper.instance as CRUDService<any>;\n if (!modelService) {\n throw new Error(ERROR_MESSAGES.MODEL_SERVICE_NOT_FOUND(modelSingularName));\n }\n return modelService;\n }\n\n private async convertImportedRecordToDto(record: Record<string, any>, mapping: ImportMapping[], modelMetadataWithFields: ModelMetadata) {\n // Create a new record object\n const dtoRecord: Record<string, any> = {};\n\n // Iterate through every cell in the record\n // Using the saved mapping, populate the dtoRecord w.r.t the record and fields\n for (const key in record) {\n const mappedField = mapping.find(m => m.header === key);\n if (mappedField) {\n // If the field is found in the mapping, get the field metadata from the model metadata\n const fieldMetadata = modelMetadataWithFields.fields.find(f => f.name === mappedField.fieldName);\n // const userKeyField = modelMetadataWithFields.fields.find(f => f.isUserKey === true); // Assuming userKey is a field in the model metadata\n if (fieldMetadata) {\n // If the field is found in the model metadata, set the value in the dtoRecord\n await this.populateDtoForACell(dtoRecord, fieldMetadata, record, key);\n } else {\n this.logger.warn(`Field ${mappedField.fieldName} not found in model metadata ${modelMetadataWithFields.singularName}`);\n }\n }\n }\n return dtoRecord;\n }\n\n private async populateDtoForACell(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string): Promise<Record<string, any>> {\n const fieldType = fieldMetadata.type;\n // const userKeyFieldName = userKeyField?.name || 'id'; // Default to 'id' if not found\n\n // TODO Move this logic to field crud managers i.e add a parse method to the field crud manager interface\n switch (fieldType) {\n case SolidFieldType.relation: {\n return await this.populateDtoForRelations(fieldMetadata, record, key, dtoRecord);\n }\n case SolidFieldType.date:\n case SolidFieldType.datetime:\n return this.populateDtoForDate(record, key, fieldMetadata, dtoRecord);\n case SolidFieldType.int:\n case SolidFieldType.bigint:\n case SolidFieldType.decimal:\n return this.populateDtoForNumber(dtoRecord, fieldMetadata, record, key);\n case SolidFieldType.boolean:\n return this.populateDtoForBoolean(dtoRecord, fieldMetadata, record, key);\n case SolidFieldType.selectionStatic:\n case SolidFieldType.selectionDynamic:\n return this.populateDtoForSelectionValues(dtoRecord, fieldMetadata, record, key);\n case SolidFieldType.email:\n case SolidFieldType.shortText:\n case SolidFieldType.longtext:\n case SolidFieldType.richText: {\n dtoRecord[fieldMetadata.name] = record[key] ? String(record[key]).trim() : null; // Trim text fields and set to null if empty\n return dtoRecord;\n }\n default: {\n dtoRecord[fieldMetadata.name] = record[key];\n return dtoRecord;\n }\n }\n }\n\n private populateDtoForSelectionValues(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string) {\n const rawValue = record[key];\n\n if (rawValue == null || rawValue === '' || (typeof rawValue === 'string' && rawValue.trim() === '')) {\n dtoRecord[fieldMetadata.name] = null;\n return dtoRecord;\n }\n\n const isMultipleSelection = fieldMetadata.isMultiSelect;\n\n if (isMultipleSelection) {\n const selectionValues = String(rawValue)\n .split(',')\n .map(value => value.trim())\n .filter(value => value !== '');\n\n dtoRecord[fieldMetadata.name] = JSON.stringify(selectionValues);\n } else {\n dtoRecord[fieldMetadata.name] = rawValue; // Single select: assign directly\n }\n\n return dtoRecord;\n }\n\n\n private populateDtoForBoolean(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string) {\n const cellValue = record[key];\n if (cellValue === null || cellValue === undefined || cellValue === '') {\n dtoRecord[fieldMetadata.name] = null; // If the cell is empty, set the field to null\n return dtoRecord;\n }\n\n // If the cell contains values other than 'true', '1', 'yes', 'false', '0', 'no', throw an error\n const booleanValue = (String(cellValue).toLowerCase() === 'true' || String(cellValue) === '1' || String(cellValue).toLowerCase() === 'yes') ? true : (String(cellValue).toLowerCase() === 'false' || String(cellValue) === '0' || String(cellValue).toLowerCase() === 'no') ? false : null;\n if (booleanValue === null) {\n throw new Error(`Invalid boolean value for cell ${key} with value ${cellValue}`);\n }\n dtoRecord[fieldMetadata.name] = booleanValue;\n return dtoRecord;\n }\n\n private populateDtoForNumber(dtoRecord: Record<string, any>, fieldMetadata: FieldMetadata, record: Record<string, any>, key: string) {\n const cellValue = record[key];\n if (cellValue === null || cellValue === undefined || cellValue === '') {\n dtoRecord[fieldMetadata.name] = null; // If the cell is empty, set the field to null\n return dtoRecord;\n }\n const numberValue = Number(cellValue);\n if (isNaN(numberValue)) {\n throw new Error(`Invalid number value for cell ${key} with value ${record[key]}`);\n }\n dtoRecord[fieldMetadata.name] = numberValue;\n return dtoRecord;\n }\n\n private populateDtoForDate(record: Record<string, any>, key: string, fieldMetadata: FieldMetadata, dtoRecord: Record<string, any>) {\n {\n // Get the cell value\n const cellValue = record[key];\n if (!cellValue) { //If cell is a falsy value (empty)\n dtoRecord[fieldMetadata.name] = null; // If the cell is empty, set the field to null\n return dtoRecord;\n }\n // Use flexible date parser\n this.logger.verbose(cellValue, 'cellValue');\n\n const dateValue = parseFlexibleDate(cellValue);\n this.logger.verbose(dateValue, 'dateValue');\n\n if (!dateValue) {\n throw new Error(\n `Invalid date value for cell ${key} with value ${cellValue}`\n );\n }\n dtoRecord[fieldMetadata.name] = dateValue;\n return dtoRecord;\n }\n }\n\n private async populateDtoForRelations(fieldMetadata: FieldMetadata, record: Record<string, any>, key: string, dtoRecord: Record<string, any>) {\n if (!fieldMetadata.relationCoModelSingularName) {\n throw new Error(ERROR_MESSAGES.RELATION_CO_MODEL_NOT_DEFINED_FOR_FIELD(fieldMetadata.name));\n }\n\n const relatedRecordsIds = await this.getRelatedEntityIdsFromUserKeys(fieldMetadata, record, key);\n if (relatedRecordsIds.length === 0) {\n return dtoRecord; // If no related records found, return the dtoRecord as is\n }\n\n if (fieldMetadata.relationType === RelationType.manyTomany || fieldMetadata.relationType === RelationType.oneToMany) {\n dtoRecord[`${fieldMetadata.name}Ids`] = relatedRecordsIds;\n dtoRecord[`${fieldMetadata.name}Command`] = RelationFieldsCommand.set; // Reset the relation field association with the related records IDs\n }\n else if (fieldMetadata.relationType === RelationType.manyToOne) {\n dtoRecord[`${fieldMetadata.name}Id`] = relatedRecordsIds.pop(); // For many-to-one relations, we need only one ID\n }\n return dtoRecord;\n }\n\n private async getRelatedEntityIdsFromUserKeys(fieldMetadata: FieldMetadata, record: Record<string, any>, key: string): Promise<Array<number>> {\n // For many-to-many or one-to-many relations, we expect the record cell to contains a comma-separated list of userKeys\n const relationUserKeys = record[key] ? String(record[key]).split(',').map((userKey: string) => userKey.trim()) : [];\n if (relationUserKeys.length === 0) return [];\n\n const coModelService = this.getModelService(fieldMetadata.relationCoModelSingularName);\n const coModelWithUserKeyField = await this.modelMetadataService.findOneBySingularName(fieldMetadata.relationCoModelSingularName, ['userKeyField']);\n const coModelUserKeyFieldName = coModelWithUserKeyField?.userKeyField?.name || 'id'; // Default to 'id' if not found\n\n\n // Set the relation basic filter dto filters with the userkeys and call the find method of the model service to get the related records\n const relationFilterDto = {\n filters: {\n [coModelUserKeyFieldName]: {\n $in: relationUserKeys, // Use the userKeyFieldName to filter by userKeys\n },\n },\n };\n\n // From the userKeys, we will get the IDs of the related records using the userKeyFieldName and throw an error if any of the userKeys is not found\n const relatedRecordsResult = await coModelService.find(relationFilterDto);\n if (!relatedRecordsResult || !relatedRecordsResult.records || relatedRecordsResult.records.length === 0 || relatedRecordsResult.records.length !== relationUserKeys.length) {\n throw new Error(`Invalid related records userKey values found for cell ${key} with value ${record[key]}`);\n }\n const relatedRecordsIds = relatedRecordsResult.records.map(record => record.id);\n return relatedRecordsIds;\n }\n}"]}
@@ -1,12 +1,15 @@
1
1
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
2
- import { EntityManager, Repository } from 'typeorm';
2
+ import { EntityManager } from 'typeorm';
3
+ import { ConfigService } from '@nestjs/config';
4
+ import { CrudHelperService } from 'src/services/crud-helper.service';
3
5
  import { CRUDService } from 'src/services/crud.service';
6
+ import { FileService } from 'src/services/file.service';
4
7
  import { ModelMetadataService } from 'src/services/model-metadata.service';
5
8
  import { ModuleMetadataService } from 'src/services/module-metadata.service';
6
- import { ConfigService } from '@nestjs/config';
7
- import { FileService } from 'src/services/file.service';
8
- import { CrudHelperService } from 'src/services/crud-helper.service';
9
+ import { ListOfValuesRepository } from 'src/repository/list-of-values.repository';
9
10
  import { ListOfValues } from '../entities/list-of-values.entity';
11
+ import { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';
12
+ import { ListOfValuesMapper } from 'src/mappers/list-of-values-mapper';
10
13
  export declare class ListOfValuesService extends CRUDService<ListOfValues> {
11
14
  readonly modelMetadataService: ModelMetadataService;
12
15
  readonly moduleMetadataService: ModuleMetadataService;
@@ -15,11 +18,21 @@ export declare class ListOfValuesService extends CRUDService<ListOfValues> {
15
18
  readonly discoveryService: DiscoveryService;
16
19
  readonly crudHelperService: CrudHelperService;
17
20
  readonly entityManager: EntityManager;
18
- readonly repo: Repository<ListOfValues>;
21
+ readonly repo: ListOfValuesRepository;
19
22
  readonly moduleRef: ModuleRef;
20
- constructor(modelMetadataService: ModelMetadataService, moduleMetadataService: ModuleMetadataService, configService: ConfigService, fileService: FileService, discoveryService: DiscoveryService, crudHelperService: CrudHelperService, entityManager: EntityManager, repo: Repository<ListOfValues>, moduleRef: ModuleRef);
23
+ private readonly moduleMetadataHelperService;
24
+ readonly listOfValuesMapper: ListOfValuesMapper;
25
+ logger: any;
26
+ constructor(modelMetadataService: ModelMetadataService, moduleMetadataService: ModuleMetadataService, configService: ConfigService, fileService: FileService, discoveryService: DiscoveryService, crudHelperService: CrudHelperService, entityManager: EntityManager, repo: ListOfValuesRepository, moduleRef: ModuleRef, moduleMetadataHelperService: ModuleMetadataHelperService, listOfValuesMapper: ListOfValuesMapper);
21
27
  findOneByValueAndType(lovValue: string, lovType: string): Promise<ListOfValues>;
22
28
  findAll(): Promise<ListOfValues[]>;
23
29
  upsert(updateListOfValuesDto: any): Promise<any>;
30
+ saveListofValuesToConfig(entity: ListOfValues): Promise<void>;
31
+ updateListofValuesToConfig(oldentity: ListOfValues, entity: ListOfValues): Promise<void>;
32
+ deleteListOfValuesFromConfig(entity: ListOfValues): Promise<void>;
33
+ private getConfigFileDetails;
34
+ private writeToConfig;
35
+ private updateToConfig;
36
+ private deleteFromConfig;
24
37
  }
25
38
  //# sourceMappingURL=list-of-values.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-of-values.service.d.ts","sourceRoot":"","sources":["../../src/services/list-of-values.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE,qBACa,mBAAoB,SAAQ,WAAW,CAAC,YAAY,CAAC;IAE9D,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAE7C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,SAAS;gBAVpB,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAEpC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,EAC9B,SAAS,EAAE,SAAS;IAKzB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IASvD,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAIlC,MAAM,CAAC,qBAAqB,EAAE,GAAG;CAoBxC"}
1
+ {"version":3,"file":"list-of-values.service.d.ts","sourceRoot":"","sources":["../../src/services/list-of-values.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAI7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAGvE,qBACa,mBAAoB,SAAQ,WAAW,CAAC,YAAY,CAAC;IAK9D,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAG7C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAGrC,QAAQ,CAAC,IAAI,EAAE,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,2BAA2B;IAC5C,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB;IAlBjD,MAAM,EAAE,GAAG,CAAC;gBAID,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAGpC,aAAa,EAAE,aAAa,EAG5B,IAAI,EAAE,sBAAsB,EAC5B,SAAS,EAAE,SAAS,EACZ,2BAA2B,EAAE,2BAA2B,EAChE,kBAAkB,EAAE,kBAAkB;IAK3C,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IASvD,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAIlC,MAAM,CAAC,qBAAqB,EAAE,GAAG;IAqBjC,wBAAwB,CAAC,MAAM,EAAE,YAAY;IAuB7C,0BAA0B,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY;IAwBxE,4BAA4B,CAAC,MAAM,EAAE,YAAY;YAuBzC,oBAAoB;YAWpB,aAAa;YAoCb,cAAc;YAyBd,gBAAgB;CA4B/B"}