@resolveio/server-lib 12.5.54 → 12.5.56

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 (400) hide show
  1. package/client-server-app.d.ts +1 -0
  2. package/client-server-app.js +48 -0
  3. package/client-server-app.js.map +1 -0
  4. package/collections/app-status.collection.d.ts +3 -0
  5. package/collections/app-status.collection.js +51 -0
  6. package/collections/app-status.collection.js.map +1 -0
  7. package/collections/counter.collection.d.ts +3 -0
  8. package/collections/counter.collection.js +54 -0
  9. package/collections/counter.collection.js.map +1 -0
  10. package/collections/cron-job-history.collection.d.ts +3 -0
  11. package/collections/cron-job-history.collection.js +82 -0
  12. package/collections/cron-job-history.collection.js.map +1 -0
  13. package/collections/cron-job.collection.d.ts +3 -0
  14. package/collections/cron-job.collection.js +85 -0
  15. package/collections/cron-job.collection.js.map +1 -0
  16. package/collections/email-history.collection.d.ts +3 -0
  17. package/collections/email-history.collection.js +66 -0
  18. package/collections/email-history.collection.js.map +1 -0
  19. package/collections/email-verified.collection.d.ts +3 -0
  20. package/collections/email-verified.collection.js +61 -0
  21. package/collections/email-verified.collection.js.map +1 -0
  22. package/collections/file.collection.d.ts +3 -0
  23. package/collections/file.collection.js +73 -0
  24. package/collections/file.collection.js.map +1 -0
  25. package/collections/flag.collection.d.ts +3 -0
  26. package/collections/flag.collection.js +56 -0
  27. package/collections/flag.collection.js.map +1 -0
  28. package/collections/log-method-latency.collection.d.ts +3 -0
  29. package/collections/log-method-latency.collection.js +64 -0
  30. package/collections/log-method-latency.collection.js.map +1 -0
  31. package/collections/log-subscription.collection.d.ts +3 -0
  32. package/collections/log-subscription.collection.js +68 -0
  33. package/collections/log-subscription.collection.js.map +1 -0
  34. package/collections/log-ts.collection.d.ts +3 -0
  35. package/collections/log-ts.collection.js +78 -0
  36. package/collections/log-ts.collection.js.map +1 -0
  37. package/collections/log.collection.d.ts +3 -0
  38. package/collections/log.collection.js +77 -0
  39. package/collections/log.collection.js.map +1 -0
  40. package/collections/logged-in-users.collection.d.ts +3 -0
  41. package/collections/logged-in-users.collection.js +65 -0
  42. package/collections/logged-in-users.collection.js.map +1 -0
  43. package/collections/method-response.collection.d.ts +3 -0
  44. package/collections/method-response.collection.js +66 -0
  45. package/collections/method-response.collection.js.map +1 -0
  46. package/collections/monitor-cpu.collection.d.ts +3 -0
  47. package/collections/monitor-cpu.collection.js +63 -0
  48. package/collections/monitor-cpu.collection.js.map +1 -0
  49. package/collections/monitor-memory.collection.d.ts +3 -0
  50. package/collections/monitor-memory.collection.js +75 -0
  51. package/collections/monitor-memory.collection.js.map +1 -0
  52. package/collections/monitor-mongo.collection.d.ts +3 -0
  53. package/collections/monitor-mongo.collection.js +69 -0
  54. package/collections/monitor-mongo.collection.js.map +1 -0
  55. package/collections/notification.collection.d.ts +3 -0
  56. package/collections/notification.collection.js +51 -0
  57. package/collections/notification.collection.js.map +1 -0
  58. package/collections/report-builder-dashboard-builder.collection.d.ts +3 -0
  59. package/collections/report-builder-dashboard-builder.collection.js +109 -0
  60. package/collections/report-builder-dashboard-builder.collection.js.map +1 -0
  61. package/collections/report-builder-library.collection.d.ts +3 -0
  62. package/collections/report-builder-library.collection.js +87 -0
  63. package/collections/report-builder-library.collection.js.map +1 -0
  64. package/collections/report-builder-report.collection.d.ts +4 -0
  65. package/collections/report-builder-report.collection.js +149 -0
  66. package/collections/report-builder-report.collection.js.map +1 -0
  67. package/collections/user-group.collection.d.ts +4 -0
  68. package/collections/user-group.collection.js +90 -0
  69. package/collections/user-group.collection.js.map +1 -0
  70. package/collections/user-guide.collection.d.ts +3 -0
  71. package/collections/user-guide.collection.js +57 -0
  72. package/collections/user-guide.collection.js.map +1 -0
  73. package/collections/user.collection.d.ts +4 -0
  74. package/collections/user.collection.js +259 -0
  75. package/collections/user.collection.js.map +1 -0
  76. package/cron/cron.d.ts +5 -0
  77. package/cron/cron.js +162 -0
  78. package/cron/cron.js.map +1 -0
  79. package/fixtures/cron-jobs.d.ts +1 -0
  80. package/fixtures/cron-jobs.js +73 -0
  81. package/fixtures/cron-jobs.js.map +1 -0
  82. package/fixtures/init.d.ts +1 -0
  83. package/fixtures/init.js +59 -0
  84. package/fixtures/init.js.map +1 -0
  85. package/http/auth.d.ts +2 -0
  86. package/http/auth.js +763 -0
  87. package/http/auth.js.map +1 -0
  88. package/http/health.d.ts +1 -0
  89. package/http/health.js +12 -0
  90. package/http/health.js.map +1 -0
  91. package/http/home.d.ts +2 -0
  92. package/http/home.js +66 -0
  93. package/http/home.js.map +1 -0
  94. package/index.d.ts +23 -0
  95. package/index.js +127 -0
  96. package/index.js.map +1 -0
  97. package/managers/cron.manager.d.ts +17 -0
  98. package/managers/cron.manager.js +242 -0
  99. package/managers/cron.manager.js.map +1 -0
  100. package/managers/method.manager.d.ts +38 -0
  101. package/managers/method.manager.js +595 -0
  102. package/managers/method.manager.js.map +1 -0
  103. package/managers/mongo.manager.d.ts +178 -0
  104. package/managers/mongo.manager.js +2221 -0
  105. package/managers/mongo.manager.js.map +1 -0
  106. package/managers/monitor.manager.d.ts +59 -0
  107. package/managers/monitor.manager.js +351 -0
  108. package/managers/monitor.manager.js.map +1 -0
  109. package/managers/subscription.manager.d.ts +50 -0
  110. package/managers/subscription.manager.js +1091 -0
  111. package/managers/subscription.manager.js.map +1 -0
  112. package/managers/subscription.performance.d.ts +1 -0
  113. package/{src/managers/subscription.performance.ts → managers/subscription.performance.js} +33 -68
  114. package/managers/subscription.performance.js.map +1 -0
  115. package/methods/accounts.d.ts +2 -0
  116. package/methods/accounts.js +274 -0
  117. package/methods/accounts.js.map +1 -0
  118. package/methods/aws.d.ts +2 -0
  119. package/methods/aws.js +617 -0
  120. package/methods/aws.js.map +1 -0
  121. package/methods/collections.d.ts +2 -0
  122. package/methods/collections.js +499 -0
  123. package/methods/collections.js.map +1 -0
  124. package/methods/counters.d.ts +2 -0
  125. package/methods/counters.js +122 -0
  126. package/methods/counters.js.map +1 -0
  127. package/methods/cron-jobs.d.ts +2 -0
  128. package/methods/cron-jobs.js +1315 -0
  129. package/methods/cron-jobs.js.map +1 -0
  130. package/methods/flags.d.ts +2 -0
  131. package/methods/flags.js +9 -0
  132. package/methods/flags.js.map +1 -0
  133. package/methods/logs.d.ts +2 -0
  134. package/methods/logs.js +371 -0
  135. package/methods/logs.js.map +1 -0
  136. package/methods/monitor.d.ts +2 -0
  137. package/methods/monitor.js +565 -0
  138. package/methods/monitor.js.map +1 -0
  139. package/methods/pdf.d.ts +2 -0
  140. package/methods/pdf.js +468 -0
  141. package/methods/pdf.js.map +1 -0
  142. package/methods/report-builder.d.ts +2 -0
  143. package/methods/report-builder.js +858 -0
  144. package/methods/report-builder.js.map +1 -0
  145. package/methods/support.d.ts +2 -0
  146. package/methods/support.js +246 -0
  147. package/methods/support.js.map +1 -0
  148. package/{src/models/app-status.model.ts → models/app-status.model.d.ts} +2 -3
  149. package/models/app-status.model.js +4 -0
  150. package/models/app-status.model.js.map +1 -0
  151. package/{src/models/billing-logged-in-users.model.ts → models/billing-logged-in-users.model.d.ts} +4 -5
  152. package/models/billing-logged-in-users.model.js +4 -0
  153. package/models/billing-logged-in-users.model.js.map +1 -0
  154. package/models/collection-document.model.d.ts +19 -0
  155. package/models/collection-document.model.js +4 -0
  156. package/models/collection-document.model.js.map +1 -0
  157. package/{src/models/counter.model.ts → models/counter.model.d.ts} +3 -4
  158. package/models/counter.model.js +4 -0
  159. package/models/counter.model.js.map +1 -0
  160. package/models/cron-job-history.model.d.ts +12 -0
  161. package/models/cron-job-history.model.js +4 -0
  162. package/models/cron-job-history.model.js.map +1 -0
  163. package/models/cron-job.model.d.ts +13 -0
  164. package/models/cron-job.model.js +4 -0
  165. package/models/cron-job.model.js.map +1 -0
  166. package/models/dialog.model.d.ts +23 -0
  167. package/models/dialog.model.js +4 -0
  168. package/models/dialog.model.js.map +1 -0
  169. package/{src/models/email-history.model.ts → models/email-history.model.d.ts} +7 -8
  170. package/models/email-history.model.js +4 -0
  171. package/models/email-history.model.js.map +1 -0
  172. package/{src/models/email-verified.model.ts → models/email-verified.model.d.ts} +5 -6
  173. package/models/email-verified.model.js +4 -0
  174. package/models/email-verified.model.js.map +1 -0
  175. package/{src/models/file.model.ts → models/file.model.d.ts} +7 -8
  176. package/models/file.model.js +4 -0
  177. package/models/file.model.js.map +1 -0
  178. package/{src/models/flag.model.ts → models/flag.model.d.ts} +3 -4
  179. package/models/flag.model.js +4 -0
  180. package/models/flag.model.js.map +1 -0
  181. package/{src/models/log-method-latency.model.ts → models/log-method-latency.model.d.ts} +4 -5
  182. package/models/log-method-latency.model.js +4 -0
  183. package/models/log-method-latency.model.js.map +1 -0
  184. package/{src/models/log-subscription.model.ts → models/log-subscription.model.d.ts} +6 -8
  185. package/models/log-subscription.model.js +4 -0
  186. package/models/log-subscription.model.js.map +1 -0
  187. package/{src/models/log.model.ts → models/log.model.d.ts} +10 -12
  188. package/models/log.model.js +4 -0
  189. package/models/log.model.js.map +1 -0
  190. package/{src/models/logged-in-users.model.ts → models/logged-in-users.model.d.ts} +5 -6
  191. package/models/logged-in-users.model.js +4 -0
  192. package/models/logged-in-users.model.js.map +1 -0
  193. package/{src/models/method-response.model.ts → models/method-response.model.d.ts} +6 -7
  194. package/models/method-response.model.js +4 -0
  195. package/models/method-response.model.js.map +1 -0
  196. package/models/method.model.d.ts +9 -0
  197. package/models/method.model.js +4 -0
  198. package/models/method.model.js.map +1 -0
  199. package/{src/models/monitor-cpu.model.ts → models/monitor-cpu.model.d.ts} +7 -9
  200. package/models/monitor-cpu.model.js +4 -0
  201. package/models/monitor-cpu.model.js.map +1 -0
  202. package/models/monitor-memory.model.d.ts +15 -0
  203. package/models/monitor-memory.model.js +4 -0
  204. package/models/monitor-memory.model.js.map +1 -0
  205. package/models/monitor-mongo.model.d.ts +13 -0
  206. package/models/monitor-mongo.model.js +4 -0
  207. package/models/monitor-mongo.model.js.map +1 -0
  208. package/{src/models/notification.model.ts → models/notification.model.d.ts} +2 -3
  209. package/models/notification.model.js +4 -0
  210. package/models/notification.model.js.map +1 -0
  211. package/models/pagination.model.d.ts +10 -0
  212. package/models/pagination.model.js +24 -0
  213. package/models/pagination.model.js.map +1 -0
  214. package/models/permission.model.d.ts +12 -0
  215. package/models/permission.model.js +4 -0
  216. package/models/permission.model.js.map +1 -0
  217. package/models/report-builder-dashboard-builder.model.d.ts +25 -0
  218. package/models/report-builder-dashboard-builder.model.js +4 -0
  219. package/models/report-builder-dashboard-builder.model.js.map +1 -0
  220. package/models/report-builder-library.model.d.ts +17 -0
  221. package/models/report-builder-library.model.js +4 -0
  222. package/models/report-builder-library.model.js.map +1 -0
  223. package/models/report-builder-report.model.d.ts +98 -0
  224. package/models/report-builder-report.model.js +4 -0
  225. package/models/report-builder-report.model.js.map +1 -0
  226. package/models/report-builder.model.d.ts +61 -0
  227. package/models/report-builder.model.js +4 -0
  228. package/models/report-builder.model.js.map +1 -0
  229. package/models/select-data-label.model.d.ts +9 -0
  230. package/models/select-data-label.model.js +4 -0
  231. package/models/select-data-label.model.js.map +1 -0
  232. package/models/server-response.model.d.ts +5 -0
  233. package/models/server-response.model.js +4 -0
  234. package/models/server-response.model.js.map +1 -0
  235. package/models/subscription.model.d.ts +23 -0
  236. package/models/subscription.model.js +4 -0
  237. package/models/subscription.model.js.map +1 -0
  238. package/models/support-ticket.model.d.ts +72 -0
  239. package/models/support-ticket.model.js +4 -0
  240. package/models/support-ticket.model.js.map +1 -0
  241. package/models/user-group.model.d.ts +19 -0
  242. package/models/user-group.model.js +4 -0
  243. package/models/user-group.model.js.map +1 -0
  244. package/{src/models/user-guide.model.ts → models/user-guide.model.d.ts} +4 -5
  245. package/models/user-guide.model.js +4 -0
  246. package/models/user-guide.model.js.map +1 -0
  247. package/models/user.model.d.ts +70 -0
  248. package/models/user.model.js +4 -0
  249. package/models/user.model.js.map +1 -0
  250. package/package.json +1 -1
  251. package/{src/public_api.ts → public_api.d.ts} +1 -1
  252. package/public_api.js +75 -0
  253. package/public_api.js.map +1 -0
  254. package/publications/app-status.d.ts +2 -0
  255. package/publications/app-status.js +17 -0
  256. package/publications/app-status.js.map +1 -0
  257. package/publications/cron-jobs.d.ts +2 -0
  258. package/publications/cron-jobs.js +33 -0
  259. package/publications/cron-jobs.js.map +1 -0
  260. package/publications/files.d.ts +2 -0
  261. package/publications/files.js +37 -0
  262. package/publications/files.js.map +1 -0
  263. package/publications/flags.d.ts +2 -0
  264. package/publications/flags.js +23 -0
  265. package/publications/flags.js.map +1 -0
  266. package/publications/logs.d.ts +2 -0
  267. package/publications/logs.js +165 -0
  268. package/publications/logs.js.map +1 -0
  269. package/publications/method-responses.d.ts +2 -0
  270. package/publications/method-responses.js +17 -0
  271. package/publications/method-responses.js.map +1 -0
  272. package/publications/notifications.d.ts +2 -0
  273. package/publications/notifications.js +17 -0
  274. package/publications/notifications.js.map +1 -0
  275. package/publications/report-builder-dashboard-builders.d.ts +2 -0
  276. package/publications/report-builder-dashboard-builders.js +43 -0
  277. package/publications/report-builder-dashboard-builders.js.map +1 -0
  278. package/publications/report-builder-libraries.d.ts +2 -0
  279. package/publications/report-builder-libraries.js +90 -0
  280. package/publications/report-builder-libraries.js.map +1 -0
  281. package/publications/report-builder-reports.d.ts +2 -0
  282. package/publications/report-builder-reports.js +51 -0
  283. package/publications/report-builder-reports.js.map +1 -0
  284. package/publications/super-admin.d.ts +2 -0
  285. package/publications/super-admin.js +17 -0
  286. package/publications/super-admin.js.map +1 -0
  287. package/publications/user-groups.d.ts +1 -0
  288. package/publications/user-groups.js +17 -0
  289. package/publications/user-groups.js.map +1 -0
  290. package/publications/user-guides.d.ts +1 -0
  291. package/publications/user-guides.js +17 -0
  292. package/publications/user-guides.js.map +1 -0
  293. package/server-app.d.ts +52 -0
  294. package/server-app.js +739 -0
  295. package/server-app.js.map +1 -0
  296. package/util/common.d.ts +25 -0
  297. package/util/common.js +524 -0
  298. package/util/common.js.map +1 -0
  299. package/util/schema-report-builder.d.ts +6 -0
  300. package/util/schema-report-builder.js +453 -0
  301. package/util/schema-report-builder.js.map +1 -0
  302. package/.nodemon.json +0 -5
  303. package/.vscode/settings.json +0 -3
  304. package/README.md +0 -22
  305. package/compileDTS.pl +0 -64
  306. package/gulpfile.js +0 -127
  307. package/mongodbensurers.js +0 -2
  308. package/mongostop.js +0 -3
  309. package/settings.development.json +0 -13
  310. package/src/client-server-app.ts +0 -7
  311. package/src/collections/app-status.collection.ts +0 -51
  312. package/src/collections/counter.collection.ts +0 -54
  313. package/src/collections/cron-job-history.collection.ts +0 -82
  314. package/src/collections/cron-job.collection.ts +0 -85
  315. package/src/collections/email-history.collection.ts +0 -66
  316. package/src/collections/email-verified.collection.ts +0 -61
  317. package/src/collections/file.collection.ts +0 -73
  318. package/src/collections/flag.collection.ts +0 -56
  319. package/src/collections/log-method-latency.collection.ts +0 -64
  320. package/src/collections/log-subscription.collection.ts +0 -68
  321. package/src/collections/log-ts.collection.ts +0 -78
  322. package/src/collections/log.collection.ts +0 -77
  323. package/src/collections/logged-in-users.collection.ts +0 -65
  324. package/src/collections/method-response.collection.ts +0 -66
  325. package/src/collections/monitor-cpu.collection.ts +0 -63
  326. package/src/collections/monitor-memory.collection.ts +0 -75
  327. package/src/collections/monitor-mongo.collection.ts +0 -69
  328. package/src/collections/notification.collection.ts +0 -51
  329. package/src/collections/report-builder-dashboard-builder.collection.ts +0 -109
  330. package/src/collections/report-builder-library.collection.ts +0 -89
  331. package/src/collections/report-builder-report.collection.ts +0 -149
  332. package/src/collections/user-group.collection.ts +0 -90
  333. package/src/collections/user-guide.collection.ts +0 -57
  334. package/src/collections/user.collection.ts +0 -259
  335. package/src/cron/cron.ts +0 -188
  336. package/src/fixtures/cron-jobs.ts +0 -25
  337. package/src/fixtures/init.ts +0 -10
  338. package/src/http/auth.ts +0 -732
  339. package/src/http/health.ts +0 -7
  340. package/src/http/home.ts +0 -71
  341. package/src/index.ts +0 -71
  342. package/src/managers/cron.manager.ts +0 -208
  343. package/src/managers/method.manager.ts +0 -607
  344. package/src/managers/mongo.manager.ts +0 -2282
  345. package/src/managers/monitor.manager.ts +0 -323
  346. package/src/managers/subscription.manager.ts +0 -1196
  347. package/src/methods/accounts.ts +0 -202
  348. package/src/methods/aws.ts +0 -507
  349. package/src/methods/collections.ts +0 -512
  350. package/src/methods/counters.ts +0 -75
  351. package/src/methods/cron-jobs.ts +0 -1454
  352. package/src/methods/flags.ts +0 -7
  353. package/src/methods/logs.ts +0 -327
  354. package/src/methods/monitor.ts +0 -548
  355. package/src/methods/pdf.ts +0 -615
  356. package/src/methods/report-builder.ts +0 -876
  357. package/src/methods/support.ts +0 -146
  358. package/src/models/collection-document.model.ts +0 -22
  359. package/src/models/cron-job-history.model.ts +0 -13
  360. package/src/models/cron-job.model.ts +0 -14
  361. package/src/models/dialog.model.ts +0 -25
  362. package/src/models/method.model.ts +0 -11
  363. package/src/models/monitor-memory.model.ts +0 -17
  364. package/src/models/monitor-mongo.model.ts +0 -15
  365. package/src/models/pagination.model.ts +0 -30
  366. package/src/models/permission.model.ts +0 -14
  367. package/src/models/report-builder-dashboard-builder.model.ts +0 -29
  368. package/src/models/report-builder-library.model.ts +0 -20
  369. package/src/models/report-builder-report.model.ts +0 -110
  370. package/src/models/report-builder.model.ts +0 -68
  371. package/src/models/select-data-label.model.ts +0 -9
  372. package/src/models/server-response.model.ts +0 -5
  373. package/src/models/subscription.model.ts +0 -64
  374. package/src/models/support-ticket.model.ts +0 -81
  375. package/src/models/user-group.model.ts +0 -23
  376. package/src/models/user.model.ts +0 -79
  377. package/src/publications/app-status.ts +0 -13
  378. package/src/publications/cron-jobs.ts +0 -30
  379. package/src/publications/files.ts +0 -34
  380. package/src/publications/flags.ts +0 -20
  381. package/src/publications/logs.ts +0 -164
  382. package/src/publications/method-responses.ts +0 -13
  383. package/src/publications/notifications.ts +0 -13
  384. package/src/publications/report-builder-dashboard-builders.ts +0 -39
  385. package/src/publications/report-builder-libraries.ts +0 -41
  386. package/src/publications/report-builder-reports.ts +0 -48
  387. package/src/publications/super-admin.ts +0 -13
  388. package/src/publications/user-groups.ts +0 -12
  389. package/src/publications/user-guides.ts +0 -12
  390. package/src/server-app.ts +0 -769
  391. package/src/util/common.ts +0 -519
  392. package/src/util/schema-report-builder.ts +0 -413
  393. package/tsconfig.json +0 -30
  394. package/tslint.json +0 -143
  395. /package/{src/private → private}/email-templates/enrollment.html +0 -0
  396. /package/{src/private → private}/email-templates/forgot-password.html +0 -0
  397. /package/{src/private → private}/email-templates/support-ticket-deleted.html +0 -0
  398. /package/{src/private → private}/email-templates/support-ticket-modified.html +0 -0
  399. /package/{src/private → private}/email-templates/support-ticket.html +0 -0
  400. /package/{src/private → private}/images/ResolveIO.png +0 -0
