@oneuptime/common 13.0.7 → 14.0.0

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 (759) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +23 -15
  2. package/Models/DatabaseModels/GlobalConfig.ts +24 -0
  3. package/Models/DatabaseModels/Monitor.ts +3 -2
  4. package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
  5. package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -1
  6. package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +1 -1
  7. package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +1 -1
  8. package/Scripts/generate-service-worker.js +65 -4
  9. package/Server/API/AIBillingAPI.ts +1 -0
  10. package/Server/API/AIInsightAPI.ts +1 -4
  11. package/Server/API/AIInvestigationAPI.ts +1 -4
  12. package/Server/API/AIReadinessAPI.ts +4 -5
  13. package/Server/API/AlertAPI.ts +1 -0
  14. package/Server/API/AutoRemediationAPI.ts +1 -4
  15. package/Server/API/BaseAPI.ts +34 -0
  16. package/Server/API/BaseAnalyticsAPI.ts +80 -9
  17. package/Server/API/BillingAPI.ts +2 -0
  18. package/Server/API/BillingInvoiceAPI.ts +1 -0
  19. package/Server/API/BillingPaymentMethodAPI.ts +2 -0
  20. package/Server/API/CodeFixRunAPI.ts +1 -3
  21. package/Server/API/CommonAPI.ts +68 -4
  22. package/Server/API/DashboardAPI.ts +12 -12
  23. package/Server/API/GlobalConfigAPI.ts +243 -460
  24. package/Server/API/IncidentAPI.ts +2 -0
  25. package/Server/API/IncidentEpisodeAPI.ts +1 -0
  26. package/Server/API/NotificationAPI.ts +1 -0
  27. package/Server/API/OnCallCalendarAPI.ts +4 -5
  28. package/Server/API/OnCallDutyPolicyAPI.ts +7 -0
  29. package/Server/API/OnCallReadinessAPI.ts +4 -1
  30. package/Server/API/OnCallScheduleTimelineAPI.ts +731 -0
  31. package/Server/API/ProjectAPI.ts +1 -0
  32. package/Server/API/ProjectOIDC.ts +25 -16
  33. package/Server/API/ProjectSSO.ts +24 -16
  34. package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
  35. package/Server/API/StatusPageAPI.ts +261 -74
  36. package/Server/API/TeamMemberAPI.ts +13 -1
  37. package/Server/API/UserCallAPI.ts +2 -0
  38. package/Server/API/UserEmailAPI.ts +2 -0
  39. package/Server/API/UserIncomingCallNumberAPI.ts +2 -0
  40. package/Server/API/UserMicrosoftTeamsAPI.ts +1 -0
  41. package/Server/API/UserSlackAPI.ts +1 -0
  42. package/Server/API/UserSmsAPI.ts +2 -0
  43. package/Server/API/UserTotpAuthAPI.ts +1 -0
  44. package/Server/API/UserWebAuthnAPI.ts +2 -0
  45. package/Server/API/UserWebhookAPI.ts +1 -0
  46. package/Server/API/UserWhatsAppAPI.ts +2 -0
  47. package/Server/Enterprise/EnterpriseEdition.ts +649 -0
  48. package/Server/Enterprise/EnterpriseFeature.ts +48 -0
  49. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
  50. package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
  51. package/Server/EnvironmentConfig.ts +147 -2
  52. package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
  53. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  54. package/Server/Middleware/MasterAdminAuthorization.ts +13 -2
  55. package/Server/Middleware/UserAuthorization.ts +117 -21
  56. package/Server/Services/ApiKeyPermissionService.ts +101 -4
  57. package/Server/Services/AuditLogService.ts +84 -1079
  58. package/Server/Services/DatabaseService.ts +245 -0
  59. package/Server/Services/DetectionRuleService.ts +5 -4
  60. package/Server/Services/EnterpriseLicenseService.ts +38 -0
  61. package/Server/Services/GlobalConfigService.ts +80 -1
  62. package/Server/Services/MonitorProbeService.ts +116 -20
  63. package/Server/Services/MonitorService.ts +56 -4
  64. package/Server/Services/MonitorStatusTimelineService.ts +284 -0
  65. package/Server/Services/MonitorTemplateService.ts +26 -0
  66. package/Server/Services/OnCallDutyPolicyChildService.ts +261 -0
  67. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -2
  68. package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -2
  69. package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -2
  70. package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -2
  71. package/Server/Services/PayAsYouGoBillingService.ts +23 -28
  72. package/Server/Services/ProjectService.ts +302 -0
  73. package/Server/Services/RumSessionPinService.ts +293 -22
  74. package/Server/Services/StatusPagePrivateUserService.ts +7 -3
  75. package/Server/Services/StatusPageService.ts +78 -1
  76. package/Server/Services/TeamMemberService.ts +11 -0
  77. package/Server/Services/TeamPermissionService.ts +120 -26
  78. package/Server/Services/TeamService.ts +10 -0
  79. package/Server/Services/ThreatIntelFeedService.ts +6 -3
  80. package/Server/Services/UserService.ts +10 -17
  81. package/Server/Types/Database/Permissions/BasePermission.ts +9 -7
  82. package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
  83. package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
  84. package/Server/Types/Database/Permissions/Index.ts +75 -11
  85. package/Server/Types/Database/Permissions/TablePermission.ts +34 -31
  86. package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
  87. package/Server/Types/Markdown.ts +41 -0
  88. package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
  89. package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -0
  90. package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
  91. package/Server/Utils/EditionEnforcement.ts +233 -0
  92. package/Server/Utils/FrontendEnvironment.ts +41 -2
  93. package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
  94. package/Server/Utils/MasterAdminPageAccess.ts +61 -0
  95. package/Server/Utils/Monitor/AffectedResourceList.ts +190 -0
  96. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
  97. package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
  98. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +543 -333
  99. package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
  100. package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
  101. package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1 -1
  102. package/Server/Utils/Realtime.ts +163 -45
  103. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +11 -28
  104. package/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.ts +170 -0
  105. package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +1 -1
  106. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +6 -2
  107. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +10 -9
  108. package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
  109. package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
  110. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
  111. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
  112. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
  113. package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
  114. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
  115. package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
  116. package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +1059 -0
  117. package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +376 -0
  118. package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +757 -0
  119. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +307 -0
  120. package/Tests/App/Dashboard/ArgumentsFormGroupByUnlistedAttributes.test.tsx +131 -0
  121. package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
  122. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +1 -1
  123. package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +9 -1
  124. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +24 -0
  125. package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +162 -8
  126. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
  127. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
  128. package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +105 -6
  129. package/Tests/App/Dashboard/EntityFilterDropdownUnlistedSelection.test.tsx +434 -0
  130. package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +276 -1
  131. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
  132. package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +9 -1
  133. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
  134. package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +58 -42
  135. package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +42 -5
  136. package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +34 -23
  137. package/Tests/App/Dashboard/ScheduleTimeline.test.tsx +1580 -0
  138. package/Tests/App/Dashboard/ScheduleTimelineAPI.test.ts +280 -0
  139. package/Tests/App/Dashboard/ScheduleTimelineModel.test.ts +673 -0
  140. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +133 -70
  141. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
  142. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
  143. package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
  144. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -58
  145. package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
  146. package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
  147. package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
  148. package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
  149. package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
  150. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
  151. package/Tests/App/Dashboard/SloOverviewHero.test.tsx +171 -36
  152. package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +215 -0
  153. package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +40 -3
  154. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
  155. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
  156. package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
  157. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
  158. package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
  159. package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
  160. package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
  161. package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
  162. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +138 -5
  163. package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +187 -0
  164. package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +51 -3
  165. package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +55 -2
  166. package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
  167. package/Tests/Server/API/BaseAnalyticsAPIAggregateCache.test.ts +729 -0
  168. package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +93 -7
  169. package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +36 -3
  170. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +1003 -24
  171. package/Tests/Server/API/DashboardPublicRateLimit.test.ts +6 -3
  172. package/Tests/Server/API/ExpiredSessionAIRoutes.test.ts +708 -0
  173. package/Tests/Server/API/ExpiredSessionCustomRoutes.test.ts +928 -0
  174. package/Tests/Server/API/ExpiredSessionMonitorTemplate.test.ts +319 -0
  175. package/Tests/Server/API/ExpiredSessionOnCallDutyPolicy.test.ts +336 -0
  176. package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +820 -0
  177. package/Tests/Server/API/GlobalConfigLicense.test.ts +766 -381
  178. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +115 -12
  179. package/Tests/Server/API/OnCallCalendarAPI.test.ts +375 -8
  180. package/Tests/Server/API/OnCallReadinessAPI.test.ts +196 -912
  181. package/Tests/Server/API/OnCallScheduleTimelineAPI.test.ts +1513 -0
  182. package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +119 -7
  183. package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +111 -4
  184. package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +615 -0
  185. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +89 -2
  186. package/Tests/Server/API/SessionReplayAPI.test.ts +121 -0
  187. package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
  188. package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +4 -2
  189. package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +441 -0
  190. package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +664 -0
  191. package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
  192. package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +7 -0
  193. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +6 -0
  194. package/Tests/Server/API/UserNotificationSettingAPI.test.ts +65 -4
  195. package/Tests/Server/API/UserProjectsAPI.test.ts +63 -3
  196. package/Tests/Server/API/UserTotpAuthAPI.test.ts +48 -2
  197. package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +11 -2
  198. package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +46 -3
  199. package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +18 -2
  200. package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +24 -7
  201. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
  202. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
  203. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
  204. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
  205. package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
  206. package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
  207. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
  208. package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
  209. package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
  210. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
  211. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
  212. package/Tests/Server/Middleware/ExpiredSessionUserMiddleware.test.ts +563 -0
  213. package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +299 -19
  214. package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +453 -0
  215. package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
  216. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
  217. package/Tests/Server/Services/AIChatPrivacyPin.test.ts +24 -0
  218. package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +2 -0
  219. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +3 -3
  220. package/Tests/Server/Services/AuditLogService.test.ts +460 -990
  221. package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
  222. package/Tests/Server/Services/DatabaseServiceCreateSuppliedId.test.ts +147 -0
  223. package/Tests/Server/Services/DatabaseServiceLoginBeforeHooks.test.ts +1078 -0
  224. package/Tests/Server/Services/DatabaseServiceTenantRelationGuard.test.ts +259 -0
  225. package/Tests/Server/Services/DatabaseServiceWriteOperatorValues.test.ts +147 -0
  226. package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
  227. package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
  228. package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
  229. package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
  230. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
  231. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
  232. package/Tests/Server/Services/OnCallChildCreateAuthorizationPostgres.test.ts +711 -0
  233. package/Tests/Server/Services/OnCallDutyPolicyChildService.test.ts +733 -0
  234. package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +190 -140
  235. package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +4 -9
  236. package/Tests/Server/Services/PermissionBlockDeletion.test.ts +780 -0
  237. package/Tests/Server/Services/PermissionBlockDeletionPostgres.test.ts +628 -0
  238. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
  239. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
  240. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
  241. package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -0
  242. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
  243. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
  244. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
  245. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
  246. package/Tests/Server/Services/TeamMemberMultiTenantReadPostgres.test.ts +394 -0
  247. package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +6 -0
  248. package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +131 -0
  249. package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
  250. package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
  251. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
  252. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
  253. package/Tests/Server/Types/Database/Permissions/ModelPermissionAnonymousRefusal.test.ts +518 -0
  254. package/Tests/Server/Types/Database/Permissions/MultiTenantPermissions.test.ts +350 -0
  255. package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +282 -25
  256. package/Tests/Server/Types/Database/Permissions/TableLevelBlockPermission.test.ts +459 -0
  257. package/Tests/Server/Types/Markdown.test.ts +181 -0
  258. package/Tests/Server/Utils/AI/AIRunPrivacyFilter.test.ts +101 -9
  259. package/Tests/Server/Utils/AI/ChatAgentHelpers.test.ts +88 -4
  260. package/Tests/Server/Utils/AI/Toolbox/ExceptionTools.test.ts +459 -0
  261. package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +794 -0
  262. package/Tests/Server/Utils/AI/Toolbox/RecentChangesTools.test.ts +574 -0
  263. package/Tests/Server/Utils/AI/Toolbox/SecurityEventTools.test.ts +596 -0
  264. package/Tests/Server/Utils/CaptchaRequestAndLogging.test.ts +395 -0
  265. package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
  266. package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
  267. package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
  268. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
  269. package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -0
  270. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
  271. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
  272. package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +616 -0
  273. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +934 -96
  274. package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
  275. package/Tests/Server/Utils/Realtime.test.ts +502 -0
  276. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorSeverity.test.ts +216 -0
  277. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +142 -0
  278. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.test.ts +140 -0
  279. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepairClickhouseIntegration.test.ts +542 -0
  280. package/Tests/Server/Utils/Telemetry/ChangeEventRow.test.ts +743 -0
  281. package/Tests/Server/Utils/Telemetry/RuntimeMetrics.test.ts +465 -0
  282. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Alert.test.ts +202 -0
  283. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.test.ts +194 -0
  284. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/ScheduledMaintenance.test.ts +231 -0
  285. package/Tests/Server/Utils/Workspace/Slack/Messages/Alert.test.ts +194 -0
  286. package/Tests/Server/Utils/Workspace/Slack/Messages/AlertEpisode.test.ts +194 -0
  287. package/Tests/Server/Utils/Workspace/Slack/Messages/Incident.test.ts +194 -0
  288. package/Tests/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.test.ts +194 -0
  289. package/Tests/Server/Utils/Workspace/Slack/Messages/ScheduledMaintenance.test.ts +247 -0
  290. package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
  291. package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
  292. package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
  293. package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
  294. package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
  295. package/Tests/Types/Call/CallProvider.test.ts +528 -0
  296. package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
  297. package/Tests/Types/Kubernetes/KubernetesCostIngest.test.ts +236 -0
  298. package/Tests/Types/OnCallDutyPolicy/ScheduleTimeline.test.ts +736 -0
  299. package/Tests/Types/OnCallDutyPolicy/ScheduleTimelineLayout.test.ts +996 -0
  300. package/Tests/Types/SecurityEvent/SigmaRule.test.ts +142 -0
  301. package/Tests/Types/Workflow/Components/JSON.test.ts +182 -0
  302. package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +116 -1
  303. package/Tests/UI/Components/Dropdown/DropdownAsyncOptions.test.tsx +81 -0
  304. package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
  305. package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
  306. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +165 -171
  307. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
  308. package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
  309. package/Tests/UI/Components/EventAttachmentList.test.tsx +174 -0
  310. package/Tests/UI/Components/Forms/BasicFormBurnRateTemplateDefaults.test.tsx +395 -0
  311. package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +286 -0
  312. package/Tests/UI/Components/Forms/FormSummary.test.tsx +128 -0
  313. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
  314. package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
  315. package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
  316. package/Tests/UI/Components/ModelTable/BaseModelTableQueryChange.test.tsx +365 -0
  317. package/Tests/UI/Components/OpenAuthenticatedUrl.test.ts +358 -0
  318. package/Tests/UI/Components/SessionAwareImage.test.tsx +496 -0
  319. package/Tests/UI/Components/TelemetryHistogramZeroBuckets.test.tsx +190 -0
  320. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
  321. package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
  322. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
  323. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +1 -1
  324. package/Tests/UI/Monitor/EvaluationLogListTimestamps.test.tsx +367 -0
  325. package/Tests/UI/Utils/API/BaseAPIRefreshSession.test.ts +1087 -0
  326. package/Tests/UI/Utils/API/DashboardHost.ts +12 -0
  327. package/Tests/UI/Utils/API/FakeAxiosServer.ts +183 -0
  328. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
  329. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  330. package/Tests/UI/Utils/Cookie.test.ts +440 -0
  331. package/Tests/UI/Utils/ModelAPIRequestClient.test.ts +278 -0
  332. package/Tests/UI/Utils/Navigation.test.ts +33 -0
  333. package/Tests/UI/Utils/PricingPlan.test.ts +295 -0
  334. package/Tests/UI/Utils/Realtime.test.ts +759 -0
  335. package/Tests/UI/Utils/Telemetry/Telemetry.test.ts +500 -0
  336. package/Tests/Utils/APIInstanceDispatch.test.ts +311 -0
  337. package/Tests/Utils/HostAddressUtil.test.ts +138 -0
  338. package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
  339. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
  340. package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -0
  341. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
  342. package/Types/API/Hostname.ts +63 -16
  343. package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
  344. package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
  345. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
  346. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
  347. package/Types/Database/CanonicalModelInstance.ts +102 -0
  348. package/Types/Database/TableColumn.ts +20 -6
  349. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
  350. package/Types/IP/IPv6.ts +6 -1
  351. package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
  352. package/Types/Monitor/MonitorStep.ts +6 -1
  353. package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
  354. package/Types/OnCallDutyPolicy/ScheduleTimeline.ts +507 -0
  355. package/Types/OnCallDutyPolicy/ScheduleTimelineLayout.ts +589 -0
  356. package/Types/Realtime/EventName.ts +11 -0
  357. package/Types/SecurityEvent/DetectionFindingConstants.ts +14 -0
  358. package/Types/SecurityEvent/OcsfSeverity.ts +31 -26
  359. package/Types/SecurityEvent/SigmaRule.ts +51 -0
  360. package/Types/SecurityEvent/ThreatIntelConstants.ts +18 -0
  361. package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
  362. package/UI/Components/AttachmentList/EventAttachmentList.tsx +30 -2
  363. package/UI/Components/Dashboard/DashboardVariableControl.tsx +12 -2
  364. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  365. package/UI/Components/EditionLabel/EditionLabel.tsx +808 -1195
  366. package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
  367. package/UI/Components/EventItem/EventItem.tsx +12 -1
  368. package/UI/Components/Forms/BasicForm.tsx +151 -126
  369. package/UI/Components/Forms/CollapsibleFormSection.tsx +63 -0
  370. package/UI/Components/Forms/Fields/FormField.tsx +10 -4
  371. package/UI/Components/Forms/FormSummary.tsx +7 -0
  372. package/UI/Components/Forms/Types/Field.ts +10 -0
  373. package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
  374. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  375. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
  376. package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
  377. package/UI/Components/ModelList/ModelList.tsx +11 -1
  378. package/UI/Components/ModelTable/BaseModelTable.tsx +34 -5
  379. package/UI/Components/ModelTable/TableView.tsx +1 -1
  380. package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
  381. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
  382. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +8 -1
  383. package/UI/Components/Tooltip/Tooltip.tsx +8 -1
  384. package/UI/Utils/API/API.ts +173 -12
  385. package/UI/Utils/API/RequestOptions.ts +11 -0
  386. package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +31 -7
  387. package/UI/Utils/ModelAPI/ModelAPI.ts +30 -9
  388. package/UI/Utils/Navigation.ts +9 -0
  389. package/UI/Utils/OpenAuthenticatedUrl.ts +154 -0
  390. package/UI/Utils/Realtime.ts +176 -30
  391. package/UI/esbuild-enterprise.js +263 -0
  392. package/Utils/API.ts +14 -5
  393. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
  394. package/Utils/HostAddressUtil.ts +94 -0
  395. package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
  396. package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
  397. package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
  398. package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
  399. package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
  400. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
  401. package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
  402. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  403. package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
  404. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  405. package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
  406. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  407. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
  408. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  409. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +1 -1
  410. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -1
  411. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +1 -1
  412. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -1
  413. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +1 -1
  414. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -1
  415. package/build/dist/Server/API/AIBillingAPI.js +1 -1
  416. package/build/dist/Server/API/AIBillingAPI.js.map +1 -1
  417. package/build/dist/Server/API/AIInsightAPI.js +1 -4
  418. package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
  419. package/build/dist/Server/API/AIInvestigationAPI.js +1 -4
  420. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  421. package/build/dist/Server/API/AIReadinessAPI.js +1 -3
  422. package/build/dist/Server/API/AIReadinessAPI.js.map +1 -1
  423. package/build/dist/Server/API/AlertAPI.js +1 -1
  424. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  425. package/build/dist/Server/API/AutoRemediationAPI.js +1 -4
  426. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  427. package/build/dist/Server/API/BaseAPI.js +33 -0
  428. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  429. package/build/dist/Server/API/BaseAnalyticsAPI.js +55 -10
  430. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  431. package/build/dist/Server/API/BillingAPI.js +2 -2
  432. package/build/dist/Server/API/BillingAPI.js.map +1 -1
  433. package/build/dist/Server/API/BillingInvoiceAPI.js +1 -1
  434. package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
  435. package/build/dist/Server/API/BillingPaymentMethodAPI.js +2 -2
  436. package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
  437. package/build/dist/Server/API/CodeFixRunAPI.js +1 -3
  438. package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
  439. package/build/dist/Server/API/CommonAPI.js +50 -5
  440. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  441. package/build/dist/Server/API/DashboardAPI.js +12 -12
  442. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  443. package/build/dist/Server/API/GlobalConfigAPI.js +158 -342
  444. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  445. package/build/dist/Server/API/IncidentAPI.js +2 -2
  446. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  447. package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
  448. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  449. package/build/dist/Server/API/NotificationAPI.js +1 -1
  450. package/build/dist/Server/API/NotificationAPI.js.map +1 -1
  451. package/build/dist/Server/API/OnCallCalendarAPI.js +1 -4
  452. package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -1
  453. package/build/dist/Server/API/OnCallDutyPolicyAPI.js +6 -0
  454. package/build/dist/Server/API/OnCallDutyPolicyAPI.js.map +1 -1
  455. package/build/dist/Server/API/OnCallReadinessAPI.js +4 -1
  456. package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -1
  457. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +494 -0
  458. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -0
  459. package/build/dist/Server/API/ProjectAPI.js +1 -1
  460. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  461. package/build/dist/Server/API/ProjectOIDC.js +24 -16
  462. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  463. package/build/dist/Server/API/ProjectSSO.js +24 -16
  464. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  465. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
  466. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  467. package/build/dist/Server/API/StatusPageAPI.js +218 -76
  468. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  469. package/build/dist/Server/API/TeamMemberAPI.js +11 -4
  470. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  471. package/build/dist/Server/API/UserCallAPI.js +2 -2
  472. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  473. package/build/dist/Server/API/UserEmailAPI.js +2 -2
  474. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  475. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +2 -2
  476. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  477. package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +1 -1
  478. package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -1
  479. package/build/dist/Server/API/UserSlackAPI.js +1 -1
  480. package/build/dist/Server/API/UserSlackAPI.js.map +1 -1
  481. package/build/dist/Server/API/UserSmsAPI.js +2 -2
  482. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  483. package/build/dist/Server/API/UserTotpAuthAPI.js +1 -1
  484. package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
  485. package/build/dist/Server/API/UserWebAuthnAPI.js +2 -2
  486. package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
  487. package/build/dist/Server/API/UserWebhookAPI.js +1 -1
  488. package/build/dist/Server/API/UserWebhookAPI.js.map +1 -1
  489. package/build/dist/Server/API/UserWhatsAppAPI.js +2 -2
  490. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  491. package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
  492. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
  493. package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
  494. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
  495. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
  496. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
  497. package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
  498. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
  499. package/build/dist/Server/EnvironmentConfig.js +84 -2
  500. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  501. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
  502. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
  503. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  504. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  505. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -2
  506. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  507. package/build/dist/Server/Middleware/UserAuthorization.js +94 -15
  508. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  509. package/build/dist/Server/Services/ApiKeyPermissionService.js +80 -4
  510. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  511. package/build/dist/Server/Services/AuditLogService.js +71 -740
  512. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  513. package/build/dist/Server/Services/DatabaseService.js +171 -0
  514. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  515. package/build/dist/Server/Services/DetectionRuleService.js +4 -4
  516. package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
  517. package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
  518. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  519. package/build/dist/Server/Services/GlobalConfigService.js +63 -0
  520. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  521. package/build/dist/Server/Services/MonitorProbeService.js +90 -17
  522. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  523. package/build/dist/Server/Services/MonitorService.js +45 -4
  524. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  525. package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
  526. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  527. package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
  528. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  529. package/build/dist/Server/Services/OnCallDutyPolicyChildService.js +170 -0
  530. package/build/dist/Server/Services/OnCallDutyPolicyChildService.js.map +1 -0
  531. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -2
  532. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  533. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +2 -2
  534. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
  535. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -2
  536. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
  537. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -2
  538. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
  539. package/build/dist/Server/Services/PayAsYouGoBillingService.js +20 -27
  540. package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -1
  541. package/build/dist/Server/Services/ProjectService.js +231 -0
  542. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  543. package/build/dist/Server/Services/RumSessionPinService.js +198 -16
  544. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  545. package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
  546. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  547. package/build/dist/Server/Services/StatusPageService.js +71 -0
  548. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  549. package/build/dist/Server/Services/TeamMemberService.js +10 -0
  550. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  551. package/build/dist/Server/Services/TeamPermissionService.js +89 -27
  552. package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
  553. package/build/dist/Server/Services/TeamService.js +9 -0
  554. package/build/dist/Server/Services/TeamService.js.map +1 -1
  555. package/build/dist/Server/Services/ThreatIntelFeedService.js +5 -4
  556. package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -1
  557. package/build/dist/Server/Services/UserService.js +10 -16
  558. package/build/dist/Server/Services/UserService.js.map +1 -1
  559. package/build/dist/Server/Types/Database/Permissions/BasePermission.js +9 -6
  560. package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
  561. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
  562. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  563. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
  564. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  565. package/build/dist/Server/Types/Database/Permissions/Index.js +60 -6
  566. package/build/dist/Server/Types/Database/Permissions/Index.js.map +1 -1
  567. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +24 -16
  568. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  569. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
  570. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  571. package/build/dist/Server/Types/Markdown.js +31 -0
  572. package/build/dist/Server/Types/Markdown.js.map +1 -1
  573. package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js +7 -0
  574. package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js.map +1 -1
  575. package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js +7 -0
  576. package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js.map +1 -1
  577. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
  578. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
  579. package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
  580. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
  581. package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
  582. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
  583. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
  584. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
  585. package/build/dist/Server/Utils/MasterAdminPageAccess.js +39 -0
  586. package/build/dist/Server/Utils/MasterAdminPageAccess.js.map +1 -0
  587. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +96 -0
  588. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
  589. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  590. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  591. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +3 -1
  592. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  593. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +449 -261
  594. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  595. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +3 -1
  596. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  597. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
  598. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
  599. package/build/dist/Server/Utils/Realtime.js +126 -37
  600. package/build/dist/Server/Utils/Realtime.js.map +1 -1
  601. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +7 -25
  602. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
  603. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js +127 -0
  604. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js.map +1 -0
  605. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +1 -1
  606. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
  607. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +3 -2
  608. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -1
  609. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +4 -8
  610. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -1
  611. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
  612. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  613. package/build/dist/Types/API/Hostname.js +59 -11
  614. package/build/dist/Types/API/Hostname.js.map +1 -1
  615. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +31 -1
  616. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
  617. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
  618. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  619. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
  620. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  621. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
  622. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
  623. package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
  624. package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
  625. package/build/dist/Types/Database/TableColumn.js +19 -6
  626. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  627. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
  628. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
  629. package/build/dist/Types/IP/IPv6.js +6 -1
  630. package/build/dist/Types/IP/IPv6.js.map +1 -1
  631. package/build/dist/Types/Monitor/MonitorStep.js +5 -0
  632. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  633. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
  634. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js +321 -0
  635. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js.map +1 -0
  636. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js +372 -0
  637. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js.map +1 -0
  638. package/build/dist/Types/Realtime/EventName.js +10 -0
  639. package/build/dist/Types/Realtime/EventName.js.map +1 -1
  640. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +11 -0
  641. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
  642. package/build/dist/Types/SecurityEvent/OcsfSeverity.js +30 -25
  643. package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -1
  644. package/build/dist/Types/SecurityEvent/SigmaRule.js +47 -0
  645. package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -1
  646. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +14 -0
  647. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -1
  648. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
  649. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
  650. package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js +9 -4
  651. package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js.map +1 -1
  652. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +10 -2
  653. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -1
  654. package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -1
  655. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  656. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +425 -585
  657. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  658. package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
  659. package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
  660. package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
  661. package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
  662. package/build/dist/UI/Components/Forms/BasicForm.js +70 -64
  663. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  664. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +27 -0
  665. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -0
  666. package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -7
  667. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  668. package/build/dist/UI/Components/Forms/FormSummary.js +7 -0
  669. package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
  670. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
  671. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  672. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  673. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  674. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +2 -1
  675. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  676. package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js +84 -0
  677. package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js.map +1 -0
  678. package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
  679. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  680. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +14 -1
  681. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  682. package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
  683. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  684. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
  685. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  686. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
  687. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  688. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -1
  689. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  690. package/build/dist/UI/Components/Tooltip/Tooltip.js +2 -1
  691. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  692. package/build/dist/UI/Utils/API/API.js +143 -19
  693. package/build/dist/UI/Utils/API/API.js.map +1 -1
  694. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +21 -7
  695. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
  696. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +26 -9
  697. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  698. package/build/dist/UI/Utils/Navigation.js +8 -0
  699. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  700. package/build/dist/UI/Utils/OpenAuthenticatedUrl.js +92 -0
  701. package/build/dist/UI/Utils/OpenAuthenticatedUrl.js.map +1 -0
  702. package/build/dist/UI/Utils/Realtime.js +120 -15
  703. package/build/dist/UI/Utils/Realtime.js.map +1 -1
  704. package/build/dist/Utils/API.js +13 -5
  705. package/build/dist/Utils/API.js.map +1 -1
  706. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
  707. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  708. package/build/dist/Utils/HostAddressUtil.js +80 -0
  709. package/build/dist/Utils/HostAddressUtil.js.map +1 -0
  710. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
  711. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
  712. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
  713. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
  714. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +123 -6
  715. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
  716. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +4 -18
  717. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -1
  718. package/build/dist/Utils/Slo/SloBurnRateTemplate.js +2 -2
  719. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  720. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
  721. package/jest.config.json +3 -1
  722. package/package.json +1 -1
  723. package/test-setup.sh +103 -34
  724. package/tsconfig.json +13 -0
  725. package/Server/API/EnterpriseLicenseAPI.ts +0 -925
  726. package/Server/API/TeamComplianceAPI.ts +0 -158
  727. package/Server/Middleware/SCIMAuthorization.ts +0 -141
  728. package/Server/Services/TeamComplianceService.ts +0 -733
  729. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
  730. package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
  731. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
  732. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
  733. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
  734. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
  735. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
  736. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
  737. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
  738. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
  739. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
  740. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
  741. package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
  742. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
  743. package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
  744. package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
  745. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
  746. package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
  747. package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
  748. package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
  749. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
  750. package/build/dist/Server/Services/TeamComplianceService.js +0 -537
  751. package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
  752. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
  753. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
  754. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
  755. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
  756. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
  757. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
  758. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
  759. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
