@solidstarters/solid-core 1.2.134 → 1.2.136

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 (300) hide show
  1. package/dist/controllers/ai-interaction.controller.d.ts +46 -0
  2. package/dist/controllers/ai-interaction.controller.d.ts.map +1 -0
  3. package/dist/controllers/ai-interaction.controller.js +204 -0
  4. package/dist/controllers/ai-interaction.controller.js.map +1 -0
  5. package/dist/controllers/dashboard-question-sql-dataset-config.controller.d.ts +43 -0
  6. package/dist/controllers/dashboard-question-sql-dataset-config.controller.d.ts.map +1 -0
  7. package/dist/controllers/dashboard-question-sql-dataset-config.controller.js +179 -0
  8. package/dist/controllers/dashboard-question-sql-dataset-config.controller.js.map +1 -0
  9. package/dist/controllers/dashboard-question.controller.d.ts +45 -0
  10. package/dist/controllers/dashboard-question.controller.d.ts.map +1 -0
  11. package/dist/controllers/dashboard-question.controller.js +194 -0
  12. package/dist/controllers/dashboard-question.controller.js.map +1 -0
  13. package/dist/controllers/dashboard-variable.controller.d.ts +43 -0
  14. package/dist/controllers/dashboard-variable.controller.d.ts.map +1 -0
  15. package/dist/controllers/dashboard-variable.controller.js +179 -0
  16. package/dist/controllers/dashboard-variable.controller.js.map +1 -0
  17. package/dist/controllers/dashboard.controller.d.ts +45 -0
  18. package/dist/controllers/dashboard.controller.d.ts.map +1 -0
  19. package/dist/controllers/dashboard.controller.js +192 -0
  20. package/dist/controllers/dashboard.controller.js.map +1 -0
  21. package/dist/controllers/test.controller.d.ts.map +1 -1
  22. package/dist/controllers/test.controller.js.map +1 -1
  23. package/dist/decorators/dashboard-question-data-provider.decorator.d.ts +3 -0
  24. package/dist/decorators/dashboard-question-data-provider.decorator.d.ts.map +1 -0
  25. package/dist/decorators/dashboard-question-data-provider.decorator.js +11 -0
  26. package/dist/decorators/dashboard-question-data-provider.decorator.js.map +1 -0
  27. package/dist/decorators/dashboard-selection-provider.decorator.d.ts +3 -0
  28. package/dist/decorators/dashboard-selection-provider.decorator.d.ts.map +1 -0
  29. package/dist/decorators/dashboard-selection-provider.decorator.js +11 -0
  30. package/dist/decorators/dashboard-selection-provider.decorator.js.map +1 -0
  31. package/dist/dtos/create-ai-interaction.dto.d.ts +14 -0
  32. package/dist/dtos/create-ai-interaction.dto.d.ts.map +1 -0
  33. package/dist/dtos/create-ai-interaction.dto.js +90 -0
  34. package/dist/dtos/create-ai-interaction.dto.js.map +1 -0
  35. package/dist/dtos/create-dashboard-question-sql-dataset-config.dto.d.ts +12 -0
  36. package/dist/dtos/create-dashboard-question-sql-dataset-config.dto.d.ts.map +1 -0
  37. package/dist/dtos/create-dashboard-question-sql-dataset-config.dto.js +77 -0
  38. package/dist/dtos/create-dashboard-question-sql-dataset-config.dto.js.map +1 -0
  39. package/dist/dtos/create-dashboard-question.dto.d.ts +17 -0
  40. package/dist/dtos/create-dashboard-question.dto.d.ts.map +1 -0
  41. package/dist/dtos/create-dashboard-question.dto.js +105 -0
  42. package/dist/dtos/create-dashboard-question.dto.js.map +1 -0
  43. package/dist/dtos/create-dashboard-variable.dto.d.ts +18 -0
  44. package/dist/dtos/create-dashboard-variable.dto.d.ts.map +1 -0
  45. package/dist/dtos/create-dashboard-variable.dto.js +97 -0
  46. package/dist/dtos/create-dashboard-variable.dto.js.map +1 -0
  47. package/dist/dtos/create-dashboard.dto.d.ts +15 -0
  48. package/dist/dtos/create-dashboard.dto.d.ts.map +1 -0
  49. package/dist/dtos/create-dashboard.dto.js +90 -0
  50. package/dist/dtos/create-dashboard.dto.js.map +1 -0
  51. package/dist/dtos/dashboard-variable-selection-dynamic-query.dto.d.ts +8 -0
  52. package/dist/dtos/dashboard-variable-selection-dynamic-query.dto.d.ts.map +1 -0
  53. package/dist/dtos/dashboard-variable-selection-dynamic-query.dto.js +52 -0
  54. package/dist/dtos/dashboard-variable-selection-dynamic-query.dto.js.map +1 -0
  55. package/dist/dtos/invoke-ai-prompt.dto.d.ts +4 -0
  56. package/dist/dtos/invoke-ai-prompt.dto.d.ts.map +1 -0
  57. package/dist/dtos/invoke-ai-prompt.dto.js +25 -0
  58. package/dist/dtos/invoke-ai-prompt.dto.js.map +1 -0
  59. package/dist/dtos/update-ai-interaction.dto.d.ts +15 -0
  60. package/dist/dtos/update-ai-interaction.dto.d.ts.map +1 -0
  61. package/dist/dtos/update-ai-interaction.dto.js +96 -0
  62. package/dist/dtos/update-ai-interaction.dto.js.map +1 -0
  63. package/dist/dtos/update-dashboard-question-sql-dataset-config.dto.d.ts +13 -0
  64. package/dist/dtos/update-dashboard-question-sql-dataset-config.dto.d.ts.map +1 -0
  65. package/dist/dtos/update-dashboard-question-sql-dataset-config.dto.js +86 -0
  66. package/dist/dtos/update-dashboard-question-sql-dataset-config.dto.js.map +1 -0
  67. package/dist/dtos/update-dashboard-question.dto.d.ts +18 -0
  68. package/dist/dtos/update-dashboard-question.dto.d.ts.map +1 -0
  69. package/dist/dtos/update-dashboard-question.dto.js +112 -0
  70. package/dist/dtos/update-dashboard-question.dto.js.map +1 -0
  71. package/dist/dtos/update-dashboard-variable.dto.d.ts +15 -0
  72. package/dist/dtos/update-dashboard-variable.dto.d.ts.map +1 -0
  73. package/dist/dtos/update-dashboard-variable.dto.js +95 -0
  74. package/dist/dtos/update-dashboard-variable.dto.js.map +1 -0
  75. package/dist/dtos/update-dashboard.dto.d.ts +16 -0
  76. package/dist/dtos/update-dashboard.dto.d.ts.map +1 -0
  77. package/dist/dtos/update-dashboard.dto.js +96 -0
  78. package/dist/dtos/update-dashboard.dto.js.map +1 -0
  79. package/dist/entities/ai-interaction.entity.d.ts +15 -0
  80. package/dist/entities/ai-interaction.entity.d.ts.map +1 -0
  81. package/dist/entities/ai-interaction.entity.js +70 -0
  82. package/dist/entities/ai-interaction.entity.js.map +1 -0
  83. package/dist/entities/dashboard-question-sql-dataset-config.entity.d.ts +13 -0
  84. package/dist/entities/dashboard-question-sql-dataset-config.entity.d.ts.map +1 -0
  85. package/dist/entities/dashboard-question-sql-dataset-config.entity.js +60 -0
  86. package/dist/entities/dashboard-question-sql-dataset-config.entity.js.map +1 -0
  87. package/dist/entities/dashboard-question.entity.d.ts +16 -0
  88. package/dist/entities/dashboard-question.entity.d.ts.map +1 -0
  89. package/dist/entities/dashboard-question.entity.js +71 -0
  90. package/dist/entities/dashboard-question.entity.js.map +1 -0
  91. package/dist/entities/dashboard-variable.entity.d.ts +15 -0
  92. package/dist/entities/dashboard-variable.entity.d.ts.map +1 -0
  93. package/dist/entities/dashboard-variable.entity.js +73 -0
  94. package/dist/entities/dashboard-variable.entity.js.map +1 -0
  95. package/dist/entities/dashboard.entity.d.ts +12 -0
  96. package/dist/entities/dashboard.entity.d.ts.map +1 -0
  97. package/dist/entities/dashboard.entity.js +50 -0
  98. package/dist/entities/dashboard.entity.js.map +1 -0
  99. package/dist/helpers/solid-registry.d.ts +9 -1
  100. package/dist/helpers/solid-registry.d.ts.map +1 -1
  101. package/dist/helpers/solid-registry.js +32 -0
  102. package/dist/helpers/solid-registry.js.map +1 -1
  103. package/dist/index.d.ts +10 -0
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +10 -0
  106. package/dist/index.js.map +1 -1
  107. package/dist/interfaces.d.ts +26 -1
  108. package/dist/interfaces.d.ts.map +1 -1
  109. package/dist/interfaces.js.map +1 -1
  110. package/dist/jobs/database/trigger-mcp-client-publisher-database.service.d.ts +11 -0
  111. package/dist/jobs/database/trigger-mcp-client-publisher-database.service.d.ts.map +1 -0
  112. package/dist/jobs/database/trigger-mcp-client-publisher-database.service.js +39 -0
  113. package/dist/jobs/database/trigger-mcp-client-publisher-database.service.js.map +1 -0
  114. package/dist/jobs/database/trigger-mcp-client-queue-options.d.ts +8 -0
  115. package/dist/jobs/database/trigger-mcp-client-queue-options.d.ts.map +1 -0
  116. package/dist/jobs/database/trigger-mcp-client-queue-options.js +10 -0
  117. package/dist/jobs/database/trigger-mcp-client-queue-options.js.map +1 -0
  118. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts +16 -0
  119. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -0
  120. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +71 -0
  121. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -0
  122. package/dist/mappers/dashboard-mapper.d.ts +6 -0
  123. package/dist/mappers/dashboard-mapper.d.ts.map +1 -0
  124. package/dist/mappers/dashboard-mapper.js +60 -0
  125. package/dist/mappers/dashboard-mapper.js.map +1 -0
  126. package/dist/repository/dashboard.repository.d.ts +9 -0
  127. package/dist/repository/dashboard.repository.d.ts.map +1 -0
  128. package/dist/repository/dashboard.repository.js +98 -0
  129. package/dist/repository/dashboard.repository.js.map +1 -0
  130. package/dist/seeders/module-metadata-seeder.service.d.ts +5 -1
  131. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  132. package/dist/seeders/module-metadata-seeder.service.js +18 -2
  133. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  134. package/dist/seeders/seed-data/solid-core-metadata.json +4172 -2411
  135. package/dist/services/ai-interaction.service.d.ts +31 -0
  136. package/dist/services/ai-interaction.service.d.ts.map +1 -0
  137. package/dist/services/ai-interaction.service.js +182 -0
  138. package/dist/services/ai-interaction.service.js.map +1 -0
  139. package/dist/services/chatter-message.service.d.ts.map +1 -1
  140. package/dist/services/chatter-message.service.js +8 -6
  141. package/dist/services/chatter-message.service.js.map +1 -1
  142. package/dist/services/dashboard-question-sql-dataset-config.service.d.ts +22 -0
  143. package/dist/services/dashboard-question-sql-dataset-config.service.d.ts.map +1 -0
  144. package/dist/services/dashboard-question-sql-dataset-config.service.js +56 -0
  145. package/dist/services/dashboard-question-sql-dataset-config.service.js.map +1 -0
  146. package/dist/services/dashboard-question.service.d.ts +29 -0
  147. package/dist/services/dashboard-question.service.d.ts.map +1 -0
  148. package/dist/services/dashboard-question.service.js +117 -0
  149. package/dist/services/dashboard-question.service.js.map +1 -0
  150. package/dist/services/dashboard-selection-providers/dashboard-variable-sql-dynamic-provider.service.d.ts +12 -0
  151. package/dist/services/dashboard-selection-providers/dashboard-variable-sql-dynamic-provider.service.d.ts.map +1 -0
  152. package/dist/services/dashboard-selection-providers/dashboard-variable-sql-dynamic-provider.service.js +55 -0
  153. package/dist/services/dashboard-selection-providers/dashboard-variable-sql-dynamic-provider.service.js.map +1 -0
  154. package/dist/services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service.d.ts +11 -0
  155. package/dist/services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service.d.ts.map +1 -0
  156. package/dist/services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service.js +45 -0
  157. package/dist/services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service.js.map +1 -0
  158. package/dist/services/dashboard-variable.service.d.ts +23 -0
  159. package/dist/services/dashboard-variable.service.d.ts.map +1 -0
  160. package/dist/services/dashboard-variable.service.js +57 -0
  161. package/dist/services/dashboard-variable.service.js.map +1 -0
  162. package/dist/services/dashboard.service.d.ts +38 -0
  163. package/dist/services/dashboard.service.d.ts.map +1 -0
  164. package/dist/services/dashboard.service.js +179 -0
  165. package/dist/services/dashboard.service.js.map +1 -0
  166. package/dist/services/field-metadata.service.d.ts.map +1 -1
  167. package/dist/services/field-metadata.service.js +1 -0
  168. package/dist/services/field-metadata.service.js.map +1 -1
  169. package/dist/services/import-transaction.service.d.ts +3 -1
  170. package/dist/services/import-transaction.service.d.ts.map +1 -1
  171. package/dist/services/import-transaction.service.js +22 -0
  172. package/dist/services/import-transaction.service.js.map +1 -1
  173. package/dist/services/list-of-values.service.d.ts +1 -0
  174. package/dist/services/list-of-values.service.d.ts.map +1 -1
  175. package/dist/services/list-of-values.service.js +3 -0
  176. package/dist/services/list-of-values.service.js.map +1 -1
  177. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  178. package/dist/services/menu-item-metadata.service.js +1 -1
  179. package/dist/services/menu-item-metadata.service.js.map +1 -1
  180. package/dist/services/question-data-providers/chartjs-sql-data-provider.service.d.ts +36 -0
  181. package/dist/services/question-data-providers/chartjs-sql-data-provider.service.d.ts.map +1 -0
  182. package/dist/services/question-data-providers/chartjs-sql-data-provider.service.js +89 -0
  183. package/dist/services/question-data-providers/chartjs-sql-data-provider.service.js.map +1 -0
  184. package/dist/services/question-data-providers/helpers.d.ts +7 -0
  185. package/dist/services/question-data-providers/helpers.d.ts.map +1 -0
  186. package/dist/services/question-data-providers/helpers.js +25 -0
  187. package/dist/services/question-data-providers/helpers.js.map +1 -0
  188. package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.d.ts +17 -0
  189. package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.d.ts.map +1 -0
  190. package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.js +70 -0
  191. package/dist/services/question-data-providers/prime-react-datatable-sql-data-provider.service.js.map +1 -0
  192. package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.d.ts +19 -0
  193. package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.d.ts.map +1 -0
  194. package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.js +92 -0
  195. package/dist/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.js.map +1 -0
  196. package/dist/services/queues/publisher-factory.service.js +1 -1
  197. package/dist/services/queues/publisher-factory.service.js.map +1 -1
  198. package/dist/services/scheduled-jobs/scheduler.service.d.ts.map +1 -1
  199. package/dist/services/scheduled-jobs/scheduler.service.js +22 -11
  200. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  201. package/dist/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.d.ts +11 -0
  202. package/dist/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.d.ts.map +1 -0
  203. package/dist/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.js +46 -0
  204. package/dist/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.js.map +1 -0
  205. package/dist/services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service.d.ts +11 -0
  206. package/dist/services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service.d.ts.map +1 -0
  207. package/dist/services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service.js +47 -0
  208. package/dist/services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service.js.map +1 -0
  209. package/dist/services/solid-introspect.service.d.ts +2 -0
  210. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  211. package/dist/services/solid-introspect.service.js +28 -0
  212. package/dist/services/solid-introspect.service.js.map +1 -1
  213. package/dist/services/sql-expression-resolver.service.d.ts +9 -0
  214. package/dist/services/sql-expression-resolver.service.d.ts.map +1 -0
  215. package/dist/services/sql-expression-resolver.service.js +105 -0
  216. package/dist/services/sql-expression-resolver.service.js.map +1 -0
  217. package/dist/solid-core.module.d.ts.map +1 -1
  218. package/dist/solid-core.module.js +75 -1
  219. package/dist/solid-core.module.js.map +1 -1
  220. package/dist/subscribers/dashboard-question-sql-dataset-config.subscriber.d.ts +16 -0
  221. package/dist/subscribers/dashboard-question-sql-dataset-config.subscriber.d.ts.map +1 -0
  222. package/dist/subscribers/dashboard-question-sql-dataset-config.subscriber.js +72 -0
  223. package/dist/subscribers/dashboard-question-sql-dataset-config.subscriber.js.map +1 -0
  224. package/dist/subscribers/dashboard-question.subscriber.d.ts +16 -0
  225. package/dist/subscribers/dashboard-question.subscriber.d.ts.map +1 -0
  226. package/dist/subscribers/dashboard-question.subscriber.js +72 -0
  227. package/dist/subscribers/dashboard-question.subscriber.js.map +1 -0
  228. package/dist/subscribers/dashboard-variable.subscriber.d.ts +16 -0
  229. package/dist/subscribers/dashboard-variable.subscriber.d.ts.map +1 -0
  230. package/dist/subscribers/dashboard-variable.subscriber.js +72 -0
  231. package/dist/subscribers/dashboard-variable.subscriber.js.map +1 -0
  232. package/dist/subscribers/dashboard.subscriber.d.ts +15 -0
  233. package/dist/subscribers/dashboard.subscriber.d.ts.map +1 -0
  234. package/dist/subscribers/dashboard.subscriber.js +56 -0
  235. package/dist/subscribers/dashboard.subscriber.js.map +1 -0
  236. package/dist/tsconfig.tsbuildinfo +1 -1
  237. package/package.json +1 -1
  238. package/src/controllers/ai-interaction.controller.ts +104 -0
  239. package/src/controllers/dashboard-question-sql-dataset-config.controller.ts +93 -0
  240. package/src/controllers/dashboard-question.controller.ts +104 -0
  241. package/src/controllers/dashboard-variable.controller.ts +93 -0
  242. package/src/controllers/dashboard.controller.ts +99 -0
  243. package/src/controllers/test.controller.ts +1 -2
  244. package/src/decorators/dashboard-question-data-provider.decorator.ts +7 -0
  245. package/src/decorators/dashboard-selection-provider.decorator.ts +7 -0
  246. package/src/dtos/create-ai-interaction.dto.ts +60 -0
  247. package/src/dtos/create-dashboard-question-sql-dataset-config.dto.ts +42 -0
  248. package/src/dtos/create-dashboard-question.dto.ts +63 -0
  249. package/src/dtos/create-dashboard-variable.dto.ts +56 -0
  250. package/src/dtos/create-dashboard.dto.ts +53 -0
  251. package/src/dtos/dashboard-variable-selection-dynamic-query.dto.ts +29 -0
  252. package/src/dtos/invoke-ai-prompt.dto.ts +6 -0
  253. package/src/dtos/update-ai-interaction.dto.ts +65 -0
  254. package/src/dtos/update-dashboard-question-sql-dataset-config.dto.ts +49 -0
  255. package/src/dtos/update-dashboard-question.dto.ts +68 -0
  256. package/src/dtos/update-dashboard-variable.dto.ts +54 -0
  257. package/src/dtos/update-dashboard.dto.ts +57 -0
  258. package/src/entities/ai-interaction.entity.ts +39 -0
  259. package/src/entities/dashboard-question-sql-dataset-config.entity.ts +25 -0
  260. package/src/entities/dashboard-question.entity.ts +33 -0
  261. package/src/entities/dashboard-variable.entity.ts +30 -0
  262. package/src/entities/dashboard.entity.ts +21 -0
  263. package/src/helpers/solid-registry.ts +44 -2
  264. package/src/index.ts +10 -2
  265. package/src/interfaces.ts +57 -29
  266. package/src/jobs/database/trigger-mcp-client-publisher-database.service.ts +22 -0
  267. package/src/jobs/database/trigger-mcp-client-queue-options.ts +9 -0
  268. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +71 -0
  269. package/src/mappers/dashboard-mapper.ts +52 -0
  270. package/src/repository/dashboard.repository.ts +101 -0
  271. package/src/seeders/module-metadata-seeder.service.ts +21 -1
  272. package/src/seeders/seed-data/solid-core-metadata.json +4175 -2414
  273. package/src/services/ai-interaction.service.ts +163 -0
  274. package/src/services/chatter-message.service.ts +12 -6
  275. package/src/services/dashboard-question-sql-dataset-config.service.ts +34 -0
  276. package/src/services/dashboard-question.service.ts +115 -0
  277. package/src/services/dashboard-selection-providers/dashboard-variable-sql-dynamic-provider.service.ts +56 -0
  278. package/src/services/dashboard-selection-providers/dashboard-variable-test-dynamic-provider.service.ts +37 -0
  279. package/src/services/dashboard-variable.service.ts +36 -0
  280. package/src/services/dashboard.service.ts +147 -0
  281. package/src/services/field-metadata.service.ts +1 -0
  282. package/src/services/import-transaction.service.ts +29 -1
  283. package/src/services/list-of-values.service.ts +5 -0
  284. package/src/services/menu-item-metadata.service.ts +2 -1
  285. package/src/services/question-data-providers/chartjs-sql-data-provider.service.ts +125 -0
  286. package/src/services/question-data-providers/helpers.ts +30 -0
  287. package/src/services/question-data-providers/prime-react-datatable-sql-data-provider.service.ts +78 -0
  288. package/src/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.ts +119 -0
  289. package/src/services/question-data-providers/test.sql +1 -0
  290. package/src/services/queues/publisher-factory.service.ts +1 -1
  291. package/src/services/scheduled-jobs/scheduler.service.ts +32 -64
  292. package/src/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.ts +41 -0
  293. package/src/services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service.ts +41 -0
  294. package/src/services/solid-introspect.service.ts +42 -0
  295. package/src/services/sql-expression-resolver.service.ts +125 -0
  296. package/src/solid-core.module.ts +77 -2
  297. package/src/subscribers/dashboard-question-sql-dataset-config.subscriber.ts +61 -0
  298. package/src/subscribers/dashboard-question.subscriber.ts +62 -0
  299. package/src/subscribers/dashboard-variable.subscriber.ts +63 -0
  300. package/src/subscribers/dashboard.subscriber.ts +43 -0
