@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,97 @@
|
|
|
1
|
+
import SafeHtml from "../SafeHtml";
|
|
2
|
+
/*
|
|
3
|
+
* What may sit between the braces of a placeholder: ASCII letters, digits,
|
|
4
|
+
* underscores and dots, and nothing else (`\w` without the `u` flag is ASCII
|
|
5
|
+
* only). Written once so that the fill below and isPlaceholderName, which
|
|
6
|
+
* the custom field template keys are generated against, cannot disagree.
|
|
7
|
+
*/
|
|
8
|
+
const PLACEHOLDER_NAME_SOURCE = "[\\w.]+";
|
|
9
|
+
const PLACEHOLDER_NAME_PATTERN = new RegExp(`^${PLACEHOLDER_NAME_SOURCE}$`);
|
|
10
|
+
export default class SubscriberNotificationTemplateCompiler {
|
|
11
|
+
/**
|
|
12
|
+
* Whether `{{name}}` is a placeholder these templates fill in. A name with
|
|
13
|
+
* any other character (a hyphen, a space, a non-ASCII letter) is left in
|
|
14
|
+
* the message as written, so anything that hands out variable names -
|
|
15
|
+
* incident custom field keys, for one - has to produce names this accepts.
|
|
16
|
+
*/
|
|
17
|
+
static isPlaceholderName(name) {
|
|
18
|
+
return PLACEHOLDER_NAME_PATTERN.test(name);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The names of the placeholders these templates hold, each once: exactly
|
|
22
|
+
* the ones the compile functions below would fill, spaces inside the
|
|
23
|
+
* braces allowed, so what a template reads can be known before it is
|
|
24
|
+
* saved or sent. Empty templates are skipped.
|
|
25
|
+
*/
|
|
26
|
+
static getPlaceholderNames(templates) {
|
|
27
|
+
const names = new Set();
|
|
28
|
+
for (const template of templates) {
|
|
29
|
+
if (typeof template !== "string" || !template) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
for (const match of template.matchAll(SubscriberNotificationTemplateCompiler.getPlaceholderPattern())) {
|
|
33
|
+
names.add(match[1]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return names;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Compile a template for a channel that does not render HTML: an email
|
|
40
|
+
* subject, SMS, Slack or Microsoft Teams. Each {{variableName}} is replaced
|
|
41
|
+
* with its value exactly as written.
|
|
42
|
+
*
|
|
43
|
+
* Never use this for the body of an email template: see
|
|
44
|
+
* compileEmailBodyTemplate.
|
|
45
|
+
*/
|
|
46
|
+
static compileTemplate(template, variables) {
|
|
47
|
+
return SubscriberNotificationTemplateCompiler.fillPlaceholders(template, (name) => {
|
|
48
|
+
if (!Object.prototype.hasOwnProperty.call(variables, name)) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return variables[name] || "";
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Compile the body of an EMAIL template, which is sent as HTML.
|
|
56
|
+
*
|
|
57
|
+
* A SafeHtml value is inserted as it is. Any other value is plain text and
|
|
58
|
+
* is HTML-escaped, so it can neither add markup nor break out of the
|
|
59
|
+
* attribute it is placed in (href="{{detailsUrl}}").
|
|
60
|
+
*/
|
|
61
|
+
static compileEmailBodyTemplate(template, variables) {
|
|
62
|
+
return SubscriberNotificationTemplateCompiler.fillPlaceholders(template, (name) => {
|
|
63
|
+
if (!Object.prototype.hasOwnProperty.call(variables, name)) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const value = variables[name];
|
|
67
|
+
if (SafeHtml.isSafeHtml(value)) {
|
|
68
|
+
return value.toHtml();
|
|
69
|
+
}
|
|
70
|
+
if (value === null || value === undefined) {
|
|
71
|
+
return "";
|
|
72
|
+
}
|
|
73
|
+
return SafeHtml.escape(String(value));
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/*
|
|
77
|
+
* One pass over the template, with a replacer function:
|
|
78
|
+
* - A replacement string would give "$&", "$$", "$`" and "$'" special
|
|
79
|
+
* meaning, so a note mentioning "$$5" or a resource named "Store $&" was
|
|
80
|
+
* rewritten on its way to subscribers.
|
|
81
|
+
* - Replacing one variable at a time also expanded placeholders that
|
|
82
|
+
* appeared inside an earlier value, so a note containing
|
|
83
|
+
* "{{unsubscribeUrl}}" came out as a link.
|
|
84
|
+
* A placeholder with no variable is left as written.
|
|
85
|
+
*/
|
|
86
|
+
static fillPlaceholders(template, renderValue) {
|
|
87
|
+
return template.replace(SubscriberNotificationTemplateCompiler.getPlaceholderPattern(), (placeholder, name) => {
|
|
88
|
+
const rendered = renderValue(name);
|
|
89
|
+
return rendered === null ? placeholder : rendered;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// A fresh global pattern each time: a shared one would carry lastIndex.
|
|
93
|
+
static getPlaceholderPattern() {
|
|
94
|
+
return new RegExp(`{{\\s*(${PLACEHOLDER_NAME_SOURCE})\\s*}}`, "g");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=SubscriberNotificationTemplateCompiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriberNotificationTemplateCompiler.js","sourceRoot":"","sources":["../../../../Types/StatusPage/SubscriberNotificationTemplateCompiler.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAC;AA6CnC;;;;;GAKG;AACH,MAAM,uBAAuB,GAAW,SAAS,CAAC;AAElD,MAAM,wBAAwB,GAAW,IAAI,MAAM,CACjD,IAAI,uBAAuB,GAAG,CAC/B,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,sCAAsC;IACzD;;;;;OAKG;IACI,MAAM,CAAC,iBAAiB,CAAC,IAAY;QAC1C,OAAO,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,mBAAmB,CAC/B,SAA2C;QAE3C,MAAM,KAAK,GAAgB,IAAI,GAAG,EAAU,CAAC;QAE7C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC9C,SAAS;YACX,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,CACnC,sCAAsC,CAAC,qBAAqB,EAAE,CAC/D,EAAE,CAAC;gBACF,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,eAAe,CAC3B,QAAgB,EAChB,SAAsD;QAEtD,OAAO,sCAAsC,CAAC,gBAAgB,CAC5D,QAAQ,EACR,CAAC,IAAY,EAAiB,EAAE;YAC9B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC3D,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,wBAAwB,CACpC,QAAgB,EAChB,SAA2D;QAE3D,OAAO,sCAAsC,CAAC,gBAAgB,CAC5D,QAAQ,EACR,CAAC,IAAY,EAAiB,EAAE;YAC9B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC3D,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAkC,SAAS,CAAC,IAAI,CAAC,CAAC;YAE7D,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;YACxB,CAAC;YAED,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC1C,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACK,MAAM,CAAC,gBAAgB,CAC7B,QAAgB,EAChB,WAAgC;QAEhC,OAAO,QAAQ,CAAC,OAAO,CACrB,sCAAsC,CAAC,qBAAqB,EAAE,EAC9D,CAAC,WAAmB,EAAE,IAAY,EAAU,EAAE;YAC5C,MAAM,QAAQ,GAAkB,WAAW,CAAC,IAAI,CAAC,CAAC;YAElD,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;QACpD,CAAC,CACF,CAAC;IACJ,CAAC;IAED,wEAAwE;IAChE,MAAM,CAAC,qBAAqB;QAClC,OAAO,IAAI,MAAM,CAAC,UAAU,uBAAuB,SAAS,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC;CACF"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import SafeHtml from "../SafeHtml";
|
|
2
|
+
import StatusPageSubscriberNotificationEventType from "./StatusPageSubscriberNotificationEventType";
|
|
3
|
+
import StatusPageSubscriberNotificationMethod from "./StatusPageSubscriberNotificationMethod";
|
|
4
|
+
import SubscriberNotificationPreview from "./SubscriberNotificationPreview";
|
|
5
|
+
import SubscriberNotificationTemplateCompiler from "./SubscriberNotificationTemplateCompiler";
|
|
6
|
+
import SubscriberNotificationTemplateVariables from "./SubscriberNotificationTemplateVariables";
|
|
7
|
+
const SAMPLE_STATUS_PAGE_URL = "https://status.example.com";
|
|
8
|
+
const SAMPLE_VALUES = {
|
|
9
|
+
statusPageName: { text: "Acme Status" },
|
|
10
|
+
statusPageUrl: { text: SAMPLE_STATUS_PAGE_URL },
|
|
11
|
+
unsubscribeUrl: {
|
|
12
|
+
text: SubscriberNotificationPreview.getPreviewUnsubscribeUrl(SAMPLE_STATUS_PAGE_URL),
|
|
13
|
+
},
|
|
14
|
+
confirmationUrl: {
|
|
15
|
+
text: `${SAMPLE_STATUS_PAGE_URL}/confirm-subscription/sample`,
|
|
16
|
+
},
|
|
17
|
+
manageSubscriptionUrl: {
|
|
18
|
+
text: `${SAMPLE_STATUS_PAGE_URL}/update-subscription/sample`,
|
|
19
|
+
},
|
|
20
|
+
detailsUrl: { text: `${SAMPLE_STATUS_PAGE_URL}/incidents/sample` },
|
|
21
|
+
resourcesAffected: {
|
|
22
|
+
text: "Europe: Checkout API; Americas: Payments API",
|
|
23
|
+
html: "Europe: Checkout API<br/>Americas: Payments API",
|
|
24
|
+
},
|
|
25
|
+
incidentTitle: { text: "Checkout requests are failing" },
|
|
26
|
+
incidentDescription: {
|
|
27
|
+
text: "Customers in Europe cannot complete a checkout. We are investigating.",
|
|
28
|
+
markdown: "Customers in **Europe** cannot complete a checkout. We are investigating.",
|
|
29
|
+
html: "<p>Customers in <strong>Europe</strong> cannot complete a checkout. We are investigating.</p>",
|
|
30
|
+
},
|
|
31
|
+
incidentSeverity: { text: "Major" },
|
|
32
|
+
incidentState: { text: "Identified" },
|
|
33
|
+
incidentLabels: { text: "Europe, Payments" },
|
|
34
|
+
affectedStatusPages: { text: "Acme Status, Acme Europe Status" },
|
|
35
|
+
postedAt: { text: "Sep 27, 2026, 10:30 AM UTC" },
|
|
36
|
+
note: {
|
|
37
|
+
text: "We found the cause and are rolling out a fix. Next update in 30 minutes.",
|
|
38
|
+
markdown: "We found the cause and are rolling out a fix. **Next update in 30 minutes.**",
|
|
39
|
+
html: "<p>We found the cause and are rolling out a fix. <strong>Next update in 30 minutes.</strong></p>",
|
|
40
|
+
},
|
|
41
|
+
postmortemNote: {
|
|
42
|
+
text: "A configuration change overloaded the payment gateway. We have added a safeguard.",
|
|
43
|
+
markdown: "A configuration change overloaded the payment gateway. We have added a **safeguard**.",
|
|
44
|
+
html: "<p>A configuration change overloaded the payment gateway. We have added a <strong>safeguard</strong>.</p>",
|
|
45
|
+
},
|
|
46
|
+
announcementTitle: { text: "New status page features" },
|
|
47
|
+
announcementDescription: {
|
|
48
|
+
text: "You can now choose which services you hear about.",
|
|
49
|
+
markdown: "You can now choose **which services** you hear about.",
|
|
50
|
+
html: "<p>You can now choose <strong>which services</strong> you hear about.</p>",
|
|
51
|
+
},
|
|
52
|
+
scheduledMaintenanceTitle: { text: "Database upgrade" },
|
|
53
|
+
scheduledMaintenanceDescription: {
|
|
54
|
+
text: "Checkout may be slow for up to ten minutes.",
|
|
55
|
+
markdown: "Checkout may be slow for up to **ten minutes**.",
|
|
56
|
+
html: "<p>Checkout may be slow for up to <strong>ten minutes</strong>.</p>",
|
|
57
|
+
},
|
|
58
|
+
scheduledMaintenanceState: { text: "Scheduled" },
|
|
59
|
+
scheduledStartTime: { text: "Sep 30, 2026, 02:00 AM UTC" },
|
|
60
|
+
scheduledEndTime: { text: "Sep 30, 2026, 03:00 AM UTC" },
|
|
61
|
+
episodeTitle: { text: "Checkout degradation" },
|
|
62
|
+
episodeDescription: {
|
|
63
|
+
text: "Several incidents are affecting checkout.",
|
|
64
|
+
markdown: "Several incidents are affecting **checkout**.",
|
|
65
|
+
html: "<p>Several incidents are affecting <strong>checkout</strong>.</p>",
|
|
66
|
+
},
|
|
67
|
+
episodeSeverity: { text: "Major" },
|
|
68
|
+
episodeState: { text: "Identified" },
|
|
69
|
+
};
|
|
70
|
+
export default class SubscriberNotificationTemplatePreview {
|
|
71
|
+
static isAvailableForEventType(eventType) {
|
|
72
|
+
return (Boolean(eventType) &&
|
|
73
|
+
Object.values(StatusPageSubscriberNotificationEventType).includes(eventType) &&
|
|
74
|
+
eventType !== StatusPageSubscriberNotificationEventType.SubscriberReport);
|
|
75
|
+
}
|
|
76
|
+
/*
|
|
77
|
+
* A sample for every variable the event offers, and for each custom field
|
|
78
|
+
* placeholder these templates place ({{customFields.<key>}}), in each
|
|
79
|
+
* channel's format.
|
|
80
|
+
*/
|
|
81
|
+
static getSampleValues(data) {
|
|
82
|
+
const values = {
|
|
83
|
+
emailBody: {},
|
|
84
|
+
plainText: {},
|
|
85
|
+
markdown: {},
|
|
86
|
+
};
|
|
87
|
+
for (const variable of SubscriberNotificationTemplateVariables.getAvailableVariablesForEventType(data.eventType)) {
|
|
88
|
+
this.addSample({
|
|
89
|
+
values: values,
|
|
90
|
+
name: variable.name,
|
|
91
|
+
sample: SAMPLE_VALUES[variable.name] || {
|
|
92
|
+
text: `[${variable.name}]`,
|
|
93
|
+
},
|
|
94
|
+
isHtmlInEmailBody: this.isHtmlInEmailBody(variable),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
for (const name of SubscriberNotificationTemplateCompiler.getPlaceholderNames(data.templates)) {
|
|
98
|
+
const dynamicVariable = SubscriberNotificationTemplateVariables.getDynamicVariableForName(data.eventType, name);
|
|
99
|
+
if (!dynamicVariable) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
this.addSample({
|
|
103
|
+
values: values,
|
|
104
|
+
name: name,
|
|
105
|
+
sample: {
|
|
106
|
+
text: `Sample ${name.slice(dynamicVariable.prefix.length)}`,
|
|
107
|
+
},
|
|
108
|
+
isHtmlInEmailBody: false,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return values;
|
|
112
|
+
}
|
|
113
|
+
// The template, filled with sample values as its channel would be.
|
|
114
|
+
static render(data) {
|
|
115
|
+
const isEmail = data.notificationMethod === StatusPageSubscriberNotificationMethod.Email;
|
|
116
|
+
const templateBody = data.templateBody || "";
|
|
117
|
+
const emailSubject = (isEmail && data.emailSubject) || "";
|
|
118
|
+
if (!this.isAvailableForEventType(data.eventType)) {
|
|
119
|
+
return {
|
|
120
|
+
isAvailable: false,
|
|
121
|
+
isHtml: isEmail,
|
|
122
|
+
subject: null,
|
|
123
|
+
body: "",
|
|
124
|
+
unknownPlaceholders: [],
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const eventType = data.eventType;
|
|
128
|
+
const values = this.getSampleValues({
|
|
129
|
+
eventType: eventType,
|
|
130
|
+
templates: [templateBody, emailSubject],
|
|
131
|
+
});
|
|
132
|
+
const unknownPlaceholders = Array.from(SubscriberNotificationTemplateCompiler.getPlaceholderNames([
|
|
133
|
+
templateBody,
|
|
134
|
+
emailSubject,
|
|
135
|
+
]))
|
|
136
|
+
.filter((name) => {
|
|
137
|
+
return !SubscriberNotificationTemplateVariables.isVariableOffered(eventType, name);
|
|
138
|
+
})
|
|
139
|
+
.sort();
|
|
140
|
+
if (isEmail) {
|
|
141
|
+
return {
|
|
142
|
+
isAvailable: true,
|
|
143
|
+
isHtml: true,
|
|
144
|
+
subject: emailSubject
|
|
145
|
+
? SubscriberNotificationTemplateCompiler.compileTemplate(emailSubject, values.plainText)
|
|
146
|
+
: null,
|
|
147
|
+
body: SubscriberNotificationTemplateCompiler.compileEmailBodyTemplate(templateBody, values.emailBody),
|
|
148
|
+
unknownPlaceholders: unknownPlaceholders,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const isMarkdownChannel = data.notificationMethod ===
|
|
152
|
+
StatusPageSubscriberNotificationMethod.Slack ||
|
|
153
|
+
data.notificationMethod ===
|
|
154
|
+
StatusPageSubscriberNotificationMethod.MicrosoftTeams;
|
|
155
|
+
return {
|
|
156
|
+
isAvailable: true,
|
|
157
|
+
isHtml: false,
|
|
158
|
+
subject: null,
|
|
159
|
+
body: SubscriberNotificationTemplateCompiler.compileTemplate(templateBody, isMarkdownChannel ? values.markdown : values.plainText),
|
|
160
|
+
unknownPlaceholders: unknownPlaceholders,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
static isHtmlInEmailBody(variable) {
|
|
164
|
+
return variable.isHtmlInEmailBody === true;
|
|
165
|
+
}
|
|
166
|
+
static addSample(data) {
|
|
167
|
+
data.values.plainText[data.name] = data.sample.text;
|
|
168
|
+
data.values.markdown[data.name] = data.sample.markdown || data.sample.text;
|
|
169
|
+
data.values.emailBody[data.name] =
|
|
170
|
+
data.isHtmlInEmailBody && data.sample.html
|
|
171
|
+
? SafeHtml.fromTrustedHtml(data.sample.html)
|
|
172
|
+
: data.sample.text;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=SubscriberNotificationTemplatePreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriberNotificationTemplatePreview.js","sourceRoot":"","sources":["../../../../Types/StatusPage/SubscriberNotificationTemplatePreview.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,60 @@
|
|
|
1
|
+
import { CUSTOM_FIELD_TEMPLATE_VARIABLE_PREFIX, isValidCustomFieldVariableKey, } from "../CustomField/CustomFieldVariableKey";
|
|
1
2
|
import BadDataException from "../Exception/BadDataException";
|
|
2
3
|
import StatusPageSubscriberNotificationEventType from "./StatusPageSubscriberNotificationEventType";
|
|
4
|
+
import SubscriberNotificationTemplateCompiler from "./SubscriberNotificationTemplateCompiler";
|
|
5
|
+
/*
|
|
6
|
+
* The variables every incident event offers on top of its own: the
|
|
7
|
+
* incident's labels, the status pages it is on, and its custom fields.
|
|
8
|
+
*
|
|
9
|
+
* affectedStatusPages and the custom fields are internal data - a status
|
|
10
|
+
* page's subscribers are usually outside the team, and the list of pages
|
|
11
|
+
* names every other audience the incident reaches - so the worker never puts
|
|
12
|
+
* them into a message on its own. They reach subscribers only where a
|
|
13
|
+
* template author places them, and the template form warns about it.
|
|
14
|
+
*/
|
|
15
|
+
const INCIDENT_VARIABLES = [
|
|
16
|
+
{
|
|
17
|
+
name: "incidentLabels",
|
|
18
|
+
description: "Labels of the incident, separated by commas",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "affectedStatusPages",
|
|
22
|
+
description: "Names of every status page the incident is shown on, separated by commas. Internal: it names the status pages of every audience the incident reaches",
|
|
23
|
+
},
|
|
24
|
+
];
|
|
25
|
+
const INCIDENT_DYNAMIC_VARIABLES = [
|
|
26
|
+
{
|
|
27
|
+
prefix: CUSTOM_FIELD_TEMPLATE_VARIABLE_PREFIX,
|
|
28
|
+
placeholder: "<key>",
|
|
29
|
+
isValidKey: isValidCustomFieldVariableKey,
|
|
30
|
+
description: "The value of an incident custom field, by the field's Template Variable key. Internal: any custom field can be placed, whether or not it is marked to be included in subscriber notifications",
|
|
31
|
+
mayBeHtmlInEmailBody: true,
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
/*
|
|
35
|
+
* The variables that read the team's own incident records rather than what
|
|
36
|
+
* the incident's status pages already show: its labels, and every custom
|
|
37
|
+
* field ({{customFields.<key>}}), marked for subscribers or not. The title,
|
|
38
|
+
* description, severity, state and public notes are on the status page for
|
|
39
|
+
* anyone who can see it; these are not, and the status page roles that may
|
|
40
|
+
* write templates may not read them. So a template can place them only if
|
|
41
|
+
* whoever writes it may read them (Server/Utils/StatusPage/
|
|
42
|
+
* SubscriberTemplateIncidentRecordAccess).
|
|
43
|
+
*
|
|
44
|
+
* {{affectedStatusPages}} is not one of them: it names status pages, which
|
|
45
|
+
* the same roles read.
|
|
46
|
+
*/
|
|
47
|
+
const INCIDENT_RECORD_VARIABLE_NAMES = [
|
|
48
|
+
"incidentLabels",
|
|
49
|
+
];
|
|
50
|
+
// The incident events, which offer INCIDENT_VARIABLES and the custom fields.
|
|
51
|
+
const INCIDENT_EVENT_TYPES = [
|
|
52
|
+
StatusPageSubscriberNotificationEventType.SubscriberIncidentCreated,
|
|
53
|
+
StatusPageSubscriberNotificationEventType.SubscriberIncidentStateChanged,
|
|
54
|
+
StatusPageSubscriberNotificationEventType.SubscriberIncidentNoteCreated,
|
|
55
|
+
StatusPageSubscriberNotificationEventType.SubscriberIncidentNoteUpdated,
|
|
56
|
+
StatusPageSubscriberNotificationEventType.SubscriberIncidentPostmortemPublished,
|
|
57
|
+
];
|
|
3
58
|
/*
|
|
4
59
|
* The variables a custom status page subscriber notification template can use
|
|
5
60
|
* for each event type, as {{variableName}}.
|
|
@@ -29,7 +84,11 @@ export default class SubscriberNotificationTemplateVariables {
|
|
|
29
84
|
];
|
|
30
85
|
const commonVariables = [
|
|
31
86
|
...statusPageVariables,
|
|
32
|
-
{
|
|
87
|
+
{
|
|
88
|
+
name: "resourcesAffected",
|
|
89
|
+
description: "List of affected resources",
|
|
90
|
+
isHtmlInEmailBody: true,
|
|
91
|
+
},
|
|
33
92
|
];
|
|
34
93
|
switch (eventType) {
|
|
35
94
|
case StatusPageSubscriberNotificationEventType.SubscriberSubscriptionConfirmation:
|
|
@@ -57,9 +116,11 @@ export default class SubscriberNotificationTemplateVariables {
|
|
|
57
116
|
{
|
|
58
117
|
name: "incidentDescription",
|
|
59
118
|
description: "Description of the incident",
|
|
119
|
+
isHtmlInEmailBody: true,
|
|
60
120
|
},
|
|
61
121
|
{ name: "incidentSeverity", description: "Severity of the incident" },
|
|
62
122
|
{ name: "detailsUrl", description: "URL to view incident details" },
|
|
123
|
+
...INCIDENT_VARIABLES,
|
|
63
124
|
];
|
|
64
125
|
case StatusPageSubscriberNotificationEventType.SubscriberIncidentStateChanged:
|
|
65
126
|
return [
|
|
@@ -68,6 +129,7 @@ export default class SubscriberNotificationTemplateVariables {
|
|
|
68
129
|
{
|
|
69
130
|
name: "incidentDescription",
|
|
70
131
|
description: "Description of the incident",
|
|
132
|
+
isHtmlInEmailBody: true,
|
|
71
133
|
},
|
|
72
134
|
{ name: "incidentSeverity", description: "Severity of the incident" },
|
|
73
135
|
{
|
|
@@ -75,6 +137,7 @@ export default class SubscriberNotificationTemplateVariables {
|
|
|
75
137
|
description: "Current state of the incident",
|
|
76
138
|
},
|
|
77
139
|
{ name: "detailsUrl", description: "URL to view incident details" },
|
|
140
|
+
...INCIDENT_VARIABLES,
|
|
78
141
|
];
|
|
79
142
|
case StatusPageSubscriberNotificationEventType.SubscriberIncidentNoteCreated:
|
|
80
143
|
case StatusPageSubscriberNotificationEventType.SubscriberIncidentNoteUpdated:
|
|
@@ -87,8 +150,13 @@ export default class SubscriberNotificationTemplateVariables {
|
|
|
87
150
|
description: "Current state of the incident",
|
|
88
151
|
},
|
|
89
152
|
{ name: "postedAt", description: "When the note was posted" },
|
|
90
|
-
{
|
|
153
|
+
{
|
|
154
|
+
name: "note",
|
|
155
|
+
description: "Content of the note",
|
|
156
|
+
isHtmlInEmailBody: true,
|
|
157
|
+
},
|
|
91
158
|
{ name: "detailsUrl", description: "URL to view incident details" },
|
|
159
|
+
...INCIDENT_VARIABLES,
|
|
92
160
|
];
|
|
93
161
|
case StatusPageSubscriberNotificationEventType.SubscriberIncidentPostmortemPublished:
|
|
94
162
|
return [
|
|
@@ -98,8 +166,10 @@ export default class SubscriberNotificationTemplateVariables {
|
|
|
98
166
|
{
|
|
99
167
|
name: "postmortemNote",
|
|
100
168
|
description: "Content of the postmortem note",
|
|
169
|
+
isHtmlInEmailBody: true,
|
|
101
170
|
},
|
|
102
171
|
{ name: "detailsUrl", description: "URL to view incident details" },
|
|
172
|
+
...INCIDENT_VARIABLES,
|
|
103
173
|
];
|
|
104
174
|
case StatusPageSubscriberNotificationEventType.SubscriberAnnouncementCreated:
|
|
105
175
|
case StatusPageSubscriberNotificationEventType.SubscriberAnnouncementUpdated:
|
|
@@ -112,6 +182,7 @@ export default class SubscriberNotificationTemplateVariables {
|
|
|
112
182
|
{
|
|
113
183
|
name: "announcementDescription",
|
|
114
184
|
description: "Description of the announcement",
|
|
185
|
+
isHtmlInEmailBody: true,
|
|
115
186
|
},
|
|
116
187
|
{
|
|
117
188
|
name: "detailsUrl",
|
|
@@ -128,6 +199,7 @@ export default class SubscriberNotificationTemplateVariables {
|
|
|
128
199
|
{
|
|
129
200
|
name: "scheduledMaintenanceDescription",
|
|
130
201
|
description: "Description of the scheduled maintenance",
|
|
202
|
+
isHtmlInEmailBody: true,
|
|
131
203
|
},
|
|
132
204
|
{
|
|
133
205
|
name: "scheduledStartTime",
|
|
@@ -152,6 +224,7 @@ export default class SubscriberNotificationTemplateVariables {
|
|
|
152
224
|
{
|
|
153
225
|
name: "scheduledMaintenanceDescription",
|
|
154
226
|
description: "Description of the scheduled maintenance",
|
|
227
|
+
isHtmlInEmailBody: true,
|
|
155
228
|
},
|
|
156
229
|
{
|
|
157
230
|
name: "scheduledMaintenanceState",
|
|
@@ -173,13 +246,18 @@ export default class SubscriberNotificationTemplateVariables {
|
|
|
173
246
|
{
|
|
174
247
|
name: "scheduledMaintenanceDescription",
|
|
175
248
|
description: "Description of the scheduled maintenance",
|
|
249
|
+
isHtmlInEmailBody: true,
|
|
176
250
|
},
|
|
177
251
|
{
|
|
178
252
|
name: "scheduledMaintenanceState",
|
|
179
253
|
description: "Current state of the scheduled maintenance",
|
|
180
254
|
},
|
|
181
255
|
{ name: "postedAt", description: "When the note was posted" },
|
|
182
|
-
{
|
|
256
|
+
{
|
|
257
|
+
name: "note",
|
|
258
|
+
description: "Content of the note",
|
|
259
|
+
isHtmlInEmailBody: true,
|
|
260
|
+
},
|
|
183
261
|
{
|
|
184
262
|
name: "detailsUrl",
|
|
185
263
|
description: "URL to view scheduled maintenance details",
|
|
@@ -192,6 +270,7 @@ export default class SubscriberNotificationTemplateVariables {
|
|
|
192
270
|
{
|
|
193
271
|
name: "episodeDescription",
|
|
194
272
|
description: "Description of the incident",
|
|
273
|
+
isHtmlInEmailBody: true,
|
|
195
274
|
},
|
|
196
275
|
{ name: "episodeSeverity", description: "Severity of the incident" },
|
|
197
276
|
{ name: "detailsUrl", description: "URL to view incident details" },
|
|
@@ -213,7 +292,11 @@ export default class SubscriberNotificationTemplateVariables {
|
|
|
213
292
|
...commonVariables,
|
|
214
293
|
{ name: "episodeTitle", description: "Title of the incident" },
|
|
215
294
|
{ name: "episodeSeverity", description: "Severity of the incident" },
|
|
216
|
-
{
|
|
295
|
+
{
|
|
296
|
+
name: "note",
|
|
297
|
+
description: "Content of the note",
|
|
298
|
+
isHtmlInEmailBody: true,
|
|
299
|
+
},
|
|
217
300
|
{ name: "detailsUrl", description: "URL to view incident details" },
|
|
218
301
|
];
|
|
219
302
|
case StatusPageSubscriberNotificationEventType.SubscriberReport:
|
|
@@ -286,10 +369,67 @@ export default class SubscriberNotificationTemplateVariables {
|
|
|
286
369
|
throw new BadDataException(`Unknown event type: ${eventType}`);
|
|
287
370
|
}
|
|
288
371
|
}
|
|
372
|
+
// The variables that are HTML, not plain text, in an email template's body.
|
|
373
|
+
static getEmailBodyHtmlVariableNamesForEventType(eventType) {
|
|
374
|
+
return this.getAvailableVariablesForEventType(eventType)
|
|
375
|
+
.filter((variable) => {
|
|
376
|
+
return variable.isHtmlInEmailBody === true;
|
|
377
|
+
})
|
|
378
|
+
.map((variable) => {
|
|
379
|
+
return variable.name;
|
|
380
|
+
});
|
|
381
|
+
}
|
|
289
382
|
static getVariableNamesForEventType(eventType) {
|
|
290
383
|
return this.getAvailableVariablesForEventType(eventType).map((variable) => {
|
|
291
384
|
return variable.name;
|
|
292
385
|
});
|
|
293
386
|
}
|
|
387
|
+
/*
|
|
388
|
+
* The families of variables this event offers on top of the listed ones,
|
|
389
|
+
* by prefix: the incident events' {{customFields.<key>}}.
|
|
390
|
+
*/
|
|
391
|
+
static getDynamicVariablesForEventType(eventType) {
|
|
392
|
+
return INCIDENT_EVENT_TYPES.includes(eventType)
|
|
393
|
+
? INCIDENT_DYNAMIC_VARIABLES.map((variable) => {
|
|
394
|
+
return Object.assign({}, variable);
|
|
395
|
+
})
|
|
396
|
+
: [];
|
|
397
|
+
}
|
|
398
|
+
/*
|
|
399
|
+
* The family this name belongs to, when it is one: the prefix followed by
|
|
400
|
+
* a key of the family's shape (for a custom field, the shape its Template
|
|
401
|
+
* Variable key is made in, which the template compiler fills). Null for a
|
|
402
|
+
* listed variable, a bare prefix, or a name the event does not offer.
|
|
403
|
+
*/
|
|
404
|
+
static getDynamicVariableForName(eventType, name) {
|
|
405
|
+
for (const variable of this.getDynamicVariablesForEventType(eventType)) {
|
|
406
|
+
if (name.startsWith(variable.prefix) &&
|
|
407
|
+
variable.isValidKey(name.slice(variable.prefix.length))) {
|
|
408
|
+
return variable;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return null;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* The placeholders in these texts - a template's body and email subject -
|
|
415
|
+
* that read the team's incident records (INCIDENT_RECORD_VARIABLE_NAMES
|
|
416
|
+
* and any {{customFields.<key>}}, whether or not such a field exists),
|
|
417
|
+
* each once, sorted. Found exactly as the compiler finds what it fills,
|
|
418
|
+
* whatever the template's event type: an update can change the event type
|
|
419
|
+
* without touching the text.
|
|
420
|
+
*/
|
|
421
|
+
static getIncidentRecordPlaceholders(texts) {
|
|
422
|
+
return Array.from(SubscriberNotificationTemplateCompiler.getPlaceholderNames(texts))
|
|
423
|
+
.filter((name) => {
|
|
424
|
+
return (INCIDENT_RECORD_VARIABLE_NAMES.includes(name) ||
|
|
425
|
+
name.startsWith(CUSTOM_FIELD_TEMPLATE_VARIABLE_PREFIX));
|
|
426
|
+
})
|
|
427
|
+
.sort();
|
|
428
|
+
}
|
|
429
|
+
// Whether a template for this event can use {{name}}.
|
|
430
|
+
static isVariableOffered(eventType, name) {
|
|
431
|
+
return (this.getVariableNamesForEventType(eventType).includes(name) ||
|
|
432
|
+
this.getDynamicVariableForName(eventType, name) !== null);
|
|
433
|
+
}
|
|
294
434
|
}
|
|
295
435
|
//# sourceMappingURL=SubscriberNotificationTemplateVariables.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriberNotificationTemplateVariables.js","sourceRoot":"","sources":["../../../../Types/StatusPage/SubscriberNotificationTemplateVariables.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,yCAAyC,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"SubscriberNotificationTemplateVariables.js","sourceRoot":"","sources":["../../../../Types/StatusPage/SubscriberNotificationTemplateVariables.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,24 +37,44 @@ class SubscriberUpdateNotification {
|
|
|
37
37
|
}
|
|
38
38
|
/*
|
|
39
39
|
* Returns why an update notification should not be sent given where the
|
|
40
|
-
* original ("posted") notification is, or null when it may go out
|
|
40
|
+
* original ("posted") notification is, or null when it may go out - or
|
|
41
|
+
* wait (see isOriginalNotificationBeingSent).
|
|
41
42
|
*
|
|
42
|
-
* While the original is still Pending
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
43
|
+
* While the original is still Pending, subscribers have not heard of the
|
|
44
|
+
* item at all, and the original will carry this edit: the edit changed the
|
|
45
|
+
* row's version, so the run that claims the original
|
|
46
|
+
* (SubscriberNotificationClaim, which checks the version it read) has read
|
|
47
|
+
* the item since. A second "updated" message about something they were
|
|
48
|
+
* never told about would only confuse them.
|
|
49
|
+
*
|
|
50
|
+
* InProgress is different: that send read the item before it claimed it,
|
|
51
|
+
* and goes on with what it read, so it may carry the text from before the
|
|
52
|
+
* edit - a typo fixed, or an ETA corrected, right after posting is exactly
|
|
53
|
+
* that case. The update waits for it instead
|
|
54
|
+
* (isOriginalNotificationBeingSent), and goes out once it has settled.
|
|
46
55
|
*
|
|
47
56
|
* Every settled state lets the update through: Success is the normal case,
|
|
48
|
-
* and Skipped or Failed mean subscribers were not told originally
|
|
49
|
-
* editor is now explicitly asking to do.
|
|
57
|
+
* and Skipped or Failed mean subscribers were not told originally (or not
|
|
58
|
+
* all of them), which the editor is now explicitly asking to do.
|
|
50
59
|
*/
|
|
51
60
|
static getSkipReasonForOriginalNotificationStatus(originalStatus) {
|
|
52
|
-
if (originalStatus === StatusPageSubscriberNotificationStatus.Pending
|
|
53
|
-
originalStatus === StatusPageSubscriberNotificationStatus.InProgress) {
|
|
61
|
+
if (originalStatus === StatusPageSubscriberNotificationStatus.Pending) {
|
|
54
62
|
return this.notYetNotifiedMessage;
|
|
55
63
|
}
|
|
56
64
|
return null;
|
|
57
65
|
}
|
|
66
|
+
/*
|
|
67
|
+
* Whether the update notification waits: the original ("posted")
|
|
68
|
+
* notification is being sent right now, with the item as it was read
|
|
69
|
+
* before the edit. The update is left Pending, untouched, and the job
|
|
70
|
+
* decides again on a later run, once the original has settled - then it
|
|
71
|
+
* goes out, since subscribers may have been sent the text from before the
|
|
72
|
+
* edit. A send that never settles is failed by the sweeper
|
|
73
|
+
* (StatusPageSubscriber:TimeoutStuckNotifications), which lets it through.
|
|
74
|
+
*/
|
|
75
|
+
static isOriginalNotificationBeingSent(originalStatus) {
|
|
76
|
+
return originalStatus === StatusPageSubscriberNotificationStatus.InProgress;
|
|
77
|
+
}
|
|
58
78
|
}
|
|
59
79
|
// The misc data prop an update request carries to ask for a notification.
|
|
60
80
|
SubscriberUpdateNotification.miscDataKey = "notifySubscribersOfUpdate";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriberUpdateNotification.js","sourceRoot":"","sources":["../../../../Types/StatusPage/SubscriberUpdateNotification.ts"],"names":[],"mappings":"AACA,OAAO,sCAAsC,MAAM,0CAA0C,CAAC;AAE9F;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAqB,4BAA4B;IAmB/C;;;;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
|
|
1
|
+
{"version":3,"file":"SubscriberUpdateNotification.js","sourceRoot":"","sources":["../../../../Types/StatusPage/SubscriberUpdateNotification.ts"],"names":[],"mappings":"AACA,OAAO,sCAAsC,MAAM,0CAA0C,CAAC;AAE9F;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAqB,4BAA4B;IAmB/C;;;;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;;;;;;;;;;;;;;;;;;;;;OAqBG;IACI,MAAM,CAAC,0CAA0C,CACtD,cAAyE;QAEzE,IAAI,cAAc,KAAK,sCAAsC,CAAC,OAAO,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC,qBAAqB,CAAC;QACpC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACI,MAAM,CAAC,+BAA+B,CAC3C,cAAyE;QAEzE,OAAO,cAAc,KAAK,sCAAsC,CAAC,UAAU,CAAC;IAC9E,CAAC;;AAtFD,0EAA0E;AACnD,wCAAW,GAAW,2BAA2B,CAAC;AAElD,0CAAa,GAClC,yDAAyD,CAAC;AAErC,gDAAmB,GACxC,2CAA2C,CAAC;AAEvB,wCAAW,GAChC,4DAA4D,CAAC;AAExC,kDAAqB,GAC1C,+JAA+J,CAAC;AAE3I,2CAAc,GACnC,sCAAsC,CAAC;eAjBtB,4BAA4B"}
|