@oneuptime/common 14.0.6 → 14.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/Incident.ts +267 -1
- package/Models/DatabaseModels/IncidentCustomField.ts +202 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +30 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +126 -1
- package/Models/DatabaseModels/InventoryItem.ts +23 -12
- package/Models/DatabaseModels/StatusPage.ts +55 -0
- package/Models/DatabaseModels/StatusPageSubscriber.ts +128 -0
- package/Server/API/IncidentAPI.ts +162 -0
- package/Server/API/StatusPageAPI.ts +487 -171
- package/Server/API/StatusPageSubscriberAPI.ts +63 -15
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.ts +217 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.ts +108 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.ts +168 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.ts +44 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +16 -0
- package/Server/Infrastructure/Semaphore.ts +10 -0
- package/Server/Middleware/IdentityRateLimit.ts +108 -3
- package/Server/Middleware/SubscriberNotificationPreviewRateLimit.ts +237 -0
- package/Server/Middleware/SubscriberNotificationTestSendRateLimit.ts +304 -0
- package/Server/Services/AlertService.ts +32 -36
- package/Server/Services/DatabaseService.ts +93 -10
- package/Server/Services/IncidentAlertService.ts +609 -2
- package/Server/Services/IncidentCustomFieldService.ts +276 -1
- package/Server/Services/IncidentEpisodePublicNoteService.ts +28 -0
- package/Server/Services/IncidentEpisodeService.ts +15 -0
- package/Server/Services/IncidentEpisodeStateTimelineService.ts +27 -1
- package/Server/Services/IncidentPublicNoteService.ts +30 -1
- package/Server/Services/IncidentService.ts +1663 -103
- package/Server/Services/IncidentStateTimelineService.ts +13 -0
- package/Server/Services/IncidentTemplateService.ts +109 -0
- package/Server/Services/InventoryItemService.ts +38 -0
- package/Server/Services/IoTDeviceCredentialService.ts +13 -4
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +30 -1
- package/Server/Services/ScheduledMaintenanceService.ts +118 -64
- package/Server/Services/SmsService.ts +10 -0
- package/Server/Services/StatusPageService.ts +65 -8
- package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +299 -37
- package/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.ts +129 -0
- package/Server/Services/StatusPageSubscriberService.ts +1161 -64
- package/Server/Services/UserNotificationRuleService.ts +55 -53
- package/Server/Services/WorkspaceNotificationSummaryService.ts +38 -20
- package/Server/Types/Markdown.ts +153 -6
- package/Server/Types/Workflow/Components/Email.ts +61 -2
- package/Server/Utils/AffectedResources/LinkedAffectedResources.ts +576 -0
- package/Server/Utils/Alert/AlertStateChangeAuthorization.ts +129 -0
- package/Server/Utils/CustomField/CustomFieldRename.ts +378 -0
- package/Server/Utils/DataSource/EgressGuard.ts +66 -21
- package/Server/Utils/Inventory/InventoryOverviewAggregation.ts +111 -0
- package/Server/Utils/Mail/PinnedSmtpSocket.ts +130 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +10 -0
- package/Server/Utils/Response.ts +31 -0
- package/Server/Utils/SSRFProtection.ts +76 -16
- package/Server/Utils/StatusPage/IncidentStatusPageScope.ts +948 -0
- package/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.ts +656 -0
- package/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.ts +805 -0
- package/Server/Utils/StatusPage/StatusPageExclusion.ts +18 -0
- package/Server/Utils/StatusPage/StatusPageReadAccess.ts +125 -0
- package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.ts +151 -0
- package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.ts +70 -0
- package/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.ts +421 -0
- package/Server/Utils/StatusPage/SubscriberNotificationClaim.ts +107 -0
- package/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.ts +1049 -0
- package/Server/Utils/StatusPage/SubscriberNotificationFanOut.ts +180 -0
- package/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.ts +839 -0
- package/Server/Utils/StatusPage/SubscriberNotificationResendAccess.ts +393 -0
- package/Server/Utils/StatusPage/SubscriberNotificationRunLimit.ts +246 -0
- package/Server/Utils/StatusPage/SubscriberNotificationTiming.ts +133 -0
- package/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.ts +215 -0
- package/Server/Utils/StatusPageResource.ts +51 -20
- package/Server/Utils/Topology/TopologyConcurrencyLimiter.ts +229 -0
- package/Server/Utils/Topology/TopologyQueries.ts +1350 -0
- package/Server/Utils/Topology/TopologyRequest.ts +463 -0
- package/Server/Utils/Topology/TopologyResponseCache.ts +183 -0
- package/Server/Utils/Topology/TopologySql.ts +1024 -0
- package/Server/Utils/VM/VMAPI.ts +1 -0
- package/Server/Utils/VM/VMRunner.ts +10 -0
- package/Server/Utils/Workflow/OAuth2TokenClient.ts +10 -0
- package/Server/Views/Partials/SensitiveUrlToken.ejs +8 -5
- package/Tests/App/Accounts/RegisterVerifyEmail.test.tsx +748 -0
- package/Tests/App/Accounts/ResendVerificationEmail.test.tsx +1222 -0
- package/Tests/App/Accounts/VerificationEmailResendUtils.test.ts +797 -0
- package/Tests/App/Accounts/VerifyEmailPending.test.tsx +538 -0
- package/Tests/App/Accounts/VerifyEmailResend.test.tsx +779 -0
- package/Tests/App/Dashboard/AcknowledgeAlertsOnDeclare.test.ts +369 -0
- package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +1 -1
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +510 -123
- package/Tests/App/Dashboard/AlertsTableAffectedResources.test.tsx +490 -0
- package/Tests/App/Dashboard/ChangeAlertStateDeclareIncident.test.tsx +886 -0
- package/Tests/App/Dashboard/CreateReviewStepRoleSummary.test.tsx +1250 -0
- package/Tests/App/Dashboard/CreateReviewStepSelectionSummary.test.tsx +738 -0
- package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +357 -0
- package/Tests/App/Dashboard/DeclareIncidentFromAlert.test.ts +417 -0
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +1948 -229
- package/Tests/App/Dashboard/EntityDetailPanelLifecycle.test.tsx +493 -0
- package/Tests/App/Dashboard/EntityDetailPanelNavigation.test.tsx +439 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +776 -0
- package/Tests/App/Dashboard/EventNotesPages.test.tsx +119 -0
- package/Tests/App/Dashboard/EventNotesUtil.test.ts +116 -17
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +534 -6
- package/Tests/App/Dashboard/EventStatusPanel.test.tsx +798 -2
- package/Tests/App/Dashboard/FetchStateAndSeverityElements.test.tsx +669 -0
- package/Tests/App/Dashboard/FetchUsers.test.tsx +230 -0
- package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +91 -1
- package/Tests/App/Dashboard/IncidentCreateAcknowledgeAlerts.test.tsx +1611 -0
- package/Tests/App/Dashboard/IncidentCreateDetailsStep.test.tsx +643 -0
- package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +8 -1
- package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +601 -0
- package/Tests/App/Dashboard/IncidentCustomFieldTemplateVariables.test.tsx +386 -0
- package/Tests/App/Dashboard/IncidentNoteTemplatePlaceholders.test.tsx +124 -0
- package/Tests/App/Dashboard/IncidentNoteTemplateVariablesLoader.test.ts +305 -0
- package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +112 -0
- package/Tests/App/Dashboard/IncidentSettingsRenotifyOnPublish.test.tsx +674 -0
- package/Tests/App/Dashboard/IncidentSettingsStatusPageScope.test.tsx +1051 -0
- package/Tests/App/Dashboard/IncidentTemplateCustomFields.test.tsx +384 -0
- package/Tests/App/Dashboard/IncidentTemplateStatusPageScopeCard.test.tsx +215 -0
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +1365 -57
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +964 -23
- package/Tests/App/Dashboard/InventoryRelationships.test.tsx +885 -0
- package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +113 -1
- package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +201 -15
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +508 -36
- package/Tests/App/Dashboard/SubscriberAudienceSummary.test.tsx +512 -0
- package/Tests/App/Dashboard/SubscriberNotificationPreviewModal.test.tsx +837 -0
- package/Tests/App/Dashboard/SubscriberNotificationStatusLabel.test.tsx +88 -0
- package/Tests/App/Dashboard/SubscriberNotificationStatusResend.test.tsx +473 -0
- package/Tests/App/Dashboard/SubscriberTemplateLivePreview.test.tsx +196 -0
- package/Tests/App/Dashboard/TeamAddedSubscribersUnsubscribedNotice.test.tsx +248 -0
- package/Tests/App/Dashboard/TopologyDataLifecycle.test.tsx +583 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +982 -218
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +818 -114
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +64 -3
- package/Tests/App/StatusPage/StatusPageUnsubscribePage.test.tsx +412 -0
- package/Tests/Models/IncidentCustomFieldApiSchemaContract.test.ts +217 -0
- package/Tests/Models/IncidentCustomFieldCreateSettingsColumns.test.ts +252 -0
- package/Tests/Models/StatusPageSubscriberUnsubscribeColumns.test.ts +218 -0
- package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +7 -0
- package/Tests/Server/API/IncidentSubscriberAudienceAPI.test.ts +1408 -0
- package/Tests/Server/API/StatusPageIncidentScope.test.ts +1868 -0
- package/Tests/Server/API/StatusPageIncidentScopePostgres.test.ts +790 -0
- package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +10 -1
- package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +206 -18
- package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +14 -2
- package/Tests/Server/API/StatusPageSubscriberCreateResponse.test.ts +217 -0
- package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +103 -2
- package/Tests/Server/API/StatusPageUnsubscribeAPI.test.ts +396 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentStatusPageScopeMigration.test.ts +395 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentTemplateStatusPageScopeFlagMigration.test.ts +150 -0
- package/Tests/Server/Infrastructure/Postgres/AddSubscriberNotificationClaimedAtMigration.test.ts +156 -0
- package/Tests/Server/Infrastructure/Postgres/RenameInventoryItemMigration.test.ts +90 -21
- package/Tests/Server/Infrastructure/Postgres/SkipHiddenIncidentCreatedNotificationsMigration.test.ts +410 -0
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +551 -1
- package/Tests/Server/Middleware/SubscriberNotificationPreviewRateLimit.test.ts +238 -0
- package/Tests/Server/Middleware/SubscriberNotificationTestSendRateLimit.test.ts +245 -0
- package/Tests/Server/Services/AddStatusPageSubscriberUnsubscribeTokenMigration.test.ts +152 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +221 -36
- package/Tests/Server/Services/DatabaseServiceCompareAndSetColumns.test.ts +191 -0
- package/Tests/Server/Services/DomainService.test.ts +525 -0
- package/Tests/Server/Services/IncidentAlertAcknowledgeOnDeclare.test.ts +2630 -0
- package/Tests/Server/Services/IncidentAlertPostgres.test.ts +1625 -1
- package/Tests/Server/Services/IncidentCreatedRenotifyOnPublish.test.ts +681 -0
- package/Tests/Server/Services/IncidentCreatedResend.test.ts +775 -0
- package/Tests/Server/Services/IncidentCustomFieldRenamePostgres.test.ts +713 -0
- package/Tests/Server/Services/IncidentCustomFieldService.test.ts +751 -0
- package/Tests/Server/Services/IncidentCustomFieldValueValidation.test.ts +556 -0
- package/Tests/Server/Services/IncidentDeclareAcknowledgeAlerts.test.ts +2189 -0
- package/Tests/Server/Services/IncidentStatusPageScope.test.ts +2971 -0
- package/Tests/Server/Services/IncidentStatusPageScopeFeed.test.ts +131 -0
- package/Tests/Server/Services/IncidentStatusPageScopePostgres.test.ts +625 -0
- package/Tests/Server/Services/IncidentTemplateCustomFieldsCopy.test.ts +311 -0
- package/Tests/Server/Services/IncidentTemplateStatusPageScope.test.ts +363 -0
- package/Tests/Server/Services/InventoryItemServiceOverviewCounts.test.ts +345 -0
- package/Tests/Server/Services/InventoryOverviewPostgres.test.ts +254 -0
- package/Tests/Server/Services/IoTDeviceCredentialService.test.ts +819 -0
- package/Tests/Server/Services/LinkedAffectedResourcesCreatedFeed.test.ts +420 -0
- package/Tests/Server/Services/PublicNoteEditFeedEventType.test.ts +213 -0
- package/Tests/Server/Services/PublicNoteResendAccess.test.ts +994 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +289 -9
- package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +92 -36
- package/Tests/Server/Services/SmsServiceFailIfNotSent.test.ts +67 -0
- package/Tests/Server/Services/StatusPageReportIncidentCounts.test.ts +610 -0
- package/Tests/Server/Services/StatusPageSubscriberAudienceCounts.test.ts +201 -0
- package/Tests/Server/Services/StatusPageSubscriberAudienceCountsPostgres.test.ts +271 -0
- package/Tests/Server/Services/StatusPageSubscriberConfirmationTemplateEscaping.test.ts +200 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationLogRedaction.test.ts +54 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +37 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateIncidentRecordAccess.test.ts +772 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookup.test.ts +506 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookupPostgres.test.ts +261 -0
- package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +21 -5
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribe.test.ts +1618 -0
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribeLinkSenders.test.ts +373 -0
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribePostgres.test.ts +388 -0
- package/Tests/Server/Services/SubscriberNotificationInFlightRequeue.test.ts +500 -0
- package/Tests/Server/Types/MarkdownEmailLinks.test.ts +320 -0
- package/Tests/Server/Types/Workflow/Components/Email.test.ts +491 -1
- package/Tests/Server/Types/Workflow/Components/EmailSmtpPinning.test.ts +398 -0
- package/Tests/Server/Utils/AffectedResources/LinkedAffectedResources.test.ts +858 -0
- package/Tests/Server/Utils/Alert/AlertStateChangeAuthorization.test.ts +1172 -0
- package/Tests/Server/Utils/CustomField/CustomFieldRename.test.ts +586 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +246 -10
- package/Tests/Server/Utils/DataSource/EgressGuardDeploymentConfig.test.ts +226 -0
- package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +131 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +4 -0
- package/Tests/Server/Utils/EgressPolicyEnvironment.ts +45 -0
- package/Tests/Server/Utils/Mail/PinnedSmtpSocket.test.ts +409 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +23 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionResolutionDetail.test.ts +314 -0
- package/Tests/Server/Utils/StatusPage/IncidentStatusPageScope.test.ts +1699 -0
- package/Tests/Server/Utils/StatusPage/IncidentStatusPageScopeQueriesPostgres.test.ts +508 -0
- package/Tests/Server/Utils/StatusPage/IncidentSubscriberAudienceCallerPermission.test.ts +246 -0
- package/Tests/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.test.ts +1348 -0
- package/Tests/Server/Utils/StatusPage/StatusPageReadAccess.test.ts +221 -0
- package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.test.ts +132 -0
- package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.test.ts +155 -0
- package/Tests/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.test.ts +708 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaim.test.ts +255 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaimPostgres.test.ts +528 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.test.ts +1238 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationFanOut.test.ts +472 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.test.ts +1168 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationRunLimit.test.ts +275 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationTiming.test.ts +131 -0
- package/Tests/Server/Utils/StatusPageResource.test.ts +98 -0
- package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigration.test.ts +386 -0
- package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigrationPostgres.test.ts +430 -0
- package/Tests/Server/Utils/Topology/TopologyActivityParityPostgres.test.ts +279 -0
- package/Tests/Server/Utils/Topology/TopologyConcurrencyLimiter.test.ts +534 -0
- package/Tests/Server/Utils/Topology/TopologyEstateGenerator.ts +624 -0
- package/Tests/Server/Utils/Topology/TopologyJsonResponse.test.ts +90 -0
- package/Tests/Server/Utils/Topology/TopologyQueries.test.ts +1634 -0
- package/Tests/Server/Utils/Topology/TopologyQueriesDifferentialPostgres.test.ts +683 -0
- package/Tests/Server/Utils/Topology/TopologyQueriesPostgres.test.ts +2624 -0
- package/Tests/Server/Utils/Topology/TopologyReference.ts +1018 -0
- package/Tests/Server/Utils/Topology/TopologyRequest.test.ts +643 -0
- package/Tests/Server/Utils/Topology/TopologyResponseCache.test.ts +305 -0
- package/Tests/Server/Utils/Topology/TopologySql.test.ts +973 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +17 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +75 -0
- package/Tests/Types/CustomField/CustomFieldSavedViews.test.ts +247 -0
- package/Tests/Types/CustomField/CustomFieldTemplateValues.test.ts +186 -0
- package/Tests/Types/CustomField/CustomFieldTypeCorrespondence.test.ts +48 -0
- package/Tests/Types/CustomField/CustomFieldValueFormat.test.ts +215 -0
- package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +343 -0
- package/Tests/Types/CustomField/CustomFieldVariableKey.test.ts +364 -0
- package/Tests/Types/SafeHtml.test.ts +102 -0
- package/Tests/Types/StatusPage/IncidentCreatedRenotify.test.ts +419 -0
- package/Tests/Types/StatusPage/IncidentCreatedResend.test.ts +118 -0
- package/Tests/Types/StatusPage/IncidentScopeAddedPagesNotification.test.ts +558 -0
- package/Tests/Types/StatusPage/IncidentSubscriberAudience.test.ts +284 -0
- package/Tests/Types/StatusPage/StatusPageSubscriberUnsubscribe.test.ts +341 -0
- package/Tests/Types/StatusPage/SubscriberNotificationPreview.test.ts +196 -0
- package/Tests/Types/StatusPage/SubscriberNotificationResend.test.ts +201 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateCompiler.test.ts +277 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplatePreview.test.ts +179 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +324 -0
- package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +60 -13
- package/Tests/Types/Topology/TopologyTypeRules.test.ts +176 -0
- package/Tests/UI/Components/CustomFields/CustomFieldFormFields.test.ts +432 -0
- package/Tests/UI/Components/CustomFields/CustomFieldModelFormFields.test.tsx +685 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetailOrder.test.tsx +469 -0
- package/Tests/UI/Components/Forms/ModelFormCustomFieldInputs.test.tsx +325 -0
- package/Tests/UI/Components/Forms/ModelFormDropdownOptionsRefused.test.tsx +358 -0
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +22 -0
- package/Tests/UI/Monitor/NetworkPathView.test.tsx +289 -0
- package/Tests/Utils/Incident/IncidentFromAlerts.test.ts +302 -0
- package/Tests/Utils/Incident/IncidentNoteTemplateVariables.test.ts +623 -0
- package/Tests/Utils/Markdown/MarkdownEscape.test.ts +89 -0
- package/Tests/Utils/ProbeNetworkFailureUtil.test.ts +992 -0
- package/Tests/Utils/RequestFailedDetails.test.ts +575 -0
- package/Types/CustomField/CustomFieldOrder.ts +55 -0
- package/Types/CustomField/CustomFieldSavedViews.ts +225 -0
- package/Types/CustomField/CustomFieldTemplateMerge.ts +71 -0
- package/Types/CustomField/CustomFieldType.ts +14 -0
- package/Types/CustomField/CustomFieldValueFormat.ts +161 -0
- package/Types/CustomField/CustomFieldValueValidator.ts +488 -0
- package/Types/CustomField/CustomFieldVariableKey.ts +211 -0
- package/Types/Incident/IncidentAlertLink.ts +19 -0
- package/Types/SafeHtml.ts +93 -0
- package/Types/StatusPage/IncidentCreatedRenotify.ts +224 -0
- package/Types/StatusPage/IncidentCreatedResend.ts +108 -0
- package/Types/StatusPage/IncidentScopeAddedPagesNotification.ts +343 -0
- package/Types/StatusPage/IncidentSubscriberAudience.ts +332 -0
- package/Types/StatusPage/StatusPageSubscriberUnsubscribe.ts +405 -0
- package/Types/StatusPage/SubscriberNotificationInterruption.ts +32 -0
- package/Types/StatusPage/SubscriberNotificationPreview.ts +322 -0
- package/Types/StatusPage/SubscriberNotificationResend.ts +132 -0
- package/Types/StatusPage/SubscriberNotificationTemplateCompiler.ts +180 -0
- package/Types/StatusPage/SubscriberNotificationTemplatePreview.ts +301 -0
- package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +217 -4
- package/Types/StatusPage/SubscriberUpdateNotification.ts +32 -11
- package/Types/Telemetry/InventoryLiveness.ts +26 -0
- package/Types/Topology/TopologyApi.ts +428 -0
- package/Types/Topology/TopologyTypeRules.ts +191 -0
- package/UI/Components/CustomFields/CustomFieldFormFields.ts +317 -0
- package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +395 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +95 -55
- package/UI/Components/Forms/ModelForm.tsx +70 -8
- package/UI/Components/Forms/Validation.ts +1 -1
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +2 -4
- package/UI/Components/ModelTable/AnalyticsModelTable.tsx +2 -6
- package/UI/Components/ModelTable/BaseModelTable.tsx +9 -8
- package/UI/Components/ModelTable/CustomFieldColumns.tsx +14 -1
- package/UI/Components/ModelTable/ModelTable.tsx +6 -7
- package/UI/Utils/SensitiveUrlToken.ts +10 -5
- package/Utils/API.ts +247 -2
- package/Utils/Incident/IncidentFromAlerts.ts +78 -0
- package/Utils/Incident/IncidentNoteTemplateVariables.ts +304 -0
- package/Utils/Markdown/MarkdownEscape.ts +65 -0
- package/Utils/ProbeNetworkFailureUtil.ts +673 -0
- package/build/dist/Models/DatabaseModels/Incident.js +267 -1
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js +207 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +31 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +124 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js +20 -11
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +56 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +131 -0
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +100 -1
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +417 -176
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageSubscriberAPI.js +52 -13
- package/build/dist/Server/API/StatusPageSubscriberAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js +165 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js +57 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js +29 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +3 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +89 -3
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js +149 -0
- package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js.map +1 -0
- package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js +190 -0
- package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AlertService.js +21 -33
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +56 -7
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentAlertService.js +457 -3
- package/build/dist/Server/Services/IncidentAlertService.js.map +1 -1
- package/build/dist/Server/Services/IncidentCustomFieldService.js +204 -8
- package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +14 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +26 -0
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +26 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +1148 -42
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +83 -0
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +31 -0
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/IoTDeviceCredentialService.js +12 -5
- package/build/dist/Server/Services/IoTDeviceCredentialService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +26 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +84 -57
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/SmsService.js +2 -22
- package/build/dist/Server/Services/SmsService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +47 -9
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +237 -32
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js +109 -0
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +925 -99
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +55 -51
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +42 -25
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +110 -6
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Email.js +55 -6
- package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
- package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js +405 -0
- package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js.map +1 -0
- package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js +112 -0
- package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldRename.js +211 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldRename.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +41 -12
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js +81 -0
- package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js.map +1 -0
- package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js +101 -0
- package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +30 -0
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +48 -6
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js +631 -0
- package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js +403 -0
- package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js +451 -0
- package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js +13 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js +91 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js +101 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js +47 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js +273 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js +73 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js +722 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js +102 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js +527 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js +278 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js +137 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js +103 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js +114 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPageResource.js +39 -7
- package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
- package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js +178 -0
- package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyQueries.js +884 -0
- package/build/dist/Server/Utils/Topology/TopologyQueries.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyRequest.js +275 -0
- package/build/dist/Server/Utils/Topology/TopologyRequest.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyResponseCache.js +146 -0
- package/build/dist/Server/Utils/Topology/TopologyResponseCache.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologySql.js +688 -0
- package/build/dist/Server/Utils/Topology/TopologySql.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +1 -0
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +3 -0
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldOrder.js +36 -0
- package/build/dist/Types/CustomField/CustomFieldOrder.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldSavedViews.js +135 -0
- package/build/dist/Types/CustomField/CustomFieldSavedViews.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js +27 -0
- package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldType.js +12 -0
- package/build/dist/Types/CustomField/CustomFieldType.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldValueFormat.js +126 -0
- package/build/dist/Types/CustomField/CustomFieldValueFormat.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js +280 -0
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldVariableKey.js +150 -0
- package/build/dist/Types/CustomField/CustomFieldVariableKey.js.map +1 -0
- package/build/dist/Types/Incident/IncidentAlertLink.js +17 -0
- package/build/dist/Types/Incident/IncidentAlertLink.js.map +1 -1
- package/build/dist/Types/SafeHtml.js +84 -0
- package/build/dist/Types/SafeHtml.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js +117 -0
- package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentCreatedResend.js +86 -0
- package/build/dist/Types/StatusPage/IncidentCreatedResend.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js +246 -0
- package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js +183 -0
- package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js +277 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js +27 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js +190 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationResend.js +102 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationResend.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js +97 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js +175 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +144 -4
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -1
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +29 -9
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -1
- package/build/dist/Types/Telemetry/InventoryLiveness.js +23 -0
- package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -1
- package/build/dist/Types/Topology/TopologyApi.js +55 -0
- package/build/dist/Types/Topology/TopologyApi.js.map +1 -0
- package/build/dist/Types/Topology/TopologyTypeRules.js +165 -0
- package/build/dist/Types/Topology/TopologyTypeRules.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js +169 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +212 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +64 -49
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +39 -5
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +1 -1
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/AnalyticsModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +13 -1
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +10 -5
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -1
- package/build/dist/Utils/API.js +177 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Incident/IncidentFromAlerts.js +38 -0
- package/build/dist/Utils/Incident/IncidentFromAlerts.js.map +1 -1
- package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js +155 -0
- package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js.map +1 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js +48 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -1
- package/build/dist/Utils/ProbeNetworkFailureUtil.js +460 -0
- package/build/dist/Utils/ProbeNetworkFailureUtil.js.map +1 -0
- package/package.json +1 -1
|
@@ -12,6 +12,25 @@
|
|
|
12
12
|
*/
|
|
13
13
|
export const INCIDENT_ALERT_IDS_TO_LINK_KEY: string = "alertIdsToLink";
|
|
14
14
|
|
|
15
|
+
/*
|
|
16
|
+
* Declaring an incident from alerts does not, on its own, change the alerts:
|
|
17
|
+
* they keep escalating until somebody acknowledges them. Sending
|
|
18
|
+
* `miscDataProps[INCIDENT_ACKNOWLEDGE_ALERTS_TO_LINK_KEY] = true` along with
|
|
19
|
+
* INCIDENT_ALERT_IDS_TO_LINK_KEY also acknowledges them, as the declaring
|
|
20
|
+
* user, once they are linked - which is what stops their on-call escalation.
|
|
21
|
+
* Alerts already acknowledged (or past it) are left as they are, and the
|
|
22
|
+
* caller must be allowed to change the state of every alert that is not.
|
|
23
|
+
* Off unless asked for.
|
|
24
|
+
*
|
|
25
|
+
* One exception: when the incident is declared straight into an
|
|
26
|
+
* acknowledged or resolved state and the project's linked-alert switches
|
|
27
|
+
* already move linked alerts along with it, those alerts are left to the
|
|
28
|
+
* switches (one writer per alert) - acknowledged or resolved as the switch
|
|
29
|
+
* does it, not credited to the declaring user.
|
|
30
|
+
*/
|
|
31
|
+
export const INCIDENT_ACKNOWLEDGE_ALERTS_TO_LINK_KEY: string =
|
|
32
|
+
"acknowledgeAlertsToLink";
|
|
33
|
+
|
|
15
34
|
/*
|
|
16
35
|
* The create-incident page reads the alerts to declare an incident from out of
|
|
17
36
|
* this query string parameter, as a comma separated list of alert ids.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A value that is ALREADY HTML and may go into an HTML document as written.
|
|
3
|
+
*
|
|
4
|
+
* Status page subscriber emails are filled from two kinds of value, and a
|
|
5
|
+
* plain string cannot say which one it holds:
|
|
6
|
+
*
|
|
7
|
+
* - plain text: an incident, episode, maintenance or announcement title, a
|
|
8
|
+
* severity or state name, a status page or resource name, a URL. Project
|
|
9
|
+
* members type these, and a title is exactly what someone outside the
|
|
10
|
+
* team gets to influence (an incident created from a monitor, an API
|
|
11
|
+
* call, a Slack command). Put into HTML as written, a title such as
|
|
12
|
+
* `<a href="https://evil.example">Reset your password</a>` becomes a live
|
|
13
|
+
* link in an email the recipient trusts.
|
|
14
|
+
* - HTML this code produced itself: Markdown.convertToHTML output (which
|
|
15
|
+
* escapes the raw HTML an author typed and keeps only http, https and
|
|
16
|
+
* mailto links), the date helper's multi-timezone HTML, and the resource
|
|
17
|
+
* list StatusPageResourceUtil.getResourcesGroupedByGroupName builds from
|
|
18
|
+
* escaped names.
|
|
19
|
+
*
|
|
20
|
+
* So the HTML ones travel wrapped in this type, and anything that is still a
|
|
21
|
+
* string is treated as plain text and escaped where it meets HTML (see
|
|
22
|
+
* SubscriberNotificationTemplateCompiler.compileEmailBodyTemplate). A value
|
|
23
|
+
* nobody thought about is therefore escaped, which at worst shows the reader
|
|
24
|
+
* an "&" too many; it can never become markup by accident.
|
|
25
|
+
*
|
|
26
|
+
* Kept free of server dependencies so both the server and the dashboard can
|
|
27
|
+
* use it.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/*
|
|
31
|
+
* Marks instances without instanceof, which a second copy of this module (a
|
|
32
|
+
* test's isolated module registry, a duplicated bundle) would defeat.
|
|
33
|
+
*/
|
|
34
|
+
const SAFE_HTML_BRAND: unique symbol = Symbol.for("OneUptime.SafeHtml");
|
|
35
|
+
|
|
36
|
+
export default class SafeHtml {
|
|
37
|
+
// Read by isSafeHtml; a symbol key, so JSON.stringify leaves it out.
|
|
38
|
+
public readonly [SAFE_HTML_BRAND]: boolean = true;
|
|
39
|
+
|
|
40
|
+
private readonly html: string;
|
|
41
|
+
|
|
42
|
+
private constructor(html: string) {
|
|
43
|
+
this.html = html;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
* Wraps markup this code produced from values it had already made safe:
|
|
48
|
+
* Markdown.convertToHTML(..., MarkdownContentType.Email) output,
|
|
49
|
+
* OneUptimeDate.getDateAsFormattedHTMLInMultipleTimezones output, and
|
|
50
|
+
* StatusPageResourceUtil.getResourcesGroupedByGroupName output. Never a
|
|
51
|
+
* value a user typed.
|
|
52
|
+
*/
|
|
53
|
+
public static fromTrustedHtml(html: string | null | undefined): SafeHtml {
|
|
54
|
+
return new SafeHtml(html || "");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Plain text, escaped so it reads the same in HTML.
|
|
58
|
+
public static fromPlainText(text: string | null | undefined): SafeHtml {
|
|
59
|
+
return new SafeHtml(SafeHtml.escape(text || ""));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/*
|
|
63
|
+
* Escapes the five characters that can break out of HTML text or a quoted
|
|
64
|
+
* attribute value. The ampersand goes first, so the entities the other
|
|
65
|
+
* four become are not escaped a second time.
|
|
66
|
+
*
|
|
67
|
+
* This is the one implementation: Markdown.escapeHtml calls it.
|
|
68
|
+
*/
|
|
69
|
+
public static escape(text: string): string {
|
|
70
|
+
return String(text)
|
|
71
|
+
.replace(/&/g, "&")
|
|
72
|
+
.replace(/</g, "<")
|
|
73
|
+
.replace(/>/g, ">")
|
|
74
|
+
.replace(/"/g, """)
|
|
75
|
+
.replace(/'/g, "'");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public static isSafeHtml(value: unknown): value is SafeHtml {
|
|
79
|
+
return (
|
|
80
|
+
typeof value === "object" &&
|
|
81
|
+
value !== null &&
|
|
82
|
+
(value as { [SAFE_HTML_BRAND]?: unknown })[SAFE_HTML_BRAND] === true
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public toHtml(): string {
|
|
87
|
+
return this.html;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public toString(): string {
|
|
91
|
+
return this.html;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { JSONObject } from "../JSON";
|
|
2
|
+
import IncidentScopeAddedPagesNotification from "./IncidentScopeAddedPagesNotification";
|
|
3
|
+
import StatusPageSubscriberNotificationStatus from "./StatusPageSubscriberNotificationStatus";
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* Status page subscribers hear about an incident once, when it is created -
|
|
7
|
+
* but only if it is visible on status pages at that moment. A common routine
|
|
8
|
+
* is to declare an incident hidden, work out who is affected, and then turn
|
|
9
|
+
* 'Visible on Status Page' on. The 'created' notification of such an incident
|
|
10
|
+
* is settled as Skipped (hidden from status pages), so without a way back
|
|
11
|
+
* nobody was ever told.
|
|
12
|
+
*
|
|
13
|
+
* Whether publishing should announce the incident is the editor's call: for a
|
|
14
|
+
* live outage it should, but making an old, resolved incident visible "for the
|
|
15
|
+
* record" must not email everyone about a "new" incident. So it is asked when
|
|
16
|
+
* the incident is published, not decided automatically, and the answer travels
|
|
17
|
+
* with that update request as a misc data prop (like SubscriberUpdateNotification,
|
|
18
|
+
* it is not a column - a stored flag would either stick or have to be reset
|
|
19
|
+
* behind the caller's back). IncidentService turns it into a Pending 'created'
|
|
20
|
+
* notification status, and the Incident:SendNotificationToSubscribers job
|
|
21
|
+
* sends it.
|
|
22
|
+
*
|
|
23
|
+
* The same goes for status pages added to an incident's scope while it was
|
|
24
|
+
* hidden. Adding a page to a visible incident can tell that page it was
|
|
25
|
+
* created (IncidentScopeAddedPagesNotification), but a hidden incident is not
|
|
26
|
+
* sent anywhere, so a page added then was never told - and once it is in the
|
|
27
|
+
* scope it is no longer "added" by any later edit. So publishing also offers
|
|
28
|
+
* the notification when the incident's scope holds pages its record of told
|
|
29
|
+
* pages (Incident.statusPagesNotifiedOnCreation) does not list. The job then
|
|
30
|
+
* sends it to those pages only.
|
|
31
|
+
*
|
|
32
|
+
* API callers keep the route they already had: set
|
|
33
|
+
* subscriberNotificationStatusOnIncidentCreated to Pending.
|
|
34
|
+
*
|
|
35
|
+
* Everything here is shared by the dashboard, which offers the checkbox, the
|
|
36
|
+
* server, which acts on it, and the worker, which writes the skip reason, so
|
|
37
|
+
* they cannot drift apart.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
export interface IncidentCreatedRenotifyState {
|
|
41
|
+
subscriberNotificationStatusOnIncidentCreated?:
|
|
42
|
+
| StatusPageSubscriberNotificationStatus
|
|
43
|
+
| undefined
|
|
44
|
+
| null;
|
|
45
|
+
shouldStatusPageSubscribersBeNotifiedOnIncidentCreated?:
|
|
46
|
+
| boolean
|
|
47
|
+
| undefined
|
|
48
|
+
| null;
|
|
49
|
+
isVisibleOnStatusPage?: boolean | undefined | null;
|
|
50
|
+
isPrivate?: boolean | undefined | null;
|
|
51
|
+
/*
|
|
52
|
+
* The status pages the incident is limited to, and the job's record of the
|
|
53
|
+
* pages it told (Incident.statusPagesNotifiedOnCreation). Only needed to
|
|
54
|
+
* offer the notification to pages added while the incident was hidden.
|
|
55
|
+
*/
|
|
56
|
+
statusPages?: unknown;
|
|
57
|
+
statusPagesNotifiedOnCreation?: unknown;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export default class IncidentCreatedRenotify {
|
|
61
|
+
// The misc data prop an update request carries to ask for the notification.
|
|
62
|
+
public static readonly miscDataKey: string =
|
|
63
|
+
"notifySubscribersOfIncidentCreatedOnPublish";
|
|
64
|
+
|
|
65
|
+
/*
|
|
66
|
+
* Why the worker skipped the 'created' notification of a hidden incident.
|
|
67
|
+
* The data migration that settled incidents left InProgress by the old
|
|
68
|
+
* worker writes the same text, so both read alike on the dashboard.
|
|
69
|
+
*/
|
|
70
|
+
public static readonly hiddenFromStatusPagesMessage: string =
|
|
71
|
+
"Incident is not visible on status pages. Skipping notifications to subscribers.";
|
|
72
|
+
|
|
73
|
+
// How the dashboard labels that skip next to the notification status.
|
|
74
|
+
public static readonly hiddenFromStatusPagesLabel: string =
|
|
75
|
+
"Skipped: hidden from status pages";
|
|
76
|
+
|
|
77
|
+
public static readonly queuedMessage: string =
|
|
78
|
+
"Incident published on status pages. Subscribers will be notified that this incident was created.";
|
|
79
|
+
|
|
80
|
+
public static readonly formFieldTitle: string =
|
|
81
|
+
"Notify subscribers that this incident was created";
|
|
82
|
+
|
|
83
|
+
public static readonly formFieldDescription: string =
|
|
84
|
+
"Subscribers were not told about this incident because it was hidden from status pages. Tick this to send them the incident-created notification now. It starts unticked for resolved incidents, so publishing an old incident for the record does not announce it as new.";
|
|
85
|
+
|
|
86
|
+
// The same checkbox, for an incident whose earlier subscribers were told.
|
|
87
|
+
public static readonly untoldStatusPagesFormFieldDescription: string =
|
|
88
|
+
"Some status pages this incident is limited to were never sent the notification that it was created, for example pages added while it was hidden. Tick this to send it to them now. Pages that were already told are not sent it again.";
|
|
89
|
+
|
|
90
|
+
/*
|
|
91
|
+
* Only a real yes counts. The flag arrives over JSON, so accept the string
|
|
92
|
+
* form a hand-written API request might send, and nothing looser: a stray
|
|
93
|
+
* "false" or 1 must never email every subscriber of a status page.
|
|
94
|
+
*/
|
|
95
|
+
public static isRequested(
|
|
96
|
+
miscDataProps: JSONObject | undefined | null,
|
|
97
|
+
): boolean {
|
|
98
|
+
if (!miscDataProps || typeof miscDataProps !== "object") {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const value: unknown = miscDataProps[this.miscDataKey];
|
|
103
|
+
|
|
104
|
+
return value === true || value === "true";
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
public static getMiscDataProps(): JSONObject {
|
|
108
|
+
return {
|
|
109
|
+
[this.miscDataKey]: true,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/*
|
|
114
|
+
* Whether publishing this incident may queue its 'created' notification
|
|
115
|
+
* again, given what is stored for it right now:
|
|
116
|
+
*
|
|
117
|
+
* - it is hidden today, so this really is the publish;
|
|
118
|
+
* - notifying on creation is on. An incident created with notifications
|
|
119
|
+
* off was deliberately kept quiet, and publishing does not change that;
|
|
120
|
+
* - it is not private. Private incidents are hidden from every status page,
|
|
121
|
+
* so there is nothing to publish;
|
|
122
|
+
* - and there is someone left to tell. Either its 'created' notification
|
|
123
|
+
* was Skipped, so nobody was told; or it went out (Success, or Failed
|
|
124
|
+
* part-way) and the incident is limited to status pages its record does
|
|
125
|
+
* not list - typically pages added while it was hidden (see
|
|
126
|
+
* hasUntoldStatusPages). Pending and InProgress are on their way already
|
|
127
|
+
* (and a Pending send reads the incident when it goes out, so it will see
|
|
128
|
+
* it visible).
|
|
129
|
+
*/
|
|
130
|
+
public static canRenotifyOnPublish(
|
|
131
|
+
incident: IncidentCreatedRenotifyState,
|
|
132
|
+
): boolean {
|
|
133
|
+
if (
|
|
134
|
+
incident.isVisibleOnStatusPage === true ||
|
|
135
|
+
incident.shouldStatusPageSubscribersBeNotifiedOnIncidentCreated !==
|
|
136
|
+
true ||
|
|
137
|
+
incident.isPrivate === true
|
|
138
|
+
) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return (
|
|
143
|
+
incident.subscriberNotificationStatusOnIncidentCreated ===
|
|
144
|
+
StatusPageSubscriberNotificationStatus.Skipped ||
|
|
145
|
+
this.hasUntoldStatusPages(incident)
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/*
|
|
150
|
+
* Whether a notification that already went out left status pages of the
|
|
151
|
+
* incident's scope untold: its record exists and misses one of them. Pages
|
|
152
|
+
* added while the incident was hidden land here, as do pages whose send
|
|
153
|
+
* failed. A page in the scope that lists none of the incident's monitors,
|
|
154
|
+
* or does not show incidents, is never told either; offering the checkbox
|
|
155
|
+
* for it sends nothing, and the incident feed says so.
|
|
156
|
+
*
|
|
157
|
+
* An incident without a record is not offered it: its notification went out
|
|
158
|
+
* before the record existed, to every page that listed its monitors (see
|
|
159
|
+
* IncidentScopeAddedPagesNotification).
|
|
160
|
+
*/
|
|
161
|
+
public static hasUntoldStatusPages(
|
|
162
|
+
incident: IncidentCreatedRenotifyState,
|
|
163
|
+
): boolean {
|
|
164
|
+
if (
|
|
165
|
+
incident.subscriberNotificationStatusOnIncidentCreated !==
|
|
166
|
+
StatusPageSubscriberNotificationStatus.Success &&
|
|
167
|
+
incident.subscriberNotificationStatusOnIncidentCreated !==
|
|
168
|
+
StatusPageSubscriberNotificationStatus.Failed
|
|
169
|
+
) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const recorded: Array<string> | null =
|
|
174
|
+
IncidentScopeAddedPagesNotification.getRecordedStatusPageIds(
|
|
175
|
+
incident.statusPagesNotifiedOnCreation,
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
if (recorded === null) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return IncidentScopeAddedPagesNotification.normalizeStatusPageIds(
|
|
183
|
+
incident.statusPages,
|
|
184
|
+
).some((id: string): boolean => {
|
|
185
|
+
return !recorded.includes(id);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// The checkbox's description, for the case canRenotifyOnPublish found.
|
|
190
|
+
public static getFormFieldDescription(
|
|
191
|
+
incident: IncidentCreatedRenotifyState,
|
|
192
|
+
): string {
|
|
193
|
+
return incident.subscriberNotificationStatusOnIncidentCreated ===
|
|
194
|
+
StatusPageSubscriberNotificationStatus.Skipped
|
|
195
|
+
? this.formFieldDescription
|
|
196
|
+
: this.untoldStatusPagesFormFieldDescription;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/*
|
|
200
|
+
* The checkbox starts ticked while the incident is unresolved - publishing
|
|
201
|
+
* a live incident is the moment its audience should hear about it - and
|
|
202
|
+
* unticked once it is resolved, so making an old incident visible for the
|
|
203
|
+
* record does not announce it as new.
|
|
204
|
+
*/
|
|
205
|
+
public static isTickedByDefault(data: {
|
|
206
|
+
isResolved: boolean | undefined | null;
|
|
207
|
+
}): boolean {
|
|
208
|
+
return data.isResolved !== true;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/*
|
|
212
|
+
* Whether a stored status and message say the 'created' notification was
|
|
213
|
+
* skipped because the incident was hidden from status pages.
|
|
214
|
+
*/
|
|
215
|
+
public static isHiddenFromStatusPagesSkip(data: {
|
|
216
|
+
status: StatusPageSubscriberNotificationStatus | undefined | null;
|
|
217
|
+
message: string | undefined | null;
|
|
218
|
+
}): boolean {
|
|
219
|
+
return (
|
|
220
|
+
data.status === StatusPageSubscriberNotificationStatus.Skipped &&
|
|
221
|
+
data.message === this.hiddenFromStatusPagesMessage
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { JSONObject } from "../JSON";
|
|
2
|
+
import StatusPageSubscriberNotificationStatus from "./StatusPageSubscriberNotificationStatus";
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* 'Resend to all pages' for the notification that an incident was created.
|
|
6
|
+
*
|
|
7
|
+
* That notification keeps a record of the status pages it was sent to in
|
|
8
|
+
* full (Incident.statusPagesNotifiedOnCreation), and the job skips them. Two
|
|
9
|
+
* ways of sending it again already existed, and both stay as they are:
|
|
10
|
+
*
|
|
11
|
+
* - setting subscriberNotificationStatusOnIncidentCreated back to Pending
|
|
12
|
+
* (the API route, and the dashboard's Retry): IncidentService empties the
|
|
13
|
+
* record in the same write, so it reaches every page again - except after
|
|
14
|
+
* a failure, where Retry resumes after the pages the failed send finished,
|
|
15
|
+
* so they are not sent it twice (see
|
|
16
|
+
* IncidentService.clearCreatedNotificationRecordOnResend);
|
|
17
|
+
* - adding pages to the scope, or publishing a hidden incident, with their
|
|
18
|
+
* checkboxes (IncidentScopeAddedPagesNotification, IncidentCreatedRenotify),
|
|
19
|
+
* which tell only the pages the record does not list.
|
|
20
|
+
*
|
|
21
|
+
* What was missing is sending it to every page on purpose: after a failure,
|
|
22
|
+
* to start over rather than resume (a template or an SMTP setting was fixed
|
|
23
|
+
* since, and the pages that "went through" should get the corrected email
|
|
24
|
+
* too), and after a success, without relying on an implied rule. This misc
|
|
25
|
+
* data prop asks for exactly that. IncidentService turns it into a Pending
|
|
26
|
+
* status and an empty record, in the caller's own update, so the column
|
|
27
|
+
* check that runs after the hook decides whether the caller may.
|
|
28
|
+
*
|
|
29
|
+
* Like the other notification requests (SubscriberUpdateNotification,
|
|
30
|
+
* IncidentCreatedRenotify, IncidentScopeAddedPagesNotification) it is a misc
|
|
31
|
+
* data prop, not a column: a stored "resend" flag would either stick or have
|
|
32
|
+
* to be reset behind the caller's back.
|
|
33
|
+
*
|
|
34
|
+
* It is only accepted for a notification that went out - Success, or Failed
|
|
35
|
+
* part-way. A skipped one was never sent to anyone, and one that is Pending
|
|
36
|
+
* or being sent is on its way; see getRefusalReason.
|
|
37
|
+
*/
|
|
38
|
+
export default class IncidentCreatedResend {
|
|
39
|
+
// The misc data prop an update request carries to ask for the resend.
|
|
40
|
+
public static readonly miscDataKey: string =
|
|
41
|
+
"resendIncidentCreatedToAllStatusPages";
|
|
42
|
+
|
|
43
|
+
// The status message of a notification queued by this request.
|
|
44
|
+
public static readonly queuedMessage: string =
|
|
45
|
+
"Queued to be sent again to every status page this incident reaches, including the pages that were already sent it.";
|
|
46
|
+
|
|
47
|
+
/*
|
|
48
|
+
* The status message the dashboard's Retry writes: it resumes after the
|
|
49
|
+
* pages already reached.
|
|
50
|
+
*/
|
|
51
|
+
public static readonly retryQueuedMessage: string =
|
|
52
|
+
"Queued to be sent again to the status pages that were not sent it in full. The pages already reached are not sent it again.";
|
|
53
|
+
|
|
54
|
+
public static readonly skippedRefusalMessage: string =
|
|
55
|
+
"Subscribers were never sent the notification that this incident was created (it was skipped), so there is nothing to send again.";
|
|
56
|
+
|
|
57
|
+
public static readonly inFlightRefusalMessage: string =
|
|
58
|
+
"The notification that this incident was created is queued or being sent right now. Wait until it has finished, then send it again.";
|
|
59
|
+
|
|
60
|
+
public static readonly conflictingStatusMessage: string =
|
|
61
|
+
"A request to send the incident-created notification to every status page again cannot also set its status. Leave the status out.";
|
|
62
|
+
|
|
63
|
+
public static readonly noPermissionMessage: string =
|
|
64
|
+
"You do not have permission to send the incident-created notification again. It needs the permission to edit incidents.";
|
|
65
|
+
|
|
66
|
+
/*
|
|
67
|
+
* Only a real yes counts. The flag arrives over JSON, so accept the string
|
|
68
|
+
* form a hand-written API request might send, and nothing looser: a stray
|
|
69
|
+
* "false" or 1 must never email every subscriber of every status page.
|
|
70
|
+
*/
|
|
71
|
+
public static isRequested(
|
|
72
|
+
miscDataProps: JSONObject | undefined | null,
|
|
73
|
+
): boolean {
|
|
74
|
+
if (!miscDataProps || typeof miscDataProps !== "object") {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const value: unknown = miscDataProps[this.miscDataKey];
|
|
79
|
+
|
|
80
|
+
return value === true || value === "true";
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
public static getMiscDataProps(): JSONObject {
|
|
84
|
+
return {
|
|
85
|
+
[this.miscDataKey]: true,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/*
|
|
90
|
+
* Why a notification in `status` cannot be sent to every page again, or
|
|
91
|
+
* null when it can (it went out: Success, or Failed part-way).
|
|
92
|
+
*/
|
|
93
|
+
public static getRefusalReason(
|
|
94
|
+
status: StatusPageSubscriberNotificationStatus | undefined | null,
|
|
95
|
+
): string | null {
|
|
96
|
+
switch (status) {
|
|
97
|
+
case StatusPageSubscriberNotificationStatus.Success:
|
|
98
|
+
case StatusPageSubscriberNotificationStatus.Failed:
|
|
99
|
+
return null;
|
|
100
|
+
case StatusPageSubscriberNotificationStatus.Pending:
|
|
101
|
+
case StatusPageSubscriberNotificationStatus.InProgress:
|
|
102
|
+
return this.inFlightRefusalMessage;
|
|
103
|
+
default:
|
|
104
|
+
// Skipped, and a missing status, which the column's default rules out.
|
|
105
|
+
return this.skippedRefusalMessage;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|