@@ -28,9 +28,12 @@ import StatusPageResourceService from "../Services/StatusPageResourceService";
28
28
  import StatusPageService, {
29
29
  Service as StatusPageServiceType,
30
30
  } from "../Services/StatusPageService";
31
+ import { UptimeDailyAggregate } from "../../Types/StatusPage/UptimeDailyAggregate";
32
+ import UptimeDailyAggregateUtil from "../../Utils/StatusPage/UptimeDailyAggregateUtil";
31
33
  import StatusPageSsoService from "../Services/StatusPageSsoService";
32
34
  import StatusPageOidcService from "../Services/StatusPageOidcService";
33
35
  import StatusPageSubscriberService from "../Services/StatusPageSubscriberService";
36
+ import ModelPermission from "../Types/Database/Permissions/Index";
34
37
  import Query from "../Types/Database/Query";
35
38
  import QueryHelper from "../Types/Database/QueryHelper";
36
39
  import Select from "../Types/Database/Select";
@@ -39,6 +42,7 @@ import {
39
42
  ExpressResponse,
40
43
  NextFunction,
41
44
  } from "../Utils/Express";
45
+ import EditionEnforcement from "../Utils/EditionEnforcement";
42
46
  import logger, { getLogAttributesFromRequest } from "../Utils/Logger";