@@ -1,876 +0,0 @@
1
- import SimpleSchema from 'simpl-schema';
2
- import { MethodManager } from '../managers/method.manager';
3
- import { PaginationOptions, PaginationOptionsSchema } from '../models/pagination.model';
4
- import { ResolveIOServer } from '../index';
5
- import { getReportLookupSchemas, buildTree, mongoCommand } from '../util/schema-report-builder';
6
-
7
- export function loadReportBuilderMethods(methodManager: MethodManager) {
8
- methodManager.methods({
9
- reportBuilderBuildTree: {
10
- check: new SimpleSchema({
11
- collection_root: {
12
- type: String
13
- }
14
- }),
15
- function: function(collection_root: string) {
16
- return new Promise(async (resolve, reject) => {
17
- let lookupSchemaData = getReportLookupSchemas(collection_root).sort((a, b) => a.collection_name.localeCompare(b.collection_name));
18
- let lookupSchemaTree = lookupSchemaData.filter(a => a.is_root === true)[0].tree;
19
-
20
- let treeItems = buildTree(collection_root, lookupSchemaTree);
21
-
22
- Object.keys(lookupSchemaTree).filter(a => a.endsWith('(Lookup)')).forEach(lookup => {
23
- let fieldPath = lookup.split('.');
24
- let field = null;
25
- fieldPath.forEach(path => {
26
- if (!field) {
27
- field = treeItems.filter(a => a.fieldName === path)[0];
28
- }
29
- else {
30
- field = field.children.filter(a => a.fieldName === path)[0];
31
- }
32
- });
33
- field.children = buildTree(lookupSchemaTree[lookup].lookup_collection, lookupSchemaData.filter(a => a.collection_name === lookupSchemaTree[lookup].lookup_collection)[0].tree, field);
34
- });
35
-
36
- // console.log('----------- Tree Items -----------', treeItems);
37
-
38
- resolve({isLeaf: false, children: treeItems});
39
- });
40
- }
41
- },
42
- reportBuilderGetDistinctValue: {
43
- check: new SimpleSchema({
44
- treeLeaf: {
45
- type: Object,
46
- blackbox: true
47
- }
48
- }),
49
- function: function(treeLeaf) {
50
- return new Promise(async (resolve, reject) => {
51
- if (treeLeaf.fieldType === 'String') {
52
- if (treeLeaf.fieldPath.includes('(Lookup)')) {
53
- resolve(await mongoCommand('distinct', treeLeaf.collection_name, treeLeaf.fieldPath.replace(/^.+\(.+\) \(Lookup\)\.\$\./g, '').replace(/\.\$/g, '')));
54
- }
55
- else {
56
- resolve(await mongoCommand('distinct', treeLeaf.collection_name, treeLeaf.fieldPath.replace(/\.\$/g, '')));
57
- }
58
- }
59
- else {
60
- resolve([]);
61
- }
62
- });
63
- }
64
- },
65
- reportBuilderGetResults: {
66
- check: new SimpleSchema({
67
- reportType: {
68
- type: String
69
- },
70
- rootCollectionName: {
71
- type: String
72
- },
73
- options: {
74
- type: PaginationOptionsSchema
75
- },
76
- filters: {
77
- type: Array,
78
- optional: true
79
- },
80
- 'filters.$': {
81
- type: Object,
82
- blackbox: true,
83
- optional: true
84
- },
85
- filterArrays: {
86
- type: Array,
87
- optional: true
88
- },
89
- 'filterArrays.$': {
90
- type: Object,
91
- blackbox: true,
92
- optional: true
93
- },
94
- filterArrayFields: {
95
- type: Array,
96
- optional: true
97
- },
98
- 'filterArrayFields.$': {
99
- type: Object,
100
- blackbox: true,
101
- optional: true
102
- },
103
- selectedFields: {
104
- type: Array,
105
- optional: true
106
- },
107
- 'selectedFields.$': {
108
- type: Object,
109
- optional: true,
110
- blackbox: true
111
- },
112
- customFields: {
113
- type: Array,
114
- optional: true
115
- },
116
- 'customFields.$': {
117
- type: Object,
118
- optional: true,
119
- blackbox: true
120
- },
121
- groupsRow: {
122
- type: Array
123
- },
124
- 'groupsRow.$': {
125
- type: Object,
126
- blackbox: true
127
- },
128
- fieldsTotal: {
129
- type: Array
130
- },
131
- 'fieldsTotal.$': {
132
- type: Object,
133
- blackbox: true
134
- },
135
- fieldsLink: {
136
- type: Array
137
- },
138
- 'fieldsLink.$': {
139
- type: Object,
140
- blackbox: true
141
- },
142
- date_field: {
143
- type: String,
144
- optional: true
145
- },
146
- date_interval: {
147
- type: String,
148
- optional: true
149
- },
150
- displayType: {
151
- type: String,
152
- optional: true
153
- }
154
- }),
155
- function: function(reportType: string, rootCollectionName: string, rootOptions: PaginationOptions, filters: any[] = [], filterArrays: any[] = [], filterArrayFields: any[] = [], selectedFields: any[] = [], customFields: any[] = [], groupsRow: any[] = [], fieldsTotal: any[] = [], fieldsLink: any[] = [], date_field = '', date_interval = '', displayType = '') {
156
- return new Promise(async (resolve, reject) => {
157
-
158
- let modelCollection = ResolveIOServer.getMongoManager().collection(rootCollectionName);
159
-
160
- if (!modelCollection) {
161
- reject('Invalid collection');
162
- }
163
- else {
164
- // Query
165
- let query = [];
166
-
167
- // Non-Lookup Match Filters
168
- let initialQueryMatchCondition = {
169
- $and: []
170
- };
171
-
172
- // selectedFields.filter(a => a.collection_name === rootCollectionName).forEach(field => {
173
- // initialQueryMatchCondition['$and'].push({
174
- // $and: [
175
- // {[field.fieldPath.replace(/\.\$/g, '')]: {$exists: 1}},
176
- // // {[field.fieldPath.replace(/\.\$/g, '')]: {$ne: ''}},
177
- // {[field.fieldPath.replace(/\.\$/g, '')]: {$ne: null}},
178
- // ]
179
- // });
180
- // });
181
-
182
- if (filters.filter(a => (!a['$or'] && !Object.keys(a).some(b => b.includes('(Lookup)'))) || (a['$or'] && !a['$or'].some(b => Object.keys(b).some(c => c.includes('(Lookup)'))))).length) {
183
- filters.filter(a => (!a['$or'] && !Object.keys(a).some(b => b.includes('(Lookup)'))) || (a['$or'] && !a['$or'].some(b => Object.keys(b).some(c => c.includes('(Lookup)'))))).forEach(filter => {
184
- initialQueryMatchCondition['$and'].push(filter);
185
- });
186
- }
187
-
188
- // Add filter to query
189
- // if (filters.filter(a => (!a['$or'] && !Object.keys(a).some(b => b.includes('(Lookup)'))) || (a['$or'] && !a['$or'].some(b => Object.keys(b).some(c => c.includes('(Lookup)'))))).length || selectedFields.filter(a => !a.fieldPath.includes('(Lookup')).length) {
190
- if (filters.filter(a => (!a['$or'] && !Object.keys(a).some(b => b.includes('(Lookup)'))) || (a['$or'] && !a['$or'].some(b => Object.keys(b).some(c => c.includes('(Lookup)'))))).length) {
191
- query.push({
192
- $match: initialQueryMatchCondition
193
- });
194
- }
195
-
196
- // Add count
197
- query.push({ $addFields: { count: { $sum: 1} } });
198
-
199
- let sizes = [];
200
-
201
- filterArrayFields.filter(a => a.fieldPath).forEach(filterField => {
202
- let fieldData = filterField.fieldPath.split('.$');
203
-
204
- let fieldPath = '';
205
-
206
- for (let i = 0; i < fieldData.length - 1; i++) {
207
-
208
- fieldPath += fieldData[i];
209
-
210
- if (fieldPath.split('.$')[fieldPath.split('.$').length - 1].includes('(Lookup)')) {
211
- if (!query.some(a => a.$lookup && a.$lookup.as === filterField.lookup_as.replace(/\.\$/g, ''))) {
212
- query.push({$lookup: {
213
- from: filterField.lookup_collection,
214
- localField: filterField.lookup_local_key,
215
- foreignField: filterField.lookup_foreign_key,
216
- as: filterField.lookup_as.replace(/\.\$/g, '')
217
- }});
218
-
219
- sizes.push(filterField.lookup_as.replace(/\.\$\./g, '_').replace(/\./g, '_'));
220
- query.push({$addFields: {['size_' + filterField.lookup_as.replace(/\.\$\./g, '_').replace(/\./g, '_')]: {$size: {$ifNull: ['$' + filterField.lookup_as.replace(/\.\$/g, '').replace(/\./g, '_'), []]}}}});
221
-
222
- query.push({'$unwind': {path: '$' + filterField.lookup_as.replace(/\.\$/g, ''), preserveNullAndEmptyArrays: true}});
223
- }
224
- }
225
- else {
226
- if (!query.some(a => a.$addFields && Object.keys(a.$addFields).includes('size_' + fieldPath.replace(/\./g, '_')))) {
227
- sizes.push(fieldPath.replace(/\./g, '_'));
228
- query.push({$addFields: {['size_' + fieldPath.replace(/\./g, '_')]: {$size: {$ifNull: ['$' + fieldPath, []]}}}});
229
-
230
- query.push({'$unwind': {path: '$' + fieldPath, preserveNullAndEmptyArrays: true}});
231
- }
232
- }
233
- }
234
- });
235
-
236
- // Groups - Lookups / Sizes / Unwinds
237
- groupsRow.forEach(row => {
238
- if (row.field.includes('$')) {
239
- let fieldData = row.field.split('.$');
240
-
241
- let fieldPath = '';
242
-
243
- for (let i = 0; i < fieldData.length - 1; i++) {
244
-
245
- fieldPath += fieldData[i];
246
-
247
- if (fieldPath.split('.$')[fieldPath.split('.$').length - 1].includes('(Lookup)')) {
248
- if (!query.some(a => a.$lookup && a.$lookup.as === row.treeItem.lookup_as.replace(/\.\$/g, ''))) {
249
- query.push({$lookup: {
250
- from: row.treeItem.lookup_collection,
251
- localField: row.treeItem.lookup_local_key,
252
- foreignField: row.treeItem.lookup_foreign_key,
253
- as: row.treeItem.lookup_as.replace(/\.\$/g, '')
254
- }});
255
-
256
- sizes.push(row.treeItem.lookup_as.replace(/\.\$\./g, '_').replace(/\./g, '_'));
257
- query.push({$addFields: {['size_' + row.treeItem.lookup_as.replace(/\.\$\./g, '_').replace(/\./g, '_')]: {$size: {$ifNull: ['$' + row.treeItem.lookup_as.replace(/\.\$/g, '').replace(/\./g, '_'), []]}}}});
258
-
259
- query.push({'$unwind': {path: '$' + row.treeItem.lookup_as.replace(/\.\$/g, ''), preserveNullAndEmptyArrays: true}});
260
- }
261
- }
262
- else {
263
- if (!query.some(a => a.$addFields && Object.keys(a.$addFields).includes('size_' + fieldPath.replace(/\./g, '_')))) {
264
- sizes.push(fieldPath.replace(/\./g, '_'));
265
- query.push({$addFields: {['size_' + fieldPath.replace(/\./g, '_')]: {$size: {$ifNull: ['$' + fieldPath, []]}}}});
266
-
267
- query.push({'$unwind': {path: '$' + fieldPath, preserveNullAndEmptyArrays: true}});
268
- }
269
- }
270
- }
271
- }
272
- });
273
-
274
- // Selected Fields - Lookups / Sizes / Unwinds
275
- selectedFields.forEach(field => {
276
- if (field.fieldPath.includes('$')) {
277
- let fieldData = field.fieldPath.split('.$');
278
-
279
- let fieldPath = '';
280
-
281
- for (let i = 0; i < fieldData.length - 1; i++) {
282
-
283
- fieldPath += fieldData[i];
284
-
285
- if (fieldPath.split('.$')[fieldPath.split('.$').length - 1].includes('(Lookup)')) {
286
- if (!query.some(a => a.$lookup && a.$lookup.as === field.lookup_as.replace(/\.\$/g, ''))) {
287
- query.push({$lookup: {
288
- from: field.lookup_collection,
289
- localField: field.lookup_local_key,
290
- foreignField: field.lookup_foreign_key,
291
- as: field.lookup_as.replace(/\.\$/g, '')
292
- }});
293
-
294
- sizes.push(field.lookup_as.replace(/\.\$\./g, '_').replace(/\./g, '_'));
295
- query.push({$addFields: {['size_' + field.lookup_as.replace(/\.\$\./g, '_').replace(/\./g, '_')]: {$size: {$ifNull: ['$' + field.lookup_as.replace(/\.\$/g, '').replace(/\./g, '_'), []]}}}});
296
-
297
- query.push({'$unwind': {path: '$' + field.lookup_as.replace(/\.\$/g, ''), preserveNullAndEmptyArrays: true}});
298
- }
299
- else {
300
- if (!fieldData[i].includes('(Lookup)')) {
301
- if (!query.some(a => a.$addFields && Object.keys(a.$addFields).includes('size_' + fieldPath.replace(/\./g, '_')))) {
302
- sizes.push(fieldPath.replace(/\./g, '_'));
303
- query.push({$addFields: {['size_' + fieldPath.replace(/\./g, '_')]: {$size: {$ifNull: ['$' + fieldPath, []]}}}});
304
-
305
- query.push({'$unwind': {path: '$' + fieldPath, preserveNullAndEmptyArrays: true}});
306
- }
307
- }
308
- }
309
- }
310
- else {
311
- if (!query.some(a => a.$addFields && Object.keys(a.$addFields).includes('size_' + fieldPath.replace(/\./g, '_')))) {
312
- sizes.push(fieldPath.replace(/\./g, '_'));
313
- query.push({$addFields: {['size_' + fieldPath.replace(/\./g, '_')]: {$size: {$ifNull: ['$' + fieldPath, []]}}}});
314
- }
315
-
316
- if (field.leafValueType !== 'Count' && !query.some(a => a.$unwind && a.$unwind.path === '$' + fieldPath)) {
317
- query.push({'$unwind': {path: '$' + fieldPath, preserveNullAndEmptyArrays: true}});
318
- }
319
- }
320
- }
321
- }
322
- });
323
-
324
- // Divide all number fields by sizes
325
- let divFields = {$addFields: {}};
326
-
327
- fieldsTotal.filter(a => a.type === 'sum').forEach(total => {
328
- selectedFields.filter(a => a.fieldType === 'Number' || a.leafValueType === 'Count').forEach(field => {
329
- let multFields = [];
330
-
331
- if (!field.fieldPath.includes('.$')) {
332
- sizes.forEach(size => {
333
- multFields.push({$cond: { if: { $gt: ['$size_' + size, 0 ] }, then: '$size_' + size, else: 1 }});
334
- });
335
- }
336
- else {
337
- sizes.filter(a => !field.fieldPath.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a) && !filterArrayFields.filter(a => a.fieldPath).some(b => b.fieldPath.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a)) && !fieldsLink.some(b => b.field_first.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a) || b.field_second.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a))).forEach(size => {
338
- multFields.push({$cond: { if: { $gt: ['$size_' + size, 0 ] }, then: '$size_' + size, else: 1 }});
339
- });
340
- }
341
-
342
- if (multFields.length) {
343
- if (field.leafValueType === 'Count') {
344
- divFields.$addFields[total.id + '_' + field.id] = {
345
- $divide: ['$count', {$multiply: multFields}]
346
- };
347
- }
348
- else {
349
- divFields.$addFields[total.id + '_' + field.id] = {
350
- $divide: ['$' + field.fieldPath.replace(/\.\$/g, ''), {$multiply: multFields}]
351
- };
352
- }
353
- }
354
- else {
355
- if (field.leafValueType === 'Count') {
356
- divFields.$addFields[total.id + '_' + field.id] = '$count';
357
- }
358
- else {
359
- divFields.$addFields[total.id + '_' + field.id] = '$' + field.fieldPath.replace(/\.\$/g, '');
360
- }
361
- }
362
- });
363
- });
364
-
365
- selectedFields.filter(a => a.fieldType === 'Number' && a.leafValueType === 'Sum').forEach(field => {
366
- let multFields = [];
367
-
368
- sizes.filter(a => !field.fieldPath.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a) && !groupsRow.some(b => b.field.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a)) && !filterArrayFields.filter(a => a.fieldPath).some(b => b.fieldPath.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a)) && !fieldsLink.some(b => b.field_first.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a) || b.field_second.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a))).forEach(size => {
369
- multFields.push({$cond: { if: { $gt: ['$size_' + size, 0 ] }, then: '$size_' + size, else: 1 }});
370
- });
371
-
372
- if (multFields.length) {
373
- divFields.$addFields[field.fieldPath.replace(/\.\$/g, '')] = {
374
- $divide: ['$' + field.fieldPath.replace(/\.\$/g, ''), {$multiply: multFields}]
375
- };
376
- }
377
- });
378
-
379
- selectedFields.filter(a => a.leafValueType === 'Count').forEach(field => {
380
- let multFields = [];
381
-
382
- sizes.filter(a => !field.fieldPath.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a) && !groupsRow.some(b => b.field.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a)) && !filterArrayFields.filter(a => a.fieldPath).some(b => b.fieldPath.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a)) && !fieldsLink.some(b => b.field_first.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a) || b.field_second.replace(/\.\$\./g, '_').replace(/\./g, '_').includes(a))).forEach(size => {
383
- multFields.push({$cond: { if: { $gt: ['$size_' + size, 0 ] }, then: '$size_' + size, else: 1 }});
384
- });
385
-
386
- if (multFields.length) {
387
- divFields.$addFields['count_' + field.fieldPath.replace(/\.\$/g, '')] = {
388
- $divide: ['$count', {$multiply: multFields}]
389
- };
390
- }
391
- else {
392
- if (reportType !== 'Dated' && sizes.filter(a => field.fieldPath.replace(/\.\$\./g, '_').includes(a)).length) {
393
- sizes.filter(a => field.fieldPath.replace(/\.\$\./g, '_').includes(a)).forEach(size => {
394
- divFields.$addFields['count_' + field.fieldPath.replace(/\.\$/g, '')] = '$size_' + size;
395
- });
396
- }
397
- else {
398
- divFields.$addFields['count_' + field.fieldPath.replace(/\.\$/g, '')] = '$count';
399
- }
400
- }
401
- });
402
-
403
- fieldsTotal.filter(a => a.type === 'avg').forEach(total => {
404
- selectedFields.filter(a => a.fieldType === 'Number' || a.leafValueType === 'Count').forEach(field => {
405
- divFields.$addFields[total.id + '_' + field.id] = '$' + field.fieldPath.replace(/\.\$/g, '');
406
- });
407
- });
408
-
409
- if (Object.keys(divFields.$addFields).length > 0) {
410
- query.push(divFields);
411
- }
412
-
413
- fieldsLink.filter(a => a.field_first && a.field_second).forEach(link => {
414
- query.push({$addFields: {[link.id]: {$cmp: ['$' + link.field_first.replace(/\.\$/g, ''), '$' + link.field_second.replace(/\.\$/g, '')]}}});
415
- query.push({$match: {[link.id]: 0}});
416
- });
417
-
418
- customFields.forEach(cust => {
419
- cust.operations.filter(a => a.operation && !a.fields.some(b => (b.field === null || b.field === '') && b.value === null)).forEach((operation, opIndex) => {
420
- let custFieldGroup = {};
421
-
422
- if (operation.operation === 'divide') {
423
- let condCheck = [];
424
- operation.fields.filter(a => a.field || a.value !== null).forEach(field => {
425
- if (field.field) {
426
- condCheck.push({$eq: ['$' + field.field.replace(/\.\$/g, ''), 0]});
427
- condCheck.push({$eq: ['$' + field.field.replace(/\.\$/g, ''), null]});
428
- }
429
- else {
430
- condCheck.push({$eq: [field.value, 0]});
431
- condCheck.push({$eq: [field.value, null]});
432
- }
433
- });
434
-
435
- if (opIndex > 0) {
436
- condCheck.push({$eq: ['$' + cust.selFieldId, 0]});
437
- condCheck.push({$eq: ['$' + cust.selFieldId, null]});
438
- }
439
-
440
- let tmpOperationFields = [];
441
-
442
- if (opIndex > 0) {
443
- tmpOperationFields.push('$' + cust.selFieldId);
444
- }
445
-
446
- operation.fields.filter(a => a.field || a.value !== null).forEach(field => {
447
- if (field.field) {
448
- tmpOperationFields.push('$' + field.field.replace(/\.\$/g, ''));
449
- }
450
- else {
451
- tmpOperationFields.push(field.value);
452
- }
453
- });
454
-
455
- custFieldGroup[cust.selFieldId] = {
456
- $cond: { if: { $or: condCheck }, then: 0, else: {['$' + operation.operation]: tmpOperationFields} }
457
- };
458
- }
459
- else {
460
- custFieldGroup[cust.selFieldId] = {
461
- ['$' + operation.operation]: []
462
- };
463
-
464
- if (opIndex > 0) {
465
- custFieldGroup[cust.selFieldId]['$' + operation.operation].push({$cond: { if: { $eq: ['$' + cust.selFieldId, null] }, then: 0, else: '$' + cust.selFieldId}});
466
- }
467
-
468
- let condOr = [];
469
-
470
- operation.fields.filter(a => a.field || a.value !== null).forEach(field => {
471
- if (field.field) {
472
- condOr.push({$eq: ['$' + field.field.replace(/\.\$/g, ''), null]});
473
- }
474
- else {
475
- condOr.push({$eq: [field.value, null]});
476
- }
477
- });
478
-
479
- operation.fields.filter(a => a.field || a.value !== null).forEach(field => {
480
- if (field.field) {
481
- custFieldGroup[cust.selFieldId]['$' + operation.operation].push({$cond: { if: { $or: condOr }, then: 0, else: '$' + field.field.replace(/\.\$/g, '')}});
482
- }
483
- else {
484
- custFieldGroup[cust.selFieldId]['$' + operation.operation].push({$cond: { if: { $or: condOr }, then: 0, else: field.value}});
485
- }
486
- });
487
- }
488
-
489
- query.push({$addFields: custFieldGroup});
490
- });
491
- });
492
-
493
- fieldsTotal.forEach(total => {
494
- customFields.forEach(field => {
495
- query.push({$addFields:{[total.id + '_' + field.selFieldId]: '$' + field.selFieldId}});
496
- });
497
- });
498
-
499
- // Filters - Lookups / Arrays
500
- let queryMatchConditionLookup = {
501
- $and: []
502
- };
503
-
504
- if (filters.filter(a => (!a['$or'] && Object.keys(a).some(b => b.includes('(Lookup)'))) || (a['$or'] && a['$or'].some(b => Object.keys(b).some(c => c.includes('(Lookup)'))))).length) {
505
- filters.filter(a => (!a['$or'] && Object.keys(a).some(b => b.includes('(Lookup)'))) || (a['$or'] && a['$or'].some(b => Object.keys(b).some(c => c.includes('(Lookup)'))))).forEach(filter => {
506
- queryMatchConditionLookup['$and'].push(filter);
507
- });
508
- }
509
-
510
- filterArrays.forEach(filter => {
511
- queryMatchConditionLookup['$and'].push(filter);
512
- });
513
-
514
- if (queryMatchConditionLookup.$and.length) {
515
- query.push({$match: queryMatchConditionLookup});
516
- }
517
-
518
- // Group
519
- let queryGroup = {
520
- _id: {}
521
- };
522
-
523
- if (groupsRow.length || !displayType || displayType === 'grouped') {
524
- if (!groupsRow.length) {
525
- queryGroup._id = '$_id';
526
- }
527
- else {
528
- if (rootOptions.sort) {
529
- let groupedSorts = {};
530
- Object.keys(rootOptions.sort).forEach(sortField => {
531
- let selField = selectedFields.filter(a => a.id === sortField)[0];
532
-
533
- if (selField) {
534
- groupedSorts[selField.fieldPath.replace(/\.\$/g, '')] = rootOptions.sort[sortField];
535
- }
536
- });
537
- if (Object.keys(groupedSorts).length > 0) {
538
- query.push({
539
- $sort: groupedSorts
540
- });
541
- }
542
- }
543
- }
544
-
545
- groupsRow.forEach(row => {
546
- queryGroup._id[row.id] = '$' + row.field.replace(/\.\$/g, '');
547
-
548
- if (date_field && date_interval) {
549
- if (date_interval === 'Seconds') {
550
- queryGroup._id['second'] = {'$second' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
551
- queryGroup._id['minute'] = {'$minute' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
552
- queryGroup._id['hour'] = {'$hour' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
553
- queryGroup._id['day'] = {'$dayOfMonth' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
554
- queryGroup._id['month'] = {'$month' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
555
- queryGroup._id['year'] = {'$year' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
556
- }
557
- else if (date_interval === 'Minutes') {
558
- queryGroup._id['minute'] = {'$minute' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
559
- queryGroup._id['hour'] = {'$hour' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
560
- queryGroup._id['day'] = {'$dayOfMonth' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
561
- queryGroup._id['month'] = {'$month' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
562
- queryGroup._id['year'] = {'$year' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
563
- }
564
- else if (date_interval === 'Hours') {
565
- queryGroup._id['hour'] = {'$hour' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
566
- queryGroup._id['day'] = {'$dayOfMonth' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
567
- queryGroup._id['month'] = {'$month' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
568
- queryGroup._id['year'] = {'$year' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
569
- }
570
- else if (date_interval === 'Daily') {
571
- queryGroup._id['day'] = {'$dayOfMonth' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
572
- queryGroup._id['month'] = {'$month' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
573
- queryGroup._id['year'] = {'$year' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
574
- }
575
- else if (date_interval === 'Weekly') {
576
- queryGroup._id['week'] = {'$isoWeek' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
577
- queryGroup._id['year'] = {'$isoWeekYear' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
578
- }
579
- else if (date_interval === 'Monthly') {
580
- queryGroup._id['month'] = {'$month' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
581
- queryGroup._id['year'] = {'$year' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
582
- }
583
- else if (date_interval === 'Quarterly') {
584
- queryGroup._id['month'] = {'$month' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
585
- queryGroup._id['year'] = {'$year' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
586
- }
587
- else if (date_interval === 'Yearly') {
588
- queryGroup._id['year'] = {'$year' : {'date': '$' + date_field.replace(/\.\$/g, ''), 'timezone': process.env.TZ}};
589
- }
590
- }
591
- });
592
-
593
- selectedFields.forEach(field => {
594
- if (field.leafValueType === 'Average') {
595
- queryGroup[field.id] = {'$avg': '$' + field.fieldPath.replace(/\.\$/g, '')};
596
- }
597
- else if (field.leafValueType === 'Sum') {
598
- queryGroup[field.id] = {'$sum': '$' + field.fieldPath.replace(/\.\$/g, '')};
599
- }
600
- else if (field.leafValueType === 'Count') {
601
- queryGroup[field.id] = { '$sum': '$count_' + field.fieldPath.replace(/\.\$/g, '') };
602
- }
603
- else if (field.leafValueType === 'Minimum') {
604
- queryGroup[field.id] = {'$min': '$' + field.fieldPath.replace(/\.\$/g, '')};
605
- }
606
- else if (field.leafValueType === 'Maximum') {
607
- queryGroup[field.id] = {'$max': '$' + field.fieldPath.replace(/\.\$/g, '')};
608
- }
609
- else if (field.leafValueType === 'First' || (!groupsRow.length && (!field.fieldPath.includes('.$') || field.fieldPath.includes('(Lookup)')))) {
610
- queryGroup[field.id] = {'$first': '$' + field.fieldPath.replace(/\.\$/g, '')};
611
- }
612
- else if (field.leafValueType === 'Last') {
613
- queryGroup[field.id] = {'$last': '$' + field.fieldPath.replace(/\.\$/g, '')};
614
- }
615
- else if (field.leafValueType === 'Unique') {
616
- queryGroup[field.id] = {'$addToSet': '$' + field.fieldPath.replace(/\.\$/g, '')};
617
- }
618
- else {
619
- queryGroup[field.id] = {'$push': {$ifNull: ['$' + field.fieldPath.replace(/\.\$/g, ''), null]}};
620
- }
621
- });
622
-
623
- customFields.forEach(cust => {
624
- if (cust.leafValueType === 'Average') {
625
- queryGroup[cust.selFieldId] = {'$avg': '$' + cust.selFieldId};
626
- }
627
- else if (cust.leafValueType === 'Sum') {
628
- queryGroup[cust.selFieldId] = {'$sum': '$' + cust.selFieldId};
629
- }
630
- else if (cust.leafValueType === 'Count') {
631
- if (reportType === 'Dated') {
632
- queryGroup[cust.selFieldId] = { '$sum': '$count_' + cust.selFieldId };
633
- }
634
- else {
635
- queryGroup[cust.selFieldId] = { '$push': '$count_' + cust.selFieldId };
636
- }
637
- }
638
- else if (cust.leafValueType === 'Minimum') {
639
- queryGroup[cust.selFieldId] = {'$min': '$' + cust.selFieldId};
640
- }
641
- else if (cust.leafValueType === 'Maximum') {
642
- queryGroup[cust.selFieldId] = {'$max': '$' + cust.selFieldId};
643
- }
644
- else if (cust.leafValueType === 'First') {
645
- queryGroup[cust.selFieldId] = {'$first': '$' + cust.selFieldId};
646
- }
647
- else if (cust.leafValueType === 'Last') {
648
- queryGroup[cust.selFieldId] = {'$last': '$' + cust.selFieldId};
649
- }
650
- else if (cust.leafValueType === 'Unique') {
651
- queryGroup[cust.selFieldId] = {'$addToSet': '$' + cust.selFieldId};
652
- }
653
- else {
654
- queryGroup[cust.selFieldId] = {'$push': {$ifNull: ['$' + cust.selFieldId, null]}};
655
- }
656
- });
657
-
658
- // Totals
659
- if (fieldsTotal.length) {
660
- fieldsTotal.forEach(total => {
661
- selectedFields.filter(a => a.fieldType === 'Number' || a.leafValueType === 'Count').forEach(field => {
662
- queryGroup[total.id + '_' + field.id] = {$sum: '$' + total.id + '_' + field.id};
663
- });
664
-
665
- customFields.forEach(field => {
666
- queryGroup[total.id + '_' + field.selFieldId] = {$sum: '$' + total.id + '_' + field.selFieldId};
667
- });
668
- });
669
- }
670
-
671
- query.push({$group: queryGroup});
672
- }
673
- else {
674
- //Projection
675
- let queryProjection = {
676
- _id: 1
677
- };
678
-
679
- selectedFields.forEach(field => {
680
- if (field.leafValueType === 'Average') {
681
- queryProjection[field.id] = {$avg: '$' + field.fieldPath.replace(/\.\$/g, '')};
682
- }
683
- else if (field.leafValueType === 'Sum') {
684
- queryProjection[field.id] = {$sum: '$' + field.fieldPath.replace(/\.\$/g, '')};
685
- }
686
- else if (field.leafValueType === 'Count') {
687
- queryProjection[field.id] = {$sum: 1};
688
- }
689
- else if (field.leafValueType === 'Minimum') {
690
- queryProjection[field.id] = {$min: '$' + field.fieldPath.replace(/\.\$/g, '')};
691
- }
692
- else if (field.leafValueType === 'Maximum') {
693
- queryProjection[field.id] = {$max: '$' + field.fieldPath.replace(/\.\$/g, '')};
694
- }
695
- else {
696
- queryProjection[field.id] = '$' + field.fieldPath.replace(/\.\$/g, '');
697
- }
698
- });
699
-
700
- customFields.forEach(cust => {
701
- if (cust === 'Average') {
702
- queryProjection[cust.selFieldId] = {$avg: '$' + cust.selFieldId};
703
- }
704
- else if (cust === 'Sum') {
705
- queryProjection[cust.selFieldId] = {$sum: '$' + cust.selFieldId};
706
- }
707
- else if (cust === 'Count') {
708
- queryProjection[cust.selFieldId] = {$sum: 1};
709
- }
710
- else if (cust === 'Minimum') {
711
- queryProjection[cust.selFieldId] = {$min: '$' + cust.selFieldId};
712
- }
713
- else if (cust === 'Maximum') {
714
- queryProjection[cust.selFieldId] = {$max: '$' + cust.selFieldId};
715
- }
716
- else {
717
- queryProjection[cust.selFieldId] = '$' + cust.selFieldId;
718
- }
719
- });
720
-
721
- //Totals
722
- if (fieldsTotal.length && (reportType === 'List' || reportType === 'Dated')) {
723
- fieldsTotal.forEach(total => {
724
- selectedFields.filter(a => a.fieldType === 'Number' || a.leafValueType === 'Count').forEach(field => {
725
- queryProjection[total.id + '_' + field.id] = {['$' + total.type]: '$' + total.id + '_' + field.id};
726
- });
727
-
728
- customFields.forEach(field => {
729
- queryProjection[total.id + '_' + field.selFieldId] = {['$' + total.type]: '$' + total.id + '_' + field.selFieldId};
730
- });
731
- });
732
- }
733
-
734
- query.push({$project: queryProjection});
735
- }
736
-
737
- // SORT
738
- if (rootOptions.sort) {
739
- query.push({
740
- $sort: rootOptions.sort
741
- });
742
- }
743
-
744
- if (reportType === 'Group' && groupsRow.length > 1) {
745
- for (let i = groupsRow.length - 1; i >= 1; i--) {
746
- let projQuery = {_id: 1};
747
-
748
- projQuery[groupsRow[i].id] = {
749
- _id: {[groupsRow[i].id]: '$_id.' + groupsRow[i].id}
750
- };
751
-
752
- if (i === groupsRow.length - 1) {
753
- selectedFields.forEach(field => {
754
- projQuery[groupsRow[i].id][field.id] = '$' + field.id;
755
- });
756
-
757
- customFields.forEach(field => {
758
- projQuery[groupsRow[i].id][field.selFieldId] = '$' + field.selFieldId;
759
- });
760
- }
761
- else {
762
- projQuery[groupsRow[i].id][groupsRow[i + 1].id] = '$' + groupsRow[i + 1].id;
763
- }
764
-
765
- fieldsTotal.forEach(totField => {
766
- selectedFields.filter(b => b.fieldType === 'Number' || b.leafValueType === 'Count').forEach(selField => {
767
- projQuery[totField.id + '_' + selField.id] = 1;
768
- projQuery[groupsRow[i].id][totField.id + '_' + selField.id] = '$' + totField.id + '_' + selField.id;
769
- });
770
-
771
- customFields.forEach(field => {
772
- projQuery[groupsRow[i].id][totField.id + '_' + field.selFieldId] = '$' + totField.id + '_' + field.selFieldId;
773
- });
774
- });
775
-
776
- query.push({$project: projQuery});
777
-
778
- let grQuery = {
779
- _id: {}
780
- };
781
-
782
- for (let j = 0; j < i; j++) {
783
- grQuery._id[groupsRow[j].id] = '$_id.' + groupsRow[j].id;
784
- }
785
-
786
- grQuery[groupsRow[i].id] = {
787
- $push: '$' + groupsRow[i].id
788
- };
789
-
790
- fieldsTotal.forEach(totField => {
791
- selectedFields.filter(b => b.fieldType === 'Number' || b.leafValueType === 'Count').forEach(selField => {
792
- grQuery[totField.id + '_' + selField.id] = {['$' + totField.type]: '$' + totField.id + '_' + selField.id};
793
- });
794
-
795
- customFields.forEach(field => {
796
- grQuery[totField.id + '_' + field.selFieldId] = {['$' + totField.type]: '$' + totField.id + '_' + field.selFieldId};
797
- });
798
- });
799
-
800
- query.push({$group: grQuery});
801
-
802
- if (rootOptions.sort) {
803
- let sortKeys = Object.keys(rootOptions.sort);
804
- let sort = {};
805
-
806
- let groupString = '';
807
- groupsRow.forEach((row, groupIndex) => {
808
- if (groupIndex > 0) {
809
- groupString += 'gr_' + (groupIndex + 1) + '.';
810
- }
811
-
812
- if (sortKeys.includes('_id.gr_' + (groupIndex + 1))) {
813
- sort[groupString + '_id.gr_' + (groupIndex + 1)] = rootOptions.sort['_id.gr_' + (groupIndex + 1)];
814
- }
815
- else {
816
- sort[groupString + '_id.gr_' + (groupIndex + 1)] = 1;
817
- }
818
- });
819
-
820
- sortKeys.filter(a => !a.startsWith('_id.gr_')).forEach(key => {
821
- sort[groupString + key] = rootOptions.sort[key];
822
- });
823
-
824
- query.push({$sort: sort});
825
- }
826
- }
827
- }
828
-
829
- // console.log('_____________ query __________'); console.log(query); console.log(JSON.stringify(query, null, 2));
830
-
831
- let res = null;
832
-
833
- try {
834
- res = await modelCollection.aggregate(query, {allowDiskUse: true, readPreference: this.serverConfig['ROOT_URL'] !== 'http://localhost:4200' ? 'secondary' : 'primary'}, true);
835
- }
836
- catch (err) {
837
- console.log(err);
838
- }
839
-
840
- let tmpTotals = {};
841
-
842
- if (res) {
843
- fieldsTotal.forEach(totField => {
844
- selectedFields.filter(b => b.fieldType === 'Number' || b.leafValueType === 'Count').forEach(selField => {
845
- if (totField.type === 'sum') {
846
- tmpTotals[totField.id + '_' + selField.id] = res.map(a => a[totField.id + '_' + selField.id] || 0).reduce((a, b) => a + b, 0);
847
- }
848
- else if (totField.type === 'avg') {
849
- tmpTotals[totField.id + '_' + selField.id] = Math.round(res.map(a => a[totField.id + '_' + selField.id] || 0).reduce((a, b) => a + b, 0) / res.length);
850
- }
851
- });
852
-
853
- customFields.forEach(custField => {
854
- if (totField.type === 'sum') {
855
- tmpTotals[totField.id + '_' + custField.selFieldId] = res.map(a => a[totField.id + '_' + custField.selFieldId] || 0).reduce((a, b) => a + b, 0);
856
- }
857
- else if (totField.type === 'avg') {
858
- tmpTotals[totField.id + '_' + custField.selFieldId] = Math.round(res.map(a => a[totField.id + '_' + custField.selFieldId] || 0).reduce((a, b) => a + b, 0) / res.length);
859
- }
860
- });
861
- });
862
- }
863
-
864
- let tmpRes = [{
865
- count: res ? res.length : 0,
866
- results: res ? (rootOptions.limit ? res.splice(0, rootOptions.limit) : res) : [],
867
- totals: tmpTotals
868
- }];
869
-
870
- resolve(tmpRes);
871
- }
872
- });
873
- },
874
- }
875
- });
876
- }