@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
|
@@ -1,27 +1,208 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
1
10
|
import DatabaseService from "./DatabaseService";
|
|
2
11
|
import Model from "../../Models/DatabaseModels/StatusPageSubscriberNotificationTemplate";
|
|
12
|
+
import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
13
|
+
import QueryHelper from "../Types/Database/QueryHelper";
|
|
14
|
+
import SubscriberTemplateIncidentRecordAccess from "../Utils/StatusPage/SubscriberTemplateIncidentRecordAccess";
|
|
15
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
3
16
|
import StatusPageSubscriberNotificationTemplateStatusPageService from "./StatusPageSubscriberNotificationTemplateStatusPageService";
|
|
4
17
|
import SubscriberNotificationTemplateVariables from "../../Types/StatusPage/SubscriberNotificationTemplateVariables";
|
|
18
|
+
import SubscriberNotificationTemplateCompiler from "../../Types/StatusPage/SubscriberNotificationTemplateCompiler";
|
|
5
19
|
export class Service extends DatabaseService {
|
|
6
20
|
constructor() {
|
|
7
21
|
super(Model);
|
|
8
22
|
}
|
|
23
|
+
/*
|
|
24
|
+
* A template's body and subject may place values from the team's incident
|
|
25
|
+
* records - {{incidentLabels}} and {{customFields.<key>}} - only when
|
|
26
|
+
* whoever writes them may read those records: the status page roles that
|
|
27
|
+
* may write templates may not (SubscriberTemplateIncidentRecordAccess).
|
|
28
|
+
*/
|
|
29
|
+
async onBeforeCreate(createBy) {
|
|
30
|
+
SubscriberTemplateIncidentRecordAccess.assertCanPlace({
|
|
31
|
+
placeholders: SubscriberNotificationTemplateVariables.getIncidentRecordPlaceholders([
|
|
32
|
+
createBy.data.templateBody,
|
|
33
|
+
createBy.data.emailSubject,
|
|
34
|
+
]),
|
|
35
|
+
props: createBy.props,
|
|
36
|
+
});
|
|
37
|
+
return { createBy, carryForward: null };
|
|
38
|
+
}
|
|
39
|
+
/*
|
|
40
|
+
* On an update, only what the write adds is checked: a placeholder the
|
|
41
|
+
* template already holds was allowed when it was written, so someone
|
|
42
|
+
* without incident access can still fix a typo, rename the template or
|
|
43
|
+
* move a placeholder from the subject to the body - but not add one.
|
|
44
|
+
*
|
|
45
|
+
* Pointing a template somewhere else counts as placing everything it
|
|
46
|
+
* holds: changing its channel or event type makes an admin's template
|
|
47
|
+
* send its incident records to wherever the new channel goes, and a
|
|
48
|
+
* status page role can add a Slack, Teams or webhook subscriber of its
|
|
49
|
+
* own. (Linking it to another status page is checked by
|
|
50
|
+
* StatusPageSubscriberNotificationTemplateStatusPageService.)
|
|
51
|
+
*/
|
|
52
|
+
async onBeforeUpdate(updateBy) {
|
|
53
|
+
SubscriberTemplateIncidentRecordAccess.assertCanPlace({
|
|
54
|
+
placeholders: await this.getIncidentRecordPlaceholdersToCheck(updateBy),
|
|
55
|
+
props: updateBy.props,
|
|
56
|
+
});
|
|
57
|
+
return { updateBy, carryForward: null };
|
|
58
|
+
}
|
|
59
|
+
/*
|
|
60
|
+
* The incident record placeholders this update must be allowed to place,
|
|
61
|
+
* across every template it would change: those it writes into a body or
|
|
62
|
+
* subject that the template did not hold before, and, when it changes
|
|
63
|
+
* where the template is sent (its channel or event type), every one the
|
|
64
|
+
* template will hold once written. The templates are read as root and
|
|
65
|
+
* limited to the caller's project, like other update hooks: the update's
|
|
66
|
+
* own permission check has not run yet, and only narrows the rows further.
|
|
67
|
+
*/
|
|
68
|
+
async getIncidentRecordPlaceholdersToCheck(updateBy) {
|
|
69
|
+
if (updateBy.props.isRoot || updateBy.props.isMasterAdmin) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
const data = updateBy.data;
|
|
73
|
+
const writesBody = data.templateBody !== undefined;
|
|
74
|
+
const writesSubject = data.emailSubject !== undefined;
|
|
75
|
+
const writesTarget = data.eventType !== undefined || data.notificationMethod !== undefined;
|
|
76
|
+
if (!writesBody && !writesSubject && !writesTarget) {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
// Anything but text places nothing: the column check refuses it anyway.
|
|
80
|
+
const writtenBody = writesBody && typeof data.templateBody === "string"
|
|
81
|
+
? data.templateBody
|
|
82
|
+
: null;
|
|
83
|
+
const writtenSubject = writesSubject && typeof data.emailSubject === "string"
|
|
84
|
+
? data.emailSubject
|
|
85
|
+
: null;
|
|
86
|
+
const written = SubscriberNotificationTemplateVariables.getIncidentRecordPlaceholders([
|
|
87
|
+
writtenBody,
|
|
88
|
+
writtenSubject,
|
|
89
|
+
]);
|
|
90
|
+
if (written.length === 0 && !writesTarget) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
const query = updateBy.props.tenantId
|
|
94
|
+
? Object.assign(Object.assign({}, updateBy.query), { projectId: updateBy.props.tenantId }) : updateBy.query;
|
|
95
|
+
const templates = await this.findBy({
|
|
96
|
+
query: query,
|
|
97
|
+
select: {
|
|
98
|
+
templateBody: true,
|
|
99
|
+
emailSubject: true,
|
|
100
|
+
eventType: true,
|
|
101
|
+
notificationMethod: true,
|
|
102
|
+
},
|
|
103
|
+
limit: LIMIT_MAX,
|
|
104
|
+
skip: 0,
|
|
105
|
+
props: {
|
|
106
|
+
isRoot: true,
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
const added = new Set();
|
|
110
|
+
for (const template of templates) {
|
|
111
|
+
const held = SubscriberNotificationTemplateVariables.getIncidentRecordPlaceholders([
|
|
112
|
+
template.templateBody,
|
|
113
|
+
template.emailSubject,
|
|
114
|
+
]);
|
|
115
|
+
/*
|
|
116
|
+
* Only a real change: the edit form sends the channel and event type
|
|
117
|
+
* back as they were, and a typo fix must still go through.
|
|
118
|
+
*/
|
|
119
|
+
const changesTarget = writesTarget &&
|
|
120
|
+
((data.eventType !== undefined &&
|
|
121
|
+
data.eventType !== template.eventType) ||
|
|
122
|
+
(data.notificationMethod !== undefined &&
|
|
123
|
+
data.notificationMethod !== template.notificationMethod));
|
|
124
|
+
if (changesTarget) {
|
|
125
|
+
// Everything the template will hold goes to the new target.
|
|
126
|
+
for (const name of SubscriberNotificationTemplateVariables.getIncidentRecordPlaceholders([
|
|
127
|
+
writesBody ? writtenBody : template.templateBody,
|
|
128
|
+
writesSubject ? writtenSubject : template.emailSubject,
|
|
129
|
+
])) {
|
|
130
|
+
added.add(name);
|
|
131
|
+
}
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
for (const name of written) {
|
|
135
|
+
if (!held.includes(name)) {
|
|
136
|
+
added.add(name);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return Array.from(added).sort();
|
|
141
|
+
}
|
|
142
|
+
/*
|
|
143
|
+
* The incident record placeholders the given templates hold, in the
|
|
144
|
+
* caller's project: what linking them to a status page places there
|
|
145
|
+
* (StatusPageSubscriberNotificationTemplateStatusPageService). Read as
|
|
146
|
+
* root, like the update hook above.
|
|
147
|
+
*/
|
|
148
|
+
async getIncidentRecordPlaceholdersHeld(data) {
|
|
149
|
+
if (data.templateIds.length === 0) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
const templates = await this.findBy({
|
|
153
|
+
query: Object.assign({ _id: QueryHelper.any(data.templateIds) }, (data.projectId ? { projectId: data.projectId } : {})),
|
|
154
|
+
select: {
|
|
155
|
+
templateBody: true,
|
|
156
|
+
emailSubject: true,
|
|
157
|
+
},
|
|
158
|
+
limit: LIMIT_MAX,
|
|
159
|
+
skip: 0,
|
|
160
|
+
props: {
|
|
161
|
+
isRoot: true,
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
const held = new Set();
|
|
165
|
+
for (const template of templates) {
|
|
166
|
+
for (const name of SubscriberNotificationTemplateVariables.getIncidentRecordPlaceholders([template.templateBody, template.emailSubject])) {
|
|
167
|
+
held.add(name);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return Array.from(held).sort();
|
|
171
|
+
}
|
|
9
172
|
/**
|
|
10
173
|
* Get template for a specific status page, event type, and notification method.
|
|
11
174
|
* Returns null if no custom template is found (caller should use default template).
|
|
175
|
+
*
|
|
176
|
+
* Workers call this as root, so nothing but the query below keeps one
|
|
177
|
+
* project's page from reading another project's templates. The template
|
|
178
|
+
* query is therefore narrowed to the ids this page links to AND to the
|
|
179
|
+
* page's own project. It used to ask for every template of this event type
|
|
180
|
+
* and channel across all projects, 100 at a time, and look for the linked
|
|
181
|
+
* id in memory: once more than 100 such templates existed on a shared
|
|
182
|
+
* server, the linked one could fall outside those 100 and the page's
|
|
183
|
+
* subscribers silently got the default template instead of the branded one.
|
|
12
184
|
*/
|
|
13
185
|
async getTemplateForStatusPage(data) {
|
|
186
|
+
var _a, _b;
|
|
14
187
|
const { statusPageId, eventType, notificationMethod } = data;
|
|
15
|
-
|
|
188
|
+
/*
|
|
189
|
+
* First find the template links for this status page. There is one per
|
|
190
|
+
* linked template, so a page has only a handful, but nothing enforces a
|
|
191
|
+
* cap - so read them all rather than risk the same truncation as above.
|
|
192
|
+
*/
|
|
16
193
|
const templateLinks = await StatusPageSubscriberNotificationTemplateStatusPageService.findBy({
|
|
17
194
|
query: {
|
|
18
195
|
statusPageId: statusPageId,
|
|
19
196
|
},
|
|
20
197
|
select: {
|
|
21
198
|
statusPageSubscriberNotificationTemplateId: true,
|
|
199
|
+
projectId: true,
|
|
200
|
+
statusPage: {
|
|
201
|
+
projectId: true,
|
|
202
|
+
},
|
|
22
203
|
},
|
|
23
204
|
skip: 0,
|
|
24
|
-
limit:
|
|
205
|
+
limit: LIMIT_PER_PROJECT,
|
|
25
206
|
props: {
|
|
26
207
|
isRoot: true,
|
|
27
208
|
},
|
|
@@ -29,25 +210,47 @@ export class Service extends DatabaseService {
|
|
|
29
210
|
if (templateLinks.length === 0) {
|
|
30
211
|
return null;
|
|
31
212
|
}
|
|
32
|
-
|
|
213
|
+
const statusPageProjectId = ((_b = (_a = templateLinks.find((link) => {
|
|
214
|
+
var _a;
|
|
215
|
+
return Boolean((_a = link.statusPage) === null || _a === void 0 ? void 0 : _a.projectId);
|
|
216
|
+
})) === null || _a === void 0 ? void 0 : _a.statusPage) === null || _b === void 0 ? void 0 : _b.projectId) || undefined;
|
|
217
|
+
if (!statusPageProjectId) {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
/*
|
|
221
|
+
* Only links the page's own project made count: a link row stamped with
|
|
222
|
+
* another project cannot pull that project's template onto this page.
|
|
223
|
+
*/
|
|
33
224
|
const templateIds = templateLinks
|
|
225
|
+
.filter((link) => {
|
|
226
|
+
var _a;
|
|
227
|
+
return ((_a = link.projectId) === null || _a === void 0 ? void 0 : _a.toString()) === statusPageProjectId.toString();
|
|
228
|
+
})
|
|
34
229
|
.map((link) => {
|
|
35
230
|
return link.statusPageSubscriberNotificationTemplateId;
|
|
36
231
|
})
|
|
37
232
|
.filter((id) => {
|
|
38
|
-
return id !== undefined;
|
|
233
|
+
return id !== undefined && id !== null;
|
|
39
234
|
});
|
|
40
235
|
if (templateIds.length === 0) {
|
|
41
236
|
return null;
|
|
42
237
|
}
|
|
43
|
-
|
|
238
|
+
/*
|
|
239
|
+
* Find the linked template for this event type and notification method.
|
|
240
|
+
* Several linked templates can match (nothing stops a page linking two
|
|
241
|
+
* for the same event and channel); the default sort returns the newest
|
|
242
|
+
* first, which is the one this method has always picked.
|
|
243
|
+
*/
|
|
44
244
|
const templates = await this.findBy({
|
|
45
245
|
query: {
|
|
246
|
+
_id: QueryHelper.any(templateIds),
|
|
247
|
+
projectId: statusPageProjectId,
|
|
46
248
|
eventType: eventType,
|
|
47
249
|
notificationMethod: notificationMethod,
|
|
48
250
|
},
|
|
49
251
|
select: {
|
|
50
252
|
_id: true,
|
|
253
|
+
projectId: true,
|
|
51
254
|
templateName: true,
|
|
52
255
|
templateBody: true,
|
|
53
256
|
emailSubject: true,
|
|
@@ -55,21 +258,12 @@ export class Service extends DatabaseService {
|
|
|
55
258
|
notificationMethod: true,
|
|
56
259
|
},
|
|
57
260
|
skip: 0,
|
|
58
|
-
limit:
|
|
261
|
+
limit: 1,
|
|
59
262
|
props: {
|
|
60
263
|
isRoot: true,
|
|
61
264
|
},
|
|
62
265
|
});
|
|
63
|
-
|
|
64
|
-
for (const template of templates) {
|
|
65
|
-
if (templateIds.some((id) => {
|
|
66
|
-
var _a;
|
|
67
|
-
return id.toString() === ((_a = template._id) === null || _a === void 0 ? void 0 : _a.toString());
|
|
68
|
-
})) {
|
|
69
|
-
return template;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return null;
|
|
266
|
+
return templates[0] || null;
|
|
73
267
|
}
|
|
74
268
|
/**
|
|
75
269
|
* Get available variables for a specific event type.
|
|
@@ -81,26 +275,37 @@ export class Service extends DatabaseService {
|
|
|
81
275
|
return SubscriberNotificationTemplateVariables.getAvailableVariablesForEventType(eventType);
|
|
82
276
|
}
|
|
83
277
|
/**
|
|
84
|
-
* Compile a template
|
|
85
|
-
*
|
|
278
|
+
* Compile a template for a channel that does not render HTML - an email
|
|
279
|
+
* subject, SMS, Slack or Microsoft Teams - replacing {{variableName}} with
|
|
280
|
+
* each value exactly as written.
|
|
86
281
|
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* meaning, so a note mentioning "$$5" or a resource named "Store $&" was
|
|
90
|
-
* rewritten on its way to subscribers.
|
|
91
|
-
* - Replacing one variable at a time also expanded placeholders that
|
|
92
|
-
* appeared inside an earlier value, so a note containing
|
|
93
|
-
* "{{unsubscribeUrl}}" came out as a link.
|
|
94
|
-
* A placeholder with no variable is left as written.
|
|
282
|
+
* Never use it for the body of an email template, which is HTML: use
|
|
283
|
+
* compileEmailBodyTemplate. See SubscriberNotificationTemplateCompiler.
|
|
95
284
|
*/
|
|
96
285
|
static compileTemplate(template, variables) {
|
|
97
|
-
return
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
286
|
+
return SubscriberNotificationTemplateCompiler.compileTemplate(template, variables);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Compile the body of an EMAIL template, which is sent as HTML. Plain
|
|
290
|
+
* values are HTML-escaped; only a SafeHtml value (rendered Markdown, the
|
|
291
|
+
* date helper's HTML, the escaped resource list) is inserted as it is. See
|
|
292
|
+
* SubscriberNotificationTemplateCompiler.
|
|
293
|
+
*/
|
|
294
|
+
static compileEmailBodyTemplate(template, variables) {
|
|
295
|
+
return SubscriberNotificationTemplateCompiler.compileEmailBodyTemplate(template, variables);
|
|
103
296
|
}
|
|
104
297
|
}
|
|
298
|
+
__decorate([
|
|
299
|
+
CaptureSpan(),
|
|
300
|
+
__metadata("design:type", Function),
|
|
301
|
+
__metadata("design:paramtypes", [Object]),
|
|
302
|
+
__metadata("design:returntype", Promise)
|
|
303
|
+
], Service.prototype, "onBeforeCreate", null);
|
|
304
|
+
__decorate([
|
|
305
|
+
CaptureSpan(),
|
|
306
|
+
__metadata("design:type", Function),
|
|
307
|
+
__metadata("design:paramtypes", [Object]),
|
|
308
|
+
__metadata("design:returntype", Promise)
|
|
309
|
+
], Service.prototype, "onBeforeUpdate", null);
|
|
105
310
|
export default new Service();
|
|
106
311
|
//# sourceMappingURL=StatusPageSubscriberNotificationTemplateService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusPageSubscriberNotificationTemplateService.js","sourceRoot":"","sources":["../../../../Server/Services/StatusPageSubscriberNotificationTemplateService.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,MAAM,sEAAsE,CAAC;
|
|
1
|
+
{"version":3,"file":"StatusPageSubscriberNotificationTemplateService.js","sourceRoot":"","sources":["../../../../Server/Services/StatusPageSubscriberNotificationTemplateService.ts"],"names":[],"mappings":"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"}
|
package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js
CHANGED
|
@@ -1,9 +1,118 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
1
10
|
import DatabaseService from "./DatabaseService";
|
|
11
|
+
import StatusPageSubscriberNotificationTemplateService from "./StatusPageSubscriberNotificationTemplateService";
|
|
2
12
|
import Model from "../../Models/DatabaseModels/StatusPageSubscriberNotificationTemplateStatusPage";
|
|
13
|
+
import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
14
|
+
import ObjectID from "../../Types/ObjectID";
|
|
15
|
+
import SubscriberTemplateIncidentRecordAccess from "../Utils/StatusPage/SubscriberTemplateIncidentRecordAccess";
|
|
16
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
17
|
+
/*
|
|
18
|
+
* Linking a custom subscriber notification template to a status page sends
|
|
19
|
+
* that page's subscribers whatever the template places. A template may place
|
|
20
|
+
* values from the team's incident records ({{incidentLabels}},
|
|
21
|
+
* {{customFields.<key>}}), which only someone who may read them may put in a
|
|
22
|
+
* template (SubscriberTemplateIncidentRecordAccess) - and the status page
|
|
23
|
+
* roles that may link templates may also add a Slack, Teams or webhook
|
|
24
|
+
* subscriber of their own to a page. So linking such a template, or moving a
|
|
25
|
+
* link to another template or page, is checked as placing everything the
|
|
26
|
+
* template holds. Root and master admin writes are not checked.
|
|
27
|
+
*/
|
|
3
28
|
export class Service extends DatabaseService {
|
|
4
29
|
constructor() {
|
|
5
30
|
super(Model);
|
|
6
31
|
}
|
|
32
|
+
async onBeforeCreate(createBy) {
|
|
33
|
+
var _a;
|
|
34
|
+
if (!createBy.props.isRoot && !createBy.props.isMasterAdmin) {
|
|
35
|
+
const templateId = createBy.data.statusPageSubscriberNotificationTemplateId ||
|
|
36
|
+
((_a = createBy.data.statusPageSubscriberNotificationTemplate) === null || _a === void 0 ? void 0 : _a.id) ||
|
|
37
|
+
undefined;
|
|
38
|
+
await this.assertCanLink({
|
|
39
|
+
templateIds: templateId ? [templateId] : [],
|
|
40
|
+
createBy: createBy,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return { createBy, carryForward: null };
|
|
44
|
+
}
|
|
45
|
+
async onBeforeUpdate(updateBy) {
|
|
46
|
+
if (updateBy.props.isRoot || updateBy.props.isMasterAdmin) {
|
|
47
|
+
return { updateBy, carryForward: null };
|
|
48
|
+
}
|
|
49
|
+
const data = updateBy.data;
|
|
50
|
+
const writesTemplate = data.statusPageSubscriberNotificationTemplateId !== undefined &&
|
|
51
|
+
data.statusPageSubscriberNotificationTemplateId !== null;
|
|
52
|
+
const writesStatusPage = data.statusPageId !== undefined;
|
|
53
|
+
if (!writesTemplate && !writesStatusPage) {
|
|
54
|
+
return { updateBy, carryForward: null };
|
|
55
|
+
}
|
|
56
|
+
let templateIds = [];
|
|
57
|
+
if (writesTemplate) {
|
|
58
|
+
templateIds = [
|
|
59
|
+
new ObjectID(String(data.statusPageSubscriberNotificationTemplateId)),
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Moved to another page: the templates the links already point at.
|
|
64
|
+
const query = updateBy.props.tenantId
|
|
65
|
+
? Object.assign(Object.assign({}, updateBy.query), { projectId: updateBy.props.tenantId }) : updateBy.query;
|
|
66
|
+
const links = await this.findBy({
|
|
67
|
+
query: query,
|
|
68
|
+
select: {
|
|
69
|
+
statusPageSubscriberNotificationTemplateId: true,
|
|
70
|
+
},
|
|
71
|
+
limit: LIMIT_MAX,
|
|
72
|
+
skip: 0,
|
|
73
|
+
props: {
|
|
74
|
+
isRoot: true,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
templateIds = links
|
|
78
|
+
.map((link) => {
|
|
79
|
+
return link.statusPageSubscriberNotificationTemplateId;
|
|
80
|
+
})
|
|
81
|
+
.filter((id) => {
|
|
82
|
+
return Boolean(id);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
SubscriberTemplateIncidentRecordAccess.assertCanPlace({
|
|
86
|
+
placeholders: await StatusPageSubscriberNotificationTemplateService.getIncidentRecordPlaceholdersHeld({
|
|
87
|
+
templateIds: templateIds,
|
|
88
|
+
projectId: updateBy.props.tenantId,
|
|
89
|
+
}),
|
|
90
|
+
props: updateBy.props,
|
|
91
|
+
});
|
|
92
|
+
return { updateBy, carryForward: null };
|
|
93
|
+
}
|
|
94
|
+
async assertCanLink(data) {
|
|
95
|
+
SubscriberTemplateIncidentRecordAccess.assertCanPlace({
|
|
96
|
+
placeholders: await StatusPageSubscriberNotificationTemplateService.getIncidentRecordPlaceholdersHeld({
|
|
97
|
+
templateIds: data.templateIds,
|
|
98
|
+
projectId: data.createBy.props.tenantId ||
|
|
99
|
+
data.createBy.data.projectId,
|
|
100
|
+
}),
|
|
101
|
+
props: data.createBy.props,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
7
104
|
}
|
|
105
|
+
__decorate([
|
|
106
|
+
CaptureSpan(),
|
|
107
|
+
__metadata("design:type", Function),
|
|
108
|
+
__metadata("design:paramtypes", [Object]),
|
|
109
|
+
__metadata("design:returntype", Promise)
|
|
110
|
+
], Service.prototype, "onBeforeCreate", null);
|
|
111
|
+
__decorate([
|
|
112
|
+
CaptureSpan(),
|
|
113
|
+
__metadata("design:type", Function),
|
|
114
|
+
__metadata("design:paramtypes", [Object]),
|
|
115
|
+
__metadata("design:returntype", Promise)
|
|
116
|
+
], Service.prototype, "onBeforeUpdate", null);
|
|
8
117
|
export default new Service();
|
|
9
118
|
//# sourceMappingURL=StatusPageSubscriberNotificationTemplateStatusPageService.js.map
|
package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusPageSubscriberNotificationTemplateStatusPageService.js","sourceRoot":"","sources":["../../../../Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,MAAM,gFAAgF,CAAC;
|
|
1
|
+
{"version":3,"file":"StatusPageSubscriberNotificationTemplateStatusPageService.js","sourceRoot":"","sources":["../../../../Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.ts"],"names":[],"mappings":"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"}
|