43
47
  import {
44
48
  SEARCH_ENGINE_INDEXING_FLAG_NAME,
@@ -46,8 +50,10 @@ import {
46
50
  } from "../../Types/StatusPage/SearchEngineIndexing";
47
51
  import Response from "../Utils/Response";
48
52
  import BaseAPI from "./BaseAPI";
53
+ import CommonAPI from "./CommonAPI";
49
54
  import BaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
50
55
  import ArrayUtil from "../../Utils/Array";
56
+ import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
51
57
  import SortOrder from "../../Types/BaseDatabase/SortOrder";
52
58
  import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
53
59
  import OneUptimeDate from "../../Types/Date";
@@ -55,6 +61,7 @@ import Dictionary from "../../Types/Dictionary";
55
61
  import Email from "../../Types/Email";
56
62
  import BadDataException from "../../Types/Exception/BadDataException";
57
63
  import NotAuthenticatedException from "../../Types/Exception/NotAuthenticatedException";
64
+ import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
58
65
  import NotFoundException from "../../Types/Exception/NotFoundException";
59
66
  import { JSONArray, JSONObject } from "../../Types/JSON";
60
67
  import JSONFunctions from "../../Types/JSONFunctions";
@@ -196,13 +203,63 @@ export default class StatusPageAPI extends BaseAPI<
196
203
  this.overviewResponseInFlight.clear();
197
204
  }
