@oneuptime/common 13.0.7 → 13.0.8
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.
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +1 -1
- package/Server/API/AIBillingAPI.ts +1 -0
- package/Server/API/AIInsightAPI.ts +1 -4
- package/Server/API/AIInvestigationAPI.ts +1 -4
- package/Server/API/AIReadinessAPI.ts +4 -5
- package/Server/API/AlertAPI.ts +1 -0
- package/Server/API/AutoRemediationAPI.ts +1 -4
- package/Server/API/BaseAPI.ts +13 -0
- package/Server/API/BaseAnalyticsAPI.ts +80 -9
- package/Server/API/BillingAPI.ts +2 -0
- package/Server/API/BillingInvoiceAPI.ts +1 -0
- package/Server/API/BillingPaymentMethodAPI.ts +2 -0
- package/Server/API/CodeFixRunAPI.ts +1 -3
- package/Server/API/CommonAPI.ts +68 -4
- package/Server/API/DashboardAPI.ts +12 -12
- package/Server/API/GlobalConfigAPI.ts +17 -0
- package/Server/API/IncidentAPI.ts +2 -0
- package/Server/API/IncidentEpisodeAPI.ts +1 -0
- package/Server/API/NotificationAPI.ts +1 -0
- package/Server/API/OnCallCalendarAPI.ts +4 -5
- package/Server/API/OnCallDutyPolicyAPI.ts +7 -0
- package/Server/API/OnCallReadinessAPI.ts +4 -1
- package/Server/API/OnCallScheduleTimelineAPI.ts +731 -0
- package/Server/API/ProjectAPI.ts +1 -0
- package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
- package/Server/API/StatusPageAPI.ts +161 -32
- package/Server/API/TeamMemberAPI.ts +3 -0
- package/Server/API/UserCallAPI.ts +2 -0
- package/Server/API/UserEmailAPI.ts +2 -0
- package/Server/API/UserIncomingCallNumberAPI.ts +2 -0
- package/Server/API/UserMicrosoftTeamsAPI.ts +1 -0
- package/Server/API/UserSlackAPI.ts +1 -0
- package/Server/API/UserSmsAPI.ts +2 -0
- package/Server/API/UserTotpAuthAPI.ts +1 -0
- package/Server/API/UserWebAuthnAPI.ts +2 -0
- package/Server/API/UserWebhookAPI.ts +1 -0
- package/Server/API/UserWhatsAppAPI.ts +2 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +13 -2
- package/Server/Middleware/UserAuthorization.ts +79 -5
- package/Server/Services/ApiKeyPermissionService.ts +101 -4
- package/Server/Services/DatabaseService.ts +245 -0
- package/Server/Services/DetectionRuleService.ts +5 -4
- package/Server/Services/OnCallDutyPolicyChildService.ts +261 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -2
- package/Server/Services/PayAsYouGoBillingService.ts +23 -28
- package/Server/Services/ProjectService.ts +18 -0
- package/Server/Services/RumSessionPinService.ts +274 -22
- package/Server/Services/TeamPermissionService.ts +120 -26
- package/Server/Services/ThreatIntelFeedService.ts +6 -3
- package/Server/Types/Database/Permissions/BasePermission.ts +9 -7
- package/Server/Types/Database/Permissions/Index.ts +75 -11
- package/Server/Types/Database/Permissions/TablePermission.ts +24 -28
- package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
- package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -0
- package/Server/Utils/MasterAdminPageAccess.ts +61 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
- package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1 -1
- package/Server/Utils/Realtime.ts +163 -45
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +11 -28
- package/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.ts +170 -0
- package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +1 -1
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +6 -2
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +10 -9
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +1059 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +376 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +757 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +307 -0
- package/Tests/App/Dashboard/ArgumentsFormGroupByUnlistedAttributes.test.tsx +131 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +1 -1
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +9 -1
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +24 -0
- package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +162 -8
- package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +105 -6
- package/Tests/App/Dashboard/EntityFilterDropdownUnlistedSelection.test.tsx +434 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +276 -1
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +9 -1
- package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +58 -42
- package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +42 -5
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +34 -23
- package/Tests/App/Dashboard/ScheduleTimeline.test.tsx +1580 -0
- package/Tests/App/Dashboard/ScheduleTimelineAPI.test.ts +280 -0
- package/Tests/App/Dashboard/ScheduleTimelineModel.test.ts +673 -0
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +95 -68
- package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +28 -3
- package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +761 -0
- package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
- package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
- package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
- package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
- package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +321 -0
- package/Tests/App/Dashboard/SloOverviewHero.test.tsx +171 -36
- package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +215 -0
- package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +40 -3
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
- package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +138 -5
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +187 -0
- package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +51 -3
- package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +55 -2
- package/Tests/Server/API/BaseAnalyticsAPIAggregateCache.test.ts +729 -0
- package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +93 -7
- package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +36 -3
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +1003 -24
- package/Tests/Server/API/DashboardPublicRateLimit.test.ts +6 -3
- package/Tests/Server/API/ExpiredSessionAIRoutes.test.ts +708 -0
- package/Tests/Server/API/ExpiredSessionCustomRoutes.test.ts +928 -0
- package/Tests/Server/API/ExpiredSessionMonitorTemplate.test.ts +319 -0
- package/Tests/Server/API/ExpiredSessionOnCallDutyPolicy.test.ts +336 -0
- package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +820 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +140 -0
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +115 -12
- package/Tests/Server/API/OnCallCalendarAPI.test.ts +375 -8
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +175 -17
- package/Tests/Server/API/OnCallScheduleTimelineAPI.test.ts +1513 -0
- package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +119 -7
- package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +111 -4
- package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +615 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +89 -2
- package/Tests/Server/API/SessionReplayAPI.test.ts +121 -0
- package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +4 -2
- package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +441 -0
- package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +664 -0
- package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +7 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +6 -0
- package/Tests/Server/API/UserNotificationSettingAPI.test.ts +65 -4
- package/Tests/Server/API/UserProjectsAPI.test.ts +63 -3
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +48 -2
- package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +11 -2
- package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +46 -3
- package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +18 -2
- package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +24 -7
- package/Tests/Server/Middleware/ExpiredSessionUserMiddleware.test.ts +563 -0
- package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +299 -19
- package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +453 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +24 -0
- package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +2 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +3 -3
- package/Tests/Server/Services/DatabaseServiceCreateSuppliedId.test.ts +147 -0
- package/Tests/Server/Services/DatabaseServiceLoginBeforeHooks.test.ts +1078 -0
- package/Tests/Server/Services/DatabaseServiceTenantRelationGuard.test.ts +259 -0
- package/Tests/Server/Services/DatabaseServiceWriteOperatorValues.test.ts +147 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
- package/Tests/Server/Services/OnCallChildCreateAuthorizationPostgres.test.ts +711 -0
- package/Tests/Server/Services/OnCallDutyPolicyChildService.test.ts +733 -0
- package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +190 -140
- package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +4 -9
- package/Tests/Server/Services/PermissionBlockDeletion.test.ts +780 -0
- package/Tests/Server/Services/PermissionBlockDeletionPostgres.test.ts +628 -0
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
- package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -0
- package/Tests/Server/Services/TeamMemberMultiTenantReadPostgres.test.ts +394 -0
- package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +6 -0
- package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +131 -0
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
- package/Tests/Server/Types/Database/Permissions/ModelPermissionAnonymousRefusal.test.ts +518 -0
- package/Tests/Server/Types/Database/Permissions/MultiTenantPermissions.test.ts +350 -0
- package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +282 -25
- package/Tests/Server/Types/Database/Permissions/TableLevelBlockPermission.test.ts +459 -0
- package/Tests/Server/Utils/AI/AIRunPrivacyFilter.test.ts +101 -9
- package/Tests/Server/Utils/AI/ChatAgentHelpers.test.ts +88 -4
- package/Tests/Server/Utils/AI/Toolbox/ExceptionTools.test.ts +459 -0
- package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +794 -0
- package/Tests/Server/Utils/AI/Toolbox/RecentChangesTools.test.ts +574 -0
- package/Tests/Server/Utils/AI/Toolbox/SecurityEventTools.test.ts +596 -0
- package/Tests/Server/Utils/CaptchaRequestAndLogging.test.ts +395 -0
- package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -0
- package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +616 -0
- package/Tests/Server/Utils/Realtime.test.ts +502 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorSeverity.test.ts +216 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +142 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.test.ts +140 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepairClickhouseIntegration.test.ts +542 -0
- package/Tests/Server/Utils/Telemetry/ChangeEventRow.test.ts +743 -0
- package/Tests/Server/Utils/Telemetry/RuntimeMetrics.test.ts +465 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Alert.test.ts +202 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/ScheduledMaintenance.test.ts +231 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Alert.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/AlertEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/ScheduledMaintenance.test.ts +247 -0
- package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
- package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
- package/Tests/Types/Call/CallProvider.test.ts +528 -0
- package/Tests/Types/Kubernetes/KubernetesCostIngest.test.ts +236 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimeline.test.ts +736 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimelineLayout.test.ts +996 -0
- package/Tests/Types/SecurityEvent/SigmaRule.test.ts +142 -0
- package/Tests/Types/Workflow/Components/JSON.test.ts +182 -0
- package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +116 -1
- package/Tests/UI/Components/Dropdown/DropdownAsyncOptions.test.tsx +81 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +89 -1
- package/Tests/UI/Components/EventAttachmentList.test.tsx +174 -0
- package/Tests/UI/Components/Forms/BasicFormBurnRateTemplateDefaults.test.tsx +395 -0
- package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +286 -0
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +128 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableQueryChange.test.tsx +365 -0
- package/Tests/UI/Components/OpenAuthenticatedUrl.test.ts +358 -0
- package/Tests/UI/Components/SessionAwareImage.test.tsx +496 -0
- package/Tests/UI/Components/TelemetryHistogramZeroBuckets.test.tsx +190 -0
- package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +1 -1
- package/Tests/UI/Monitor/EvaluationLogListTimestamps.test.tsx +367 -0
- package/Tests/UI/Utils/API/BaseAPIRefreshSession.test.ts +1087 -0
- package/Tests/UI/Utils/API/DashboardHost.ts +12 -0
- package/Tests/UI/Utils/API/FakeAxiosServer.ts +183 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/UI/Utils/Cookie.test.ts +440 -0
- package/Tests/UI/Utils/ModelAPIRequestClient.test.ts +278 -0
- package/Tests/UI/Utils/Navigation.test.ts +33 -0
- package/Tests/UI/Utils/PricingPlan.test.ts +295 -0
- package/Tests/UI/Utils/Realtime.test.ts +759 -0
- package/Tests/UI/Utils/Telemetry/Telemetry.test.ts +500 -0
- package/Tests/Utils/APIInstanceDispatch.test.ts +311 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -0
- package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
- package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
- package/Types/OnCallDutyPolicy/ScheduleTimeline.ts +507 -0
- package/Types/OnCallDutyPolicy/ScheduleTimelineLayout.ts +589 -0
- package/Types/Realtime/EventName.ts +11 -0
- package/Types/SecurityEvent/DetectionFindingConstants.ts +14 -0
- package/Types/SecurityEvent/OcsfSeverity.ts +31 -26
- package/Types/SecurityEvent/SigmaRule.ts +51 -0
- package/Types/SecurityEvent/ThreatIntelConstants.ts +18 -0
- package/UI/Components/AttachmentList/EventAttachmentList.tsx +30 -2
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +12 -2
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/EditionLabel/EditionLabel.tsx +12 -0
- package/UI/Components/EventItem/EventItem.tsx +12 -1
- package/UI/Components/Forms/BasicForm.tsx +151 -126
- package/UI/Components/Forms/CollapsibleFormSection.tsx +63 -0
- package/UI/Components/Forms/Fields/FormField.tsx +10 -4
- package/UI/Components/Forms/FormSummary.tsx +7 -0
- package/UI/Components/Forms/Types/Field.ts +10 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
- package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +34 -5
- package/UI/Components/ModelTable/TableView.tsx +1 -1
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +8 -1
- package/UI/Components/Tooltip/Tooltip.tsx +8 -1
- package/UI/Utils/API/API.ts +173 -12
- package/UI/Utils/API/RequestOptions.ts +11 -0
- package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +31 -7
- package/UI/Utils/ModelAPI/ModelAPI.ts +30 -9
- package/UI/Utils/Navigation.ts +9 -0
- package/UI/Utils/OpenAuthenticatedUrl.ts +154 -0
- package/UI/Utils/Realtime.ts +176 -30
- package/Utils/API.ts +14 -5
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
- package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
- package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -1
- package/build/dist/Server/API/AIBillingAPI.js +1 -1
- package/build/dist/Server/API/AIBillingAPI.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +1 -4
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +1 -4
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AIReadinessAPI.js +1 -3
- package/build/dist/Server/API/AIReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +1 -1
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +1 -4
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +12 -0
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js +55 -10
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +2 -2
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
- package/build/dist/Server/API/BillingPaymentMethodAPI.js +2 -2
- package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
- package/build/dist/Server/API/CodeFixRunAPI.js +1 -3
- package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +50 -5
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +12 -12
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +12 -0
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +2 -2
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/NotificationAPI.js +1 -1
- package/build/dist/Server/API/NotificationAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallCalendarAPI.js +1 -4
- package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js +6 -0
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js +4 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +494 -0
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -0
- package/build/dist/Server/API/ProjectAPI.js +1 -1
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +125 -33
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +3 -3
- package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +2 -2
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +2 -2
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +2 -2
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/UserSlackAPI.js +1 -1
- package/build/dist/Server/API/UserSlackAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +2 -2
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js +2 -2
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +2 -2
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -2
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +64 -4
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +80 -4
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +171 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DetectionRuleService.js +4 -4
- package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyChildService.js +170 -0
- package/build/dist/Server/Services/OnCallDutyPolicyChildService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
- package/build/dist/Server/Services/PayAsYouGoBillingService.js +20 -27
- package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +17 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +180 -16
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/TeamPermissionService.js +89 -27
- package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
- package/build/dist/Server/Services/ThreatIntelFeedService.js +5 -4
- package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +9 -6
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/Index.js +60 -6
- package/build/dist/Server/Types/Database/Permissions/Index.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +14 -13
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/MasterAdminPageAccess.js +39 -0
- package/build/dist/Server/Utils/MasterAdminPageAccess.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Realtime.js +126 -37
- package/build/dist/Server/Utils/Realtime.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +7 -25
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js +127 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +3 -2
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +4 -8
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -1
- package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +31 -1
- package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js +321 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js +372 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js.map +1 -0
- package/build/dist/Types/Realtime/EventName.js +10 -0
- package/build/dist/Types/Realtime/EventName.js.map +1 -1
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +11 -0
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js +30 -25
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -1
- package/build/dist/Types/SecurityEvent/SigmaRule.js +47 -0
- package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -1
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +14 -0
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -1
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js +9 -4
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js.map +1 -1
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +10 -2
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +11 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
- package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +70 -64
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +27 -0
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -0
- package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -7
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/FormSummary.js +7 -0
- package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +2 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js +84 -0
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +14 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +2 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/API/API.js +143 -19
- package/build/dist/UI/Utils/API/API.js.map +1 -1
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +21 -7
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +26 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +8 -0
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js +92 -0
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js.map +1 -0
- package/build/dist/UI/Utils/Realtime.js +120 -15
- package/build/dist/UI/Utils/Realtime.js.map +1 -1
- package/build/dist/Utils/API.js +13 -5
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +123 -6
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +4 -18
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -1
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js +2 -2
- package/package.json +1 -1
|
@@ -36,11 +36,13 @@ import StatusPageService, { Service as StatusPageServiceType, } from "../Service
|
|
|
36
36
|
import StatusPageSsoService from "../Services/StatusPageSsoService";
|
|
37
37
|
import StatusPageOidcService from "../Services/StatusPageOidcService";
|
|
38
38
|
import StatusPageSubscriberService from "../Services/StatusPageSubscriberService";
|
|
39
|
+
import ModelPermission from "../Types/Database/Permissions/Index";
|
|
39
40
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
40
41
|
import logger, { getLogAttributesFromRequest } from "../Utils/Logger";
|
|
41
42
|
import { SEARCH_ENGINE_INDEXING_FLAG_NAME, isSearchEngineIndexingEnabled, } from "../../Types/StatusPage/SearchEngineIndexing";
|
|
42
43
|
import Response from "../Utils/Response";
|
|
43
44
|
import BaseAPI from "./BaseAPI";
|
|
45
|
+
import CommonAPI from "./CommonAPI";
|
|
44
46
|
import BaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
45
47
|
import ArrayUtil from "../../Utils/Array";
|
|
46
48
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
@@ -49,6 +51,7 @@ import OneUptimeDate from "../../Types/Date";
|
|
|
49
51
|
import Email from "../../Types/Email";
|
|
50
52
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
51
53
|
import NotAuthenticatedException from "../../Types/Exception/NotAuthenticatedException";
|
|
54
|
+
import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
|
|
52
55
|
import NotFoundException from "../../Types/Exception/NotFoundException";
|
|
53
56
|
import JSONFunctions from "../../Types/JSONFunctions";
|
|
54
57
|
import ObjectID from "../../Types/ObjectID";
|
|
@@ -136,11 +139,44 @@ class StatusPageAPI extends BaseAPI {
|
|
|
136
139
|
this.overviewResponseCache.clear();
|
|
137
140
|
this.overviewResponseInFlight.clear();
|
|
138
141
|
}
|
|
142
|
+
/*
|
|
143
|
+
* Holding one of StatusPage's update roles is not the same as being allowed
|
|
144
|
+
* to update a given page: team block rows, label-restricted grants and
|
|
145
|
+
* Owned-scoped grants all narrow it. Apply the checks a CRUD update of this
|
|
146
|
+
* page would run - block and label rules against the loaded page, then the
|
|
147
|
+
* query narrowing (tenant, labels, Owned scope) - and require the page to
|
|
148
|
+
* survive them. `statusPage` must have been loaded with its labels.
|
|
149
|
+
*/
|
|
150
|
+
static async assertCanUpdateStatusPage(data) {
|
|
151
|
+
await ModelPermission.checkUpdatePermissionByModel({
|
|
152
|
+
modelType: StatusPage,
|
|
153
|
+
fetchModelWithAccessControlIds: async () => {
|
|
154
|
+
return data.statusPage;
|
|
155
|
+
},
|
|
156
|
+
props: data.props,
|
|
157
|
+
});
|
|
158
|
+
const permittedQuery = await ModelPermission.checkUpdateQueryPermissions(StatusPage, {
|
|
159
|
+
_id: data.statusPage.id,
|
|
160
|
+
projectId: data.projectId,
|
|
161
|
+
}, {}, data.props);
|
|
162
|
+
const permittedStatusPage = await StatusPageService.findOneBy({
|
|
163
|
+
query: permittedQuery,
|
|
164
|
+
select: {
|
|
165
|
+
_id: true,
|
|
166
|
+
},
|
|
167
|
+
props: {
|
|
168
|
+
isRoot: true,
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
if (!permittedStatusPage) {
|
|
172
|
+
throw new NotAuthorizedException("You do not have permission to send this status page's report.");
|
|
173
|
+
}
|
|
174
|
+
}
|
|
139
175
|
constructor() {
|
|
140
176
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9;
|
|
141
177
|
super(StatusPage, StatusPageService);
|
|
142
178
|
// get title, description of the page. This is used for SEO.
|
|
143
|
-
this.router.get(`${(_a = new this.entityType().getCrudApiPath()) === null || _a === void 0 ? void 0 : _a.toString()}/seo/:statusPageIdOrDomain`, UserMiddleware.
|
|
179
|
+
this.router.get(`${(_a = new this.entityType().getCrudApiPath()) === null || _a === void 0 ? void 0 : _a.toString()}/seo/:statusPageIdOrDomain`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res) => {
|
|
144
180
|
var _a;
|
|
145
181
|
const statusPageIdOrDomain = req.params["statusPageIdOrDomain"];
|
|
146
182
|
// Shares the service resolver's custom-domain -> statusPageId cache.
|
|
@@ -279,7 +315,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
279
315
|
}
|
|
280
316
|
});
|
|
281
317
|
this.router.get(`${(_e = new this.entityType()
|
|
282
|
-
.getCrudApiPath()) === null || _e === void 0 ? void 0 : _e.toString()}/incident-public-note/attachment/:statusPageId/:incidentId/:noteId/:fileId`, UserMiddleware.
|
|
318
|
+
.getCrudApiPath()) === null || _e === void 0 ? void 0 : _e.toString()}/incident-public-note/attachment/:statusPageId/:incidentId/:noteId/:fileId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
283
319
|
try {
|
|
284
320
|
await this.getIncidentPublicNoteAttachment(req, res);
|
|
285
321
|
}
|
|
@@ -288,7 +324,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
288
324
|
}
|
|
289
325
|
});
|
|
290
326
|
this.router.get(`${(_f = new this.entityType()
|
|
291
|
-
.getCrudApiPath()) === null || _f === void 0 ? void 0 : _f.toString()}/incident-episode-public-note/attachment/:statusPageId/:episodeId/:noteId/:fileId`, UserMiddleware.
|
|
327
|
+
.getCrudApiPath()) === null || _f === void 0 ? void 0 : _f.toString()}/incident-episode-public-note/attachment/:statusPageId/:episodeId/:noteId/:fileId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
292
328
|
try {
|
|
293
329
|
await this.getIncidentEpisodePublicNoteAttachment(req, res);
|
|
294
330
|
}
|
|
@@ -297,7 +333,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
297
333
|
}
|
|
298
334
|
});
|
|
299
335
|
this.router.get(`${(_g = new this.entityType()
|
|
300
|
-
.getCrudApiPath()) === null || _g === void 0 ? void 0 : _g.toString()}/incident/postmortem/attachment/:statusPageId/:incidentId/:fileId`, UserMiddleware.
|
|
336
|
+
.getCrudApiPath()) === null || _g === void 0 ? void 0 : _g.toString()}/incident/postmortem/attachment/:statusPageId/:incidentId/:fileId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
301
337
|
try {
|
|
302
338
|
await this.getIncidentPostmortemAttachment(req, res);
|
|
303
339
|
}
|
|
@@ -306,7 +342,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
306
342
|
}
|
|
307
343
|
});
|
|
308
344
|
this.router.get(`${(_h = new this.entityType()
|
|
309
|
-
.getCrudApiPath()) === null || _h === void 0 ? void 0 : _h.toString()}/scheduled-maintenance-public-note/attachment/:statusPageId/:scheduledMaintenanceId/:noteId/:fileId`, UserMiddleware.
|
|
345
|
+
.getCrudApiPath()) === null || _h === void 0 ? void 0 : _h.toString()}/scheduled-maintenance-public-note/attachment/:statusPageId/:scheduledMaintenanceId/:noteId/:fileId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
310
346
|
try {
|
|
311
347
|
await this.getScheduledMaintenancePublicNoteAttachment(req, res);
|
|
312
348
|
}
|
|
@@ -315,7 +351,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
315
351
|
}
|
|
316
352
|
});
|
|
317
353
|
this.router.get(`${(_j = new this.entityType()
|
|
318
|
-
.getCrudApiPath()) === null || _j === void 0 ? void 0 : _j.toString()}/status-page-announcement/attachment/:statusPageId/:announcementId/:fileId`, UserMiddleware.
|
|
354
|
+
.getCrudApiPath()) === null || _j === void 0 ? void 0 : _j.toString()}/status-page-announcement/attachment/:statusPageId/:announcementId/:fileId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
319
355
|
try {
|
|
320
356
|
await this.getStatusPageAnnouncementAttachment(req, res);
|
|
321
357
|
}
|
|
@@ -530,10 +566,54 @@ class StatusPageAPI extends BaseAPI {
|
|
|
530
566
|
}
|
|
531
567
|
return Response.sendTextResponse(req, res, challenge.challenge);
|
|
532
568
|
});
|
|
533
|
-
|
|
569
|
+
/*
|
|
570
|
+
* Sends the status page's report to an address the caller chooses, so it
|
|
571
|
+
* is gated like editing the status page: an authenticated member of the
|
|
572
|
+
* project that owns it who could update this particular page.
|
|
573
|
+
*/
|
|
574
|
+
this.router.post(`${(_p = new this.entityType().getCrudApiPath()) === null || _p === void 0 ? void 0 : _p.toString()}/test-email-report`, UserMiddleware.getUserMiddleware, UserMiddleware.requireUserAuthentication, async (req, res, next) => {
|
|
534
575
|
try {
|
|
576
|
+
/*
|
|
577
|
+
* This route acts on one page in one project, and the permission
|
|
578
|
+
* checks below must be evaluated for that single tenant, so the
|
|
579
|
+
* request is never treated as multi-tenant.
|
|
580
|
+
*/
|
|
581
|
+
const props = Object.assign(Object.assign({}, (await CommonAPI.getDatabaseCommonInteractionProps(req))), { isMultiTenantRequest: false });
|
|
582
|
+
const projectId = CommonAPI.assertAuthenticatedProjectMember(props);
|
|
583
|
+
CommonAPI.assertPermittedInProject({
|
|
584
|
+
databaseProps: props,
|
|
585
|
+
allowedPermissions: new StatusPage().getUpdatePermissions(),
|
|
586
|
+
errorMessage: "You do not have permission to send this status page's report.",
|
|
587
|
+
});
|
|
588
|
+
if (!req.body["statusPageId"] ||
|
|
589
|
+
!ObjectID.isValidUUID(req.body["statusPageId"].toString())) {
|
|
590
|
+
throw new BadDataException("A valid statusPageId is required.");
|
|
591
|
+
}
|
|
535
592
|
const email = new Email(req.body["email"]);
|
|
536
593
|
const statusPageId = new ObjectID(req.body["statusPageId"].toString());
|
|
594
|
+
const statusPage = await StatusPageService.findOneById({
|
|
595
|
+
id: statusPageId,
|
|
596
|
+
select: {
|
|
597
|
+
_id: true,
|
|
598
|
+
projectId: true,
|
|
599
|
+
labels: {
|
|
600
|
+
_id: true,
|
|
601
|
+
name: true,
|
|
602
|
+
},
|
|
603
|
+
},
|
|
604
|
+
props: {
|
|
605
|
+
isRoot: true,
|
|
606
|
+
},
|
|
607
|
+
});
|
|
608
|
+
CommonAPI.assertResourceBelongsToProject({
|
|
609
|
+
resourceProjectId: statusPage === null || statusPage === void 0 ? void 0 : statusPage.projectId,
|
|
610
|
+
projectId,
|
|
611
|
+
});
|
|
612
|
+
await StatusPageAPI.assertCanUpdateStatusPage({
|
|
613
|
+
statusPage: statusPage,
|
|
614
|
+
projectId,
|
|
615
|
+
props,
|
|
616
|
+
});
|
|
537
617
|
await StatusPageService.sendEmailReport({
|
|
538
618
|
email: email,
|
|
539
619
|
statusPageId,
|
|
@@ -544,7 +624,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
544
624
|
next(err);
|
|
545
625
|
}
|
|
546
626
|
});
|
|
547
|
-
this.router.post(`${(_q = new this.entityType().getCrudApiPath()) === null || _q === void 0 ? void 0 : _q.toString()}/domain`, UserMiddleware.
|
|
627
|
+
this.router.post(`${(_q = new this.entityType().getCrudApiPath()) === null || _q === void 0 ? void 0 : _q.toString()}/domain`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
548
628
|
try {
|
|
549
629
|
if (!req.body["domain"]) {
|
|
550
630
|
throw new BadDataException("domain is required in request body");
|
|
@@ -577,7 +657,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
577
657
|
}
|
|
578
658
|
});
|
|
579
659
|
this.router.post(`${(_r = new this.entityType()
|
|
580
|
-
.getCrudApiPath()) === null || _r === void 0 ? void 0 : _r.toString()}/master-page/:statusPageId`, UserMiddleware.
|
|
660
|
+
.getCrudApiPath()) === null || _r === void 0 ? void 0 : _r.toString()}/master-page/:statusPageId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
581
661
|
try {
|
|
582
662
|
const statusPageIdParam = req.params["statusPageId"];
|
|
583
663
|
ObjectID.validateUUID(statusPageIdParam);
|
|
@@ -729,7 +809,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
729
809
|
* PublicDashboardRateLimit for the budget and why it fails closed.
|
|
730
810
|
*/
|
|
731
811
|
this.router.post(`${(_s = new this.entityType()
|
|
732
|
-
.getCrudApiPath()) === null || _s === void 0 ? void 0 : _s.toString()}/master-password/:statusPageId`, PublicDashboardRateLimit.getMiddleware(PublicDashboardRateLimitBucket.StatusPageMasterPassword), UserMiddleware.
|
|
812
|
+
.getCrudApiPath()) === null || _s === void 0 ? void 0 : _s.toString()}/master-password/:statusPageId`, PublicDashboardRateLimit.getMiddleware(PublicDashboardRateLimitBucket.StatusPageMasterPassword), UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
733
813
|
try {
|
|
734
814
|
if (!req.params["statusPageId"]) {
|
|
735
815
|
throw new BadDataException("Status Page ID not found");
|
|
@@ -780,7 +860,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
780
860
|
next(err);
|
|
781
861
|
}
|
|
782
862
|
});
|
|
783
|
-
this.router.post(`${(_t = new this.entityType().getCrudApiPath()) === null || _t === void 0 ? void 0 : _t.toString()}/sso/:statusPageId`, UserMiddleware.
|
|
863
|
+
this.router.post(`${(_t = new this.entityType().getCrudApiPath()) === null || _t === void 0 ? void 0 : _t.toString()}/sso/:statusPageId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
784
864
|
try {
|
|
785
865
|
const objectId = new ObjectID(req.params["statusPageId"]);
|
|
786
866
|
const sso = await StatusPageSsoService.findBy({
|
|
@@ -806,7 +886,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
806
886
|
next(err);
|
|
807
887
|
}
|
|
808
888
|
});
|
|
809
|
-
this.router.post(`${(_u = new this.entityType().getCrudApiPath()) === null || _u === void 0 ? void 0 : _u.toString()}/oidc/:statusPageId`, UserMiddleware.
|
|
889
|
+
this.router.post(`${(_u = new this.entityType().getCrudApiPath()) === null || _u === void 0 ? void 0 : _u.toString()}/oidc/:statusPageId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
810
890
|
try {
|
|
811
891
|
const objectId = new ObjectID(req.params["statusPageId"]);
|
|
812
892
|
const oidc = await StatusPageOidcService.findBy({
|
|
@@ -833,7 +913,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
833
913
|
});
|
|
834
914
|
// Get all status page resources for subscriber to subscribe to.
|
|
835
915
|
this.router.post(`${(_v = new this.entityType()
|
|
836
|
-
.getCrudApiPath()) === null || _v === void 0 ? void 0 : _v.toString()}/resources/:statusPageId`, UserMiddleware.
|
|
916
|
+
.getCrudApiPath()) === null || _v === void 0 ? void 0 : _v.toString()}/resources/:statusPageId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
837
917
|
try {
|
|
838
918
|
const statusPageId = new ObjectID(req.params["statusPageId"]);
|
|
839
919
|
await this.checkHasReadAccess({
|
|
@@ -867,7 +947,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
867
947
|
}
|
|
868
948
|
});
|
|
869
949
|
this.router.post(`${(_w = new this.entityType()
|
|
870
|
-
.getCrudApiPath()) === null || _w === void 0 ? void 0 : _w.toString()}/uptime/:statusPageId`, UserMiddleware.
|
|
950
|
+
.getCrudApiPath()) === null || _w === void 0 ? void 0 : _w.toString()}/uptime/:statusPageId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
871
951
|
var _a, _b;
|
|
872
952
|
try {
|
|
873
953
|
// This reosurce ID can be of a status page resource OR a status page group.
|
|
@@ -1151,15 +1231,15 @@ class StatusPageAPI extends BaseAPI {
|
|
|
1151
1231
|
};
|
|
1152
1232
|
const overviewApiPath = `${(_x = new this.entityType()
|
|
1153
1233
|
.getCrudApiPath()) === null || _x === void 0 ? void 0 : _x.toString()}/overview/:statusPageIdOrDomain`;
|
|
1154
|
-
this.router.post(overviewApiPath, UserMiddleware.
|
|
1234
|
+
this.router.post(overviewApiPath, UserMiddleware.getPublicRouteUserMiddleware, overviewHandler);
|
|
1155
1235
|
/*
|
|
1156
1236
|
* GET variant of the overview endpoint. Same middleware and same handler
|
|
1157
1237
|
* as the POST route above — private status pages are rejected for
|
|
1158
1238
|
* unauthenticated callers exactly as they are on POST.
|
|
1159
1239
|
*/
|
|
1160
|
-
this.router.get(overviewApiPath, UserMiddleware.
|
|
1240
|
+
this.router.get(overviewApiPath, UserMiddleware.getPublicRouteUserMiddleware, overviewHandler);
|
|
1161
1241
|
this.router.put(`${(_y = new this.entityType()
|
|
1162
|
-
.getCrudApiPath()) === null || _y === void 0 ? void 0 : _y.toString()}/update-subscription/:statusPageId/:subscriberId`, UserMiddleware.
|
|
1242
|
+
.getCrudApiPath()) === null || _y === void 0 ? void 0 : _y.toString()}/update-subscription/:statusPageId/:subscriberId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
1163
1243
|
try {
|
|
1164
1244
|
await this.subscribeToStatusPage(req);
|
|
1165
1245
|
return Response.sendEmptySuccessResponse(req, res);
|
|
@@ -1169,7 +1249,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
1169
1249
|
}
|
|
1170
1250
|
});
|
|
1171
1251
|
this.router.post(`${(_z = new this.entityType()
|
|
1172
|
-
.getCrudApiPath()) === null || _z === void 0 ? void 0 : _z.toString()}/get-subscription/:statusPageId/:subscriberId`, UserMiddleware.
|
|
1252
|
+
.getCrudApiPath()) === null || _z === void 0 ? void 0 : _z.toString()}/get-subscription/:statusPageId/:subscriberId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
1173
1253
|
try {
|
|
1174
1254
|
const subscriber = await this.getSubscriber(req);
|
|
1175
1255
|
return Response.sendEntityResponse(req, res, subscriber, StatusPageSubscriber);
|
|
@@ -1179,7 +1259,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
1179
1259
|
}
|
|
1180
1260
|
});
|
|
1181
1261
|
this.router.post(`${(_0 = new this.entityType()
|
|
1182
|
-
.getCrudApiPath()) === null || _0 === void 0 ? void 0 : _0.toString()}/subscribe/:statusPageId`, UserMiddleware.
|
|
1262
|
+
.getCrudApiPath()) === null || _0 === void 0 ? void 0 : _0.toString()}/subscribe/:statusPageId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
1183
1263
|
try {
|
|
1184
1264
|
await this.subscribeToStatusPage(req);
|
|
1185
1265
|
return Response.sendEmptySuccessResponse(req, res);
|
|
@@ -1189,7 +1269,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
1189
1269
|
}
|
|
1190
1270
|
});
|
|
1191
1271
|
this.router.post(`${(_1 = new this.entityType()
|
|
1192
|
-
.getCrudApiPath()) === null || _1 === void 0 ? void 0 : _1.toString()}/manage-subscription/:statusPageId`, UserMiddleware.
|
|
1272
|
+
.getCrudApiPath()) === null || _1 === void 0 ? void 0 : _1.toString()}/manage-subscription/:statusPageId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
1193
1273
|
try {
|
|
1194
1274
|
await this.manageExistingSubscription(req);
|
|
1195
1275
|
return Response.sendEmptySuccessResponse(req, res);
|
|
@@ -1216,8 +1296,8 @@ class StatusPageAPI extends BaseAPI {
|
|
|
1216
1296
|
};
|
|
1217
1297
|
const incidentsListApiPath = `${(_2 = new this.entityType()
|
|
1218
1298
|
.getCrudApiPath()) === null || _2 === void 0 ? void 0 : _2.toString()}/incidents/:statusPageIdOrDomain`;
|
|
1219
|
-
this.router.post(incidentsListApiPath, UserMiddleware.
|
|
1220
|
-
this.router.get(incidentsListApiPath, UserMiddleware.
|
|
1299
|
+
this.router.post(incidentsListApiPath, UserMiddleware.getPublicRouteUserMiddleware, incidentsListHandler);
|
|
1300
|
+
this.router.get(incidentsListApiPath, UserMiddleware.getPublicRouteUserMiddleware, incidentsListHandler);
|
|
1221
1301
|
/*
|
|
1222
1302
|
* Shared handler for the scheduled maintenance events list endpoint.
|
|
1223
1303
|
* Registered for both POST and GET (same auth path). It does not read
|
|
@@ -1237,8 +1317,8 @@ class StatusPageAPI extends BaseAPI {
|
|
|
1237
1317
|
};
|
|
1238
1318
|
const scheduledMaintenanceEventsListApiPath = `${(_3 = new this.entityType()
|
|
1239
1319
|
.getCrudApiPath()) === null || _3 === void 0 ? void 0 : _3.toString()}/scheduled-maintenance-events/:statusPageIdOrDomain`;
|
|
1240
|
-
this.router.post(scheduledMaintenanceEventsListApiPath, UserMiddleware.
|
|
1241
|
-
this.router.get(scheduledMaintenanceEventsListApiPath, UserMiddleware.
|
|
1320
|
+
this.router.post(scheduledMaintenanceEventsListApiPath, UserMiddleware.getPublicRouteUserMiddleware, scheduledMaintenanceEventsListHandler);
|
|
1321
|
+
this.router.get(scheduledMaintenanceEventsListApiPath, UserMiddleware.getPublicRouteUserMiddleware, scheduledMaintenanceEventsListHandler);
|
|
1242
1322
|
/*
|
|
1243
1323
|
* Shared handler for the announcements list endpoint. Registered for
|
|
1244
1324
|
* both POST and GET (same auth path). It does not read req.body.
|
|
@@ -1257,10 +1337,10 @@ class StatusPageAPI extends BaseAPI {
|
|
|
1257
1337
|
};
|
|
1258
1338
|
const announcementsListApiPath = `${(_4 = new this.entityType()
|
|
1259
1339
|
.getCrudApiPath()) === null || _4 === void 0 ? void 0 : _4.toString()}/announcements/:statusPageIdOrDomain`;
|
|
1260
|
-
this.router.post(announcementsListApiPath, UserMiddleware.
|
|
1261
|
-
this.router.get(announcementsListApiPath, UserMiddleware.
|
|
1340
|
+
this.router.post(announcementsListApiPath, UserMiddleware.getPublicRouteUserMiddleware, announcementsListHandler);
|
|
1341
|
+
this.router.get(announcementsListApiPath, UserMiddleware.getPublicRouteUserMiddleware, announcementsListHandler);
|
|
1262
1342
|
this.router.post(`${(_5 = new this.entityType()
|
|
1263
|
-
.getCrudApiPath()) === null || _5 === void 0 ? void 0 : _5.toString()}/incidents/:statusPageIdOrDomain/:incidentId`, UserMiddleware.
|
|
1343
|
+
.getCrudApiPath()) === null || _5 === void 0 ? void 0 : _5.toString()}/incidents/:statusPageIdOrDomain/:incidentId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
1264
1344
|
try {
|
|
1265
1345
|
const objectId = await resolveStatusPageIdOrThrow(req.params["statusPageIdOrDomain"]);
|
|
1266
1346
|
const incidentId = new ObjectID(req.params["incidentId"]);
|
|
@@ -1272,7 +1352,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
1272
1352
|
}
|
|
1273
1353
|
});
|
|
1274
1354
|
this.router.post(`${(_6 = new this.entityType()
|
|
1275
|
-
.getCrudApiPath()) === null || _6 === void 0 ? void 0 : _6.toString()}/scheduled-maintenance-events/:statusPageIdOrDomain/:scheduledMaintenanceId`, UserMiddleware.
|
|
1355
|
+
.getCrudApiPath()) === null || _6 === void 0 ? void 0 : _6.toString()}/scheduled-maintenance-events/:statusPageIdOrDomain/:scheduledMaintenanceId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
1276
1356
|
try {
|
|
1277
1357
|
const objectId = await resolveStatusPageIdOrThrow(req.params["statusPageIdOrDomain"]);
|
|
1278
1358
|
const scheduledMaintenanceId = new ObjectID(req.params["scheduledMaintenanceId"]);
|
|
@@ -1284,7 +1364,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
1284
1364
|
}
|
|
1285
1365
|
});
|
|
1286
1366
|
this.router.post(`${(_7 = new this.entityType()
|
|
1287
|
-
.getCrudApiPath()) === null || _7 === void 0 ? void 0 : _7.toString()}/announcements/:statusPageIdOrDomain/:announcementId`, UserMiddleware.
|
|
1367
|
+
.getCrudApiPath()) === null || _7 === void 0 ? void 0 : _7.toString()}/announcements/:statusPageIdOrDomain/:announcementId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
1288
1368
|
try {
|
|
1289
1369
|
const objectId = await resolveStatusPageIdOrThrow(req.params["statusPageIdOrDomain"]);
|
|
1290
1370
|
const announcementId = new ObjectID(req.params["announcementId"]);
|
|
@@ -1297,7 +1377,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
1297
1377
|
});
|
|
1298
1378
|
// Episodes endpoints
|
|
1299
1379
|
this.router.post(`${(_8 = new this.entityType()
|
|
1300
|
-
.getCrudApiPath()) === null || _8 === void 0 ? void 0 : _8.toString()}/episodes/:statusPageIdOrDomain`, UserMiddleware.
|
|
1380
|
+
.getCrudApiPath()) === null || _8 === void 0 ? void 0 : _8.toString()}/episodes/:statusPageIdOrDomain`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
1301
1381
|
try {
|
|
1302
1382
|
const objectId = await resolveStatusPageIdOrThrow(req.params["statusPageIdOrDomain"]);
|
|
1303
1383
|
const response = await this.getEpisodes(objectId, null, req);
|
|
@@ -1308,7 +1388,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
1308
1388
|
}
|
|
1309
1389
|
});
|
|
1310
1390
|
this.router.post(`${(_9 = new this.entityType()
|
|
1311
|
-
.getCrudApiPath()) === null || _9 === void 0 ? void 0 : _9.toString()}/episodes/:statusPageIdOrDomain/:episodeId`, UserMiddleware.
|
|
1391
|
+
.getCrudApiPath()) === null || _9 === void 0 ? void 0 : _9.toString()}/episodes/:statusPageIdOrDomain/:episodeId`, UserMiddleware.getPublicRouteUserMiddleware, async (req, res, next) => {
|
|
1312
1392
|
try {
|
|
1313
1393
|
const objectId = await resolveStatusPageIdOrThrow(req.params["statusPageIdOrDomain"]);
|
|
1314
1394
|
const episodeId = new ObjectID(req.params["episodeId"]);
|
|
@@ -2258,6 +2338,18 @@ class StatusPageAPI extends BaseAPI {
|
|
|
2258
2338
|
}
|
|
2259
2339
|
return statusPageSubscriber;
|
|
2260
2340
|
}
|
|
2341
|
+
serializeIncidentsForStatusPage(incidents) {
|
|
2342
|
+
return incidents.map((incident) => {
|
|
2343
|
+
const incidentJson = BaseModel.toJSON(incident, Incident);
|
|
2344
|
+
// Enforce postmortem visibility before sending or caching status-page JSON.
|
|
2345
|
+
if (incident.showPostmortemOnStatusPage !== true) {
|
|
2346
|
+
delete incidentJson["postmortemNote"];
|
|
2347
|
+
delete incidentJson["postmortemPostedAt"];
|
|
2348
|
+
delete incidentJson["postmortemAttachments"];
|
|
2349
|
+
}
|
|
2350
|
+
return incidentJson;
|
|
2351
|
+
});
|
|
2352
|
+
}
|
|
2261
2353
|
async getIncidents(statusPageId, incidentId, req) {
|
|
2262
2354
|
await this.checkHasReadAccess({
|
|
2263
2355
|
statusPageId: statusPageId,
|
|
@@ -2465,7 +2557,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
2465
2557
|
const response = {
|
|
2466
2558
|
incidentPublicNotes: BaseModel.toJSONArray(incidentPublicNotes, IncidentPublicNote),
|
|
2467
2559
|
incidentStates: BaseModel.toJSONArray(incidentStates, IncidentState),
|
|
2468
|
-
incidents:
|
|
2560
|
+
incidents: this.serializeIncidentsForStatusPage(incidents),
|
|
2469
2561
|
statusPageResources: BaseModel.toJSONArray(statusPageResources, StatusPageResource),
|
|
2470
2562
|
incidentStateTimelines: BaseModel.toJSONArray(incidentStateTimelines, IncidentStateTimeline),
|
|
2471
2563
|
monitorsInGroup: JSONFunctions.serialize(monitorsInGroup),
|
|
@@ -3745,7 +3837,7 @@ class StatusPageAPI extends BaseAPI {
|
|
|
3745
3837
|
scheduledMaintenanceEvents: BaseModel.toJSONArray(scheduledMaintenanceEvents, ScheduledMaintenance),
|
|
3746
3838
|
activeAnnouncements: BaseModel.toJSONArray(activeAnnouncements, StatusPageAnnouncement),
|
|
3747
3839
|
incidentPublicNotes: BaseModel.toJSONArray(incidentPublicNotes, IncidentPublicNote),
|
|
3748
|
-
activeIncidents:
|
|
3840
|
+
activeIncidents: this.serializeIncidentsForStatusPage(activeIncidents),
|
|
3749
3841
|
activeEpisodes: activeEpisodesJson,
|
|
3750
3842
|
episodePublicNotes: BaseModel.toJSONArray(episodePublicNotes, IncidentEpisodePublicNote),
|
|
3751
3843
|
episodeStateTimelines: BaseModel.toJSONArray(episodeStateTimelines, IncidentEpisodeStateTimeline),
|