@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
|
@@ -0,0 +1,84 @@
|
|
|
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
|
+
var _a;
|
|
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 = Symbol.for("OneUptime.SafeHtml");
|
|
35
|
+
class SafeHtml {
|
|
36
|
+
constructor(html) {
|
|
37
|
+
// Read by isSafeHtml; a symbol key, so JSON.stringify leaves it out.
|
|
38
|
+
this[_a] = true;
|
|
39
|
+
this.html = html;
|
|
40
|
+
}
|
|
41
|
+
/*
|
|
42
|
+
* Wraps markup this code produced from values it had already made safe:
|
|
43
|
+
* Markdown.convertToHTML(..., MarkdownContentType.Email) output,
|
|
44
|
+
* OneUptimeDate.getDateAsFormattedHTMLInMultipleTimezones output, and
|
|
45
|
+
* StatusPageResourceUtil.getResourcesGroupedByGroupName output. Never a
|
|
46
|
+
* value a user typed.
|
|
47
|
+
*/
|
|
48
|
+
static fromTrustedHtml(html) {
|
|
49
|
+
return new SafeHtml(html || "");
|
|
50
|
+
}
|
|
51
|
+
// Plain text, escaped so it reads the same in HTML.
|
|
52
|
+
static fromPlainText(text) {
|
|
53
|
+
return new SafeHtml(SafeHtml.escape(text || ""));
|
|
54
|
+
}
|
|
55
|
+
/*
|
|
56
|
+
* Escapes the five characters that can break out of HTML text or a quoted
|
|
57
|
+
* attribute value. The ampersand goes first, so the entities the other
|
|
58
|
+
* four become are not escaped a second time.
|
|
59
|
+
*
|
|
60
|
+
* This is the one implementation: Markdown.escapeHtml calls it.
|
|
61
|
+
*/
|
|
62
|
+
static escape(text) {
|
|
63
|
+
return String(text)
|
|
64
|
+
.replace(/&/g, "&")
|
|
65
|
+
.replace(/</g, "<")
|
|
66
|
+
.replace(/>/g, ">")
|
|
67
|
+
.replace(/"/g, """)
|
|
68
|
+
.replace(/'/g, "'");
|
|
69
|
+
}
|
|
70
|
+
static isSafeHtml(value) {
|
|
71
|
+
return (typeof value === "object" &&
|
|
72
|
+
value !== null &&
|
|
73
|
+
value[SAFE_HTML_BRAND] === true);
|
|
74
|
+
}
|
|
75
|
+
toHtml() {
|
|
76
|
+
return this.html;
|
|
77
|
+
}
|
|
78
|
+
toString() {
|
|
79
|
+
return this.html;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
_a = SAFE_HTML_BRAND;
|
|
83
|
+
export default SafeHtml;
|
|
84
|
+
//# sourceMappingURL=SafeHtml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SafeHtml.js","sourceRoot":"","sources":["../../../Types/SafeHtml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;AAEH;;;GAGG;AACH,MAAM,eAAe,GAAkB,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAExE,MAAqB,QAAQ;IAM3B,YAAoB,IAAY;QALhC,qEAAqE;QACrD,QAAiB,GAAY,IAAI,CAAC;QAKhD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,eAAe,CAAC,IAA+B;QAC3D,OAAO,IAAI,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,oDAAoD;IAC7C,MAAM,CAAC,aAAa,CAAC,IAA+B;QACzD,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,MAAM,CAAC,IAAY;QAC/B,OAAO,MAAM,CAAC,IAAI,CAAC;aAChB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;aACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;aACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;aACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;aACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;IAEM,MAAM,CAAC,UAAU,CAAC,KAAc;QACrC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,KAAK,IAAI;YACb,KAAyC,CAAC,eAAe,CAAC,KAAK,IAAI,CACrE,CAAC;IACJ,CAAC;IAEM,MAAM;QACX,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF;KAvDkB,eAAe;eAFb,QAAQ"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import IncidentScopeAddedPagesNotification from "./IncidentScopeAddedPagesNotification";
|
|
2
|
+
import StatusPageSubscriberNotificationStatus from "./StatusPageSubscriberNotificationStatus";
|
|
3
|
+
class IncidentCreatedRenotify {
|
|
4
|
+
/*
|
|
5
|
+
* Only a real yes counts. The flag arrives over JSON, so accept the string
|
|
6
|
+
* form a hand-written API request might send, and nothing looser: a stray
|
|
7
|
+
* "false" or 1 must never email every subscriber of a status page.
|
|
8
|
+
*/
|
|
9
|
+
static isRequested(miscDataProps) {
|
|
10
|
+
if (!miscDataProps || typeof miscDataProps !== "object") {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const value = miscDataProps[this.miscDataKey];
|
|
14
|
+
return value === true || value === "true";
|
|
15
|
+
}
|
|
16
|
+
static getMiscDataProps() {
|
|
17
|
+
return {
|
|
18
|
+
[this.miscDataKey]: true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/*
|
|
22
|
+
* Whether publishing this incident may queue its 'created' notification
|
|
23
|
+
* again, given what is stored for it right now:
|
|
24
|
+
*
|
|
25
|
+
* - it is hidden today, so this really is the publish;
|
|
26
|
+
* - notifying on creation is on. An incident created with notifications
|
|
27
|
+
* off was deliberately kept quiet, and publishing does not change that;
|
|
28
|
+
* - it is not private. Private incidents are hidden from every status page,
|
|
29
|
+
* so there is nothing to publish;
|
|
30
|
+
* - and there is someone left to tell. Either its 'created' notification
|
|
31
|
+
* was Skipped, so nobody was told; or it went out (Success, or Failed
|
|
32
|
+
* part-way) and the incident is limited to status pages its record does
|
|
33
|
+
* not list - typically pages added while it was hidden (see
|
|
34
|
+
* hasUntoldStatusPages). Pending and InProgress are on their way already
|
|
35
|
+
* (and a Pending send reads the incident when it goes out, so it will see
|
|
36
|
+
* it visible).
|
|
37
|
+
*/
|
|
38
|
+
static canRenotifyOnPublish(incident) {
|
|
39
|
+
if (incident.isVisibleOnStatusPage === true ||
|
|
40
|
+
incident.shouldStatusPageSubscribersBeNotifiedOnIncidentCreated !==
|
|
41
|
+
true ||
|
|
42
|
+
incident.isPrivate === true) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return (incident.subscriberNotificationStatusOnIncidentCreated ===
|
|
46
|
+
StatusPageSubscriberNotificationStatus.Skipped ||
|
|
47
|
+
this.hasUntoldStatusPages(incident));
|
|
48
|
+
}
|
|
49
|
+
/*
|
|
50
|
+
* Whether a notification that already went out left status pages of the
|
|
51
|
+
* incident's scope untold: its record exists and misses one of them. Pages
|
|
52
|
+
* added while the incident was hidden land here, as do pages whose send
|
|
53
|
+
* failed. A page in the scope that lists none of the incident's monitors,
|
|
54
|
+
* or does not show incidents, is never told either; offering the checkbox
|
|
55
|
+
* for it sends nothing, and the incident feed says so.
|
|
56
|
+
*
|
|
57
|
+
* An incident without a record is not offered it: its notification went out
|
|
58
|
+
* before the record existed, to every page that listed its monitors (see
|
|
59
|
+
* IncidentScopeAddedPagesNotification).
|
|
60
|
+
*/
|
|
61
|
+
static hasUntoldStatusPages(incident) {
|
|
62
|
+
if (incident.subscriberNotificationStatusOnIncidentCreated !==
|
|
63
|
+
StatusPageSubscriberNotificationStatus.Success &&
|
|
64
|
+
incident.subscriberNotificationStatusOnIncidentCreated !==
|
|
65
|
+
StatusPageSubscriberNotificationStatus.Failed) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
const recorded = IncidentScopeAddedPagesNotification.getRecordedStatusPageIds(incident.statusPagesNotifiedOnCreation);
|
|
69
|
+
if (recorded === null) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return IncidentScopeAddedPagesNotification.normalizeStatusPageIds(incident.statusPages).some((id) => {
|
|
73
|
+
return !recorded.includes(id);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// The checkbox's description, for the case canRenotifyOnPublish found.
|
|
77
|
+
static getFormFieldDescription(incident) {
|
|
78
|
+
return incident.subscriberNotificationStatusOnIncidentCreated ===
|
|
79
|
+
StatusPageSubscriberNotificationStatus.Skipped
|
|
80
|
+
? this.formFieldDescription
|
|
81
|
+
: this.untoldStatusPagesFormFieldDescription;
|
|
82
|
+
}
|
|
83
|
+
/*
|
|
84
|
+
* The checkbox starts ticked while the incident is unresolved - publishing
|
|
85
|
+
* a live incident is the moment its audience should hear about it - and
|
|
86
|
+
* unticked once it is resolved, so making an old incident visible for the
|
|
87
|
+
* record does not announce it as new.
|
|
88
|
+
*/
|
|
89
|
+
static isTickedByDefault(data) {
|
|
90
|
+
return data.isResolved !== true;
|
|
91
|
+
}
|
|
92
|
+
/*
|
|
93
|
+
* Whether a stored status and message say the 'created' notification was
|
|
94
|
+
* skipped because the incident was hidden from status pages.
|
|
95
|
+
*/
|
|
96
|
+
static isHiddenFromStatusPagesSkip(data) {
|
|
97
|
+
return (data.status === StatusPageSubscriberNotificationStatus.Skipped &&
|
|
98
|
+
data.message === this.hiddenFromStatusPagesMessage);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// The misc data prop an update request carries to ask for the notification.
|
|
102
|
+
IncidentCreatedRenotify.miscDataKey = "notifySubscribersOfIncidentCreatedOnPublish";
|
|
103
|
+
/*
|
|
104
|
+
* Why the worker skipped the 'created' notification of a hidden incident.
|
|
105
|
+
* The data migration that settled incidents left InProgress by the old
|
|
106
|
+
* worker writes the same text, so both read alike on the dashboard.
|
|
107
|
+
*/
|
|
108
|
+
IncidentCreatedRenotify.hiddenFromStatusPagesMessage = "Incident is not visible on status pages. Skipping notifications to subscribers.";
|
|
109
|
+
// How the dashboard labels that skip next to the notification status.
|
|
110
|
+
IncidentCreatedRenotify.hiddenFromStatusPagesLabel = "Skipped: hidden from status pages";
|
|
111
|
+
IncidentCreatedRenotify.queuedMessage = "Incident published on status pages. Subscribers will be notified that this incident was created.";
|
|
112
|
+
IncidentCreatedRenotify.formFieldTitle = "Notify subscribers that this incident was created";
|
|
113
|
+
IncidentCreatedRenotify.formFieldDescription = "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.";
|
|
114
|
+
// The same checkbox, for an incident whose earlier subscribers were told.
|
|
115
|
+
IncidentCreatedRenotify.untoldStatusPagesFormFieldDescription = "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.";
|
|
116
|
+
export default IncidentCreatedRenotify;
|
|
117
|
+
//# sourceMappingURL=IncidentCreatedRenotify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncidentCreatedRenotify.js","sourceRoot":"","sources":["../../../../Types/StatusPage/IncidentCreatedRenotify.ts"],"names":[],"mappings":"AACA,OAAO,mCAAmC,MAAM,uCAAuC,CAAC;AACxF,OAAO,sCAAsC,MAAM,0CAA0C,CAAC;AAyD9F,MAAqB,uBAAuB;IA8B1C;;;;OAIG;IACI,MAAM,CAAC,WAAW,CACvB,aAA4C;QAE5C,IAAI,CAAC,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAY,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEvD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC;IAC5C,CAAC;IAEM,MAAM,CAAC,gBAAgB;QAC5B,OAAO;YACL,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI;SACzB,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACI,MAAM,CAAC,oBAAoB,CAChC,QAAsC;QAEtC,IACE,QAAQ,CAAC,qBAAqB,KAAK,IAAI;YACvC,QAAQ,CAAC,sDAAsD;gBAC7D,IAAI;YACN,QAAQ,CAAC,SAAS,KAAK,IAAI,EAC3B,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,CACL,QAAQ,CAAC,6CAA6C;YACpD,sCAAsC,CAAC,OAAO;YAChD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CACpC,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;OAWG;IACI,MAAM,CAAC,oBAAoB,CAChC,QAAsC;QAEtC,IACE,QAAQ,CAAC,6CAA6C;YACpD,sCAAsC,CAAC,OAAO;YAChD,QAAQ,CAAC,6CAA6C;gBACpD,sCAAsC,CAAC,MAAM,EAC/C,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,QAAQ,GACZ,mCAAmC,CAAC,wBAAwB,CAC1D,QAAQ,CAAC,6BAA6B,CACvC,CAAC;QAEJ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,mCAAmC,CAAC,sBAAsB,CAC/D,QAAQ,CAAC,WAAW,CACrB,CAAC,IAAI,CAAC,CAAC,EAAU,EAAW,EAAE;YAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uEAAuE;IAChE,MAAM,CAAC,uBAAuB,CACnC,QAAsC;QAEtC,OAAO,QAAQ,CAAC,6CAA6C;YAC3D,sCAAsC,CAAC,OAAO;YAC9C,CAAC,CAAC,IAAI,CAAC,oBAAoB;YAC3B,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC;IACjD,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,iBAAiB,CAAC,IAE/B;QACC,OAAO,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC;IAClC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,2BAA2B,CAAC,IAGzC;QACC,OAAO,CACL,IAAI,CAAC,MAAM,KAAK,sCAAsC,CAAC,OAAO;YAC9D,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,4BAA4B,CACnD,CAAC;IACJ,CAAC;;AAlKD,4EAA4E;AACrD,mCAAW,GAChC,6CAA6C,CAAC;AAEhD;;;;GAIG;AACoB,oDAA4B,GACjD,iFAAiF,CAAC;AAEpF,sEAAsE;AAC/C,kDAA0B,GAC/C,mCAAmC,CAAC;AAEf,qCAAa,GAClC,kGAAkG,CAAC;AAE9E,sCAAc,GACnC,mDAAmD,CAAC;AAE/B,4CAAoB,GACzC,2QAA2Q,CAAC;AAE9Q,0EAA0E;AACnD,6DAAqC,GAC1D,wOAAwO,CAAC;eA5BxN,uBAAuB"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import StatusPageSubscriberNotificationStatus from "./StatusPageSubscriberNotificationStatus";
|
|
2
|
+
/*
|
|
3
|
+
* 'Resend to all pages' for the notification that an incident was created.
|
|
4
|
+
*
|
|
5
|
+
* That notification keeps a record of the status pages it was sent to in
|
|
6
|
+
* full (Incident.statusPagesNotifiedOnCreation), and the job skips them. Two
|
|
7
|
+
* ways of sending it again already existed, and both stay as they are:
|
|
8
|
+
*
|
|
9
|
+
* - setting subscriberNotificationStatusOnIncidentCreated back to Pending
|
|
10
|
+
* (the API route, and the dashboard's Retry): IncidentService empties the
|
|
11
|
+
* record in the same write, so it reaches every page again - except after
|
|
12
|
+
* a failure, where Retry resumes after the pages the failed send finished,
|
|
13
|
+
* so they are not sent it twice (see
|
|
14
|
+
* IncidentService.clearCreatedNotificationRecordOnResend);
|
|
15
|
+
* - adding pages to the scope, or publishing a hidden incident, with their
|
|
16
|
+
* checkboxes (IncidentScopeAddedPagesNotification, IncidentCreatedRenotify),
|
|
17
|
+
* which tell only the pages the record does not list.
|
|
18
|
+
*
|
|
19
|
+
* What was missing is sending it to every page on purpose: after a failure,
|
|
20
|
+
* to start over rather than resume (a template or an SMTP setting was fixed
|
|
21
|
+
* since, and the pages that "went through" should get the corrected email
|
|
22
|
+
* too), and after a success, without relying on an implied rule. This misc
|
|
23
|
+
* data prop asks for exactly that. IncidentService turns it into a Pending
|
|
24
|
+
* status and an empty record, in the caller's own update, so the column
|
|
25
|
+
* check that runs after the hook decides whether the caller may.
|
|
26
|
+
*
|
|
27
|
+
* Like the other notification requests (SubscriberUpdateNotification,
|
|
28
|
+
* IncidentCreatedRenotify, IncidentScopeAddedPagesNotification) it is a misc
|
|
29
|
+
* data prop, not a column: a stored "resend" flag would either stick or have
|
|
30
|
+
* to be reset behind the caller's back.
|
|
31
|
+
*
|
|
32
|
+
* It is only accepted for a notification that went out - Success, or Failed
|
|
33
|
+
* part-way. A skipped one was never sent to anyone, and one that is Pending
|
|
34
|
+
* or being sent is on its way; see getRefusalReason.
|
|
35
|
+
*/
|
|
36
|
+
class IncidentCreatedResend {
|
|
37
|
+
/*
|
|
38
|
+
* Only a real yes counts. The flag arrives over JSON, so accept the string
|
|
39
|
+
* form a hand-written API request might send, and nothing looser: a stray
|
|
40
|
+
* "false" or 1 must never email every subscriber of every status page.
|
|
41
|
+
*/
|
|
42
|
+
static isRequested(miscDataProps) {
|
|
43
|
+
if (!miscDataProps || typeof miscDataProps !== "object") {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
const value = miscDataProps[this.miscDataKey];
|
|
47
|
+
return value === true || value === "true";
|
|
48
|
+
}
|
|
49
|
+
static getMiscDataProps() {
|
|
50
|
+
return {
|
|
51
|
+
[this.miscDataKey]: true,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/*
|
|
55
|
+
* Why a notification in `status` cannot be sent to every page again, or
|
|
56
|
+
* null when it can (it went out: Success, or Failed part-way).
|
|
57
|
+
*/
|
|
58
|
+
static getRefusalReason(status) {
|
|
59
|
+
switch (status) {
|
|
60
|
+
case StatusPageSubscriberNotificationStatus.Success:
|
|
61
|
+
case StatusPageSubscriberNotificationStatus.Failed:
|
|
62
|
+
return null;
|
|
63
|
+
case StatusPageSubscriberNotificationStatus.Pending:
|
|
64
|
+
case StatusPageSubscriberNotificationStatus.InProgress:
|
|
65
|
+
return this.inFlightRefusalMessage;
|
|
66
|
+
default:
|
|
67
|
+
// Skipped, and a missing status, which the column's default rules out.
|
|
68
|
+
return this.skippedRefusalMessage;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// The misc data prop an update request carries to ask for the resend.
|
|
73
|
+
IncidentCreatedResend.miscDataKey = "resendIncidentCreatedToAllStatusPages";
|
|
74
|
+
// The status message of a notification queued by this request.
|
|
75
|
+
IncidentCreatedResend.queuedMessage = "Queued to be sent again to every status page this incident reaches, including the pages that were already sent it.";
|
|
76
|
+
/*
|
|
77
|
+
* The status message the dashboard's Retry writes: it resumes after the
|
|
78
|
+
* pages already reached.
|
|
79
|
+
*/
|
|
80
|
+
IncidentCreatedResend.retryQueuedMessage = "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.";
|
|
81
|
+
IncidentCreatedResend.skippedRefusalMessage = "Subscribers were never sent the notification that this incident was created (it was skipped), so there is nothing to send again.";
|
|
82
|
+
IncidentCreatedResend.inFlightRefusalMessage = "The notification that this incident was created is queued or being sent right now. Wait until it has finished, then send it again.";
|
|
83
|
+
IncidentCreatedResend.conflictingStatusMessage = "A request to send the incident-created notification to every status page again cannot also set its status. Leave the status out.";
|
|
84
|
+
IncidentCreatedResend.noPermissionMessage = "You do not have permission to send the incident-created notification again. It needs the permission to edit incidents.";
|
|
85
|
+
export default IncidentCreatedResend;
|
|
86
|
+
//# sourceMappingURL=IncidentCreatedResend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncidentCreatedResend.js","sourceRoot":"","sources":["../../../../Types/StatusPage/IncidentCreatedResend.ts"],"names":[],"mappings":"AACA,OAAO,sCAAsC,MAAM,0CAA0C,CAAC;AAE9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAqB,qBAAqB;IA4BxC;;;;OAIG;IACI,MAAM,CAAC,WAAW,CACvB,aAA4C;QAE5C,IAAI,CAAC,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAY,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEvD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC;IAC5C,CAAC;IAEM,MAAM,CAAC,gBAAgB;QAC5B,OAAO;YACL,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI;SACzB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,gBAAgB,CAC5B,MAAiE;QAEjE,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,sCAAsC,CAAC,OAAO,CAAC;YACpD,KAAK,sCAAsC,CAAC,MAAM;gBAChD,OAAO,IAAI,CAAC;YACd,KAAK,sCAAsC,CAAC,OAAO,CAAC;YACpD,KAAK,sCAAsC,CAAC,UAAU;gBACpD,OAAO,IAAI,CAAC,sBAAsB,CAAC;YACrC;gBACE,uEAAuE;gBACvE,OAAO,IAAI,CAAC,qBAAqB,CAAC;QACtC,CAAC;IACH,CAAC;;AApED,sEAAsE;AAC/C,iCAAW,GAChC,uCAAuC,CAAC;AAE1C,+DAA+D;AACxC,mCAAa,GAClC,oHAAoH,CAAC;AAEvH;;;GAGG;AACoB,wCAAkB,GACvC,6HAA6H,CAAC;AAEzG,2CAAqB,GAC1C,kIAAkI,CAAC;AAE9G,4CAAsB,GAC3C,oIAAoI,CAAC;AAEhH,8CAAwB,GAC7C,kIAAkI,CAAC;AAE9G,yCAAmB,GACxC,wHAAwH,CAAC;eA1BxG,qBAAqB"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import StatusPageSubscriberNotificationStatus from "./StatusPageSubscriberNotificationStatus";
|
|
2
|
+
/*
|
|
3
|
+
* An incident can be limited to some status pages (Incident.statusPages), and
|
|
4
|
+
* the pages it is limited to often change while it is open: a site turns out
|
|
5
|
+
* to be affected after all, or an incident a monitor created on its own gets
|
|
6
|
+
* scoped once someone works out who is affected. Subscribers of a page hear
|
|
7
|
+
* about an incident once, when it is created, so without a way back a page
|
|
8
|
+
* added later never got the 'created' notification at all.
|
|
9
|
+
*
|
|
10
|
+
* Whether a newly added page should hear about it now is the editor's call,
|
|
11
|
+
* so it is asked when pages are added (the dashboard ticks it by default)
|
|
12
|
+
* rather than decided automatically, and the answer travels with that update
|
|
13
|
+
* as a misc data prop - like SubscriberUpdateNotification and
|
|
14
|
+
* IncidentCreatedRenotify, it is not a column. IncidentService turns it into a
|
|
15
|
+
* Pending 'created' notification, and the Incident:SendNotificationToSubscribers
|
|
16
|
+
* job sends it to the pages in the scope that are not yet listed in
|
|
17
|
+
* Incident.statusPagesNotifiedOnCreation. That record is what keeps the pages
|
|
18
|
+
* that were already told from hearing it twice: the request re-queues the
|
|
19
|
+
* notification, and the record decides who it goes to.
|
|
20
|
+
*
|
|
21
|
+
* The record only exists once the job has settled a send, so two cases have
|
|
22
|
+
* none, and each is handled so that only the pages the edit adds are told:
|
|
23
|
+
*
|
|
24
|
+
* - the notification went out before the record existed (an incident from an
|
|
25
|
+
* earlier release, Success or Failed with no record). It reached every page
|
|
26
|
+
* that listed the incident's monitors back then, so there is no way to tell
|
|
27
|
+
* an added page from one that was told, and nothing is queued. An empty
|
|
28
|
+
* record would otherwise read as "nobody was told" and announce the incident
|
|
29
|
+
* a second time;
|
|
30
|
+
* - the notification was Skipped and never sent (published without
|
|
31
|
+
* announcing it, or declared without monitors). The pages the incident was
|
|
32
|
+
* limited to before the edit were deliberately not told, so the update
|
|
33
|
+
* writes them in as the record when it queues the notification (see
|
|
34
|
+
* getRecordToSeedOnQueue): the job then tells the added pages only, not the
|
|
35
|
+
* pages the editor chose not to announce it on.
|
|
36
|
+
*
|
|
37
|
+
* Everything here is shared by the dashboard, which offers the checkbox, and
|
|
38
|
+
* the server, which acts on it, so the two cannot drift apart: the dashboard
|
|
39
|
+
* offers the checkbox exactly when getAction would queue.
|
|
40
|
+
*/
|
|
41
|
+
// What an update that adds status pages does to the 'created' notification.
|
|
42
|
+
export var IncidentScopeAddedPagesNotificationAction;
|
|
43
|
+
(function (IncidentScopeAddedPagesNotificationAction) {
|
|
44
|
+
/*
|
|
45
|
+
* Nothing to do: no page was added, every added page was told already, or
|
|
46
|
+
* the incident is not to be announced.
|
|
47
|
+
*/
|
|
48
|
+
IncidentScopeAddedPagesNotificationAction["None"] = "None";
|
|
49
|
+
// Put the 'created' notification back to Pending.
|
|
50
|
+
IncidentScopeAddedPagesNotificationAction["Queue"] = "Queue";
|
|
51
|
+
/*
|
|
52
|
+
* It is Pending, or being sent right now. A queued send reads the scope
|
|
53
|
+
* when it goes out, and a send that is running reads it again once it has
|
|
54
|
+
* finished and queues itself once more for any page added meanwhile, so the
|
|
55
|
+
* added pages are reached without any change here. IncidentService checks
|
|
56
|
+
* once the update is written, in case the send finished in between.
|
|
57
|
+
*/
|
|
58
|
+
IncidentScopeAddedPagesNotificationAction["AlreadyQueued"] = "AlreadyQueued";
|
|
59
|
+
})(IncidentScopeAddedPagesNotificationAction || (IncidentScopeAddedPagesNotificationAction = {}));
|
|
60
|
+
class IncidentScopeAddedPagesNotification {
|
|
61
|
+
/*
|
|
62
|
+
* Only a real yes counts. The flag arrives over JSON, so accept the string
|
|
63
|
+
* form a hand-written API request might send, and nothing looser: a stray
|
|
64
|
+
* "false" or 1 must never email every subscriber of a status page.
|
|
65
|
+
*/
|
|
66
|
+
static isRequested(miscDataProps) {
|
|
67
|
+
if (!miscDataProps || typeof miscDataProps !== "object") {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
const value = miscDataProps[this.miscDataKey];
|
|
71
|
+
return value === true || value === "true";
|
|
72
|
+
}
|
|
73
|
+
static getMiscDataProps() {
|
|
74
|
+
return {
|
|
75
|
+
[this.miscDataKey]: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/*
|
|
79
|
+
* The status page ids in any shape a status page list arrives in - a model,
|
|
80
|
+
* a {_id} or {id} object, an ObjectID or a bare string - lower-cased (the
|
|
81
|
+
* database reads uuids back lower-cased) and without duplicates, in the
|
|
82
|
+
* order first seen.
|
|
83
|
+
*/
|
|
84
|
+
static normalizeStatusPageIds(value) {
|
|
85
|
+
if (value === undefined || value === null) {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
const entries = Array.isArray(value) ? value : [value];
|
|
89
|
+
const ids = [];
|
|
90
|
+
for (const entry of entries) {
|
|
91
|
+
const id = this.getStatusPageId(entry);
|
|
92
|
+
if (id && !ids.includes(id)) {
|
|
93
|
+
ids.push(id);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return ids;
|
|
97
|
+
}
|
|
98
|
+
// Which pages a change of the scope from `before` to `after` adds and removes.
|
|
99
|
+
static getScopeChange(data) {
|
|
100
|
+
const before = this.normalizeStatusPageIds(data.before);
|
|
101
|
+
const after = this.normalizeStatusPageIds(data.after);
|
|
102
|
+
return {
|
|
103
|
+
addedStatusPageIds: after.filter((id) => {
|
|
104
|
+
return !before.includes(id);
|
|
105
|
+
}),
|
|
106
|
+
removedStatusPageIds: before.filter((id) => {
|
|
107
|
+
return !after.includes(id);
|
|
108
|
+
}),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/*
|
|
112
|
+
* The pages Incident.statusPagesNotifiedOnCreation lists, or null when there
|
|
113
|
+
* is no record: never written (the job has not settled a send since the
|
|
114
|
+
* record was introduced), or not a list.
|
|
115
|
+
*/
|
|
116
|
+
static getRecordedStatusPageIds(value) {
|
|
117
|
+
if (!Array.isArray(value)) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
return this.normalizeStatusPageIds(value);
|
|
121
|
+
}
|
|
122
|
+
/*
|
|
123
|
+
* What adding `addedStatusPageIds` to an incident's scope does to its
|
|
124
|
+
* 'created' notification, given where that notification is:
|
|
125
|
+
*
|
|
126
|
+
* - no page added: nothing, whatever else the update does;
|
|
127
|
+
* - notifying on creation is off: nothing. An incident declared with
|
|
128
|
+
* notifications off was deliberately kept quiet, and scoping it does not
|
|
129
|
+
* change that;
|
|
130
|
+
* - hidden from status pages or private once the update is written:
|
|
131
|
+
* nothing. The job would only skip it again. Publishing the incident
|
|
132
|
+
* offers to announce it to the pages that were not told
|
|
133
|
+
* (IncidentCreatedRenotify.canRenotifyOnPublish), including pages added
|
|
134
|
+
* while it was hidden;
|
|
135
|
+
* - every added page is in the record: nothing, they were told already
|
|
136
|
+
* (a page removed earlier and added back, or an unscoped incident being
|
|
137
|
+
* narrowed to pages it reached);
|
|
138
|
+
* - Success or Failed with no record: nothing. It went out before the
|
|
139
|
+
* record existed, to every page that listed the monitors then (see the
|
|
140
|
+
* header);
|
|
141
|
+
* - Success, Skipped or Failed otherwise: queue it again. The job then
|
|
142
|
+
* sends it to the pages in the scope it has no record of telling - the
|
|
143
|
+
* added pages, plus, after a failure, the pages the failed send did not
|
|
144
|
+
* reach;
|
|
145
|
+
* - Pending or InProgress: already on its way, and it reaches the added
|
|
146
|
+
* pages (see AlreadyQueued).
|
|
147
|
+
*/
|
|
148
|
+
static getAction(data) {
|
|
149
|
+
const addedStatusPageIds = this.normalizeStatusPageIds(data.addedStatusPageIds);
|
|
150
|
+
if (addedStatusPageIds.length === 0) {
|
|
151
|
+
return IncidentScopeAddedPagesNotificationAction.None;
|
|
152
|
+
}
|
|
153
|
+
const incident = data.incident;
|
|
154
|
+
if (incident.shouldStatusPageSubscribersBeNotifiedOnIncidentCreated !== true) {
|
|
155
|
+
return IncidentScopeAddedPagesNotificationAction.None;
|
|
156
|
+
}
|
|
157
|
+
// A null visibility is hidden to the job, so it is here too.
|
|
158
|
+
if (incident.isVisibleOnStatusPage !== true ||
|
|
159
|
+
incident.isPrivate === true) {
|
|
160
|
+
return IncidentScopeAddedPagesNotificationAction.None;
|
|
161
|
+
}
|
|
162
|
+
const status = incident.subscriberNotificationStatusOnIncidentCreated;
|
|
163
|
+
const recorded = this.getRecordedStatusPageIds(incident.statusPagesNotifiedOnCreation);
|
|
164
|
+
if (recorded === null) {
|
|
165
|
+
if (status === StatusPageSubscriberNotificationStatus.Success ||
|
|
166
|
+
status === StatusPageSubscriberNotificationStatus.Failed) {
|
|
167
|
+
return IncidentScopeAddedPagesNotificationAction.None;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else if (addedStatusPageIds.every((id) => {
|
|
171
|
+
return recorded.includes(id);
|
|
172
|
+
})) {
|
|
173
|
+
return IncidentScopeAddedPagesNotificationAction.None;
|
|
174
|
+
}
|
|
175
|
+
switch (status) {
|
|
176
|
+
case StatusPageSubscriberNotificationStatus.Pending:
|
|
177
|
+
case StatusPageSubscriberNotificationStatus.InProgress:
|
|
178
|
+
return IncidentScopeAddedPagesNotificationAction.AlreadyQueued;
|
|
179
|
+
default:
|
|
180
|
+
/*
|
|
181
|
+
* Success, Skipped and Failed - and a missing status, which the
|
|
182
|
+
* column's Pending default makes impossible but which would otherwise
|
|
183
|
+
* never be sent.
|
|
184
|
+
*/
|
|
185
|
+
return IncidentScopeAddedPagesNotificationAction.Queue;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/*
|
|
189
|
+
* The record an update that queues the notification (action Queue) has to
|
|
190
|
+
* write along with it, or undefined when the stored record stands.
|
|
191
|
+
*
|
|
192
|
+
* With a record, the job already knows who was told. Without one the
|
|
193
|
+
* notification was never sent (getAction does not queue a Success or
|
|
194
|
+
* Failed one without a record), so the pages the incident was limited to
|
|
195
|
+
* before the update were deliberately not told - it was published without
|
|
196
|
+
* announcing it, or declared without monitors. They are written in as the
|
|
197
|
+
* record, so the job tells only the pages the update adds. An incident
|
|
198
|
+
* that was not limited to any page before has nothing to leave out: every
|
|
199
|
+
* page it is now limited to is one the update adds.
|
|
200
|
+
*/
|
|
201
|
+
static getRecordToSeedOnQueue(data) {
|
|
202
|
+
if (this.getRecordedStatusPageIds(data.statusPagesNotifiedOnCreation)) {
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
return this.normalizeStatusPageIds(data.statusPageIdsBeforeUpdate);
|
|
206
|
+
}
|
|
207
|
+
static getStatusPageId(entry) {
|
|
208
|
+
if (!entry) {
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
let id = entry;
|
|
212
|
+
if (typeof entry === "object") {
|
|
213
|
+
const relation = entry;
|
|
214
|
+
// A model, an ObjectID, a {_id}/{id} object or a serialized ObjectID.
|
|
215
|
+
if (relation._id !== undefined && relation._id !== null) {
|
|
216
|
+
id = relation._id;
|
|
217
|
+
}
|
|
218
|
+
else if (relation.id !== undefined && relation.id !== null) {
|
|
219
|
+
id = relation.id;
|
|
220
|
+
}
|
|
221
|
+
else if (relation._type === "ObjectID" && relation.value) {
|
|
222
|
+
id = relation.value;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (typeof id !== "string" && typeof id !== "object") {
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
const text = String(id).trim().toLowerCase();
|
|
229
|
+
if (!text || text === "[object object]") {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
return text;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// The misc data prop an update request carries to ask for the notification.
|
|
236
|
+
IncidentScopeAddedPagesNotification.miscDataKey = "notifyAddedStatusPagesOfIncidentCreated";
|
|
237
|
+
IncidentScopeAddedPagesNotification.queuedMessage = "Status pages were added to this incident. Their subscribers will be sent the notification that this incident was created.";
|
|
238
|
+
/*
|
|
239
|
+
* The status the job leaves when pages were added to the scope while it was
|
|
240
|
+
* sending: queued again, for the pages it had not reached.
|
|
241
|
+
*/
|
|
242
|
+
IncidentScopeAddedPagesNotification.addedWhileSendingMessage = "Status pages were added to this incident while its subscribers were being sent the notification that it was created. The added pages will be sent it next.";
|
|
243
|
+
IncidentScopeAddedPagesNotification.formFieldTitle = "Send the incident-created notification to newly added pages";
|
|
244
|
+
IncidentScopeAddedPagesNotification.formFieldDescription = "Subscribers of the status pages you add are sent the notification that this incident was created. Pages that were already told are not sent it again.";
|
|
245
|
+
export default IncidentScopeAddedPagesNotification;
|
|
246
|
+
//# sourceMappingURL=IncidentScopeAddedPagesNotification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncidentScopeAddedPagesNotification.js","sourceRoot":"","sources":["../../../../Types/StatusPage/IncidentScopeAddedPagesNotification.ts"],"names":[],"mappings":"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"}
|