198
205
 
206
+ /*
207
+ * Holding one of StatusPage's update roles is not the same as being allowed
208
+ * to update a given page: team block rows, label-restricted grants and
209
+ * Owned-scoped grants all narrow it. Apply the checks a CRUD update of this
210
+ * page would run - block and label rules against the loaded page, then the
211
+ * query narrowing (tenant, labels, Owned scope) - and require the page to
212
+ * survive them. `statusPage` must have been loaded with its labels.
213
+ */
214
+ private static async assertCanUpdateStatusPage(data: {
215
+ statusPage: StatusPage;
216
+ projectId: ObjectID;
217
+ props: DatabaseCommonInteractionProps;
218
+ }): Promise<void> {
219
+ await ModelPermission.checkUpdatePermissionByModel({
220
+ modelType: StatusPage,
221
+ fetchModelWithAccessControlIds: async (): Promise<StatusPage> => {
222
+ return data.statusPage;
223
+ },
224
+ props: data.props,
225
+ });
226
+
227
+ const permittedQuery: Query<StatusPage> =
228
+ await ModelPermission.checkUpdateQueryPermissions(
229
+ StatusPage,
230
+ {
231
+ _id: data.statusPage.id!,
232
+ projectId: data.projectId,
233
+ },
234
+ {},
235
+ data.props,
236
+ );
237
+
238
+ const permittedStatusPage: StatusPage | null =
239
+ await StatusPageService.findOneBy({
240
+ query: permittedQuery,
241
+ select: {
242
+ _id: true,
243
+ },
244
+ props: {
245
+ isRoot: true,
246
+ },
247
+ });
248
+
249
+ if (!permittedStatusPage) {
250
+ throw new NotAuthorizedException(
251
+ "You do not have permission to send this status page's report.",
252
+ );
253
+ }
254
+ }
255
+
199
256
  public constructor() {
200
257
  super(StatusPage, StatusPageService);
201
258
 
202
259
  // get title, description of the page. This is used for SEO.
203
260
  this.router.get(
204
261
  `${new this.entityType().getCrudApiPath()?.toString()}/seo/:statusPageIdOrDomain`,
205
- UserMiddleware.getUserMiddleware,
262
+ UserMiddleware.getPublicRouteUserMiddleware,
206
263
  async (req: ExpressRequest, res: ExpressResponse) => {
207
264
  const statusPageIdOrDomain: string = req.params[
208
265
  "statusPageIdOrDomain"
@@ -430,7 +487,7 @@ export default class StatusPageAPI extends BaseAPI<
430
487
  `${new this.entityType()
431
488
  .getCrudApiPath()
432
489
  ?.toString()}/incident-public-note/attachment/:statusPageId/:incidentId/:noteId/:fileId`,
433
- UserMiddleware.getUserMiddleware,
490
+ UserMiddleware.getPublicRouteUserMiddleware,
434
491
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
435
492
  try {
436
493
  await this.getIncidentPublicNoteAttachment(req, res);
@@ -444,7 +501,7 @@ export default class StatusPageAPI extends BaseAPI<
444
501
  `${new this.entityType()
445
502
  .getCrudApiPath()
446
503
  ?.toString()}/incident-episode-public-note/attachment/:statusPageId/:episodeId/:noteId/:fileId`,
447
- UserMiddleware.getUserMiddleware,
504
+ UserMiddleware.getPublicRouteUserMiddleware,
448
505
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
449
506
  try {
450
507
  await this.getIncidentEpisodePublicNoteAttachment(req, res);
@@ -458,7 +515,7 @@ export default class StatusPageAPI extends BaseAPI<
458
515
  `${new this.entityType()
459
516
  .getCrudApiPath()
460
517
  ?.toString()}/incident/postmortem/attachment/:statusPageId/:incidentId/:fileId`,
461
- UserMiddleware.getUserMiddleware,
518
+ UserMiddleware.getPublicRouteUserMiddleware,
462
519
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
463
520
  try {
464
521
  await this.getIncidentPostmortemAttachment(req, res);
@@ -472,7 +529,7 @@ export default class StatusPageAPI extends BaseAPI<
472
529
  `${new this.entityType()
473
530
  .getCrudApiPath()
474
531
  ?.toString()}/scheduled-maintenance-public-note/attachment/:statusPageId/:scheduledMaintenanceId/:noteId/:fileId`,
475
- UserMiddleware.getUserMiddleware,
532
+ UserMiddleware.getPublicRouteUserMiddleware,
476
533
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
477
534
  try {
478
535
  await this.getScheduledMaintenancePublicNoteAttachment(req, res);
@@ -486,7 +543,7 @@ export default class StatusPageAPI extends BaseAPI<
486
543
  `${new this.entityType()
487
544
  .getCrudApiPath()
488
545
  ?.toString()}/status-page-announcement/attachment/:statusPageId/:announcementId/:fileId`,
489
- UserMiddleware.getUserMiddleware,
546
+ UserMiddleware.getPublicRouteUserMiddleware,
490
547
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
491
548
  try {
492
549
  await this.getStatusPageAnnouncementAttachment(req, res);
@@ -795,16 +852,74 @@ export default class StatusPageAPI extends BaseAPI<
795
852
  },
796
853
  );
797
854
 
855
+ /*
856
+ * Sends the status page's report to an address the caller chooses, so it
857
+ * is gated like editing the status page: an authenticated member of the
858
+ * project that owns it who could update this particular page.
859
+ */
798
860
  this.router.post(
799
861
  `${new this.entityType().getCrudApiPath()?.toString()}/test-email-report`,
800
862
  UserMiddleware.getUserMiddleware,
863
+ UserMiddleware.requireUserAuthentication,
801
864
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
802
865
  try {
866
+ /*
867
+ * This route acts on one page in one project, and the permission
868
+ * checks below must be evaluated for that single tenant, so the
869
+ * request is never treated as multi-tenant.
870
+ */
871
+ const props: DatabaseCommonInteractionProps = {
872
+ ...(await CommonAPI.getDatabaseCommonInteractionProps(req)),
873
+ isMultiTenantRequest: false,
874
+ };
875
+ const projectId: ObjectID =
876
+ CommonAPI.assertAuthenticatedProjectMember(props);
877
+ CommonAPI.assertPermittedInProject({
878
+ databaseProps: props,
879
+ allowedPermissions: new StatusPage().getUpdatePermissions(),
880
+ errorMessage:
881
+ "You do not have permission to send this status page's report.",
882
+ });
883
+
884
+ if (
885
+ !req.body["statusPageId"] ||
886
+ !ObjectID.isValidUUID(req.body["statusPageId"].toString())
887
+ ) {
888
+ throw new BadDataException("A valid statusPageId is required.");
889
+ }
890
+
803
891
  const email: Email = new Email(req.body["email"] as string);
804
892
  const statusPageId: ObjectID = new ObjectID(
805
893
  req.body["statusPageId"].toString() as string,
806
894
  );
807
895
 
896
+ const statusPage: StatusPage | null =
897
+ await StatusPageService.findOneById({
898
+ id: statusPageId,
899
+ select: {
900
+ _id: true,
901
+ projectId: true,
902
+ labels: {
903
+ _id: true,
904
+ name: true,
905
+ },
906
+ },
907
+ props: {
908
+ isRoot: true,
909
+ },
910
+ });
911
+
912
+ CommonAPI.assertResourceBelongsToProject({
913
+ resourceProjectId: statusPage?.projectId,
914
+ projectId,
915
+ });
916
+
917
+ await StatusPageAPI.assertCanUpdateStatusPage({
918
+ statusPage: statusPage!,
919
+ projectId,
920
+ props,
921
+ });
922
+
808
923
  await StatusPageService.sendEmailReport({
809
924
  email: email,
810
925
  statusPageId,
@@ -819,7 +934,7 @@ export default class StatusPageAPI extends BaseAPI<
819
934
 
820
935
  this.router.post(
821
936
  `${new this.entityType().getCrudApiPath()?.toString()}/domain`,
822
- UserMiddleware.getUserMiddleware,
937
+ UserMiddleware.getPublicRouteUserMiddleware,
823
938
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
824
939
  try {
825
940
  if (!req.body["domain"]) {
@@ -863,7 +978,7 @@ export default class StatusPageAPI extends BaseAPI<
863
978
  `${new this.entityType()
864
979
  .getCrudApiPath()
865
980
  ?.toString()}/master-page/:statusPageId`,
866
- UserMiddleware.getUserMiddleware,
981
+ UserMiddleware.getPublicRouteUserMiddleware,
867
982
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
868
983
  try {
869
984
  const statusPageIdParam: string = req.params[
@@ -932,16 +1047,24 @@ export default class StatusPageAPI extends BaseAPI<
932
1047
  select.footerHTML = true;
933
1048
  }
934
1049
 
1050
+ /*
1051
+ * The status page app offers SSO sign-in when this is non-zero.
1052
+ * While SSO is not active - the Community Edition serves no status
1053
+ * page SSO routes, and on a lapsed Enterprise license they refuse -
1054
+ * it reports none rather than send visitors into a dead end.
1055
+ */
935
1056
  const hasEnabledSSO: PositiveNumber =
936
- await StatusPageSsoService.countBy({
937
- query: {
938
- isEnabled: true,
939
- statusPageId: objectId,
940
- },
941
- props: {
942
- isRoot: true,
943
- },
944
- });
1057
+ EditionEnforcement.areSsoRoutesServed()
1058
+ ? await StatusPageSsoService.countBy({
1059
+ query: {
1060
+ isEnabled: true,
1061
+ statusPageId: objectId,
1062
+ },
1063
+ props: {
1064
+ isRoot: true,
1065
+ },
1066
+ })
1067
+ : new PositiveNumber(0);
945
1068
 
946
1069
  const item: StatusPage | null = await this.service.findOneById({
947
1070
  id: objectId,
@@ -969,6 +1092,19 @@ export default class StatusPageAPI extends BaseAPI<
969
1092
  delete item.footerHTML;
970
1093
  }
971
1094
 
1095
+ /*
1096
+ * The status page app forces SSO sign-in from this flag. Report
1097
+ * the EFFECTIVE requirement: while SSO is not active (the
1098
+ * Community Edition, or a lapsed Enterprise license) it is not
1099
+ * enforced and password sign-in works, so the page must not send
1100
+ * visitors into an SSO flow that does not exist or refuses. The
1101
+ * stored value is untouched and applies again as soon as SSO is
1102
+ * active.
1103
+ */
1104
+ if (!EditionEnforcement.isSsoEnforced()) {
1105
+ item.requireSsoForLogin = false;
1106
+ }
1107
+
972
1108
  const footerLinks: Array<StatusPageFooterLink> =
973
1109
  await StatusPageFooterLinkService.findBy({
974
1110
  query: {
@@ -1046,7 +1182,7 @@ export default class StatusPageAPI extends BaseAPI<
1046
1182
  PublicDashboardRateLimit.getMiddleware(
1047
1183
  PublicDashboardRateLimitBucket.StatusPageMasterPassword,
1048
1184
  ),
1049
- UserMiddleware.getUserMiddleware,
1185
+ UserMiddleware.getPublicRouteUserMiddleware,
1050
1186
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
1051
1187
  try {
1052
1188
  if (!req.params["statusPageId"]) {
@@ -1120,30 +1256,37 @@ export default class StatusPageAPI extends BaseAPI<
1120
1256
 
1121
1257
  this.router.post(
1122
1258
  `${new this.entityType().getCrudApiPath()?.toString()}/sso/:statusPageId`,
1123
- UserMiddleware.getUserMiddleware,
1259
+ UserMiddleware.getPublicRouteUserMiddleware,
1124
1260
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
1125
1261
  try {
1126
1262
  const objectId: ObjectID = new ObjectID(
1127
1263
  req.params["statusPageId"] as string,
1128
1264
  );
1129
1265
 
1130
- const sso: Array<StatusPageSSO> = await StatusPageSsoService.findBy({
1131
- query: {
1132
- statusPageId: objectId,
1133
- isEnabled: true,
1134
- },
1135
- select: {
1136
- signOnURL: true,
1137
- name: true,
1138
- description: true,
1139
- _id: true,
1140
- },
1141
- limit: LIMIT_PER_PROJECT,
1142
- skip: 0,
1143
- props: {
1144
- isRoot: true,
1145
- },
1146
- });
1266
+ /*
1267
+ * Only list providers a visitor can actually sign in with: the
1268
+ * Community Edition serves no status page SSO login routes.
1269
+ */
1270
+ const sso: Array<StatusPageSSO> =
1271
+ EditionEnforcement.areSsoRoutesServed()
1272
+ ? await StatusPageSsoService.findBy({
1273
+ query: {
1274
+ statusPageId: objectId,
1275
+ isEnabled: true,
1276
+ },
1277
+ select: {
1278
+ signOnURL: true,
1279
+ name: true,
1280
+ description: true,
1281
+ _id: true,
1282
+ },
1283
+ limit: LIMIT_PER_PROJECT,
1284
+ skip: 0,
1285
+ props: {
1286
+ isRoot: true,
1287
+ },
1288
+ })
1289
+ : [];
1147
1290
 
1148
1291
  return Response.sendEntityArrayResponse(
1149
1292
  req,
@@ -1160,30 +1303,36 @@ export default class StatusPageAPI extends BaseAPI<
1160
1303
 
1161
1304
  this.router.post(
1162
1305
  `${new this.entityType().getCrudApiPath()?.toString()}/oidc/:statusPageId`,
1163
- UserMiddleware.getUserMiddleware,
1306
+ UserMiddleware.getPublicRouteUserMiddleware,
1164
1307
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
1165
1308
  try {
1166
1309
  const objectId: ObjectID = new ObjectID(
1167
1310
  req.params["statusPageId"] as string,
1168
1311
  );
1169
1312
 
1313
+ /*
1314
+ * Only list providers a visitor can actually sign in with: the
1315
+ * Community Edition serves no status page OIDC login routes.
1316
+ */
1170
1317
  const oidc: Array<StatusPageOIDC> =
1171
- await StatusPageOidcService.findBy({
1172
- query: {
1173
- statusPageId: objectId,
1174
- isEnabled: true,
1175
- },
1176
- select: {
1177
- name: true,
1178
- description: true,
1179
- _id: true,
1180
- },
1181
- limit: LIMIT_PER_PROJECT,
1182
- skip: 0,
1183
- props: {
1184
- isRoot: true,
1185
- },
1186
- });
1318
+ EditionEnforcement.areSsoRoutesServed()
1319
+ ? await StatusPageOidcService.findBy({
1320
+ query: {
1321
+ statusPageId: objectId,
1322
+ isEnabled: true,
1323
+ },
1324
+ select: {
1325
+ name: true,
1326
+ description: true,
1327
+ _id: true,
1328
+ },
1329
+ limit: LIMIT_PER_PROJECT,
1330
+ skip: 0,
1331
+ props: {
1332
+ isRoot: true,
1333
+ },
1334
+ })
1335
+ : [];
1187
1336
 
1188
1337
  return Response.sendEntityArrayResponse(
1189
1338
  req,
@@ -1203,7 +1352,7 @@ export default class StatusPageAPI extends BaseAPI<
1203
1352
  `${new this.entityType()
1204
1353
  .getCrudApiPath()
1205
1354
  ?.toString()}/resources/:statusPageId`,
1206
- UserMiddleware.getUserMiddleware,
1355
+ UserMiddleware.getPublicRouteUserMiddleware,
1207
1356
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
1208
1357
  try {
1209
1358
  const statusPageId: ObjectID = new ObjectID(
@@ -1254,7 +1403,7 @@ export default class StatusPageAPI extends BaseAPI<
1254
1403
  `${new this.entityType()
1255
1404
  .getCrudApiPath()
1256
1405
  ?.toString()}/uptime/:statusPageId`,
1257
- UserMiddleware.getUserMiddleware,
1406
+ UserMiddleware.getPublicRouteUserMiddleware,
1258
1407
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
1259
1408
  try {
1260
1409
  // This reosurce ID can be of a status page resource OR a status page group.
@@ -1698,7 +1847,7 @@ export default class StatusPageAPI extends BaseAPI<
1698
1847
 
1699
1848
  this.router.post(
1700
1849
  overviewApiPath,
1701
- UserMiddleware.getUserMiddleware,
1850
+ UserMiddleware.getPublicRouteUserMiddleware,
1702
1851
  overviewHandler,
1703
1852
  );
1704
1853
 
@@ -1709,7 +1858,7 @@ export default class StatusPageAPI extends BaseAPI<
1709
1858
  */
1710
1859
  this.router.get(
1711
1860
  overviewApiPath,
1712
- UserMiddleware.getUserMiddleware,
1861
+ UserMiddleware.getPublicRouteUserMiddleware,
1713
1862
  overviewHandler,
1714
1863
  );
1715
1864
 
@@ -1717,7 +1866,7 @@ export default class StatusPageAPI extends BaseAPI<
1717
1866
  `${new this.entityType()
1718
1867
  .getCrudApiPath()
1719
1868
  ?.toString()}/update-subscription/:statusPageId/:subscriberId`,
1720
- UserMiddleware.getUserMiddleware,
1869
+ UserMiddleware.getPublicRouteUserMiddleware,
1721
1870
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
1722
1871
  try {
1723
1872
  await this.subscribeToStatusPage(req);
@@ -1732,7 +1881,7 @@ export default class StatusPageAPI extends BaseAPI<
1732
1881
  `${new this.entityType()
1733
1882
  .getCrudApiPath()
1734
1883
  ?.toString()}/get-subscription/:statusPageId/:subscriberId`,
1735
- UserMiddleware.getUserMiddleware,
1884
+ UserMiddleware.getPublicRouteUserMiddleware,
1736
1885
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
1737
1886
  try {
1738
1887
  const subscriber: StatusPageSubscriber =
@@ -1754,7 +1903,7 @@ export default class StatusPageAPI extends BaseAPI<
1754
1903
  `${new this.entityType()
1755
1904
  .getCrudApiPath()
1756
1905
  ?.toString()}/subscribe/:statusPageId`,
1757
- UserMiddleware.getUserMiddleware,
1906
+ UserMiddleware.getPublicRouteUserMiddleware,
1758
1907
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
1759
1908
  try {
1760
1909
  await this.subscribeToStatusPage(req);
@@ -1770,7 +1919,7 @@ export default class StatusPageAPI extends BaseAPI<
1770
1919
  `${new this.entityType()
1771
1920
  .getCrudApiPath()
1772
1921
  ?.toString()}/manage-subscription/:statusPageId`,
1773
- UserMiddleware.getUserMiddleware,
1922
+ UserMiddleware.getPublicRouteUserMiddleware,
1774
1923
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
1775
1924
  try {
1776
1925
  await this.manageExistingSubscription(req);
@@ -1821,13 +1970,13 @@ export default class StatusPageAPI extends BaseAPI<
1821
1970
 
1822
1971
  this.router.post(
1823
1972
  incidentsListApiPath,
1824
- UserMiddleware.getUserMiddleware,
1973
+ UserMiddleware.getPublicRouteUserMiddleware,
1825
1974
  incidentsListHandler,
1826
1975
  );
1827
1976
 
1828
1977
  this.router.get(
1829
1978
  incidentsListApiPath,
1830
- UserMiddleware.getUserMiddleware,
1979
+ UserMiddleware.getPublicRouteUserMiddleware,
1831
1980
  incidentsListHandler,
1832
1981
  );
1833
1982
 
@@ -1872,13 +2021,13 @@ export default class StatusPageAPI extends BaseAPI<
1872
2021
 
1873
2022
  this.router.post(
1874
2023
  scheduledMaintenanceEventsListApiPath,
1875
- UserMiddleware.getUserMiddleware,
2024
+ UserMiddleware.getPublicRouteUserMiddleware,
1876
2025
  scheduledMaintenanceEventsListHandler,
1877
2026
  );
1878
2027
 
1879
2028
  this.router.get(
1880
2029
  scheduledMaintenanceEventsListApiPath,
1881
- UserMiddleware.getUserMiddleware,
2030
+ UserMiddleware.getPublicRouteUserMiddleware,
1882
2031
  scheduledMaintenanceEventsListHandler,
1883
2032
  );
1884
2033
 
@@ -1922,13 +2071,13 @@ export default class StatusPageAPI extends BaseAPI<
1922
2071
 
1923
2072
  this.router.post(
1924
2073
  announcementsListApiPath,
1925
- UserMiddleware.getUserMiddleware,
2074
+ UserMiddleware.getPublicRouteUserMiddleware,
1926
2075
  announcementsListHandler,
1927
2076
  );
1928
2077
 
1929
2078
  this.router.get(
1930
2079
  announcementsListApiPath,
1931
- UserMiddleware.getUserMiddleware,
2080
+ UserMiddleware.getPublicRouteUserMiddleware,
1932
2081
  announcementsListHandler,
1933
2082
  );
1934
2083
 
@@ -1936,7 +2085,7 @@ export default class StatusPageAPI extends BaseAPI<
1936
2085
  `${new this.entityType()
1937
2086
  .getCrudApiPath()
1938
2087
  ?.toString()}/incidents/:statusPageIdOrDomain/:incidentId`,
1939
- UserMiddleware.getUserMiddleware,
2088
+ UserMiddleware.getPublicRouteUserMiddleware,
1940
2089
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
1941
2090
  try {
1942
2091
  const objectId: ObjectID = await resolveStatusPageIdOrThrow(
@@ -1964,7 +2113,7 @@ export default class StatusPageAPI extends BaseAPI<
1964
2113
  `${new this.entityType()
1965
2114
  .getCrudApiPath()
1966
2115
  ?.toString()}/scheduled-maintenance-events/:statusPageIdOrDomain/:scheduledMaintenanceId`,
1967
- UserMiddleware.getUserMiddleware,
2116
+ UserMiddleware.getPublicRouteUserMiddleware,
1968
2117
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
1969
2118
  try {
1970
2119
  const objectId: ObjectID = await resolveStatusPageIdOrThrow(
@@ -1993,7 +2142,7 @@ export default class StatusPageAPI extends BaseAPI<
1993
2142
  `${new this.entityType()
1994
2143
  .getCrudApiPath()
1995
2144
  ?.toString()}/announcements/:statusPageIdOrDomain/:announcementId`,
1996
- UserMiddleware.getUserMiddleware,
2145
+ UserMiddleware.getPublicRouteUserMiddleware,
1997
2146
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
1998
2147
  try {
1999
2148
  const objectId: ObjectID = await resolveStatusPageIdOrThrow(
@@ -2023,7 +2172,7 @@ export default class StatusPageAPI extends BaseAPI<
2023
2172
  `${new this.entityType()
2024
2173
  .getCrudApiPath()
2025
2174
  ?.toString()}/episodes/:statusPageIdOrDomain`,
2026
- UserMiddleware.getUserMiddleware,
2175
+ UserMiddleware.getPublicRouteUserMiddleware,
2027
2176
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
2028
2177
  try {
2029
2178
  const objectId: ObjectID = await resolveStatusPageIdOrThrow(
@@ -2047,7 +2196,7 @@ export default class StatusPageAPI extends BaseAPI<
2047
2196
  `${new this.entityType()
2048
2197
  .getCrudApiPath()
2049
2198
  ?.toString()}/episodes/:statusPageIdOrDomain/:episodeId`,
2050
- UserMiddleware.getUserMiddleware,
2199
+ UserMiddleware.getPublicRouteUserMiddleware,
2051
2200
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
2052
2201
  try {
2053
2202
  const objectId: ObjectID = await resolveStatusPageIdOrThrow(
@@ -3508,6 +3657,23 @@ export default class StatusPageAPI extends BaseAPI<
3508
3657
  return statusPageSubscriber;
3509
3658
  }
3510
3659
 
3660
+ private serializeIncidentsForStatusPage(
3661
+ incidents: Array<Incident>,
3662
+ ): JSONArray {
3663
+ return incidents.map((incident: Incident): JSONObject => {
3664
+ const incidentJson: JSONObject = BaseModel.toJSON(incident, Incident);
3665
+
3666
+ // Enforce postmortem visibility before sending or caching status-page JSON.
3667
+ if (incident.showPostmortemOnStatusPage !== true) {
3668
+ delete incidentJson["postmortemNote"];
3669
+ delete incidentJson["postmortemPostedAt"];
3670
+ delete incidentJson["postmortemAttachments"];
3671
+ }
3672
+
3673
+ return incidentJson;
3674
+ });
3675
+ }
3676
+
3511
3677
  @CaptureSpan()
3512
3678
  public async getIncidents(
3513
3679
  statusPageId: ObjectID,
@@ -3771,7 +3937,7 @@ export default class StatusPageAPI extends BaseAPI<
3771
3937
  IncidentPublicNote,
3772
3938
  ),
3773
3939
  incidentStates: BaseModel.toJSONArray(incidentStates, IncidentState),
3774
- incidents: BaseModel.toJSONArray(incidents, Incident),
3940
+ incidents: this.serializeIncidentsForStatusPage(incidents),
3775
3941
  statusPageResources: BaseModel.toJSONArray(
3776
3942
  statusPageResources,
3777
3943
  StatusPageResource,
@@ -4270,6 +4436,7 @@ export default class StatusPageAPI extends BaseAPI<
4270
4436
  statusPageResources: StatusPageResource[];
4271
4437
  monitorStatuses: MonitorStatus[];
4272
4438
  monitorStatusTimelines: MonitorStatusTimeline[];
4439
+ uptimeDailyAggregate: UptimeDailyAggregate;
4273
4440
  monitorGroupCurrentStatuses: Dictionary<ObjectID>;
4274
4441
  statusPageGroups: StatusPageGroup[];
4275
4442
  statusPage: StatusPage;
@@ -4549,6 +4716,22 @@ export default class StatusPageAPI extends BaseAPI<
4549
4716
  endDate: endDateForMonitorTimeline,
4550
4717
  });
4551
4718
 
4719
+ /*
4720
+ * What the uptime bars are actually painted from.
4721
+ *
4722
+ * `monitorStatusTimelines` above stays in the response - it is documented
4723
+ * public API and the E2E helpers read it for current status - but it must
4724
+ * NOT drive the bars. It is capped at LIMIT_MAX across every monitor on
4725
+ * the page and sorted newest-first, so on a page with churny monitors it
4726
+ * returns a few recent days and silently drops the rest.
4727
+ */
4728
+ const uptimeDailyAggregate: UptimeDailyAggregate =
4729
+ await StatusPageService.getUptimeDailyAggregateForStatusPage({
4730
+ monitorIds: monitorsOnStatusPageForTimeline,
4731
+ startDate: startDateForMonitorTimeline,
4732
+ endDate: endDateForMonitorTimeline,
4733
+ });
4734
+
4552
4735
  // return everything.
4553
4736
 
4554
4737
  return {
@@ -4557,6 +4740,7 @@ export default class StatusPageAPI extends BaseAPI<
4557
4740
  monitorGroupCurrentStatuses,
4558
4741
  statusPageGroups: groups,
4559
4742
  monitorStatusTimelines,
4743
+ uptimeDailyAggregate,
4560
4744
  statusPage,
4561
4745
  monitorsOnStatusPage,
4562
4746
  monitorsInGroup,
@@ -4590,6 +4774,7 @@ export default class StatusPageAPI extends BaseAPI<
4590
4774
  statusPage,
4591
4775
  monitorsOnStatusPage,
4592
4776
  monitorStatusTimelines,
4777
+ uptimeDailyAggregate,
4593
4778
  statusPageGroups,
4594
4779
  monitorsInGroup,
4595
4780
  startDateForMonitorTimeline: startDate,
@@ -5374,7 +5559,7 @@ export default class StatusPageAPI extends BaseAPI<
5374
5559
  IncidentPublicNote,
5375
5560
  ),
5376
5561
 
5377
- activeIncidents: BaseModel.toJSONArray(activeIncidents, Incident),
5562
+ activeIncidents: this.serializeIncidentsForStatusPage(activeIncidents),
5378
5563
 
5379
5564
  activeEpisodes: activeEpisodesJson,
5380
5565
  episodePublicNotes: BaseModel.toJSONArray(
@@ -5390,6 +5575,8 @@ export default class StatusPageAPI extends BaseAPI<
5390
5575
  monitorStatusTimelines,
5391
5576
  MonitorStatusTimeline,
5392
5577
  ),
5578
+ uptimeDailyAggregate:
5579
+ UptimeDailyAggregateUtil.toJSON(uptimeDailyAggregate),
5393
5580
  resourceGroups: BaseModel.toJSONArray(statusPageGroups, StatusPageGroup),
5394
5581
  monitorStatuses: BaseModel.toJSONArray(monitorStatuses, MonitorStatus),
5395
5582
  statusPageResources: BaseModel.toJSONArray(