@@ -0,0 +1,17 @@
1
+ import { DashboardQuestion } from "src/entities/dashboard-question.entity";
2
+ import { IDashboardQuestionDataProvider } from "src/interfaces";
3
+ import { EntityManager } from "typeorm";
4
+ import { SqlExpressionResolverService } from "../sql-expression-resolver.service";
5
+ import { SqlExpression } from "./chartjs-sql-data-provider.service";
6
+ export interface QuestionSqlDataProviderContext {
7
+ }
8
+ export declare class PrimeReactDatatableSqlDataProvider implements IDashboardQuestionDataProvider<QuestionSqlDataProviderContext, any> {
9
+ private readonly entityManager;
10
+ private readonly sqlExpressionResolver;
11
+ private readonly logger;
12
+ constructor(entityManager: EntityManager, sqlExpressionResolver: SqlExpressionResolverService);
13
+ help(): string;
14
+ name(): string;
15
+ getData(question: DashboardQuestion, expressions?: SqlExpression[], context?: QuestionSqlDataProviderContext): Promise<any>;
16
+ }
17
+ //# sourceMappingURL=prime-react-datatable-sql-data-provider.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prime-react-datatable-sql-data-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/question-data-providers/prime-react-datatable-sql-data-provider.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAGpE,MAAM,WAAW,8BAA8B;CAI9C;AAED,qBAEa,kCAAmC,YAAW,8BAA8B,CAAC,8BAA8B,EAAE,GAAG,CAAC;IAG9G,OAAO,CAAC,QAAQ,CAAC,aAAa;IAAiB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAFjG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuD;gBAEjD,aAAa,EAAE,aAAa,EAAmB,qBAAqB,EAAE,4BAA4B;IAE/H,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAIR,OAAO,CAAC,QAAQ,EAAE,iBAAiB,EAAE,WAAW,CAAC,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,8BAA8B,GAAG,OAAO,CAAC,GAAG,CAAC;CA8CpI"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var PrimeReactDatatableSqlDataProvider_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.PrimeReactDatatableSqlDataProvider = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const dashboard_question_data_provider_decorator_1 = require("../../decorators/dashboard-question-data-provider.decorator");
16
+ const typeorm_1 = require("typeorm");
17
+ const sql_expression_resolver_service_1 = require("../sql-expression-resolver.service");
18
+ const common_2 = require("@nestjs/common");
19
+ const helpers_1 = require("./helpers");
20
+ let PrimeReactDatatableSqlDataProvider = PrimeReactDatatableSqlDataProvider_1 = class PrimeReactDatatableSqlDataProvider {
21
+ constructor(entityManager, sqlExpressionResolver) {
22
+ this.entityManager = entityManager;
23
+ this.sqlExpressionResolver = sqlExpressionResolver;
24
+ this.logger = new common_2.Logger(PrimeReactDatatableSqlDataProvider_1.name);
25
+ }
26
+ help() {
27
+ return "Provides data for dashboard questions using a SQL dataset configuration. Configure your SQL dataset in the admin panel, then reference it in your dashboard question to fetch data.";
28
+ }
29
+ name() {
30
+ return "PrimeReactDatatableSqlDataProvider";
31
+ }
32
+ async getData(question, expressions, context) {
33
+ const kpi = await (0, helpers_1.getKpi)(question, expressions, this.entityManager, this.sqlExpressionResolver);
34
+ const labelSql = question.labelSql;
35
+ const labelResults = await this.entityManager.query(labelSql);
36
+ const columns = [];
37
+ for (let i = 0; i < labelResults.length; i++) {
38
+ const labelResult = labelResults[i];
39
+ columns.push({
40
+ field: labelResult['field'],
41
+ header: labelResult['header'],
42
+ });
43
+ }
44
+ const values = [];
45
+ const questionSqlDatasetConfig = question.questionSqlDatasetConfigs[0];
46
+ const sql = questionSqlDatasetConfig.sql;
47
+ if (!sql) {
48
+ throw new Error(`SQL dataset ${questionSqlDatasetConfig.datasetName} configuration does not contain a valid SQL query.`);
49
+ }
50
+ const sqlReplacementResult = this.sqlExpressionResolver.resolveSqlWithExpressions(sql, expressions || []);
51
+ this.logger.debug(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is query=[${sqlReplacementResult.rawSql}]`);
52
+ this.logger.debug(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is parameters=[${JSON.stringify(sqlReplacementResult.parameters)}]`);
53
+ const results = await this.entityManager.query(sqlReplacementResult.rawSql, sqlReplacementResult.parameters);
54
+ return {
55
+ kpi,
56
+ visualisedAs: question.visualisedAs,
57
+ visualizationData: {
58
+ columns,
59
+ rows: results,
60
+ }
61
+ };
62
+ }
63
+ };
64
+ exports.PrimeReactDatatableSqlDataProvider = PrimeReactDatatableSqlDataProvider;
65
+ exports.PrimeReactDatatableSqlDataProvider = PrimeReactDatatableSqlDataProvider = PrimeReactDatatableSqlDataProvider_1 = __decorate([
66
+ (0, dashboard_question_data_provider_decorator_1.DashboardQuestionDataProvider)(),
67
+ (0, common_1.Injectable)(),
68
+ __metadata("design:paramtypes", [typeorm_1.EntityManager, sql_expression_resolver_service_1.SqlExpressionResolverService])
69
+ ], PrimeReactDatatableSqlDataProvider);
70
+ //# sourceMappingURL=prime-react-datatable-sql-data-provider.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prime-react-datatable-sql-data-provider.service.js","sourceRoot":"","sources":["../../../src/services/question-data-providers/prime-react-datatable-sql-data-provider.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,4HAA0G;AAG1G,qCAAwC;AACxC,wFAAkF;AAClF,2CAAwC;AAExC,uCAAmC;AAU5B,IAAM,kCAAkC,0CAAxC,MAAM,kCAAkC;IAG3C,YAA6B,aAA4B,EAAmB,qBAAmD;QAAlG,kBAAa,GAAb,aAAa,CAAe;QAAmB,0BAAqB,GAArB,qBAAqB,CAA8B;QAF9G,WAAM,GAAG,IAAI,eAAM,CAAC,oCAAkC,CAAC,IAAI,CAAC,CAAC;IAEqD,CAAC;IAEpI,IAAI;QACA,OAAO,qLAAqL,CAAC;IACjM,CAAC;IAED,IAAI;QACA,OAAO,oCAAoC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAA2B,EAAE,WAA6B,EAAE,OAAwC;QAK9G,MAAM,GAAG,GAAW,MAAM,IAAA,gBAAM,EAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAExG,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC;gBAC3B,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC;aAChC,CAAC,CAAC;QACP,CAAC;QAKD,MAAM,MAAM,GAAG,EAAE,CAAA;QAGjB,MAAM,wBAAwB,GAAG,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC;QAEvE,MAAM,GAAG,GAAG,wBAAwB,CAAC,GAAG,CAAC;QACzC,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,eAAe,wBAAwB,CAAC,WAAW,oDAAoD,CAAC,CAAC;QAC7H,CAAC;QAED,MAAM,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,GAAG,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;QAC1G,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,wBAAwB,CAAC,WAAW,eAAe,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;QACrI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,wBAAwB,CAAC,WAAW,oBAAoB,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9J,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAE7G,OAAO;YACH,GAAG;YACH,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,iBAAiB,EAAE;gBACf,OAAO;gBACP,IAAI,EAAE,OAAO;aAChB;SACJ,CAAC;IAEN,CAAC;CACJ,CAAA;AA3DY,gFAAkC;6CAAlC,kCAAkC;IAF9C,IAAA,0EAA6B,GAAE;IAC/B,IAAA,mBAAU,GAAE;qCAImC,uBAAa,EAA0C,8DAA4B;GAHtH,kCAAkC,CA2D9C","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DashboardQuestionDataProvider } from \"src/decorators/dashboard-question-data-provider.decorator\";\nimport { DashboardQuestion } from \"src/entities/dashboard-question.entity\";\nimport { IDashboardQuestionDataProvider } from \"src/interfaces\";\nimport { EntityManager } from \"typeorm\";\nimport { SqlExpressionResolverService } from \"../sql-expression-resolver.service\";\nimport { Logger } from '@nestjs/common';\nimport { SqlExpression } from \"./chartjs-sql-data-provider.service\";\nimport { getKpi } from \"./helpers\";\n\nexport interface QuestionSqlDataProviderContext {\n // questionSqlDatasetConfig: QuestionSqlDatasetConfig;\n // questionId: number;\n // question: Question;\n}\n\n@DashboardQuestionDataProvider()\n@Injectable()\nexport class PrimeReactDatatableSqlDataProvider implements IDashboardQuestionDataProvider<QuestionSqlDataProviderContext, any> {\n private readonly logger = new Logger(PrimeReactDatatableSqlDataProvider.name);\n\n constructor(private readonly entityManager: EntityManager, private readonly sqlExpressionResolver: SqlExpressionResolverService) { }\n\n help(): string {\n return \"Provides data for dashboard questions using a SQL dataset configuration. Configure your SQL dataset in the admin panel, then reference it in your dashboard question to fetch data.\";\n }\n\n name(): string {\n return \"PrimeReactDatatableSqlDataProvider\";\n }\n\n async getData(question: DashboardQuestion, expressions?: SqlExpression[], context?: QuestionSqlDataProviderContext): Promise<any> {\n // TODO: put some validation to check if the results of each SQL in each dataset returns the same number of rows \n\n // Check the expected response for prime react data tables to understand what is going on here...\n\n const kpi: string = await getKpi(question, expressions, this.entityManager, this.sqlExpressionResolver);\n // TODO: Load the set of labels by using a separate field on the question entity.\n const labelSql = question.labelSql;\n const labelResults = await this.entityManager.query(labelSql);\n const columns = [];\n for (let i = 0; i < labelResults.length; i++) {\n const labelResult = labelResults[i];\n columns.push({\n field: labelResult['field'],\n header: labelResult['header'],\n });\n }\n\n // Load the chart options as a JSON \n // const chartOptions = JSON.parse(question.barChartLabelOptions || '{}');\n\n const values = []\n\n // For meter group we can assume that we only have one sql dataset config.\n const questionSqlDatasetConfig = question.questionSqlDatasetConfigs[0];\n\n const sql = questionSqlDatasetConfig.sql;\n if (!sql) {\n throw new Error(`SQL dataset ${questionSqlDatasetConfig.datasetName} configuration does not contain a valid SQL query.`);\n }\n\n const sqlReplacementResult = this.sqlExpressionResolver.resolveSqlWithExpressions(sql, expressions || []);\n this.logger.debug(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is query=[${sqlReplacementResult.rawSql}]`);\n this.logger.debug(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is parameters=[${JSON.stringify(sqlReplacementResult.parameters)}]`);\n const results = await this.entityManager.query(sqlReplacementResult.rawSql, sqlReplacementResult.parameters);\n\n return {\n kpi,\n visualisedAs: question.visualisedAs,\n visualizationData: {\n columns,\n rows: results,\n }\n };\n\n }\n}"]}
@@ -0,0 +1,19 @@
1
+ import { DashboardQuestion } from "src/entities/dashboard-question.entity";
2
+ import { IDashboardQuestionDataProvider } from "src/interfaces";
3
+ import { EntityManager } from "typeorm";
4
+ import { SqlExpressionResolverService } from "../sql-expression-resolver.service";
5
+ import { SqlExpression } from "./chartjs-sql-data-provider.service";
6
+ export interface QuestionSqlDataProviderContext {
7
+ }
8
+ export declare class PrimeReactMeterGroupSqlDataProvider implements IDashboardQuestionDataProvider<QuestionSqlDataProviderContext, any> {
9
+ private readonly entityManager;
10
+ private readonly sqlExpressionResolver;
11
+ private readonly logger;
12
+ constructor(entityManager: EntityManager, sqlExpressionResolver: SqlExpressionResolverService);
13
+ help(): string;
14
+ name(): string;
15
+ hslToHex(h: number, s: number, l: number): string;
16
+ generateDistinctColors(count: number): string[];
17
+ getData(question: DashboardQuestion, expressions?: SqlExpression[], context?: QuestionSqlDataProviderContext): Promise<any>;
18
+ }
19
+ //# sourceMappingURL=prime-react-meter-group-sql-data-provider.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prime-react-meter-group-sql-data-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAGpE,MAAM,WAAW,8BAA8B;CAI9C;AAED,qBAEa,mCAAoC,YAAW,8BAA8B,CAAC,8BAA8B,EAAE,GAAG,CAAC;IAG/G,OAAO,CAAC,QAAQ,CAAC,aAAa;IAAiB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAFjG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwD;gBAElD,aAAa,EAAE,aAAa,EAAmB,qBAAqB,EAAE,4BAA4B;IAE/H,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAId,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAcjD,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAezC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,EAAE,WAAW,CAAC,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,8BAA8B,GAAG,OAAO,CAAC,GAAG,CAAC;CA0DpI"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var PrimeReactMeterGroupSqlDataProvider_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.PrimeReactMeterGroupSqlDataProvider = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const dashboard_question_data_provider_decorator_1 = require("../../decorators/dashboard-question-data-provider.decorator");
16
+ const typeorm_1 = require("typeorm");
17
+ const sql_expression_resolver_service_1 = require("../sql-expression-resolver.service");
18
+ const common_2 = require("@nestjs/common");
19
+ const helpers_1 = require("./helpers");
20
+ let PrimeReactMeterGroupSqlDataProvider = PrimeReactMeterGroupSqlDataProvider_1 = class PrimeReactMeterGroupSqlDataProvider {
21
+ constructor(entityManager, sqlExpressionResolver) {
22
+ this.entityManager = entityManager;
23
+ this.sqlExpressionResolver = sqlExpressionResolver;
24
+ this.logger = new common_2.Logger(PrimeReactMeterGroupSqlDataProvider_1.name);
25
+ }
26
+ help() {
27
+ return "Provides data for dashboard questions using a SQL dataset configuration. Configure your SQL dataset in the admin panel, then reference it in your dashboard question to fetch data.";
28
+ }
29
+ name() {
30
+ return "PrimeReactMeterGroupSqlDataProvider";
31
+ }
32
+ hslToHex(h, s, l) {
33
+ l /= 100;
34
+ s /= 100;
35
+ const k = (n) => (n + h / 30) % 12;
36
+ const a = s * Math.min(l, 1 - l);
37
+ const f = (n) => Math.round(255 * (l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)))));
38
+ return `#${f(0).toString(16).padStart(2, '0')}${f(8).toString(16).padStart(2, '0')}${f(4)
39
+ .toString(16)
40
+ .padStart(2, '0')}`;
41
+ }
42
+ generateDistinctColors(count) {
43
+ const colors = [];
44
+ const hueStep = 360 / count;
45
+ const saturation = 65;
46
+ const lightness = 55;
47
+ for (let i = 0; i < count; i++) {
48
+ const hue = Math.round(i * hueStep);
49
+ colors.push(this.hslToHex(hue, saturation, lightness));
50
+ }
51
+ return colors;
52
+ }
53
+ async getData(question, expressions, context) {
54
+ const kpi = await (0, helpers_1.getKpi)(question, expressions, this.entityManager, this.sqlExpressionResolver);
55
+ const chartOptions = JSON.parse(question.chartOptions || '{}');
56
+ const values = [];
57
+ const questionSqlDatasetConfig = question.questionSqlDatasetConfigs[0];
58
+ const sql = questionSqlDatasetConfig.sql;
59
+ if (!sql) {
60
+ throw new Error(`SQL dataset ${questionSqlDatasetConfig.datasetName} configuration does not contain a valid SQL query.`);
61
+ }
62
+ const sqlReplacementResult = this.sqlExpressionResolver.resolveSqlWithExpressions(sql, expressions || []);
63
+ this.logger.debug(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is query=[${sqlReplacementResult.rawSql}]`);
64
+ this.logger.debug(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is parameters=[${JSON.stringify(sqlReplacementResult.parameters)}]`);
65
+ const results = await this.entityManager.query(sqlReplacementResult.rawSql, sqlReplacementResult.parameters);
66
+ const colors = this.generateDistinctColors(results.length);
67
+ for (let i = 0; i < results.length; i++) {
68
+ const result = results[i];
69
+ const colorFromChartOptions = chartOptions?.colors?.[result[questionSqlDatasetConfig.labelColumnName]];
70
+ const color = typeof colorFromChartOptions === 'string' ? colorFromChartOptions : colors[i];
71
+ values.push({
72
+ label: result[questionSqlDatasetConfig.labelColumnName],
73
+ color: color,
74
+ value: result[questionSqlDatasetConfig.valueColumnName]
75
+ });
76
+ }
77
+ return {
78
+ kpi,
79
+ visualizedAs: question.visualisedAs,
80
+ visualizationData: {
81
+ dataset: values
82
+ },
83
+ };
84
+ }
85
+ };
86
+ exports.PrimeReactMeterGroupSqlDataProvider = PrimeReactMeterGroupSqlDataProvider;
87
+ exports.PrimeReactMeterGroupSqlDataProvider = PrimeReactMeterGroupSqlDataProvider = PrimeReactMeterGroupSqlDataProvider_1 = __decorate([
88
+ (0, dashboard_question_data_provider_decorator_1.DashboardQuestionDataProvider)(),
89
+ (0, common_1.Injectable)(),
90
+ __metadata("design:paramtypes", [typeorm_1.EntityManager, sql_expression_resolver_service_1.SqlExpressionResolverService])
91
+ ], PrimeReactMeterGroupSqlDataProvider);
92
+ //# sourceMappingURL=prime-react-meter-group-sql-data-provider.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prime-react-meter-group-sql-data-provider.service.js","sourceRoot":"","sources":["../../../src/services/question-data-providers/prime-react-meter-group-sql-data-provider.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DashboardQuestionDataProvider } from \"src/decorators/dashboard-question-data-provider.decorator\";\nimport { DashboardQuestion } from \"src/entities/dashboard-question.entity\";\nimport { IDashboardQuestionDataProvider } from \"src/interfaces\";\nimport { EntityManager } from \"typeorm\";\nimport { SqlExpressionResolverService } from \"../sql-expression-resolver.service\";\nimport { Logger } from '@nestjs/common';\nimport { SqlExpression } from \"./chartjs-sql-data-provider.service\";\nimport { getKpi } from \"./helpers\";\n\nexport interface QuestionSqlDataProviderContext {\n // questionSqlDatasetConfig: QuestionSqlDatasetConfig;\n // questionId: number;\n // question: Question;\n}\n\n@DashboardQuestionDataProvider()\n@Injectable()\nexport class PrimeReactMeterGroupSqlDataProvider implements IDashboardQuestionDataProvider<QuestionSqlDataProviderContext, any> {\n private readonly logger = new Logger(PrimeReactMeterGroupSqlDataProvider.name);\n\n constructor(private readonly entityManager: EntityManager, private readonly sqlExpressionResolver: SqlExpressionResolverService) { }\n\n help(): string {\n return \"Provides data for dashboard questions using a SQL dataset configuration. Configure your SQL dataset in the admin panel, then reference it in your dashboard question to fetch data.\";\n }\n\n name(): string {\n return \"PrimeReactMeterGroupSqlDataProvider\";\n }\n\n hslToHex(h: number, s: number, l: number): string {\n l /= 100;\n s /= 100;\n\n const k = (n: number) => (n + h / 30) % 12;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) =>\n Math.round(255 * (l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)))));\n\n return `#${f(0).toString(16).padStart(2, '0')}${f(8).toString(16).padStart(2, '0')}${f(4)\n .toString(16)\n .padStart(2, '0')}`;\n }\n\n generateDistinctColors(count: number): string[] {\n const colors: string[] = [];\n\n const hueStep = 360 / count;\n const saturation = 65; // keep it vibrant\n const lightness = 55; // balanced for both light/dark themes\n\n for (let i = 0; i < count; i++) {\n const hue = Math.round(i * hueStep);\n colors.push(this.hslToHex(hue, saturation, lightness));\n }\n\n return colors;\n }\n\n async getData(question: DashboardQuestion, expressions?: SqlExpression[], context?: QuestionSqlDataProviderContext): Promise<any> {\n // TODO: put some validation to check if the results of each SQL in each dataset returns the same number of rows \n\n // This is what we have to return.\n // const values = [\n // { label: 'Apps', color: '#34d399', value: 16 },\n // { label: 'Messages', color: '#fbbf24', value: 8 },\n // { label: 'Media', color: '#60a5fa', value: 24 },\n // { label: 'System', color: '#c084fc', value: 10 }\n // ];\n\n // TODO: Load the set of labels by using a separate field on the question entity.\n\n const kpi: string = await getKpi(question, expressions, this.entityManager, this.sqlExpressionResolver);\n \n // Load the chart options as a JSON \n const chartOptions = JSON.parse(question.chartOptions || '{}');\n\n const values = []\n\n // For meter group we can assume that we only have one sql dataset config.\n const questionSqlDatasetConfig = question.questionSqlDatasetConfigs[0];\n\n const sql = questionSqlDatasetConfig.sql;\n if (!sql) {\n throw new Error(`SQL dataset ${questionSqlDatasetConfig.datasetName} configuration does not contain a valid SQL query.`);\n }\n\n const sqlReplacementResult = this.sqlExpressionResolver.resolveSqlWithExpressions(sql, expressions || []);\n this.logger.debug(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is query=[${sqlReplacementResult.rawSql}]`);\n this.logger.debug(`Final Sql query for dataset [${questionSqlDatasetConfig.datasetName}] is parameters=[${JSON.stringify(sqlReplacementResult.parameters)}]`);\n const results = await this.entityManager.query(sqlReplacementResult.rawSql, sqlReplacementResult.parameters);\n\n const colors = this.generateDistinctColors(results.length);\n\n // Also for each data set we create the dataset object as is expected by ChartJs.\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n\n const colorFromChartOptions = chartOptions?.colors?.[result[questionSqlDatasetConfig.labelColumnName]];\n const color = typeof colorFromChartOptions === 'string' ? colorFromChartOptions : colors[i];\n\n values.push({\n label: result[questionSqlDatasetConfig.labelColumnName],\n color: color,\n value: result[questionSqlDatasetConfig.valueColumnName]\n })\n }\n\n return {\n kpi,\n visualizedAs: question.visualisedAs,\n visualizationData: {\n dataset: values\n },\n };\n\n }\n}"]}
@@ -21,7 +21,7 @@ let PublisherFactory = PublisherFactory_1 = class PublisherFactory {
21
21
  this.logger = new common_1.Logger(PublisherFactory_1.name);
22
22
  }
