@oneuptime/common 11.7.3 → 11.7.4

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 (365) hide show
  1. package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +1 -0
  2. package/Models/DatabaseModels/AlertStateTimeline.ts +1 -0
  3. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  4. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  5. package/Models/DatabaseModels/Index.ts +5 -0
  6. package/Models/DatabaseModels/LogDropFilter.ts +89 -0
  7. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +13 -3
  8. package/Models/DatabaseModels/RecommendationDismissal.ts +463 -0
  9. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  10. package/Models/DatabaseModels/StatusPageGroup.ts +95 -0
  11. package/Models/DatabaseModels/TraceDropFilter.ts +89 -0
  12. package/Models/DatabaseModels/WorkflowVariable.ts +5 -1
  13. package/Server/API/AlertAPI.ts +32 -17
  14. package/Server/API/BaseAPI.ts +31 -2
  15. package/Server/API/BaseAnalyticsAPI.ts +36 -2
  16. package/Server/API/CommonAPI.ts +57 -0
  17. package/Server/API/IncidentAPI.ts +60 -33
  18. package/Server/API/IncidentEpisodeAPI.ts +31 -16
  19. package/Server/API/MonitorAPI.ts +30 -0
  20. package/Server/API/MonitorTemplateAPI.ts +8 -0
  21. package/Server/API/ProbeAPI.ts +196 -15
  22. package/Server/API/ProjectAPI.ts +79 -1
  23. package/Server/API/ScheduledMaintenanceAPI.ts +33 -18
  24. package/Server/API/StatusPageAPI.ts +74 -37
  25. package/Server/API/WorkspaceNotificationRuleAPI.ts +34 -4
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.ts +527 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.ts +31 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.ts +55 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.ts +53 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  31. package/Server/Services/AlertEpisodeService.ts +47 -0
  32. package/Server/Services/AlertService.ts +125 -0
  33. package/Server/Services/BillingService.ts +98 -0
  34. package/Server/Services/DatabaseService.ts +184 -20
  35. package/Server/Services/IncidentEpisodeService.ts +47 -0
  36. package/Server/Services/IncidentService.ts +123 -0
  37. package/Server/Services/IncidentTemplateService.ts +123 -1
  38. package/Server/Services/Index.ts +2 -0
  39. package/Server/Services/LogDropFilterService.ts +133 -0
  40. package/Server/Services/MonitorProbeService.ts +94 -4
  41. package/Server/Services/MonitorService.ts +48 -43
  42. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +70 -0
  43. package/Server/Services/ProbeService.ts +66 -0
  44. package/Server/Services/ProjectService.ts +131 -7
  45. package/Server/Services/RecommendationDismissalService.ts +52 -0
  46. package/Server/Services/RunbookAgentJobService.ts +68 -7
  47. package/Server/Services/ScheduledMaintenanceService.ts +103 -0
  48. package/Server/Services/ScheduledMaintenanceTemplateService.ts +90 -0
  49. package/Server/Services/StatusPageGroupService.ts +186 -0
  50. package/Server/Services/TraceDropFilterService.ts +133 -0
  51. package/Server/Types/Workflow/Components/API/Delete.ts +12 -0
  52. package/Server/Types/Workflow/Components/API/Get.ts +12 -0
  53. package/Server/Types/Workflow/Components/API/Patch.ts +12 -0
  54. package/Server/Types/Workflow/Components/API/Post.ts +12 -0
  55. package/Server/Types/Workflow/Components/API/Put.ts +13 -0
  56. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +212 -0
  57. package/Server/Utils/DropFilterValidation.ts +127 -0
  58. package/Server/Utils/Errors.ts +5 -0
  59. package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
  60. package/Server/Utils/Monitor/MonitorIncident.ts +31 -2
  61. package/Server/Utils/Telemetry/AppMetrics.ts +31 -0
  62. package/Tests/Models/DatabaseModels/MonitorProbeColumnAccessControl.test.ts +196 -0
  63. package/Tests/Models/RecommendationDismissalModel.test.ts +269 -0
  64. package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +320 -0
  65. package/Tests/Server/API/BaseAnalyticsAPIUpdatePayloadValidation.test.ts +293 -0
  66. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +164 -0
  67. package/Tests/Server/API/ProbeAPI.test.ts +422 -53
  68. package/Tests/Server/API/ProjectAPI.test.ts +180 -0
  69. package/Tests/Server/API/ProjectAPIExtendTrialBillingDisabled.test.ts +138 -0
  70. package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +458 -0
  71. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +359 -0
  72. package/Tests/Server/Infrastructure/ProcessSignalDelivery.test.ts +427 -0
  73. package/Tests/Server/Services/BillingServiceExtendTrial.test.ts +439 -0
  74. package/Tests/Server/Services/CrossProjectReferenceWriteGuard.test.ts +810 -0
  75. package/Tests/Server/Services/DatabaseServiceAtomicAddToColumns.test.ts +269 -0
  76. package/Tests/Server/Services/DatabaseServiceEmptyUpdate.test.ts +277 -0
  77. package/Tests/Server/Services/DatabaseServiceSortColumnSelect.test.ts +201 -0
  78. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +81 -23
  79. package/Tests/Server/Services/DropFilterSaveValidation.test.ts +398 -0
  80. package/Tests/Server/Services/MonitorProbeDeleteHooks.test.ts +280 -0
  81. package/Tests/Server/Services/MonitorProbeServiceProbeTenancy.test.ts +304 -0
  82. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +262 -0
  83. package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +614 -0
  84. package/Tests/Server/Services/RecommendationDismissalService.test.ts +306 -0
  85. package/Tests/Server/Services/RepairCrossProjectIncidentReferencesMigration.test.ts +528 -0
  86. package/Tests/Server/Services/StatusPageGroupNesting.test.ts +395 -0
  87. package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +26 -21
  88. package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +227 -0
  89. package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +285 -0
  90. package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +463 -0
  91. package/Tests/Server/Utils/DropFilterValidation.test.ts +269 -0
  92. package/Tests/Server/Utils/Telemetry/SpanUtil.test.ts +94 -0
  93. package/Tests/Types/DateUserTimezone.test.ts +52 -0
  94. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +177 -9
  95. package/Tests/Types/Monitor/MonitorStepDnsMonitor.test.ts +105 -0
  96. package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +131 -0
  97. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +60 -0
  98. package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +82 -0
  99. package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +268 -0
  100. package/Tests/Types/Monitor/MonitorStepMetricMonitor.test.ts +386 -0
  101. package/Tests/Types/Monitor/MonitorStepProfileMonitor.test.ts +185 -0
  102. package/Tests/Types/Monitor/MonitorStepSnmpMonitor.test.ts +156 -0
  103. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +371 -0
  104. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +901 -0
  105. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +607 -0
  106. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +754 -0
  107. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +960 -0
  108. package/Tests/Types/RollingTime/RollingTimeUtil.test.ts +186 -0
  109. package/Tests/Types/Runbook/RunbookStepTimeout.test.ts +410 -0
  110. package/Tests/Types/Telemetry/DropFilterSampling.test.ts +241 -0
  111. package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +353 -0
  112. package/Tests/Types/Workspace/NotificationRuleUtil.test.ts +566 -0
  113. package/Tests/UI/Components/CodeEditor.test.tsx +174 -0
  114. package/Tests/UI/Components/ErrorBoundary.test.tsx +555 -24
  115. package/Tests/UI/Components/InfoCard.test.tsx +358 -0
  116. package/Tests/UI/Components/LogTimeRangePicker.test.tsx +138 -0
  117. package/Tests/UI/Components/Modal.test.tsx +43 -5
  118. package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +397 -0
  119. package/Tests/UI/Components/ModelTable/ColumnCustomizationModal.test.tsx +427 -0
  120. package/Tests/UI/Components/Runbook/StepTimeoutInput.test.tsx +386 -0
  121. package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +671 -0
  122. package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +404 -0
  123. package/Tests/UI/Utils/DropdownAlignment.test.ts +306 -0
  124. package/Tests/UI/Utils/TableFilterUrlState.test.ts +292 -0
  125. package/Tests/Utils/Monitor/MonitorSummaryProbeUtil.test.ts +263 -0
  126. package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +583 -0
  127. package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +1072 -0
  128. package/Tests/Utils/StatusPage/GroupTree.test.ts +583 -0
  129. package/Tests/Utils/StatusPage/ResourceUptime.test.ts +411 -0
  130. package/Types/Date.ts +15 -6
  131. package/Types/Monitor/KubernetesAlertTemplates.ts +205 -0
  132. package/Types/Monitor/MonitorStep.ts +10 -1
  133. package/Types/Monitor/MonitorStepMetricMonitor.ts +46 -1
  134. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +413 -0
  135. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +168 -0
  136. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +175 -0
  137. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +743 -0
  138. package/Types/Permission.ts +45 -0
  139. package/Types/Recommendation/RecommendationType.ts +20 -0
  140. package/Types/Runbook/RunbookExecutionDeadline.ts +129 -0
  141. package/Types/Runbook/RunbookStepTimeout.ts +202 -0
  142. package/Types/Telemetry/DropFilterSampling.ts +92 -0
  143. package/UI/Components/AI/GenerateFromAIModal.tsx +0 -2
  144. package/UI/Components/Accordion/Accordion.tsx +10 -2
  145. package/UI/Components/BulkUpdate/BulkLabelActions.tsx +0 -1
  146. package/UI/Components/CodeEditor/CodeEditor.tsx +34 -20
  147. package/UI/Components/Date/RangeStartAndEndDateView.tsx +0 -1
  148. package/UI/Components/EditionLabel/EditionLabel.tsx +1 -27
  149. package/UI/Components/Error/PageError.tsx +0 -4
  150. package/UI/Components/ErrorBoundary.tsx +252 -15
  151. package/UI/Components/InfoCard/InfoCard.tsx +58 -1
  152. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +34 -1
  153. package/UI/Components/Modal/Modal.tsx +16 -60
  154. package/UI/Components/ModelFormModal/ModelFormModal.tsx +0 -8
  155. package/UI/Components/ModelTable/BaseModelTable.tsx +116 -67
  156. package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +150 -47
  157. package/UI/Components/Runbook/StepTimeoutInput.tsx +173 -0
  158. package/UI/Components/StatusPage/ResourceGroupSection.tsx +231 -0
  159. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +34 -1
  160. package/UI/Utils/DropdownAlignment.ts +162 -0
  161. package/UI/Utils/TableFilterUrlState.ts +59 -20
  162. package/Utils/API.ts +106 -2
  163. package/Utils/Monitor/MonitorSummaryProbeUtil.ts +130 -0
  164. package/Utils/NetworkDiscovery/ScanTargetUtil.ts +434 -0
  165. package/Utils/StatusPage/GroupNestingLayout.ts +343 -0
  166. package/Utils/StatusPage/GroupTree.ts +307 -0
  167. package/Utils/StatusPage/ResourceUptime.ts +90 -17
  168. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +1 -0
  169. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -1
  170. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +1 -0
  171. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
  172. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
  173. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  174. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  175. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  176. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  177. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  178. package/build/dist/Models/DatabaseModels/LogDropFilter.js +91 -0
  179. package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
  180. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +14 -4
  181. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  182. package/build/dist/Models/DatabaseModels/RecommendationDismissal.js +484 -0
  183. package/build/dist/Models/DatabaseModels/RecommendationDismissal.js.map +1 -0
  184. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  185. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  186. package/build/dist/Models/DatabaseModels/StatusPageGroup.js +94 -0
  187. package/build/dist/Models/DatabaseModels/StatusPageGroup.js.map +1 -1
  188. package/build/dist/Models/DatabaseModels/TraceDropFilter.js +91 -0
  189. package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
  190. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +5 -1
  191. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  192. package/build/dist/Server/API/AlertAPI.js +22 -13
  193. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  194. package/build/dist/Server/API/BaseAPI.js +22 -1
  195. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  196. package/build/dist/Server/API/BaseAnalyticsAPI.js +24 -1
  197. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  198. package/build/dist/Server/API/CommonAPI.js +42 -0
  199. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  200. package/build/dist/Server/API/IncidentAPI.js +43 -26
  201. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  202. package/build/dist/Server/API/IncidentEpisodeAPI.js +21 -12
  203. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  204. package/build/dist/Server/API/MonitorAPI.js +23 -0
  205. package/build/dist/Server/API/MonitorAPI.js.map +1 -1
  206. package/build/dist/Server/API/MonitorTemplateAPI.js +4 -0
  207. package/build/dist/Server/API/MonitorTemplateAPI.js.map +1 -1
  208. package/build/dist/Server/API/ProbeAPI.js +131 -15
  209. package/build/dist/Server/API/ProbeAPI.js.map +1 -1
  210. package/build/dist/Server/API/ProjectAPI.js +62 -3
  211. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  212. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +23 -14
  213. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  214. package/build/dist/Server/API/StatusPageAPI.js +61 -33
  215. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  216. package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js +26 -2
  217. package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js.map +1 -1
  218. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js +397 -0
  219. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js.map +1 -0
  220. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js +16 -0
  221. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js.map +1 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js +30 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js.map +1 -0
  224. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js +34 -0
  225. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js.map +1 -0
  226. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  227. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  228. package/build/dist/Server/Services/AlertEpisodeService.js +39 -0
  229. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  230. package/build/dist/Server/Services/AlertService.js +95 -0
  231. package/build/dist/Server/Services/AlertService.js.map +1 -1
  232. package/build/dist/Server/Services/BillingService.js +71 -0
  233. package/build/dist/Server/Services/BillingService.js.map +1 -1
  234. package/build/dist/Server/Services/DatabaseService.js +140 -17
  235. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  236. package/build/dist/Server/Services/IncidentEpisodeService.js +39 -0
  237. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  238. package/build/dist/Server/Services/IncidentService.js +100 -0
  239. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  240. package/build/dist/Server/Services/IncidentTemplateService.js +97 -0
  241. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  242. package/build/dist/Server/Services/Index.js +2 -0
  243. package/build/dist/Server/Services/Index.js.map +1 -1
  244. package/build/dist/Server/Services/LogDropFilterService.js +93 -0
  245. package/build/dist/Server/Services/LogDropFilterService.js.map +1 -1
  246. package/build/dist/Server/Services/MonitorProbeService.js +73 -5
  247. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  248. package/build/dist/Server/Services/MonitorService.js +34 -39
  249. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  250. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +71 -0
  251. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  252. package/build/dist/Server/Services/ProbeService.js +64 -0
  253. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  254. package/build/dist/Server/Services/ProjectService.js +103 -7
  255. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  256. package/build/dist/Server/Services/RecommendationDismissalService.js +50 -0
  257. package/build/dist/Server/Services/RecommendationDismissalService.js.map +1 -0
  258. package/build/dist/Server/Services/RunbookAgentJobService.js +63 -5
  259. package/build/dist/Server/Services/RunbookAgentJobService.js.map +1 -1
  260. package/build/dist/Server/Services/ScheduledMaintenanceService.js +83 -0
  261. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  262. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +65 -0
  263. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
  264. package/build/dist/Server/Services/StatusPageGroupService.js +136 -0
  265. package/build/dist/Server/Services/StatusPageGroupService.js.map +1 -1
  266. package/build/dist/Server/Services/TraceDropFilterService.js +93 -0
  267. package/build/dist/Server/Services/TraceDropFilterService.js.map +1 -1
  268. package/build/dist/Server/Types/Workflow/Components/API/Delete.js +11 -0
  269. package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
  270. package/build/dist/Server/Types/Workflow/Components/API/Get.js +11 -0
  271. package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
  272. package/build/dist/Server/Types/Workflow/Components/API/Patch.js +11 -0
  273. package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
  274. package/build/dist/Server/Types/Workflow/Components/API/Post.js +11 -0
  275. package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
  276. package/build/dist/Server/Types/Workflow/Components/API/Put.js +12 -0
  277. package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
  278. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +132 -0
  279. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -0
  280. package/build/dist/Server/Utils/DropFilterValidation.js +80 -0
  281. package/build/dist/Server/Utils/DropFilterValidation.js.map +1 -0
  282. package/build/dist/Server/Utils/Errors.js +3 -0
  283. package/build/dist/Server/Utils/Errors.js.map +1 -1
  284. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -12
  285. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  286. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +38 -18
  287. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  288. package/build/dist/Server/Utils/Telemetry/AppMetrics.js +26 -0
  289. package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
  290. package/build/dist/Types/Date.js +14 -4
  291. package/build/dist/Types/Date.js.map +1 -1
  292. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +192 -0
  293. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  294. package/build/dist/Types/Monitor/MonitorStep.js +6 -1
  295. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  296. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +32 -1
  297. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
  298. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +294 -0
  299. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -0
  300. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +110 -0
  301. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -0
  302. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +58 -0
  303. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -0
  304. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +451 -0
  305. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -0
  306. package/build/dist/Types/Permission.js +40 -0
  307. package/build/dist/Types/Permission.js.map +1 -1
  308. package/build/dist/Types/Recommendation/RecommendationType.js +21 -0
  309. package/build/dist/Types/Recommendation/RecommendationType.js.map +1 -0
  310. package/build/dist/Types/Runbook/RunbookExecutionDeadline.js +93 -0
  311. package/build/dist/Types/Runbook/RunbookExecutionDeadline.js.map +1 -0
  312. package/build/dist/Types/Runbook/RunbookStepTimeout.js +142 -0
  313. package/build/dist/Types/Runbook/RunbookStepTimeout.js.map +1 -0
  314. package/build/dist/Types/Telemetry/DropFilterSampling.js +75 -0
  315. package/build/dist/Types/Telemetry/DropFilterSampling.js.map +1 -0
  316. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -2
  317. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
  318. package/build/dist/UI/Components/Accordion/Accordion.js +9 -2
  319. package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
  320. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +1 -1
  321. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
  322. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +27 -14
  323. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  324. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js +1 -1
  325. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js.map +1 -1
  326. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +2 -20
  327. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  328. package/build/dist/UI/Components/Error/PageError.js +1 -3
  329. package/build/dist/UI/Components/Error/PageError.js.map +1 -1
  330. package/build/dist/UI/Components/ErrorBoundary.js +145 -11
  331. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  332. package/build/dist/UI/Components/InfoCard/InfoCard.js +28 -1
  333. package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
  334. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +13 -2
  335. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  336. package/build/dist/UI/Components/Modal/Modal.js +4 -32
  337. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  338. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  339. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +69 -33
  340. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  341. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +73 -32
  342. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -1
  343. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js +101 -0
  344. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js.map +1 -0
  345. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +73 -0
  346. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -0
  347. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +13 -2
  348. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  349. package/build/dist/UI/Utils/DropdownAlignment.js +98 -0
  350. package/build/dist/UI/Utils/DropdownAlignment.js.map +1 -0
  351. package/build/dist/UI/Utils/TableFilterUrlState.js +48 -15
  352. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  353. package/build/dist/Utils/API.js +39 -2
  354. package/build/dist/Utils/API.js.map +1 -1
  355. package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js +97 -0
  356. package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js.map +1 -0
  357. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +330 -0
  358. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -0
  359. package/build/dist/Utils/StatusPage/GroupNestingLayout.js +280 -0
  360. package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -0
  361. package/build/dist/Utils/StatusPage/GroupTree.js +214 -0
  362. package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -0
  363. package/build/dist/Utils/StatusPage/ResourceUptime.js +60 -16
  364. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  365. package/package.json +1 -1
