@oneuptime/common 14.0.7 → 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/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/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 +14 -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/DatabaseService.ts +93 -10
- 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 +1535 -65
- package/Server/Services/IncidentStateTimelineService.ts +13 -0
- package/Server/Services/IncidentTemplateService.ts +109 -0
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +30 -1
- package/Server/Services/ScheduledMaintenanceService.ts +68 -18
- 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/Types/Markdown.ts +153 -6
- package/Server/Types/Workflow/Components/Email.ts +61 -2
- package/Server/Utils/CustomField/CustomFieldRename.ts +378 -0
- package/Server/Utils/DataSource/EgressGuard.ts +66 -21
- package/Server/Utils/Mail/PinnedSmtpSocket.ts +130 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +10 -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/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/CustomFieldsSettingsIncidentOptions.test.tsx +357 -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 +242 -5
- package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +91 -1
- 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/PublicNotePagesNotifyDefault.test.tsx +113 -1
- 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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 +14 -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/DatabaseService.js +56 -7
- package/build/dist/Server/Services/DatabaseService.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 +1052 -0
- 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/ScheduledMaintenancePublicNoteService.js +26 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +47 -17
- 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/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/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/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/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/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/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/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/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 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Who an incident's status page notifications reach, shown before anything is
|
|
3
|
+
* sent: on the last step of declaring an incident, and above a public note
|
|
4
|
+
* while it is being written. "Will notify: Site 03 (up to 41 email), Site 07
|
|
5
|
+
* (up to 18 email)".
|
|
6
|
+
*
|
|
7
|
+
* POST /incident/subscriber-audience (IncidentAPI) answers it, from the same
|
|
8
|
+
* helper the subscriber jobs send through (IncidentStatusPageScope), so the
|
|
9
|
+
* preview and the send cannot disagree about which pages an incident reaches.
|
|
10
|
+
* It takes either an incident that is being declared - the monitors and the
|
|
11
|
+
* status pages picked on the form - or one that exists.
|
|
12
|
+
*
|
|
13
|
+
* The counts are "up to": they count the confirmed subscribers of each page
|
|
14
|
+
* who have not unsubscribed, per channel. A subscriber who picked only some
|
|
15
|
+
* of a page's resources, or only some event types, is filtered out at send
|
|
16
|
+
* time; and for an incident limited to specific pages an email address or
|
|
17
|
+
* phone number on two of them gets one message, not two. Addresses themselves
|
|
18
|
+
* never leave the server - only counts do.
|
|
19
|
+
*
|
|
20
|
+
* Everything here is shared by the server, which builds the answer, and the
|
|
21
|
+
* dashboard, which reads it, so the two cannot drift apart.
|
|
22
|
+
*/
|
|
23
|
+
// Why a status page that lists the incident's monitors is not notified.
|
|
24
|
+
export var IncidentSubscriberAudienceExclusionReason;
|
|
25
|
+
(function (IncidentSubscriberAudienceExclusionReason) {
|
|
26
|
+
// The incident is limited to other status pages.
|
|
27
|
+
IncidentSubscriberAudienceExclusionReason["OutsideIncidentScope"] = "OutsideIncidentScope";
|
|
28
|
+
// The page only shows incidents limited to it, and this one is not.
|
|
29
|
+
IncidentSubscriberAudienceExclusionReason["OnlyShowsScopedIncidents"] = "OnlyShowsScopedIncidents";
|
|
30
|
+
// The page does not show incidents at all (Show Incidents is off).
|
|
31
|
+
IncidentSubscriberAudienceExclusionReason["HidesIncidents"] = "HidesIncidents";
|
|
32
|
+
/*
|
|
33
|
+
* Asked for a Retry of the incident's 'created' notification only: the
|
|
34
|
+
* page was already sent it in full (Incident.statusPagesNotifiedOnCreation),
|
|
35
|
+
* and Retry resumes after it.
|
|
36
|
+
*/
|
|
37
|
+
IncidentSubscriberAudienceExclusionReason["AlreadyNotified"] = "AlreadyNotified";
|
|
38
|
+
})(IncidentSubscriberAudienceExclusionReason || (IncidentSubscriberAudienceExclusionReason = {}));
|
|
39
|
+
// The order channels are listed in, and what each is called on screen.
|
|
40
|
+
export const INCIDENT_SUBSCRIBER_AUDIENCE_CHANNELS = [
|
|
41
|
+
{ channel: "email", label: "email" },
|
|
42
|
+
{ channel: "sms", label: "SMS" },
|
|
43
|
+
{ channel: "slack", label: "Slack" },
|
|
44
|
+
{ channel: "microsoftTeams", label: "Microsoft Teams" },
|
|
45
|
+
{ channel: "webhook", label: "webhook" },
|
|
46
|
+
];
|
|
47
|
+
class IncidentSubscriberAudience {
|
|
48
|
+
static getEmptyCounts() {
|
|
49
|
+
return {
|
|
50
|
+
email: 0,
|
|
51
|
+
sms: 0,
|
|
52
|
+
slack: 0,
|
|
53
|
+
microsoftTeams: 0,
|
|
54
|
+
webhook: 0,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
static getTotal(counts) {
|
|
58
|
+
return INCIDENT_SUBSCRIBER_AUDIENCE_CHANNELS.reduce((total, entry) => {
|
|
59
|
+
return total + (counts[entry.channel] || 0);
|
|
60
|
+
}, 0);
|
|
61
|
+
}
|
|
62
|
+
/*
|
|
63
|
+
* The channels of one page that reach anyone, in display order, with their
|
|
64
|
+
* counts: [{channel: "email", label: "email", count: 41}, ...].
|
|
65
|
+
*/
|
|
66
|
+
static getNonEmptyChannels(counts) {
|
|
67
|
+
return INCIDENT_SUBSCRIBER_AUDIENCE_CHANNELS.map((entry) => {
|
|
68
|
+
return {
|
|
69
|
+
channel: entry.channel,
|
|
70
|
+
label: entry.label,
|
|
71
|
+
count: counts[entry.channel] || 0,
|
|
72
|
+
};
|
|
73
|
+
}).filter((entry) => {
|
|
74
|
+
return entry.count > 0;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Whether anyone at all will be sent anything.
|
|
78
|
+
static reachesAnyone(audience) {
|
|
79
|
+
if (audience.isHiddenFromStatusPages || !audience.hasMonitors) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
return (audience.hiddenStatusPageCount > 0 ||
|
|
83
|
+
audience.statusPages.some((statusPage) => {
|
|
84
|
+
return this.getTotal(statusPage.subscriberCounts) > 0;
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
/*
|
|
88
|
+
* The server's answer as the dashboard receives it. Read defensively: the
|
|
89
|
+
* summary is advisory, and a field that is missing or of the wrong type
|
|
90
|
+
* must read as "nothing" rather than break the form it sits on.
|
|
91
|
+
*/
|
|
92
|
+
static fromJSON(json) {
|
|
93
|
+
const toArray = (value) => {
|
|
94
|
+
return Array.isArray(value)
|
|
95
|
+
? value.filter((item) => {
|
|
96
|
+
return Boolean(item) && typeof item === "object";
|
|
97
|
+
})
|
|
98
|
+
: [];
|
|
99
|
+
};
|
|
100
|
+
const toCount = (value) => {
|
|
101
|
+
const count = Number(value);
|
|
102
|
+
return Number.isFinite(count) && count > 0 ? Math.floor(count) : 0;
|
|
103
|
+
};
|
|
104
|
+
const toNamed = (item) => {
|
|
105
|
+
return {
|
|
106
|
+
statusPageId: String(item["statusPageId"] || ""),
|
|
107
|
+
name: String(item["name"] || ""),
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
const reasons = Object.values(IncidentSubscriberAudienceExclusionReason);
|
|
111
|
+
return {
|
|
112
|
+
hasMonitors: json["hasMonitors"] === true,
|
|
113
|
+
isScoped: json["isScoped"] === true,
|
|
114
|
+
isHiddenFromStatusPages: json["isHiddenFromStatusPages"] === true,
|
|
115
|
+
statusPages: toArray(json["statusPages"]).map((item) => {
|
|
116
|
+
return Object.assign(Object.assign({}, toNamed(item)), { subscriberCounts: this.countsFromJSON(item["subscriberCounts"]) });
|
|
117
|
+
}),
|
|
118
|
+
hiddenStatusPageCount: toCount(json["hiddenStatusPageCount"]),
|
|
119
|
+
excludedStatusPages: toArray(json["excludedStatusPages"])
|
|
120
|
+
.filter((item) => {
|
|
121
|
+
return reasons.includes(String(item["reason"]));
|
|
122
|
+
})
|
|
123
|
+
.map((item) => {
|
|
124
|
+
return Object.assign(Object.assign({}, toNamed(item)), { reason: item["reason"] });
|
|
125
|
+
}),
|
|
126
|
+
selectedStatusPagesNotListingMonitors: toArray(json["selectedStatusPagesNotListingMonitors"]).map(toNamed),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/*
|
|
130
|
+
* One page's counts as they arrive, each a whole number of at least 0: a
|
|
131
|
+
* count that is missing or not a number reads as 0.
|
|
132
|
+
*/
|
|
133
|
+
static countsFromJSON(value) {
|
|
134
|
+
const counts = value && typeof value === "object" && !Array.isArray(value)
|
|
135
|
+
? value
|
|
136
|
+
: {};
|
|
137
|
+
const toCount = (count) => {
|
|
138
|
+
const number = Number(count);
|
|
139
|
+
return Number.isFinite(number) && number > 0 ? Math.floor(number) : 0;
|
|
140
|
+
};
|
|
141
|
+
return {
|
|
142
|
+
email: toCount(counts["email"]),
|
|
143
|
+
sms: toCount(counts["sms"]),
|
|
144
|
+
slack: toCount(counts["slack"]),
|
|
145
|
+
microsoftTeams: toCount(counts["microsoftTeams"]),
|
|
146
|
+
webhook: toCount(counts["webhook"]),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
static toJSON(audience) {
|
|
150
|
+
return {
|
|
151
|
+
hasMonitors: audience.hasMonitors,
|
|
152
|
+
isScoped: audience.isScoped,
|
|
153
|
+
isHiddenFromStatusPages: audience.isHiddenFromStatusPages,
|
|
154
|
+
statusPages: audience.statusPages.map((statusPage) => {
|
|
155
|
+
return {
|
|
156
|
+
statusPageId: statusPage.statusPageId,
|
|
157
|
+
name: statusPage.name,
|
|
158
|
+
subscriberCounts: Object.assign({}, statusPage.subscriberCounts),
|
|
159
|
+
};
|
|
160
|
+
}),
|
|
161
|
+
hiddenStatusPageCount: audience.hiddenStatusPageCount,
|
|
162
|
+
excludedStatusPages: audience.excludedStatusPages.map((statusPage) => {
|
|
163
|
+
return {
|
|
164
|
+
statusPageId: statusPage.statusPageId,
|
|
165
|
+
name: statusPage.name,
|
|
166
|
+
reason: statusPage.reason,
|
|
167
|
+
};
|
|
168
|
+
}),
|
|
169
|
+
selectedStatusPagesNotListingMonitors: audience.selectedStatusPagesNotListingMonitors.map((statusPage) => {
|
|
170
|
+
return {
|
|
171
|
+
statusPageId: statusPage.statusPageId,
|
|
172
|
+
name: statusPage.name,
|
|
173
|
+
};
|
|
174
|
+
}),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// The route, under the API's base URL.
|
|
179
|
+
IncidentSubscriberAudience.apiPath = "/incident/subscriber-audience";
|
|
180
|
+
// How many monitors or status pages one request may name.
|
|
181
|
+
IncidentSubscriberAudience.maxIdsPerRequest = 1000;
|
|
182
|
+
export default IncidentSubscriberAudience;
|
|
183
|
+
//# sourceMappingURL=IncidentSubscriberAudience.js.map
|