23
23
  async publish(message, publisherName, brokerToUse) {
24
- let defaultBrokerToUse = brokerToUse || process.env.QUEUES_DEFAULT_BROKER;
24
+ let defaultBrokerToUse = brokerToUse || process.env.QUEUES_DEFAULT_BROKER || "database";
25
25
  let resolvedPublisherName = `${publisherName}${(0, strings_1.classify)(defaultBrokerToUse)}`;
26
26
  let actualPublisherToUse = this.solidIntrospectionService.getProvider(resolvedPublisherName);
27
27
  if (!actualPublisherToUse) {
@@ -1 +1 @@
1
- {"version":3,"file":"publisher-factory.service.js","sourceRoot":"","sources":["../../../src/services/queues/publisher-factory.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAwC;AACxC,2CAA4C;AAG5C,oEAAkE;AAClE,0EAAqE;AAI9D,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAGzB,YACqB,yBAAiD;QAAjD,8BAAyB,GAAzB,yBAAyB,CAAwB;QAHrD,WAAM,GAAG,IAAI,eAAM,CAAC,kBAAgB,CAAC,IAAI,CAAC,CAAC;IAK5D,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAwB,EAAE,aAAqB,EAAE,WAAoB;QAC/E,IAAI,kBAAkB,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;QAC1E,IAAI,qBAAqB,GAAG,GAAG,aAAa,GAAG,IAAA,kBAAQ,EAAC,kBAAkB,CAAC,EAAE,CAAC;QAG9E,IAAI,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;QAC7F,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAGxB,IAAI,kBAAkB,KAAK,UAAU,EAAE,CAAC;gBACpC,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;gBACjF,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBACxB,MAAM,IAAI,KAAK,CAAC,wCAAwC,qBAAqB,EAAE,CAAC,CAAC;gBACrF,CAAC;YACL,CAAC;QACL,CAAC;QAGD,MAAM,oBAAoB,GAAsB,oBAAoB,CAAC,QAAQ,CAAC;QAC9E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,oBAAoB,CAAC,IAAI,sBAAsB,oBAAoB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAEnI,OAAO,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;CACJ,CAAA;AA/BY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;qCAKuC,iDAAsB;GAJ7D,gBAAgB,CA+B5B","sourcesContent":["import { Logger } from '@nestjs/common';\nimport { Injectable } from '@nestjs/common';\n\nimport { QueueMessage, QueuePublisher } from 'src/interfaces/mq';\nimport { classify } from '@angular-devkit/core/src/utils/strings';\nimport { SolidIntrospectService } from '../solid-introspect.service';\n\n\n@Injectable()\nexport class PublisherFactory<T> {\n private readonly logger = new Logger(PublisherFactory.name);\n\n constructor(\n private readonly solidIntrospectionService: SolidIntrospectService\n ) {\n }\n\n async publish(message: QueueMessage<T>, publisherName: string, brokerToUse?: string): Promise<string> {\n let defaultBrokerToUse = brokerToUse || process.env.QUEUES_DEFAULT_BROKER;\n let resolvedPublisherName = `${publisherName}${classify(defaultBrokerToUse)}`;\n\n // Register all ISolidDatabaseModules implementations\n let actualPublisherToUse = this.solidIntrospectionService.getProvider(resolvedPublisherName);\n if (!actualPublisherToUse) {\n\n // Extra check in place to make sure we do not have to refactor old publishers which have been created earlier. \n if (defaultBrokerToUse === 'rabbitmq') {\n actualPublisherToUse = this.solidIntrospectionService.getProvider(publisherName);\n if (!actualPublisherToUse) {\n throw new Error(`Unable to locate publisher with name ${resolvedPublisherName}`);\n }\n }\n }\n\n // type safe\n const typedActualPublisher: QueuePublisher<T> = actualPublisherToUse.instance;\n this.logger.error(`Resolved publisher with name ${actualPublisherToUse.name}, and with options ${typedActualPublisher.options()}`);\n\n return typedActualPublisher.publish(message);\n }\n}\n"]}
1
+ {"version":3,"file":"publisher-factory.service.js","sourceRoot":"","sources":["../../../src/services/queues/publisher-factory.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAwC;AACxC,2CAA4C;AAG5C,oEAAkE;AAClE,0EAAqE;AAI9D,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAGzB,YACqB,yBAAiD;QAAjD,8BAAyB,GAAzB,yBAAyB,CAAwB;QAHrD,WAAM,GAAG,IAAI,eAAM,CAAC,kBAAgB,CAAC,IAAI,CAAC,CAAC;IAK5D,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAwB,EAAE,aAAqB,EAAE,WAAoB;QAC/E,IAAI,kBAAkB,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,UAAU,CAAC;QACxF,IAAI,qBAAqB,GAAG,GAAG,aAAa,GAAG,IAAA,kBAAQ,EAAC,kBAAkB,CAAC,EAAE,CAAC;QAG9E,IAAI,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;QAC7F,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAGxB,IAAI,kBAAkB,KAAK,UAAU,EAAE,CAAC;gBACpC,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;gBACjF,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBACxB,MAAM,IAAI,KAAK,CAAC,wCAAwC,qBAAqB,EAAE,CAAC,CAAC;gBACrF,CAAC;YACL,CAAC;QACL,CAAC;QAGD,MAAM,oBAAoB,GAAsB,oBAAoB,CAAC,QAAQ,CAAC;QAC9E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,oBAAoB,CAAC,IAAI,sBAAsB,oBAAoB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAEnI,OAAO,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;CACJ,CAAA;AA/BY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;qCAKuC,iDAAsB;GAJ7D,gBAAgB,CA+B5B","sourcesContent":["import { Logger } from '@nestjs/common';\nimport { Injectable } from '@nestjs/common';\n\nimport { QueueMessage, QueuePublisher } from 'src/interfaces/mq';\nimport { classify } from '@angular-devkit/core/src/utils/strings';\nimport { SolidIntrospectService } from '../solid-introspect.service';\n\n\n@Injectable()\nexport class PublisherFactory<T> {\n private readonly logger = new Logger(PublisherFactory.name);\n\n constructor(\n private readonly solidIntrospectionService: SolidIntrospectService\n ) {\n }\n\n async publish(message: QueueMessage<T>, publisherName: string, brokerToUse?: string): Promise<string> {\n let defaultBrokerToUse = brokerToUse || process.env.QUEUES_DEFAULT_BROKER || \"database\";\n let resolvedPublisherName = `${publisherName}${classify(defaultBrokerToUse)}`;\n\n // Register all ISolidDatabaseModules implementations\n let actualPublisherToUse = this.solidIntrospectionService.getProvider(resolvedPublisherName);\n if (!actualPublisherToUse) {\n\n // Extra check in place to make sure we do not have to refactor old publishers which have been created earlier. \n if (defaultBrokerToUse === 'rabbitmq') {\n actualPublisherToUse = this.solidIntrospectionService.getProvider(publisherName);\n if (!actualPublisherToUse) {\n throw new Error(`Unable to locate publisher with name ${resolvedPublisherName}`);\n }\n }\n }\n\n // type safe\n const typedActualPublisher: QueuePublisher<T> = actualPublisherToUse.instance;\n this.logger.error(`Resolved publisher with name ${actualPublisherToUse.name}, and with options ${typedActualPublisher.options()}`);\n\n return typedActualPublisher.publish(message);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.service.d.ts","sourceRoot":"","sources":["../../../src/services/scheduled-jobs/scheduler.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,UAAU,EAAE,MAAM,SAAS,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAIjE,qBACa,oBAAqB,YAAW,iBAAiB;IAKtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;IALlC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;gBAI3C,gBAAgB,EAAE,UAAU,CAAC,YAAY,CAAC,EAC1C,aAAa,EAAE,aAAa;IAwD3C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCvC,OAAO,CAAC,YAAY;IAmCpB,OAAO,CAAC,gBAAgB;CAuB3B"}
1
+ {"version":3,"file":"scheduler.service.d.ts","sourceRoot":"","sources":["../../../src/services/scheduled-jobs/scheduler.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,UAAU,EAAE,MAAM,SAAS,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAIjE,qBACa,oBAAqB,YAAW,iBAAiB;IAKtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;IALlC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;gBAI3C,gBAAgB,EAAE,UAAU,CAAC,YAAY,CAAC,EAC1C,aAAa,EAAE,aAAa;IAI3C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmDvC,OAAO,CAAC,YAAY;IAmCpB,OAAO,CAAC,gBAAgB;CAyB3B"}
@@ -28,31 +28,44 @@ let SchedulerServiceImpl = SchedulerServiceImpl_1 = class SchedulerServiceImpl {
28
28
  }
29
29
  async runScheduledJobs() {
30
30
  const now = new Date();
31
+ this.logger.log(`[${now.getTime()}]: scheduler service started run...`);
31
32
  const dueJobs = await this.scheduledJobRepo.find({
32
- where: {
33
- isActive: true,
34
- nextRunAt: (0, typeorm_2.LessThanOrEqual)(now),
35
- },
33
+ where: [
34
+ {
35
+ isActive: true,
36
+ nextRunAt: (0, typeorm_2.LessThanOrEqual)(now),
37
+ },
38
+ {
39
+ isActive: true,
40
+ nextRunAt: null,
41
+ },
42
+ ],
36
43
  });
44
+ this.logger.log(`[${now.getTime()}]: scheduler service identified ${dueJobs.length} jobs to run...`);
37
45
  for (const job of dueJobs) {
46
+ this.logger.log(`[${now.getTime()}]: scheduler service attempting to run job ${job.job}`);
38
47
  try {
39
48
  if (!this.shouldRunNow(job, now)) {
49
+ this.logger.log(`[${now.getTime()}]: scheduler service skipping job ${job.job}`);
40
50
  continue;
41
51
  }
42
52
  const handler = this.solidRegistry.getScheduledJobProviderInstance(job.job);
43
53
  if (!handler) {
44
- this.logger.warn(`No job handler found for job: ${job.job}`);
54
+ this.logger.warn(`[${now.getTime()}]: scheduler service skipping because job handler not found: ${job.job}`);
45
55
  continue;
46
56
  }
57
+ this.logger.log(`[${now.getTime()}]: scheduler service about to run job ${job.job}`);
47
58
  await handler.executeReminder(job);
59
+ this.logger.log(`[${now.getTime()}]: scheduler service finished running job ${job.job}`);
48
60
  job.isActive = true;
49
61
  job.lastRunAt = now;
50
62
  job.nextRunAt = this.computeNextRunAt(job, now);
63
+ this.logger.log(`[${now.getTime()}]: scheduler service coomputed next run for ${job.job} as ${job.nextRunAt}`);
51
64
  await this.scheduledJobRepo.save(job);
52
- this.logger.log(`Successfully ran job: ${job.job}`);
65
+ this.logger.log(`[${now.getTime()}]: scheduler service finished running job: ${job.job}`);
53
66
  }
54
67
  catch (err) {
55
- this.logger.error(`Failed to run job ${job.job}`, err.stack);
68
+ this.logger.error(`[${now.getTime()}]: scheduler service failed to run job ${job.job}`, err.stack);
56
69
  }
57
70
  }
58
71
  }
@@ -89,8 +102,8 @@ let SchedulerServiceImpl = SchedulerServiceImpl_1 = class SchedulerServiceImpl {
89
102
  computeNextRunAt(job, from) {
90
103
  const base = new Date(from);
91
104
  switch (job.frequency.toLowerCase()) {
92
- case 'once':
93
- return null;
105
+ case 'every minute':
106
+ return new Date(base.getTime() + 1 * 60 * 1000);
94
107
  case 'hourly':
95
108
  return new Date(base.getTime() + 60 * 60 * 1000);
96
109
  case 'daily':
@@ -101,8 +114,6 @@ let SchedulerServiceImpl = SchedulerServiceImpl_1 = class SchedulerServiceImpl {
101
114
  const next = new Date(base);
102
115
  next.setMonth(base.getMonth() + 1);
103
116
  return next;
104
- case 'custom':
105
- return new Date(base.getTime() + 24 * 60 * 60 * 1000);
106
117
  default:
107
118
  return new Date(base.getTime() + 24 * 60 * 60 * 1000);
108
119
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.service.js","sourceRoot":"","sources":["../../../src/services/scheduled-jobs/scheduler.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger, Inject } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { LessThanOrEqual, Repository } from 'typeorm';\n\nimport { ISchedulerService } from './scheduler.interface';\nimport { SolidRegistry } from 'src/helpers/solid-registry';\nimport { ScheduledJob } from 'src/entities/scheduled-job.entity';\nimport { IScheduledJob } from './scheduled-job.interface';\nimport { Cron, CronExpression } from '@nestjs/schedule';\n\n@Injectable()\nexport class SchedulerServiceImpl implements ISchedulerService {\n private readonly logger = new Logger(SchedulerServiceImpl.name);\n\n constructor(\n @InjectRepository(ScheduledJob)\n private readonly scheduledJobRepo: Repository<ScheduledJob>,\n private readonly solidRegistry: SolidRegistry,\n ) { }\n\n // @Cron(CronExpression.EVERY_MINUTE)\n // async runScheduledJobs(): Promise<void> {\n // const now = new Date();\n\n // const dueScheduledJobs = await this.scheduledJobRepo.find({\n // where: {\n // isActive: true,\n // nextRunAt: LessThanOrEqual(now),\n // },\n // });\n\n // for (const dueScheduledJob of dueScheduledJobs) {\n // try {\n // const jobName = dueScheduledJob.job;\n // // @ts-ignore \n // // const jobHandler = this.jobMap[jobName];\n // // const jobHandler = ''; \n // const jobHandler: IScheduledJob | undefined = this.solidRegistry.getScheduledJobProviderInstance(jobName)\n\n // if (!jobHandler) {\n // this.logger.warn(`No job service found for: ${jobName}`);\n // continue;\n // }\n\n // await jobHandler.executeReminder(dueScheduledJob);\n\n // // Update nextRunAt and lastRunAt based on frequency\n // dueScheduledJob.lastRunAt = now;\n // dueScheduledJob.nextRunAt = this.computeNextRunAt(dueScheduledJob);\n // await this.scheduledJobRepo.save(dueScheduledJob);\n\n // this.logger.log(`Successfully ran job: ${jobName}`);\n // } catch (err) {\n // this.logger.error(`Failed to run job for reminder ${dueScheduledJob.id}`, err.stack);\n // }\n // }\n // }\n\n // private computeNextRunAt(reminder: ScheduledJob): Date {\n // const now = new Date();\n // switch (reminder.frequency) {\n // case 'daily':\n // return new Date(now.getTime() + 24 * 60 * 60 * 1000);\n // case 'weekly':\n // return new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);\n // case 'monthly':\n // return new Date(now.setMonth(now.getMonth() + 1));\n // default:\n // return new Date(now.getTime() + 24 * 60 * 60 * 1000); // default fallback\n // }\n // }\n\n @Cron(CronExpression.EVERY_MINUTE)\n async runScheduledJobs(): Promise<void> {\n const now = new Date();\n const dueJobs = await this.scheduledJobRepo.find({\n where: {\n isActive: true,\n nextRunAt: LessThanOrEqual(now),\n },\n });\n\n for (const job of dueJobs) {\n try {\n if (!this.shouldRunNow(job, now)) {\n continue;\n }\n\n const handler = this.solidRegistry.getScheduledJobProviderInstance(job.job);\n if (!handler) {\n this.logger.warn(`No job handler found for job: ${job.job}`);\n continue;\n }\n\n await handler.executeReminder(job);\n job.isActive = true;\n job.lastRunAt = now;\n job.nextRunAt = this.computeNextRunAt(job, now);\n await this.scheduledJobRepo.save(job);\n this.logger.log(`Successfully ran job: ${job.job}`);\n } catch (err) {\n this.logger.error(`Failed to run job ${job.job}`, err.stack);\n }\n }\n }\n\n private shouldRunNow(job: ScheduledJob, now: Date): boolean {\n const today = now.toISOString().split('T')[0]; // yyyy-mm-dd\n const timeNow = now.toTimeString().slice(0, 5); // hh:mm\n\n // 1. Check startDate / endDate\n if (job.startDate && new Date(today) < new Date(job.startDate)) return false;\n if (job.endDate && new Date(today) > new Date(job.endDate)) return false;\n\n // 2. Check startTime / endTime\n if (job.startTime) {\n const jobStart = job.startTime.toTimeString().slice(0, 5);\n if (timeNow < jobStart) return false;\n }\n if (job.endTime) {\n const jobEnd = job.endTime.toTimeString().slice(0, 5);\n if (timeNow > jobEnd) return false;\n }\n\n // 3. Check dayOfWeek (for weekly)\n if (job.frequency.toLowerCase() === 'weekly' && job.dayOfWeek) {\n const todayName = now.toLocaleString('en-US', { weekday: 'long' }); // e.g., \"Monday\"\n // const days = job.dayOfWeek.split(',').map(d => d.trim());\n const days = JSON.parse(job.dayOfWeek) as string[];\n if (!days.includes(todayName)) return false;\n }\n\n // 4. Check dayOfMonth (for monthly)\n if (job.frequency.toLowerCase() === 'monthly' && job.dayOfMonth) {\n const dom = now.getDate();\n if (dom !== job.dayOfMonth) return false;\n }\n\n return true;\n }\n\n private computeNextRunAt(job: ScheduledJob, from: Date): Date {\n const base = new Date(from);\n\n switch (job.frequency.toLowerCase()) {\n case 'once':\n return null; // don't reschedule\n case 'hourly':\n return new Date(base.getTime() + 60 * 60 * 1000);\n case 'daily':\n return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n case 'weekly':\n return new Date(base.getTime() + 7 * 24 * 60 * 60 * 1000);\n case 'monthly':\n const next = new Date(base);\n next.setMonth(base.getMonth() + 1);\n return next;\n case 'custom':\n // Optional: let job handler decide via metadata or registry\n return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n default:\n return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n }\n }\n}"]}
1
+ {"version":3,"file":"scheduler.service.js","sourceRoot":"","sources":["../../../src/services/scheduled-jobs/scheduler.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4D;AAC5D,6CAAmD;AACnD,qCAAsD;AAGtD,iEAA2D;AAC3D,8EAAiE;AAEjE,+CAAwD;AAGjD,IAAM,oBAAoB,4BAA1B,MAAM,oBAAoB;IAG7B,YAEI,gBAA2D,EAC1C,aAA4B;QAD5B,qBAAgB,GAAhB,gBAAgB,CAA0B;QAC1C,kBAAa,GAAb,aAAa,CAAe;QALhC,WAAM,GAAG,IAAI,eAAM,CAAC,sBAAoB,CAAC,IAAI,CAAC,CAAC;IAM5D,CAAC;IAGC,AAAN,KAAK,CAAC,gBAAgB;QAClB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,qCAAqC,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAC7C,KAAK,EAAE;gBACH;oBACI,QAAQ,EAAE,IAAI;oBACd,SAAS,EAAE,IAAA,yBAAe,EAAC,GAAG,CAAC;iBAClC;gBAED;oBACI,QAAQ,EAAE,IAAI;oBACd,SAAS,EAAE,IAAI;iBAClB;aACJ;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,mCAAmC,OAAO,CAAC,MAAM,iBAAiB,CAAC,CAAC;QAErG,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,8CAA8C,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YAC1F,IAAI,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;oBAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,qCAAqC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;oBACjF,SAAS;gBACb,CAAC;gBAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,+BAA+B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC5E,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,gEAAgE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;oBAC7G,SAAS;gBACb,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,yCAAyC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;gBACrF,MAAM,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,6CAA6C,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;gBAEzF,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACpB,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;gBACpB,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,+CAA+C,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;gBAE/G,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,8CAA8C,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9F,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,0CAA0C,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;YACvG,CAAC;QACL,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,GAAiB,EAAE,GAAS;QAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAG/C,IAAI,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7E,IAAI,GAAG,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAGzE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1D,IAAI,OAAO,GAAG,QAAQ;gBAAE,OAAO,KAAK,CAAC;QACzC,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtD,IAAI,OAAO,GAAG,MAAM;gBAAE,OAAO,KAAK,CAAC;QACvC,CAAC;QAGD,IAAI,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAC5D,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAEnE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAa,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,OAAO,KAAK,CAAC;QAChD,CAAC;QAGD,IAAI,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YAC9D,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;YAC1B,IAAI,GAAG,KAAK,GAAG,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC;QAC7C,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,gBAAgB,CAAC,GAAiB,EAAE,IAAU;QAClD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5B,QAAQ,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;YAGlC,KAAK,cAAc;gBACf,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YACpD,KAAK,QAAQ;gBACT,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YACrD,KAAK,OAAO;gBACR,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAC1D,KAAK,QAAQ;gBACT,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAC9D,KAAK,SAAS;gBACV,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;gBACnC,OAAO,IAAI,CAAC;YAIhB;gBACI,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC;CACJ,CAAA;AAzHY,oDAAoB;AAUvB;IADL,IAAA,eAAI,EAAC,yBAAc,CAAC,YAAY,CAAC;;;;4DAkDjC;+BA3DQ,oBAAoB;IADhC,IAAA,mBAAU,GAAE;IAKJ,WAAA,IAAA,0BAAgB,EAAC,mCAAY,CAAC,CAAA;qCACI,oBAAU;QACb,8BAAa;GANxC,oBAAoB,CAyHhC","sourcesContent":["import { Injectable, Logger, Inject } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { LessThanOrEqual, Repository } from 'typeorm';\n\nimport { ISchedulerService } from './scheduler.interface';\nimport { SolidRegistry } from 'src/helpers/solid-registry';\nimport { ScheduledJob } from 'src/entities/scheduled-job.entity';\nimport { IScheduledJob } from './scheduled-job.interface';\nimport { Cron, CronExpression } from '@nestjs/schedule';\n\n@Injectable()\nexport class SchedulerServiceImpl implements ISchedulerService {\n private readonly logger = new Logger(SchedulerServiceImpl.name);\n\n constructor(\n @InjectRepository(ScheduledJob)\n private readonly scheduledJobRepo: Repository<ScheduledJob>,\n private readonly solidRegistry: SolidRegistry,\n ) { }\n\n @Cron(CronExpression.EVERY_MINUTE)\n async runScheduledJobs(): Promise<void> {\n const now = new Date();\n\n this.logger.log(`[${now.getTime()}]: scheduler service started run...`);\n const dueJobs = await this.scheduledJobRepo.find({\n where: [\n {\n isActive: true,\n nextRunAt: LessThanOrEqual(now),\n },\n // Newly created jobs are also picked for examination \n {\n isActive: true,\n nextRunAt: null,\n },\n ],\n });\n\n this.logger.log(`[${now.getTime()}]: scheduler service identified ${dueJobs.length} jobs to run...`);\n\n for (const job of dueJobs) {\n this.logger.log(`[${now.getTime()}]: scheduler service attempting to run job ${job.job}`);\n try {\n if (!this.shouldRunNow(job, now)) {\n this.logger.log(`[${now.getTime()}]: scheduler service skipping job ${job.job}`);\n continue;\n }\n\n const handler = this.solidRegistry.getScheduledJobProviderInstance(job.job);\n if (!handler) {\n this.logger.warn(`[${now.getTime()}]: scheduler service skipping because job handler not found: ${job.job}`);\n continue;\n }\n\n this.logger.log(`[${now.getTime()}]: scheduler service about to run job ${job.job}`);\n await handler.executeReminder(job);\n this.logger.log(`[${now.getTime()}]: scheduler service finished running job ${job.job}`);\n\n job.isActive = true;\n job.lastRunAt = now;\n job.nextRunAt = this.computeNextRunAt(job, now);\n this.logger.log(`[${now.getTime()}]: scheduler service coomputed next run for ${job.job} as ${job.nextRunAt}`);\n\n await this.scheduledJobRepo.save(job);\n this.logger.log(`[${now.getTime()}]: scheduler service finished running job: ${job.job}`);\n } catch (err) {\n this.logger.error(`[${now.getTime()}]: scheduler service failed to run job ${job.job}`, err.stack);\n }\n }\n }\n\n private shouldRunNow(job: ScheduledJob, now: Date): boolean {\n const today = now.toISOString().split('T')[0]; // yyyy-mm-dd\n const timeNow = now.toTimeString().slice(0, 5); // hh:mm\n\n // 1. Check startDate / endDate\n if (job.startDate && new Date(today) < new Date(job.startDate)) return false;\n if (job.endDate && new Date(today) > new Date(job.endDate)) return false;\n\n // 2. Check startTime / endTime\n if (job.startTime) {\n const jobStart = job.startTime.toTimeString().slice(0, 5);\n if (timeNow < jobStart) return false;\n }\n if (job.endTime) {\n const jobEnd = job.endTime.toTimeString().slice(0, 5);\n if (timeNow > jobEnd) return false;\n }\n\n // 3. Check dayOfWeek (for weekly)\n if (job.frequency.toLowerCase() === 'weekly' && job.dayOfWeek) {\n const todayName = now.toLocaleString('en-US', { weekday: 'long' }); // e.g., \"Monday\"\n // const days = job.dayOfWeek.split(',').map(d => d.trim());\n const days = JSON.parse(job.dayOfWeek) as string[];\n if (!days.includes(todayName)) return false;\n }\n\n // 4. Check dayOfMonth (for monthly)\n if (job.frequency.toLowerCase() === 'monthly' && job.dayOfMonth) {\n const dom = now.getDate();\n if (dom !== job.dayOfMonth) return false;\n }\n\n return true;\n }\n\n private computeNextRunAt(job: ScheduledJob, from: Date): Date {\n const base = new Date(from);\n\n switch (job.frequency.toLowerCase()) {\n // case 'once':\n // return null; // don't reschedule\n case 'every minute':\n return new Date(base.getTime() + 1 * 60 * 1000);\n case 'hourly':\n return new Date(base.getTime() + 60 * 60 * 1000);\n case 'daily':\n return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n case 'weekly':\n return new Date(base.getTime() + 7 * 24 * 60 * 60 * 1000);\n case 'monthly':\n const next = new Date(base);\n next.setMonth(base.getMonth() + 1);\n return next;\n // case 'custom':\n // // Optional: let job handler decide via metadata or registry\n // return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n default:\n return new Date(base.getTime() + 24 * 60 * 60 * 1000);\n }\n }\n}"]}
@@ -0,0 +1,11 @@
1
+ import { SolidRegistry } from "src/helpers/solid-registry";
2
+ import { ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues } from "../../interfaces";
3
+ export declare class ListOfDashboardQuestionProvidersSelectionProvider implements ISelectionProvider<ISelectionProviderContext> {
4
+ private readonly solidRegistry;
5
+ constructor(solidRegistry: SolidRegistry);
6
+ help(): string;
7
+ name(): string;
8
+ value(optionValue: string, ctxt: ISelectionProviderContext): Promise<ISelectionProviderValues | any>;
9
+ values(query: string, ctxt: ISelectionProviderContext): Promise<readonly ISelectionProviderValues[]>;
10
+ }
11
+ //# sourceMappingURL=list-of-dashboard-question-providers-selection-provider.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-of-dashboard-question-providers-selection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAuE,kBAAkB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAIhL,qBAEa,iDAAkD,YAAW,kBAAkB,CAAC,yBAAyB,CAAC;IAG/G,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAIjD,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAIR,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,GAAG,GAAG,CAAC;IASpG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC;CAO7G"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ListOfDashboardQuestionProvidersSelectionProvider = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const selection_provider_decorator_1 = require("../../decorators/selection-provider.decorator");
15
+ const solid_registry_1 = require("../../helpers/solid-registry");
16
+ let ListOfDashboardQuestionProvidersSelectionProvider = class ListOfDashboardQuestionProvidersSelectionProvider {
17
+ constructor(solidRegistry) {
18
+ this.solidRegistry = solidRegistry;
19
+ }
20
+ help() {
21
+ return "# Allows one to dynamically fetch all the dashboard providers that are registered in the system. ";
22
+ }
23
+ name() {
24
+ return 'ListOfDashboardQuestionProvidersSelectionProvider';
25
+ }
26
+ async value(optionValue, ctxt) {
27
+ const dashboardSelectionProvider = this.solidRegistry.getDashboardQuestionDataProviderInstance(optionValue);
28
+ if (!dashboardSelectionProvider) {
29
+ return null;
30
+ }
31
+ return { label: dashboardSelectionProvider.name(), value: dashboardSelectionProvider.name() };
32
+ }
33
+ async values(query, ctxt) {
34
+ const dashboardSelectionProviders = this.solidRegistry.getDashboardQuestionDataProviders();
35
+ return dashboardSelectionProviders.map(i => {
36
+ return { label: i.name, value: i.name };
37
+ });
38
+ }
39
+ };
40
+ exports.ListOfDashboardQuestionProvidersSelectionProvider = ListOfDashboardQuestionProvidersSelectionProvider;
41
+ exports.ListOfDashboardQuestionProvidersSelectionProvider = ListOfDashboardQuestionProvidersSelectionProvider = __decorate([
42
+ (0, selection_provider_decorator_1.SelectionProvider)(),
43
+ (0, common_1.Injectable)(),
44
+ __metadata("design:paramtypes", [solid_registry_1.SolidRegistry])
45
+ ], ListOfDashboardQuestionProvidersSelectionProvider);
46
+ //# sourceMappingURL=list-of-dashboard-question-providers-selection-provider.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-of-dashboard-question-providers-selection-provider.service.js","sourceRoot":"","sources":["../../../src/services/selection-providers/list-of-dashboard-question-providers-selection-provider.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,gGAAgF;AAChF,iEAA2D;AAOpD,IAAM,iDAAiD,GAAvD,MAAM,iDAAiD;IAE1D,YACqB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAEjD,CAAC;IAED,IAAI;QACA,OAAO,mGAAmG,CAAC;IAC/G,CAAC;IAED,IAAI;QACA,OAAO,mDAAmD,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,IAA+B;QAC5D,MAAM,0BAA0B,GAAyD,IAAI,CAAC,aAAa,CAAC,wCAAwC,CAAC,WAAW,CAAC,CAAC;QAClK,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,0BAA0B,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,0BAA0B,CAAC,IAAI,EAAE,EAAE,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAA+B;QACvD,MAAM,2BAA2B,GAAG,IAAI,CAAC,aAAa,CAAC,iCAAiC,EAAE,CAAA;QAE1F,OAAO,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACvC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AA/BY,8GAAiD;4DAAjD,iDAAiD;IAF7D,IAAA,gDAAiB,GAAE;IACnB,IAAA,mBAAU,GAAE;qCAI2B,8BAAa;GAHxC,iDAAiD,CA+B7D","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { SelectionProvider } from \"src/decorators/selection-provider.decorator\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { IDashboardQuestionDataProvider, IDashboardVariableSelectionProvider, ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues } from \"../../interfaces\";\nimport { SQL_DYNAMIC_PROVIDER_NAME } from \"../dashboard.service\";\n\n\n@SelectionProvider()\n@Injectable()\nexport class ListOfDashboardQuestionProvidersSelectionProvider implements ISelectionProvider<ISelectionProviderContext> {\n\n constructor(\n private readonly solidRegistry: SolidRegistry,\n ) {\n }\n\n help(): string {\n return \"# Allows one to dynamically fetch all the dashboard providers that are registered in the system. \";\n }\n\n name(): string {\n return 'ListOfDashboardQuestionProvidersSelectionProvider';\n }\n\n async value(optionValue: string, ctxt: ISelectionProviderContext): Promise<ISelectionProviderValues | any> {\n const dashboardSelectionProvider: IDashboardQuestionDataProvider<any, any> | undefined = this.solidRegistry.getDashboardQuestionDataProviderInstance(optionValue);\n if (!dashboardSelectionProvider) {\n return null;\n }\n\n return { label: dashboardSelectionProvider.name(), value: dashboardSelectionProvider.name() };\n }\n\n async values(query: string, ctxt: ISelectionProviderContext): Promise<readonly ISelectionProviderValues[]> {\n const dashboardSelectionProviders = this.solidRegistry.getDashboardQuestionDataProviders()\n //Exclude the SQL dynamic provider from the list, (since although it is a dashboard selection provider, it is not a valid option for the user to select)\n return dashboardSelectionProviders.map(i => {\n return { label: i.name, value: i.name };\n });\n }\n}"]}
@@ -0,0 +1,11 @@
1
+ import { SolidRegistry } from "src/helpers/solid-registry";
2
+ import { ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues } from "../../interfaces";
3
+ export declare class ListOfDashboardVariableProvidersSelectionProvider implements ISelectionProvider<ISelectionProviderContext> {
4
+ private readonly solidRegistry;
5
+ constructor(solidRegistry: SolidRegistry);
6
+ help(): string;
7
+ name(): string;
8
+ value(optionValue: string, ctxt: ISelectionProviderContext): Promise<ISelectionProviderValues | any>;
9
+ values(query: string, ctxt: ISelectionProviderContext): Promise<readonly ISelectionProviderValues[]>;
10
+ }
11
+ //# sourceMappingURL=list-of-dashboard-variable-providers-selection-provider.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-of-dashboard-variable-providers-selection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAuC,kBAAkB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAIhJ,qBAEa,iDAAkD,YAAW,kBAAkB,CAAC,yBAAyB,CAAC;IAG/G,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAIjD,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAIR,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,GAAG,GAAG,CAAC;IASpG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC;CAO7G"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ListOfDashboardVariableProvidersSelectionProvider = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const selection_provider_decorator_1 = require("../../decorators/selection-provider.decorator");
15
+ const solid_registry_1 = require("../../helpers/solid-registry");
16
+ const dashboard_service_1 = require("../dashboard.service");
17
+ let ListOfDashboardVariableProvidersSelectionProvider = class ListOfDashboardVariableProvidersSelectionProvider {
18
+ constructor(solidRegistry) {
19
+ this.solidRegistry = solidRegistry;
20
+ }
21
+ help() {
22
+ return "# Allows one to dynamically fetch all the dashboard providers that are registered in the system. ";
23
+ }
24
+ name() {
25
+ return 'ListOfDashboardVariableProvidersSelectionProvider';
26
+ }
27
+ async value(optionValue, ctxt) {
28
+ const dashboardSelectionProvider = this.solidRegistry.getDashboardVariableSelectionProviderInstance(optionValue);
29
+ if (!dashboardSelectionProvider) {
30
+ return null;
31
+ }
32
+ return { label: dashboardSelectionProvider.name(), value: dashboardSelectionProvider.name() };
33
+ }
34
+ async values(query, ctxt) {
35
+ const dashboardSelectionProviders = this.solidRegistry.getDashboardVariableSelectionProviders();
36
+ return dashboardSelectionProviders.filter(i => (i.name !== dashboard_service_1.SQL_DYNAMIC_PROVIDER_NAME)).map(i => {
37
+ return { label: i.name, value: i.name };
38
+ });
39
+ }
40
+ };
41
+ exports.ListOfDashboardVariableProvidersSelectionProvider = ListOfDashboardVariableProvidersSelectionProvider;
42
+ exports.ListOfDashboardVariableProvidersSelectionProvider = ListOfDashboardVariableProvidersSelectionProvider = __decorate([
43
+ (0, selection_provider_decorator_1.SelectionProvider)(),
44
+ (0, common_1.Injectable)(),
45
+ __metadata("design:paramtypes", [solid_registry_1.SolidRegistry])
46
+ ], ListOfDashboardVariableProvidersSelectionProvider);
47
+ //# sourceMappingURL=list-of-dashboard-variable-providers-selection-provider.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-of-dashboard-variable-providers-selection-provider.service.js","sourceRoot":"","sources":["../../../src/services/selection-providers/list-of-dashboard-variable-providers-selection-provider.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,gGAAgF;AAChF,iEAA2D;AAE3D,4DAAiE;AAK1D,IAAM,iDAAiD,GAAvD,MAAM,iDAAiD;IAE1D,YACqB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAEjD,CAAC;IAED,IAAI;QACA,OAAO,mGAAmG,CAAC;IAC/G,CAAC;IAED,IAAI;QACA,OAAO,mDAAmD,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,IAA+B;QAC5D,MAAM,0BAA0B,GAA+E,IAAI,CAAC,aAAa,CAAC,6CAA6C,CAAC,WAAW,CAAC,CAAC;QAC7L,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,0BAA0B,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,0BAA0B,CAAC,IAAI,EAAE,EAAE,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAA+B;QACvD,MAAM,2BAA2B,GAAG,IAAI,CAAC,aAAa,CAAC,sCAAsC,EAAE,CAAA;QAE/F,OAAO,2BAA2B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,6CAAyB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC3F,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AA/BY,8GAAiD;4DAAjD,iDAAiD;IAF7D,IAAA,gDAAiB,GAAE;IACnB,IAAA,mBAAU,GAAE;qCAI2B,8BAAa;GAHxC,iDAAiD,CA+B7D","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { SelectionProvider } from \"src/decorators/selection-provider.decorator\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { IDashboardVariableSelectionProvider, ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues } from \"../../interfaces\";\nimport { SQL_DYNAMIC_PROVIDER_NAME } from \"../dashboard.service\";\n\n\n@SelectionProvider()\n@Injectable()\nexport class ListOfDashboardVariableProvidersSelectionProvider implements ISelectionProvider<ISelectionProviderContext> {\n\n constructor(\n private readonly solidRegistry: SolidRegistry,\n ) {\n }\n\n help(): string {\n return \"# Allows one to dynamically fetch all the dashboard providers that are registered in the system. \";\n }\n\n name(): string {\n return 'ListOfDashboardVariableProvidersSelectionProvider';\n }\n\n async value(optionValue: string, ctxt: ISelectionProviderContext): Promise<ISelectionProviderValues | any> {\n const dashboardSelectionProvider: IDashboardVariableSelectionProvider<ISelectionProviderContext> | undefined = this.solidRegistry.getDashboardVariableSelectionProviderInstance(optionValue);\n if (!dashboardSelectionProvider) {\n return null;\n }\n\n return { label: dashboardSelectionProvider.name(), value: dashboardSelectionProvider.name() };\n }\n\n async values(query: string, ctxt: ISelectionProviderContext): Promise<readonly ISelectionProviderValues[]> {\n const dashboardSelectionProviders = this.solidRegistry.getDashboardVariableSelectionProviders()\n //Exclude the SQL dynamic provider from the list, (since although it is a dashboard selection provider, it is not a valid option for the user to select)\n return dashboardSelectionProviders.filter(i => (i.name !== SQL_DYNAMIC_PROVIDER_NAME)).map(i => {\n return { label: i.name, value: i.name };\n });\n }\n}"]}
@@ -11,8 +11,10 @@ export declare class SolidIntrospectService implements OnApplicationBootstrap {
11
11
  constructor(discoveryService: DiscoveryService, reflector: Reflector, metadataScanner: MetadataScanner, solidRegistry: SolidRegistry);
12
12
  private readonly logger;
13
13
  onApplicationBootstrap(): void;
14
+ isDashboardQuestionDataProvider(providerWrapper: InstanceWrapper<any>): boolean;
14
15
  private isSeeder;
15
16
  private isSelectionProvider;
17
+ private isDashboardVariableSelectionProvider;
16
18
  private isComputedFieldProvider;
17
19
  private isScheduledJobProvider;
18
20
  private isSolidDatabaseModule;
@@ -1 +1 @@
1
- {"version":3,"file":"solid-introspect.service.d.ts","sourceRoot":"","sources":["../../src/services/solid-introspect.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAIzE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,qBACa,sBAAuB,YAAW,sBAAsB;IAEjE,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAHb,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa;IAG/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,sBAAsB;IA4EtB,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,QAAQ;IAuBhB,cAAc,CAAC,iBAAiB,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC;IAK3D,WAAW,CAAC,YAAY,EAAE,MAAM;CAGjC"}
1
+ {"version":3,"file":"solid-introspect.service.d.ts","sourceRoot":"","sources":["../../src/services/solid-introspect.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAIzE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK7C,qBACa,sBAAuB,YAAW,sBAAsB;IAEjE,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAHb,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa;IAG/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,sBAAsB;IA+FtB,+BAA+B,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,CAAC;IAWrE,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,oCAAoC;IAU5C,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,QAAQ;IAuBhB,cAAc,CAAC,iBAAiB,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC;IAK3D,WAAW,CAAC,YAAY,EAAE,MAAM;CAGjC"}