@@ -2,40 +2,156 @@ import UserMiddleware from "../Middleware/UserAuthorization";
2
2
  import ProbeService from "../Services/ProbeService";
3
3
  import Response from "../Utils/Response";
4
4
  import BaseAPI from "./BaseAPI";
5
- import LIMIT_MAX from "../../Types/Database/LimitMax";
5
+ import MultiSearch from "../../Types/BaseDatabase/MultiSearch";
6
+ import { DEFAULT_LIMIT, LIMIT_PER_PROJECT, } from "../../Types/Database/LimitMax";
7
+ import BadDataException from "../../Types/Exception/BadDataException";
8
+ import BadRequestException from "../../Types/Exception/BadRequestException";
9
+ import JSONFunctions from "../../Types/JSONFunctions";
6
10
  import PositiveNumber from "../../Types/PositiveNumber";
7
11
  import Probe from "../../Models/DatabaseModels/Probe";
12
+ // What a caller that asks for no fields in particular gets back.
13
+ const DEFAULT_GLOBAL_PROBE_SELECT = {
14
+ name: true,
15
+ description: true,
16
+ lastAlive: true,
17
+ iconFileId: true,
18
+ connectionStatus: true,
19
+ // The monitor create form pre-selects the auto-enabled probes.
20
+ shouldAutoEnableProbeOnNewMonitors: true,
21
+ };
22
+ /*
23
+ * Global probes are not project rows, so this endpoint has to read them as
24
+ * root - which means none of the usual per-column permission checks run.
25
+ * Every field a caller may select, filter or sort on is therefore listed
26
+ * here, and nothing else is reachable: `key` in particular is a probe's
27
+ * shared secret, and a root-privileged query on it would be an oracle for
28
+ * reading it back one character at a time.
29
+ */
30
+ const GLOBAL_PROBE_FIELDS = [
31
+ ...Object.keys(DEFAULT_GLOBAL_PROBE_SELECT),
32
+ "_id",
33
+ /*
34
+ * Readable, but not something a caller can steer: the query below pins it
35
+ * to true whatever the caller sent.
36
+ */
37
+ "isGlobalProbe",
38
+ ];
8
39
  export default class ProbeAPI extends BaseAPI {
9
40
  constructor() {
10
41
  var _a;
11
42
  super(Probe, ProbeService);
12
43
  this.router.post(`${(_a = new this.entityType().getCrudApiPath()) === null || _a === void 0 ? void 0 : _a.toString()}/global-probes`, UserMiddleware.getUserMiddleware, async (req, res, next) => {
13
44
  try {
45
+ const body = req.body || {};
46
+ const skip = new PositiveNumber(ProbeAPI.getPaginationValue(req, "skip", 0));
47
+ const limit = new PositiveNumber(ProbeAPI.getPaginationValue(req, "limit", DEFAULT_LIMIT));
48
+ if (limit.toNumber() > LIMIT_PER_PROJECT) {
49
+ throw new BadRequestException("Limit should be less than " + LIMIT_PER_PROJECT);
50
+ }
51
+ if (skip.toNumber() < 0) {
52
+ throw new BadRequestException("Skip should be greater than or equal to 0");
53
+ }
54
+ if (limit.toNumber() <= 0) {
55
+ throw new BadRequestException("Limit should be greater than 0");
56
+ }
57
+ const query = Object.assign(Object.assign({}, ProbeAPI.getQuery(body["query"])), {
58
+ /*
59
+ * Last, so a caller cannot widen the read past the global probes
60
+ * by sending isGlobalProbe themselves.
61
+ */
62
+ isGlobalProbe: true });
63
+ const select = ProbeAPI.getSelect(body["select"]);
64
+ const sort = ProbeAPI.getSort(body["sort"]);
14
65
  const probes = await ProbeService.findBy({
15
- query: {
16
- isGlobalProbe: true,
17
- },
18
- select: {
19
- name: true,
20
- description: true,
21
- lastAlive: true,
22
- iconFileId: true,
23
- connectionStatus: true,
24
- // The monitor create form pre-selects the auto-enabled probes.
25
- shouldAutoEnableProbeOnNewMonitors: true,
66
+ query,
67
+ select,
68
+ sort,
69
+ props: {
70
+ isRoot: true,
26
71
  },
72
+ skip,
73
+ limit,
74
+ });
75
+ const count = await ProbeService.countBy({
76
+ query,
27
77
  props: {
28
78
  isRoot: true,
29
79
  },
30
- skip: 0,
31
- limit: LIMIT_MAX,
32
80
  });
33
- return Response.sendEntityArrayResponse(req, res, probes, new PositiveNumber(probes.length), Probe);
81
+ return Response.sendEntityArrayResponse(req, res, probes, count, Probe);
34
82
  }
35
83
  catch (err) {
36
84
  next(err);
37
85
  }
38
86
  });
39
87
  }
88
+ /*
89
+ * skip/limit arrive as query params from ModelAPI.getList and in the body
90
+ * from anything hand-rolled, so both are read - same precedence as
91
+ * BaseAPI.getList.
92
+ */
93
+ static getPaginationValue(req, key, defaultValue) {
94
+ if (req.query && req.query[key]) {
95
+ return parseInt(req.query[key], 10) || defaultValue;
96
+ }
97
+ if (req.body && req.body[key] !== undefined) {
98
+ return (parseInt(req.body[key], 10) || defaultValue);
99
+ }
100
+ return defaultValue;
101
+ }
102
+ static getQuery(query) {
103
+ const deserialized = JSONFunctions.deserialize(query);
104
+ for (const key in deserialized) {
105
+ const value = deserialized[key];
106
+ /*
107
+ * MultiSearch is the free-text search operator. Its key is synthetic -
108
+ * the columns it reads are the ones it carries - so those are what get
109
+ * checked against the allow-list.
110
+ */
111
+ if (value instanceof MultiSearch) {
112
+ for (const field of value.fields) {
113
+ if (!GLOBAL_PROBE_FIELDS.includes(field)) {
114
+ throw new BadDataException(`Global probes cannot be searched on ${field}.`);
115
+ }
116
+ }
117
+ continue;
118
+ }
119
+ if (!GLOBAL_PROBE_FIELDS.includes(key)) {
120
+ throw new BadDataException(`Global probes cannot be filtered on ${key}.`);
121
+ }
122
+ }
123
+ return deserialized;
124
+ }
125
+ static getSelect(select) {
126
+ const requested = {};
127
+ for (const key in select) {
128
+ if (!GLOBAL_PROBE_FIELDS.includes(key) || !select[key]) {
129
+ continue;
130
+ }
131
+ /*
132
+ * Coerced rather than copied: every selectable field here is a scalar,
133
+ * so a nested (relation) select on one of them is not something the
134
+ * caller gets to ask for.
135
+ */
136
+ requested[key] = true;
137
+ }
138
+ /*
139
+ * A caller that asks for nothing gets what this endpoint returned before
140
+ * it honoured select at all.
141
+ */
142
+ if (Object.keys(requested).length === 0) {
143
+ return Object.assign({}, DEFAULT_GLOBAL_PROBE_SELECT);
144
+ }
145
+ return requested;
146
+ }
147
+ static getSort(sort) {
148
+ const deserialized = JSONFunctions.deserialize(sort);
149
+ for (const key in deserialized) {
150
+ if (!GLOBAL_PROBE_FIELDS.includes(key)) {
151
+ throw new BadDataException(`Global probes cannot be sorted on ${key}.`);
152
+ }
153
+ }
154
+ return deserialized;
155
+ }
40
156
  }
41
157
  //# sourceMappingURL=ProbeAPI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProbeAPI.js","sourceRoot":"","sources":["../../../../Server/API/ProbeAPI.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,iCAAiC,CAAC;AAC7D,OAAO,YAEN,MAAM,0BAA0B,CAAC;AAMlC,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,SAAS,MAAM,+BAA+B,CAAC;AACtD,OAAO,cAAc,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,MAAM,mCAAmC,CAAC;AAEtD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAgC;IACpE;;QACE,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAE3B,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,GAAG,MAAA,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,cAAc,EAAE,0CAAE,QAAQ,EAAE,gBAAgB,EACrE,cAAc,CAAC,iBAAiB,EAChC,KAAK,EAAE,GAAmB,EAAE,GAAoB,EAAE,IAAkB,EAAE,EAAE;YACtE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAiB,MAAM,YAAY,CAAC,MAAM,CAAC;oBACrD,KAAK,EAAE;wBACL,aAAa,EAAE,IAAI;qBACpB;oBACD,MAAM,EAAE;wBACN,IAAI,EAAE,IAAI;wBACV,WAAW,EAAE,IAAI;wBACjB,SAAS,EAAE,IAAI;wBACf,UAAU,EAAE,IAAI;wBAChB,gBAAgB,EAAE,IAAI;wBACtB,+DAA+D;wBAC/D,kCAAkC,EAAE,IAAI;qBACzC;oBACD,KAAK,EAAE;wBACL,MAAM,EAAE,IAAI;qBACb;oBACD,IAAI,EAAE,CAAC;oBACP,KAAK,EAAE,SAAS;iBACjB,CAAC,CAAC;gBAEH,OAAO,QAAQ,CAAC,uBAAuB,CACrC,GAAG,EACH,GAAG,EACH,MAAM,EACN,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EACjC,KAAK,CACN,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,CAAC,CAAC;YACZ,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"ProbeAPI.js","sourceRoot":"","sources":["../../../../Server/API/ProbeAPI.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
1
  import { IsBillingEnabled } from "../EnvironmentConfig";
2
+ import MasterAdminAuthorization from "../Middleware/MasterAdminAuthorization";
2
3
  import UserMiddleware from "../Middleware/UserAuthorization";
3
4
  import ProjectService from "../Services/ProjectService";
4
5
  import ResellerService from "../Services/ResellerService";
5
6
  import TeamMemberService from "../Services/TeamMemberService";
6
7
  import QueryHelper from "../Types/Database/QueryHelper";
8
+ import JSONWebToken from "../Utils/JsonWebToken";
7
9
  import Response from "../Utils/Response";
8
10
  import BaseAPI from "./BaseAPI";
9
11
  import BillingService from "../Services/BillingService";
@@ -13,11 +15,12 @@ import NotAuthenticatedException from "../../Types/Exception/NotAuthenticatedExc
13
15
  import PositiveNumber from "../../Types/PositiveNumber";
14
16
  import Project from "../../Models/DatabaseModels/Project";
15
17
  import BadDataException from "../../Types/Exception/BadDataException";
18
+ import OneUptimeDate from "../../Types/Date";
16
19
  import Permission from "../../Types/Permission";
17
20
  import ObjectID from "../../Types/ObjectID";
18
21
  export default class ProjectAPI extends BaseAPI {
19
22
  constructor() {
20
- var _a, _b;
23
+ var _a, _b, _c;
21
24
  super(Project, ProjectService);
22
25
  this.router.put(`${(_a = new this.entityType().getCrudApiPath()) === null || _a === void 0 ? void 0 : _a.toString()}/:id/change-plan`, UserMiddleware.getUserMiddleware, async (req, res, next) => {
23
26
  var _a;
@@ -84,12 +87,68 @@ export default class ProjectAPI extends BaseAPI {
84
87
  next(err);
85
88
  }
86
89
  });
90
+ /*
91
+ * Extends a project's trial. Master-admin only: this hands out free
92
+ * service and moves the customer's next invoice, so it is deliberately not
93
+ * reachable with project-level billing permissions - only OneUptime staff
94
+ * acting from the Admin Dashboard can call it.
95
+ */
96
+ this.router.put(`${(_b = new this.entityType().getCrudApiPath()) === null || _b === void 0 ? void 0 : _b.toString()}/:id/extend-trial`, MasterAdminAuthorization.isAuthorizedMasterAdminMiddleware, async (req, res, next) => {
97
+ try {
98
+ if (!IsBillingEnabled) {
99
+ throw new BadDataException("Billing is not enabled for this server");
100
+ }
101
+ const projectId = new ObjectID(req.params["id"]);
102
+ const body = req.body || {};
103
+ const data = body["data"] || {};
104
+ const trialEndsAtValue = data["trialEndsAt"];
105
+ if (!trialEndsAtValue) {
106
+ throw new BadDataException("Trial end date is required to extend the trial");
107
+ }
108
+ /*
109
+ * OneUptimeDate.fromString only parses strings and Dates - anything
110
+ * else comes back as its own error text, not a Date - so reject a
111
+ * non-string body value here rather than letting it through.
112
+ */
113
+ if (typeof trialEndsAtValue !== "string") {
114
+ throw new BadDataException("Trial end date is not a valid date");
115
+ }
116
+ const trialEndsAt = OneUptimeDate.fromString(trialEndsAtValue);
117
+ if (isNaN(trialEndsAt.getTime())) {
118
+ throw new BadDataException("Trial end date is not a valid date");
119
+ }
120
+ /*
121
+ * The master admin middleware verifies the token but does not put
122
+ * the decoded payload on the request, so read it again here - who
123
+ * granted the extension is the only audit trail this action has.
124
+ */
125
+ let extendedByUserId = undefined;
126
+ try {
127
+ const accessToken = UserMiddleware.getAccessTokenFromExpressRequest(req);
128
+ if (accessToken) {
129
+ extendedByUserId = JSONWebToken.decode(accessToken).userId;
130
+ }
131
+ }
132
+ catch (_a) {
133
+ // Only used for the log line - never block the extension on it.
134
+ }
135
+ await ProjectService.extendTrial({
136
+ projectId: projectId,
137
+ trialEndsAt: trialEndsAt,
138
+ extendedByUserId: extendedByUserId,
139
+ });
140
+ return Response.sendEmptySuccessResponse(req, res);
141
+ }
142
+ catch (err) {
143
+ next(err);
144
+ }
145
+ });
87
146
  /*
88
147
  * This API lists all the projects where user is its team member.
89
148
  * This API is usually used to show project selector dropdown in the UI
90
149
  */
91
- this.router.post(`${(_b = new this.entityType()
92
- .getCrudApiPath()) === null || _b === void 0 ? void 0 : _b.toString()}/list-user-projects`, UserMiddleware.getUserMiddleware, async (req, res, next) => {
150
+ this.router.post(`${(_c = new this.entityType()
151
+ .getCrudApiPath()) === null || _c === void 0 ? void 0 : _c.toString()}/list-user-projects`, UserMiddleware.getUserMiddleware, async (req, res, next) => {
93
152
  var _a, _b;
94
153
  try {
95
154
  if (!((_a = req.userAuthorization) === null || _a === void 0 ? void 0 : _a.userId)) {
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectAPI.js","sourceRoot":"","sources":["../../../../Server/API/ProjectAPI.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProjectAPI.js","sourceRoot":"","sources":["../../../../Server/API/ProjectAPI.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import ScheduledMaintenance from "../../Models/DatabaseModels/ScheduledMaintenance";
2
2
  import NotFoundException from "../../Types/Exception/NotFoundException";
3
3
  import BadDataException from "../../Types/Exception/BadDataException";
4
+ import DatabaseCommonInteractionPropsUtil, { PermissionType, } from "../../Types/BaseDatabase/DatabaseCommonInteractionPropsUtil";
4
5
  import ObjectID from "../../Types/ObjectID";
5
6
  import ScheduledMaintenanceService from "../Services/ScheduledMaintenanceService";
6
7
  import UserMiddleware from "../Middleware/UserAuthorization";
@@ -27,7 +28,6 @@ export default class ScheduledMaintenanceAPI extends BaseAPI {
27
28
  });
28
29
  }
29
30
  async generateNoteFromAI(req, res) {
30
- var _a;
31
31
  const scheduledMaintenanceIdParam = req.params["scheduledMaintenanceId"];
32
32
  if (!scheduledMaintenanceIdParam) {
33
33
  throw new BadDataException("Scheduled Maintenance ID is required");
@@ -36,22 +36,31 @@ export default class ScheduledMaintenanceAPI extends BaseAPI {
36
36
  try {
37
37
  scheduledMaintenanceId = new ObjectID(scheduledMaintenanceIdParam);
38
38
  }
39
- catch (_b) {
39
+ catch (_a) {
40
40
  throw new BadDataException("Invalid Scheduled Maintenance ID");
41
41
  }
42
42
  const props = await CommonAPI.getDatabaseCommonInteractionProps(req);
43
- // Verify user has permission
44
- const permissions = (_a = props
45
- .userTenantAccessPermission) === null || _a === void 0 ? void 0 : _a["permissions"];
46
- const hasPermission = permissions
47
- ? permissions.some((p) => {
48
- return (p === Permission.ProjectOwner ||
49
- p === Permission.ProjectAdmin ||
50
- p === Permission.EditProjectScheduledMaintenance ||
51
- p === Permission.CreateScheduledMaintenanceInternalNote ||
52
- p === Permission.CreateScheduledMaintenancePublicNote);
53
- })
54
- : false;
43
+ CommonAPI.assertTenantScoped(props);
44
+ /*
45
+ * Read through getUserPermissions(Allow) rather than off
46
+ * userTenantAccessPermission directly. That dictionary is keyed by project
47
+ * id and its entries hold GRANTS AND DENIALS together, discriminated only
48
+ * by isBlockPermission, so the previous
49
+ * `userTenantAccessPermission["permissions"]` read was always undefined
50
+ * and denied every caller who was not a master admin. Mapping the array
51
+ * raw would swing the other way and count a team's explicit block
52
+ * entry for one of these permissions as a grant of it.
53
+ */
54
+ const permissions = DatabaseCommonInteractionPropsUtil.getUserPermissions(props, PermissionType.Allow).map((userPermission) => {
55
+ return userPermission.permission;
56
+ });
57
+ const hasPermission = permissions.some((p) => {
58
+ return (p === Permission.ProjectOwner ||
59
+ p === Permission.ProjectAdmin ||
60
+ p === Permission.EditProjectScheduledMaintenance ||
61
+ p === Permission.CreateScheduledMaintenanceInternalNote ||
62
+ p === Permission.CreateScheduledMaintenancePublicNote);
63
+ });
55
64
  if (!hasPermission && !props.isMasterAdmin) {
56
65
  throw new BadDataException("You do not have permission to generate notes for this scheduled maintenance.");
57
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ScheduledMaintenanceAPI.js","sourceRoot":"","sources":["../../../../Server/API/ScheduledMaintenanceAPI.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScheduledMaintenanceAPI.js","sourceRoot":"","sources":["../../../../Server/API/ScheduledMaintenanceAPI.ts"],"names":[],"mappings":"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"}
@@ -76,6 +76,7 @@ import StatusPageSSO from "../../Models/DatabaseModels/StatusPageSso";
76
76
  import StatusPageOIDC from "../../Models/DatabaseModels/StatusPageOidc";
77
77
  import StatusPageSubscriber from "../../Models/DatabaseModels/StatusPageSubscriber";
78
78
  import StatusPageResourceUptimeUtil from "../../Utils/StatusPage/ResourceUptime";
79
+ import StatusPageGroupTreeUtil from "../../Utils/StatusPage/GroupTree";
79
80
  import UptimePrecision from "../../Types/StatusPage/UptimePrecision";
80
81
  import { Green } from "../../Types/BrandColors";
81
82
  import UptimeUtil from "../../Utils/Uptime/UptimeUtil";
@@ -791,6 +792,7 @@ export default class StatusPageAPI extends BaseAPI {
791
792
  });
792
793
  this.router.post(`${(_w = new this.entityType()
793
794
  .getCrudApiPath()) === null || _w === void 0 ? void 0 : _w.toString()}/uptime/:statusPageId`, UserMiddleware.getUserMiddleware, async (req, res, next) => {
795
+ var _a;
794
796
  try {
795
797
  // This reosurce ID can be of a status page resource OR a status page group.
796
798
  const statusPageResourceId = new ObjectID(req.params["statusPageResourceId"]);
@@ -839,14 +841,15 @@ export default class StatusPageAPI extends BaseAPI {
839
841
  endDate: endDate,
840
842
  };
841
843
  const getUptimeByStatusPageGroup = (data) => {
842
- var _a, _b, _c, _d, _e;
844
+ var _a, _b, _c, _d, _e, _f;
843
845
  const groupUptime = {
844
846
  statusPageGroupId: data && data.statusPageGroup
845
847
  ? (_a = data.statusPageGroup) === null || _a === void 0 ? void 0 : _a.id
846
848
  : null,
849
+ parentStatusPageGroupId: ((_b = data.statusPageGroup) === null || _b === void 0 ? void 0 : _b.parentStatusPageGroupId) || null,
847
850
  uptimePercent: null,
848
851
  statusPageResourceUptimes: [],
849
- statusPageGroupName: ((_b = data.statusPageGroup) === null || _b === void 0 ? void 0 : _b.name) || null,
852
+ statusPageGroupName: ((_c = data.statusPageGroup) === null || _c === void 0 ? void 0 : _c.name) || null,
850
853
  currentStatus: null,
851
854
  };
852
855
  const group = data.statusPageGroup;
@@ -854,8 +857,8 @@ export default class StatusPageAPI extends BaseAPI {
854
857
  if ((resource.statusPageGroupId &&
855
858
  resource.statusPageGroupId.toString() &&
856
859
  group &&
857
- ((_c = group._id) === null || _c === void 0 ? void 0 : _c.toString()) &&
858
- ((_d = group._id) === null || _d === void 0 ? void 0 : _d.toString()) ===
860
+ ((_d = group._id) === null || _d === void 0 ? void 0 : _d.toString()) &&
861
+ ((_e = group._id) === null || _e === void 0 ? void 0 : _e.toString()) ===
859
862
  resource.statusPageGroupId.toString()) ||
860
863
  (!resource.statusPageGroupId && !group)) {
861
864
  // if its not a monitor or a monitor group, then continue. This should ideally not happen.
@@ -865,7 +868,7 @@ export default class StatusPageAPI extends BaseAPI {
865
868
  const resourceUptime = {
866
869
  statusPageResourceId: resource.id,
867
870
  uptimePercent: null,
868
- statusPageResourceName: resource.displayName || ((_e = resource.monitor) === null || _e === void 0 ? void 0 : _e.name) || "",
871
+ statusPageResourceName: resource.displayName || ((_f = resource.monitor) === null || _f === void 0 ? void 0 : _f.name) || "",
869
872
  currentStatus: null,
870
873
  };
871
874
  // if its a monitor
@@ -932,40 +935,64 @@ export default class StatusPageAPI extends BaseAPI {
932
935
  }
933
936
  }
934
937
  }
935
- if (group === null || group === void 0 ? void 0 : group.showUptimePercent) {
936
- // calculate uptime percent for the group.
937
- const avgUptimePercent = UptimeUtil.calculateAvgUptimePercentage({
938
- uptimePercentages: groupUptime.statusPageResourceUptimes
939
- .filter((resource) => {
940
- return resource.uptimePercent !== null;
941
- })
942
- .map((resource) => {
943
- return resource.uptimePercent || 0;
944
- }),
945
- precision: group.uptimePercentPrecision ||
946
- UptimePrecision.ONE_DECIMAL,
947
- });
948
- groupUptime.uptimePercent = avgUptimePercent;
949
- }
950
- if (group === null || group === void 0 ? void 0 : group.showCurrentStatus) {
951
- const currentStatuses = groupUptime.statusPageResourceUptimes
952
- .filter((resourceUptime) => {
953
- return resourceUptime.currentStatus !== null;
954
- })
955
- .map((resourceUptime) => {
956
- return resourceUptime.currentStatus;
957
- });
958
- const worstStatus = StatusPageResourceUptimeUtil.getWorstMonitorStatus({
959
- monitorStatuses: currentStatuses,
960
- });
961
- groupUptime.currentStatus = worstStatus;
962
- }
963
938
  return groupUptime;
964
939
  };
965
940
  const groupUptimes = [];
966
941
  for (const group of statusPageGroups) {
967
942
  groupUptimes.push(getUptimeByStatusPageGroup({ statusPageGroup: group }));
968
943
  }
944
+ /*
945
+ * Groups nest, so a group's own uptime % / current status has to
946
+ * cover every resource in its subtree, not just the resources
947
+ * attached directly to it. statusPageResourceUptimes stays the
948
+ * group's own resources - the nesting is reported through
949
+ * parentStatusPageGroupId so callers can rebuild the tree.
950
+ */
951
+ const resourceUptimesByGroupId = {};
952
+ for (const groupUptime of groupUptimes) {
953
+ resourceUptimesByGroupId[((_a = groupUptime.statusPageGroupId) === null || _a === void 0 ? void 0 : _a.toString()) || ""] = groupUptime.statusPageResourceUptimes;
954
+ }
955
+ for (const group of statusPageGroups) {
956
+ const groupUptime = groupUptimes.find((item) => {
957
+ var _a, _b;
958
+ return (((_a = item.statusPageGroupId) === null || _a === void 0 ? void 0 : _a.toString()) === ((_b = group.id) === null || _b === void 0 ? void 0 : _b.toString()));
959
+ });
960
+ if (!groupUptime) {
961
+ continue;
962
+ }
963
+ const resourceUptimesInSubtree = StatusPageGroupTreeUtil.getGroupAndDescendants({
964
+ statusPageGroup: group,
965
+ statusPageGroups: statusPageGroups,
966
+ }).flatMap((groupInSubtree) => {
967
+ var _a;
968
+ return (resourceUptimesByGroupId[((_a = groupInSubtree.id) === null || _a === void 0 ? void 0 : _a.toString()) || ""] || []);
969
+ });
970
+ if (group.showUptimePercent) {
971
+ groupUptime.uptimePercent =
972
+ UptimeUtil.calculateAvgUptimePercentage({
973
+ uptimePercentages: resourceUptimesInSubtree
974
+ .filter((resource) => {
975
+ return resource.uptimePercent !== null;
976
+ })
977
+ .map((resource) => {
978
+ return resource.uptimePercent || 0;
979
+ }),
980
+ precision: group.uptimePercentPrecision || UptimePrecision.ONE_DECIMAL,
981
+ });
982
+ }
983
+ if (group.showCurrentStatus) {
984
+ groupUptime.currentStatus =
985
+ StatusPageResourceUptimeUtil.getWorstMonitorStatus({
986
+ monitorStatuses: resourceUptimesInSubtree
987
+ .filter((resourceUptime) => {
988
+ return resourceUptime.currentStatus !== null;
989
+ })
990
+ .map((resourceUptime) => {
991
+ return resourceUptime.currentStatus;
992
+ }),
993
+ });
994
+ }
995
+ }
969
996
  return Response.sendJsonObjectResponse(req, res, {
970
997
  statusPageResourceUptimes: [
971
998
  ...getUptimeByStatusPageGroup({ statusPageGroup: null })
@@ -3381,6 +3408,7 @@ export default class StatusPageAPI extends BaseAPI {
3381
3408
  columnAxisLabel: true,
3382
3409
  rowAxisValues: true,
3383
3410
  columnAxisValues: true,
3411
+ parentStatusPageGroupId: true,
3384
3412
  },
3385
3413
  sort: {
3386
3414
  order: SortOrder.Ascending,