@oneuptime/common 14.0.6 → 14.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/Incident.ts +267 -1
- package/Models/DatabaseModels/IncidentCustomField.ts +202 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +30 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +126 -1
- package/Models/DatabaseModels/InventoryItem.ts +23 -12
- package/Models/DatabaseModels/StatusPage.ts +55 -0
- package/Models/DatabaseModels/StatusPageSubscriber.ts +128 -0
- package/Server/API/IncidentAPI.ts +162 -0
- package/Server/API/StatusPageAPI.ts +487 -171
- package/Server/API/StatusPageSubscriberAPI.ts +63 -15
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.ts +217 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.ts +108 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.ts +168 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.ts +44 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +16 -0
- package/Server/Infrastructure/Semaphore.ts +10 -0
- package/Server/Middleware/IdentityRateLimit.ts +108 -3
- package/Server/Middleware/SubscriberNotificationPreviewRateLimit.ts +237 -0
- package/Server/Middleware/SubscriberNotificationTestSendRateLimit.ts +304 -0
- package/Server/Services/AlertService.ts +32 -36
- package/Server/Services/DatabaseService.ts +93 -10
- package/Server/Services/IncidentAlertService.ts +609 -2
- package/Server/Services/IncidentCustomFieldService.ts +276 -1
- package/Server/Services/IncidentEpisodePublicNoteService.ts +28 -0
- package/Server/Services/IncidentEpisodeService.ts +15 -0
- package/Server/Services/IncidentEpisodeStateTimelineService.ts +27 -1
- package/Server/Services/IncidentPublicNoteService.ts +30 -1
- package/Server/Services/IncidentService.ts +1663 -103
- package/Server/Services/IncidentStateTimelineService.ts +13 -0
- package/Server/Services/IncidentTemplateService.ts +109 -0
- package/Server/Services/InventoryItemService.ts +38 -0
- package/Server/Services/IoTDeviceCredentialService.ts +13 -4
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +30 -1
- package/Server/Services/ScheduledMaintenanceService.ts +118 -64
- package/Server/Services/SmsService.ts +10 -0
- package/Server/Services/StatusPageService.ts +65 -8
- package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +299 -37
- package/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.ts +129 -0
- package/Server/Services/StatusPageSubscriberService.ts +1161 -64
- package/Server/Services/UserNotificationRuleService.ts +55 -53
- package/Server/Services/WorkspaceNotificationSummaryService.ts +38 -20
- package/Server/Types/Markdown.ts +153 -6
- package/Server/Types/Workflow/Components/Email.ts +61 -2
- package/Server/Utils/AffectedResources/LinkedAffectedResources.ts +576 -0
- package/Server/Utils/Alert/AlertStateChangeAuthorization.ts +129 -0
- package/Server/Utils/CustomField/CustomFieldRename.ts +378 -0
- package/Server/Utils/DataSource/EgressGuard.ts +66 -21
- package/Server/Utils/Inventory/InventoryOverviewAggregation.ts +111 -0
- package/Server/Utils/Mail/PinnedSmtpSocket.ts +130 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +10 -0
- package/Server/Utils/Response.ts +31 -0
- package/Server/Utils/SSRFProtection.ts +76 -16
- package/Server/Utils/StatusPage/IncidentStatusPageScope.ts +948 -0
- package/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.ts +656 -0
- package/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.ts +805 -0
- package/Server/Utils/StatusPage/StatusPageExclusion.ts +18 -0
- package/Server/Utils/StatusPage/StatusPageReadAccess.ts +125 -0
- package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.ts +151 -0
- package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.ts +70 -0
- package/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.ts +421 -0
- package/Server/Utils/StatusPage/SubscriberNotificationClaim.ts +107 -0
- package/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.ts +1049 -0
- package/Server/Utils/StatusPage/SubscriberNotificationFanOut.ts +180 -0
- package/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.ts +839 -0
- package/Server/Utils/StatusPage/SubscriberNotificationResendAccess.ts +393 -0
- package/Server/Utils/StatusPage/SubscriberNotificationRunLimit.ts +246 -0
- package/Server/Utils/StatusPage/SubscriberNotificationTiming.ts +133 -0
- package/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.ts +215 -0
- package/Server/Utils/StatusPageResource.ts +51 -20
- package/Server/Utils/Topology/TopologyConcurrencyLimiter.ts +229 -0
- package/Server/Utils/Topology/TopologyQueries.ts +1350 -0
- package/Server/Utils/Topology/TopologyRequest.ts +463 -0
- package/Server/Utils/Topology/TopologyResponseCache.ts +183 -0
- package/Server/Utils/Topology/TopologySql.ts +1024 -0
- package/Server/Utils/VM/VMAPI.ts +1 -0
- package/Server/Utils/VM/VMRunner.ts +10 -0
- package/Server/Utils/Workflow/OAuth2TokenClient.ts +10 -0
- package/Server/Views/Partials/SensitiveUrlToken.ejs +8 -5
- package/Tests/App/Accounts/RegisterVerifyEmail.test.tsx +748 -0
- package/Tests/App/Accounts/ResendVerificationEmail.test.tsx +1222 -0
- package/Tests/App/Accounts/VerificationEmailResendUtils.test.ts +797 -0
- package/Tests/App/Accounts/VerifyEmailPending.test.tsx +538 -0
- package/Tests/App/Accounts/VerifyEmailResend.test.tsx +779 -0
- package/Tests/App/Dashboard/AcknowledgeAlertsOnDeclare.test.ts +369 -0
- package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +1 -1
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +510 -123
- package/Tests/App/Dashboard/AlertsTableAffectedResources.test.tsx +490 -0
- package/Tests/App/Dashboard/ChangeAlertStateDeclareIncident.test.tsx +886 -0
- package/Tests/App/Dashboard/CreateReviewStepRoleSummary.test.tsx +1250 -0
- package/Tests/App/Dashboard/CreateReviewStepSelectionSummary.test.tsx +738 -0
- package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +357 -0
- package/Tests/App/Dashboard/DeclareIncidentFromAlert.test.ts +417 -0
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +1948 -229
- package/Tests/App/Dashboard/EntityDetailPanelLifecycle.test.tsx +493 -0
- package/Tests/App/Dashboard/EntityDetailPanelNavigation.test.tsx +439 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +776 -0
- package/Tests/App/Dashboard/EventNotesPages.test.tsx +119 -0
- package/Tests/App/Dashboard/EventNotesUtil.test.ts +116 -17
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +534 -6
- package/Tests/App/Dashboard/EventStatusPanel.test.tsx +798 -2
- package/Tests/App/Dashboard/FetchStateAndSeverityElements.test.tsx +669 -0
- package/Tests/App/Dashboard/FetchUsers.test.tsx +230 -0
- package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +91 -1
- package/Tests/App/Dashboard/IncidentCreateAcknowledgeAlerts.test.tsx +1611 -0
- package/Tests/App/Dashboard/IncidentCreateDetailsStep.test.tsx +643 -0
- package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +8 -1
- package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +601 -0
- package/Tests/App/Dashboard/IncidentCustomFieldTemplateVariables.test.tsx +386 -0
- package/Tests/App/Dashboard/IncidentNoteTemplatePlaceholders.test.tsx +124 -0
- package/Tests/App/Dashboard/IncidentNoteTemplateVariablesLoader.test.ts +305 -0
- package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +112 -0
- package/Tests/App/Dashboard/IncidentSettingsRenotifyOnPublish.test.tsx +674 -0
- package/Tests/App/Dashboard/IncidentSettingsStatusPageScope.test.tsx +1051 -0
- package/Tests/App/Dashboard/IncidentTemplateCustomFields.test.tsx +384 -0
- package/Tests/App/Dashboard/IncidentTemplateStatusPageScopeCard.test.tsx +215 -0
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +1365 -57
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +964 -23
- package/Tests/App/Dashboard/InventoryRelationships.test.tsx +885 -0
- package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +113 -1
- package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +201 -15
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +508 -36
- package/Tests/App/Dashboard/SubscriberAudienceSummary.test.tsx +512 -0
- package/Tests/App/Dashboard/SubscriberNotificationPreviewModal.test.tsx +837 -0
- package/Tests/App/Dashboard/SubscriberNotificationStatusLabel.test.tsx +88 -0
- package/Tests/App/Dashboard/SubscriberNotificationStatusResend.test.tsx +473 -0
- package/Tests/App/Dashboard/SubscriberTemplateLivePreview.test.tsx +196 -0
- package/Tests/App/Dashboard/TeamAddedSubscribersUnsubscribedNotice.test.tsx +248 -0
- package/Tests/App/Dashboard/TopologyDataLifecycle.test.tsx +583 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +982 -218
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +818 -114
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +64 -3
- package/Tests/App/StatusPage/StatusPageUnsubscribePage.test.tsx +412 -0
- package/Tests/Models/IncidentCustomFieldApiSchemaContract.test.ts +217 -0
- package/Tests/Models/IncidentCustomFieldCreateSettingsColumns.test.ts +252 -0
- package/Tests/Models/StatusPageSubscriberUnsubscribeColumns.test.ts +218 -0
- package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +7 -0
- package/Tests/Server/API/IncidentSubscriberAudienceAPI.test.ts +1408 -0
- package/Tests/Server/API/StatusPageIncidentScope.test.ts +1868 -0
- package/Tests/Server/API/StatusPageIncidentScopePostgres.test.ts +790 -0
- package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +10 -1
- package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +206 -18
- package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +14 -2
- package/Tests/Server/API/StatusPageSubscriberCreateResponse.test.ts +217 -0
- package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +103 -2
- package/Tests/Server/API/StatusPageUnsubscribeAPI.test.ts +396 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentStatusPageScopeMigration.test.ts +395 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentTemplateStatusPageScopeFlagMigration.test.ts +150 -0
- package/Tests/Server/Infrastructure/Postgres/AddSubscriberNotificationClaimedAtMigration.test.ts +156 -0
- package/Tests/Server/Infrastructure/Postgres/RenameInventoryItemMigration.test.ts +90 -21
- package/Tests/Server/Infrastructure/Postgres/SkipHiddenIncidentCreatedNotificationsMigration.test.ts +410 -0
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +551 -1
- package/Tests/Server/Middleware/SubscriberNotificationPreviewRateLimit.test.ts +238 -0
- package/Tests/Server/Middleware/SubscriberNotificationTestSendRateLimit.test.ts +245 -0
- package/Tests/Server/Services/AddStatusPageSubscriberUnsubscribeTokenMigration.test.ts +152 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +221 -36
- package/Tests/Server/Services/DatabaseServiceCompareAndSetColumns.test.ts +191 -0
- package/Tests/Server/Services/DomainService.test.ts +525 -0
- package/Tests/Server/Services/IncidentAlertAcknowledgeOnDeclare.test.ts +2630 -0
- package/Tests/Server/Services/IncidentAlertPostgres.test.ts +1625 -1
- package/Tests/Server/Services/IncidentCreatedRenotifyOnPublish.test.ts +681 -0
- package/Tests/Server/Services/IncidentCreatedResend.test.ts +775 -0
- package/Tests/Server/Services/IncidentCustomFieldRenamePostgres.test.ts +713 -0
- package/Tests/Server/Services/IncidentCustomFieldService.test.ts +751 -0
- package/Tests/Server/Services/IncidentCustomFieldValueValidation.test.ts +556 -0
- package/Tests/Server/Services/IncidentDeclareAcknowledgeAlerts.test.ts +2189 -0
- package/Tests/Server/Services/IncidentStatusPageScope.test.ts +2971 -0
- package/Tests/Server/Services/IncidentStatusPageScopeFeed.test.ts +131 -0
- package/Tests/Server/Services/IncidentStatusPageScopePostgres.test.ts +625 -0
- package/Tests/Server/Services/IncidentTemplateCustomFieldsCopy.test.ts +311 -0
- package/Tests/Server/Services/IncidentTemplateStatusPageScope.test.ts +363 -0
- package/Tests/Server/Services/InventoryItemServiceOverviewCounts.test.ts +345 -0
- package/Tests/Server/Services/InventoryOverviewPostgres.test.ts +254 -0
- package/Tests/Server/Services/IoTDeviceCredentialService.test.ts +819 -0
- package/Tests/Server/Services/LinkedAffectedResourcesCreatedFeed.test.ts +420 -0
- package/Tests/Server/Services/PublicNoteEditFeedEventType.test.ts +213 -0
- package/Tests/Server/Services/PublicNoteResendAccess.test.ts +994 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +289 -9
- package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +92 -36
- package/Tests/Server/Services/SmsServiceFailIfNotSent.test.ts +67 -0
- package/Tests/Server/Services/StatusPageReportIncidentCounts.test.ts +610 -0
- package/Tests/Server/Services/StatusPageSubscriberAudienceCounts.test.ts +201 -0
- package/Tests/Server/Services/StatusPageSubscriberAudienceCountsPostgres.test.ts +271 -0
- package/Tests/Server/Services/StatusPageSubscriberConfirmationTemplateEscaping.test.ts +200 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationLogRedaction.test.ts +54 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +37 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateIncidentRecordAccess.test.ts +772 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookup.test.ts +506 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookupPostgres.test.ts +261 -0
- package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +21 -5
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribe.test.ts +1618 -0
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribeLinkSenders.test.ts +373 -0
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribePostgres.test.ts +388 -0
- package/Tests/Server/Services/SubscriberNotificationInFlightRequeue.test.ts +500 -0
- package/Tests/Server/Types/MarkdownEmailLinks.test.ts +320 -0
- package/Tests/Server/Types/Workflow/Components/Email.test.ts +491 -1
- package/Tests/Server/Types/Workflow/Components/EmailSmtpPinning.test.ts +398 -0
- package/Tests/Server/Utils/AffectedResources/LinkedAffectedResources.test.ts +858 -0
- package/Tests/Server/Utils/Alert/AlertStateChangeAuthorization.test.ts +1172 -0
- package/Tests/Server/Utils/CustomField/CustomFieldRename.test.ts +586 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +246 -10
- package/Tests/Server/Utils/DataSource/EgressGuardDeploymentConfig.test.ts +226 -0
- package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +131 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +4 -0
- package/Tests/Server/Utils/EgressPolicyEnvironment.ts +45 -0
- package/Tests/Server/Utils/Mail/PinnedSmtpSocket.test.ts +409 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +23 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionResolutionDetail.test.ts +314 -0
- package/Tests/Server/Utils/StatusPage/IncidentStatusPageScope.test.ts +1699 -0
- package/Tests/Server/Utils/StatusPage/IncidentStatusPageScopeQueriesPostgres.test.ts +508 -0
- package/Tests/Server/Utils/StatusPage/IncidentSubscriberAudienceCallerPermission.test.ts +246 -0
- package/Tests/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.test.ts +1348 -0
- package/Tests/Server/Utils/StatusPage/StatusPageReadAccess.test.ts +221 -0
- package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.test.ts +132 -0
- package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.test.ts +155 -0
- package/Tests/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.test.ts +708 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaim.test.ts +255 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaimPostgres.test.ts +528 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.test.ts +1238 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationFanOut.test.ts +472 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.test.ts +1168 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationRunLimit.test.ts +275 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationTiming.test.ts +131 -0
- package/Tests/Server/Utils/StatusPageResource.test.ts +98 -0
- package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigration.test.ts +386 -0
- package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigrationPostgres.test.ts +430 -0
- package/Tests/Server/Utils/Topology/TopologyActivityParityPostgres.test.ts +279 -0
- package/Tests/Server/Utils/Topology/TopologyConcurrencyLimiter.test.ts +534 -0
- package/Tests/Server/Utils/Topology/TopologyEstateGenerator.ts +624 -0
- package/Tests/Server/Utils/Topology/TopologyJsonResponse.test.ts +90 -0
- package/Tests/Server/Utils/Topology/TopologyQueries.test.ts +1634 -0
- package/Tests/Server/Utils/Topology/TopologyQueriesDifferentialPostgres.test.ts +683 -0
- package/Tests/Server/Utils/Topology/TopologyQueriesPostgres.test.ts +2624 -0
- package/Tests/Server/Utils/Topology/TopologyReference.ts +1018 -0
- package/Tests/Server/Utils/Topology/TopologyRequest.test.ts +643 -0
- package/Tests/Server/Utils/Topology/TopologyResponseCache.test.ts +305 -0
- package/Tests/Server/Utils/Topology/TopologySql.test.ts +973 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +17 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +75 -0
- package/Tests/Types/CustomField/CustomFieldSavedViews.test.ts +247 -0
- package/Tests/Types/CustomField/CustomFieldTemplateValues.test.ts +186 -0
- package/Tests/Types/CustomField/CustomFieldTypeCorrespondence.test.ts +48 -0
- package/Tests/Types/CustomField/CustomFieldValueFormat.test.ts +215 -0
- package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +343 -0
- package/Tests/Types/CustomField/CustomFieldVariableKey.test.ts +364 -0
- package/Tests/Types/SafeHtml.test.ts +102 -0
- package/Tests/Types/StatusPage/IncidentCreatedRenotify.test.ts +419 -0
- package/Tests/Types/StatusPage/IncidentCreatedResend.test.ts +118 -0
- package/Tests/Types/StatusPage/IncidentScopeAddedPagesNotification.test.ts +558 -0
- package/Tests/Types/StatusPage/IncidentSubscriberAudience.test.ts +284 -0
- package/Tests/Types/StatusPage/StatusPageSubscriberUnsubscribe.test.ts +341 -0
- package/Tests/Types/StatusPage/SubscriberNotificationPreview.test.ts +196 -0
- package/Tests/Types/StatusPage/SubscriberNotificationResend.test.ts +201 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateCompiler.test.ts +277 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplatePreview.test.ts +179 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +324 -0
- package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +60 -13
- package/Tests/Types/Topology/TopologyTypeRules.test.ts +176 -0
- package/Tests/UI/Components/CustomFields/CustomFieldFormFields.test.ts +432 -0
- package/Tests/UI/Components/CustomFields/CustomFieldModelFormFields.test.tsx +685 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetailOrder.test.tsx +469 -0
- package/Tests/UI/Components/Forms/ModelFormCustomFieldInputs.test.tsx +325 -0
- package/Tests/UI/Components/Forms/ModelFormDropdownOptionsRefused.test.tsx +358 -0
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +22 -0
- package/Tests/UI/Monitor/NetworkPathView.test.tsx +289 -0
- package/Tests/Utils/Incident/IncidentFromAlerts.test.ts +302 -0
- package/Tests/Utils/Incident/IncidentNoteTemplateVariables.test.ts +623 -0
- package/Tests/Utils/Markdown/MarkdownEscape.test.ts +89 -0
- package/Tests/Utils/ProbeNetworkFailureUtil.test.ts +992 -0
- package/Tests/Utils/RequestFailedDetails.test.ts +575 -0
- package/Types/CustomField/CustomFieldOrder.ts +55 -0
- package/Types/CustomField/CustomFieldSavedViews.ts +225 -0
- package/Types/CustomField/CustomFieldTemplateMerge.ts +71 -0
- package/Types/CustomField/CustomFieldType.ts +14 -0
- package/Types/CustomField/CustomFieldValueFormat.ts +161 -0
- package/Types/CustomField/CustomFieldValueValidator.ts +488 -0
- package/Types/CustomField/CustomFieldVariableKey.ts +211 -0
- package/Types/Incident/IncidentAlertLink.ts +19 -0
- package/Types/SafeHtml.ts +93 -0
- package/Types/StatusPage/IncidentCreatedRenotify.ts +224 -0
- package/Types/StatusPage/IncidentCreatedResend.ts +108 -0
- package/Types/StatusPage/IncidentScopeAddedPagesNotification.ts +343 -0
- package/Types/StatusPage/IncidentSubscriberAudience.ts +332 -0
- package/Types/StatusPage/StatusPageSubscriberUnsubscribe.ts +405 -0
- package/Types/StatusPage/SubscriberNotificationInterruption.ts +32 -0
- package/Types/StatusPage/SubscriberNotificationPreview.ts +322 -0
- package/Types/StatusPage/SubscriberNotificationResend.ts +132 -0
- package/Types/StatusPage/SubscriberNotificationTemplateCompiler.ts +180 -0
- package/Types/StatusPage/SubscriberNotificationTemplatePreview.ts +301 -0
- package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +217 -4
- package/Types/StatusPage/SubscriberUpdateNotification.ts +32 -11
- package/Types/Telemetry/InventoryLiveness.ts +26 -0
- package/Types/Topology/TopologyApi.ts +428 -0
- package/Types/Topology/TopologyTypeRules.ts +191 -0
- package/UI/Components/CustomFields/CustomFieldFormFields.ts +317 -0
- package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +395 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +95 -55
- package/UI/Components/Forms/ModelForm.tsx +70 -8
- package/UI/Components/Forms/Validation.ts +1 -1
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +2 -4
- package/UI/Components/ModelTable/AnalyticsModelTable.tsx +2 -6
- package/UI/Components/ModelTable/BaseModelTable.tsx +9 -8
- package/UI/Components/ModelTable/CustomFieldColumns.tsx +14 -1
- package/UI/Components/ModelTable/ModelTable.tsx +6 -7
- package/UI/Utils/SensitiveUrlToken.ts +10 -5
- package/Utils/API.ts +247 -2
- package/Utils/Incident/IncidentFromAlerts.ts +78 -0
- package/Utils/Incident/IncidentNoteTemplateVariables.ts +304 -0
- package/Utils/Markdown/MarkdownEscape.ts +65 -0
- package/Utils/ProbeNetworkFailureUtil.ts +673 -0
- package/build/dist/Models/DatabaseModels/Incident.js +267 -1
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js +207 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +31 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +124 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js +20 -11
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +56 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +131 -0
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +100 -1
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +417 -176
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageSubscriberAPI.js +52 -13
- package/build/dist/Server/API/StatusPageSubscriberAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js +165 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js +57 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js +29 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +3 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +89 -3
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js +149 -0
- package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js.map +1 -0
- package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js +190 -0
- package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AlertService.js +21 -33
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +56 -7
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentAlertService.js +457 -3
- package/build/dist/Server/Services/IncidentAlertService.js.map +1 -1
- package/build/dist/Server/Services/IncidentCustomFieldService.js +204 -8
- package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +14 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +26 -0
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +26 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +1148 -42
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +83 -0
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +31 -0
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/IoTDeviceCredentialService.js +12 -5
- package/build/dist/Server/Services/IoTDeviceCredentialService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +26 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +84 -57
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/SmsService.js +2 -22
- package/build/dist/Server/Services/SmsService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +47 -9
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +237 -32
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js +109 -0
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +925 -99
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +55 -51
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +42 -25
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +110 -6
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Email.js +55 -6
- package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
- package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js +405 -0
- package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js.map +1 -0
- package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js +112 -0
- package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldRename.js +211 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldRename.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +41 -12
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js +81 -0
- package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js.map +1 -0
- package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js +101 -0
- package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +30 -0
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +48 -6
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js +631 -0
- package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js +403 -0
- package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js +451 -0
- package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js +13 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js +91 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js +101 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js +47 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js +273 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js +73 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js +722 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js +102 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js +527 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js +278 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js +137 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js +103 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js +114 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPageResource.js +39 -7
- package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
- package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js +178 -0
- package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyQueries.js +884 -0
- package/build/dist/Server/Utils/Topology/TopologyQueries.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyRequest.js +275 -0
- package/build/dist/Server/Utils/Topology/TopologyRequest.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyResponseCache.js +146 -0
- package/build/dist/Server/Utils/Topology/TopologyResponseCache.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologySql.js +688 -0
- package/build/dist/Server/Utils/Topology/TopologySql.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +1 -0
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +3 -0
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldOrder.js +36 -0
- package/build/dist/Types/CustomField/CustomFieldOrder.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldSavedViews.js +135 -0
- package/build/dist/Types/CustomField/CustomFieldSavedViews.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js +27 -0
- package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldType.js +12 -0
- package/build/dist/Types/CustomField/CustomFieldType.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldValueFormat.js +126 -0
- package/build/dist/Types/CustomField/CustomFieldValueFormat.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js +280 -0
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldVariableKey.js +150 -0
- package/build/dist/Types/CustomField/CustomFieldVariableKey.js.map +1 -0
- package/build/dist/Types/Incident/IncidentAlertLink.js +17 -0
- package/build/dist/Types/Incident/IncidentAlertLink.js.map +1 -1
- package/build/dist/Types/SafeHtml.js +84 -0
- package/build/dist/Types/SafeHtml.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js +117 -0
- package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentCreatedResend.js +86 -0
- package/build/dist/Types/StatusPage/IncidentCreatedResend.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js +246 -0
- package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js +183 -0
- package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js +277 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js +27 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js +190 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationResend.js +102 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationResend.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js +97 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js +175 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +144 -4
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -1
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +29 -9
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -1
- package/build/dist/Types/Telemetry/InventoryLiveness.js +23 -0
- package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -1
- package/build/dist/Types/Topology/TopologyApi.js +55 -0
- package/build/dist/Types/Topology/TopologyApi.js.map +1 -0
- package/build/dist/Types/Topology/TopologyTypeRules.js +165 -0
- package/build/dist/Types/Topology/TopologyTypeRules.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js +169 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +212 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +64 -49
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +39 -5
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +1 -1
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/AnalyticsModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +13 -1
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +10 -5
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -1
- package/build/dist/Utils/API.js +177 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Incident/IncidentFromAlerts.js +38 -0
- package/build/dist/Utils/Incident/IncidentFromAlerts.js.map +1 -1
- package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js +155 -0
- package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js.map +1 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js +48 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -1
- package/build/dist/Utils/ProbeNetworkFailureUtil.js +460 -0
- package/build/dist/Utils/ProbeNetworkFailureUtil.js.map +1 -0
- package/package.json +1 -1
|
@@ -63,7 +63,8 @@ import MonitorGroupResource from "../../Models/DatabaseModels/MonitorGroupResour
|
|
|
63
63
|
import MonitorGroupService from "./MonitorGroupService";
|
|
64
64
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
65
65
|
import OneUptimeDate from "../../Types/Date";
|
|
66
|
-
import
|
|
66
|
+
import IncidentStatusPageScope from "../Utils/StatusPage/IncidentStatusPageScope";
|
|
67
|
+
import Select from "../Types/Database/Select";
|
|
67
68
|
import MonitorStatusTimeline from "../../Models/DatabaseModels/MonitorStatusTimeline";
|
|
68
69
|
import MonitorStatusTimelineService, {
|
|
69
70
|
MergedDowntimeTotals,
|
|
@@ -122,6 +123,17 @@ export const STATUS_PAGE_SSO_REQUIREMENT_COLUMNS: ReadonlyArray<string> = [
|
|
|
122
123
|
"requireSsoForLogin",
|
|
123
124
|
];
|
|
124
125
|
|
|
126
|
+
/*
|
|
127
|
+
* What a report's incident counts read of the status page: which project's
|
|
128
|
+
* incidents to count, and whether the page only shows incidents limited to
|
|
129
|
+
* it (IncidentStatusPageScope decides from that which incidents count).
|
|
130
|
+
*/
|
|
131
|
+
export const INCIDENT_COUNT_STATUS_PAGE_SELECT: Select<StatusPage> = {
|
|
132
|
+
_id: true,
|
|
133
|
+
projectId: true,
|
|
134
|
+
onlyShowScopedIncidents: true,
|
|
135
|
+
};
|
|
136
|
+
|
|
125
137
|
export class Service extends DatabaseService<StatusPage> {
|
|
126
138
|
/*
|
|
127
139
|
* Caches the resolved status page URL per statusPageId. `getStatusPageURL`
|
|
@@ -1393,7 +1405,7 @@ export class Service extends DatabaseService<StatusPage> {
|
|
|
1393
1405
|
const unsubscribeUrl: string =
|
|
1394
1406
|
StatusPageSubscriberService.getUnsubscribeLink(
|
|
1395
1407
|
URL.fromString(statusPageURL),
|
|
1396
|
-
subscriber
|
|
1408
|
+
subscriber,
|
|
1397
1409
|
).toString();
|
|
1398
1410
|
|
|
1399
1411
|
if (subscriber.subscriberEmail) {
|
|
@@ -1432,6 +1444,8 @@ export class Service extends DatabaseService<StatusPage> {
|
|
|
1432
1444
|
},
|
|
1433
1445
|
select: {
|
|
1434
1446
|
downtimeMonitorStatuses: true,
|
|
1447
|
+
// What the incident counts below are scoped by.
|
|
1448
|
+
...INCIDENT_COUNT_STATUS_PAGE_SELECT,
|
|
1435
1449
|
},
|
|
1436
1450
|
});
|
|
1437
1451
|
|
|
@@ -1499,7 +1513,7 @@ export class Service extends DatabaseService<StatusPage> {
|
|
|
1499
1513
|
}
|
|
1500
1514
|
|
|
1501
1515
|
const incidentCount: number = await this.getIncidentCountOnStatusPage({
|
|
1502
|
-
|
|
1516
|
+
statusPage: statusPage,
|
|
1503
1517
|
startDate: startDate,
|
|
1504
1518
|
endDate: endDate,
|
|
1505
1519
|
});
|
|
@@ -1661,6 +1675,7 @@ export class Service extends DatabaseService<StatusPage> {
|
|
|
1661
1675
|
reportItem: {
|
|
1662
1676
|
resourceName: resource.displayName || "",
|
|
1663
1677
|
totalIncidentCount: await this.getIncidentCountByMonitorIds({
|
|
1678
|
+
statusPage: statusPage,
|
|
1664
1679
|
monitorIds: monitorIdsForThisResource,
|
|
1665
1680
|
startDate: startDate,
|
|
1666
1681
|
endDate: endDate,
|
|
@@ -1710,6 +1725,7 @@ export class Service extends DatabaseService<StatusPage> {
|
|
|
1710
1725
|
|
|
1711
1726
|
const groupMetricsByGroupId: Dictionary<StatusPageReportGroupMetrics> =
|
|
1712
1727
|
await this.getReportGroupMetrics({
|
|
1728
|
+
statusPage: statusPage,
|
|
1713
1729
|
statusPageGroups: statusPageGroups,
|
|
1714
1730
|
entries: entries,
|
|
1715
1731
|
monitorIdsByResourceIndex: monitorIdsByResourceIndex,
|
|
@@ -1817,6 +1833,11 @@ export class Service extends DatabaseService<StatusPage> {
|
|
|
1817
1833
|
*/
|
|
1818
1834
|
@CaptureSpan()
|
|
1819
1835
|
public async getReportGroupMetrics(data: {
|
|
1836
|
+
/*
|
|
1837
|
+
* The status page the report is for, which the incident counts are
|
|
1838
|
+
* scoped by: loaded with INCIDENT_COUNT_STATUS_PAGE_SELECT.
|
|
1839
|
+
*/
|
|
1840
|
+
statusPage: StatusPage;
|
|
1820
1841
|
statusPageGroups: Array<StatusPageGroup>;
|
|
1821
1842
|
entries: Array<StatusPageReportResourceEntry>;
|
|
1822
1843
|
monitorIdsByResourceIndex: Array<Array<ObjectID>>;
|
|
@@ -1913,6 +1934,7 @@ export class Service extends DatabaseService<StatusPage> {
|
|
|
1913
1934
|
totalIncidentCount =
|
|
1914
1935
|
monitorIds.length > 0
|
|
1915
1936
|
? await this.getIncidentCountByMonitorIds({
|
|
1937
|
+
statusPage: data.statusPage,
|
|
1916
1938
|
monitorIds: monitorIds,
|
|
1917
1939
|
startDate: data.reportWindow.startDate,
|
|
1918
1940
|
endDate: data.reportWindow.endDate,
|
|
@@ -1963,13 +1985,41 @@ export class Service extends DatabaseService<StatusPage> {
|
|
|
1963
1985
|
});
|
|
1964
1986
|
}
|
|
1965
1987
|
|
|
1988
|
+
/*
|
|
1989
|
+
* How many incidents the status page shows on these monitors, created in
|
|
1990
|
+
* the window: the report's count for a resource, a group or the page.
|
|
1991
|
+
*
|
|
1992
|
+
* It counts what the page shows, through IncidentStatusPageScope - an
|
|
1993
|
+
* incident limited to other status pages is not counted, nor is an
|
|
1994
|
+
* unlimited one on a page that only shows incidents limited to it - and
|
|
1995
|
+
* only the project's incidents visible on status pages. (Before the scope,
|
|
1996
|
+
* this counted every incident on the monitors, hidden ones and all.)
|
|
1997
|
+
*
|
|
1998
|
+
* The status page must be loaded with INCIDENT_COUNT_STATUS_PAGE_SELECT. It
|
|
1999
|
+
* is passed in rather than read here because a report counts once for each
|
|
2000
|
+
* resource and group.
|
|
2001
|
+
*/
|
|
1966
2002
|
@CaptureSpan()
|
|
1967
2003
|
public async getIncidentCountByMonitorIds(data: {
|
|
2004
|
+
statusPage: StatusPage;
|
|
1968
2005
|
monitorIds: Array<ObjectID>;
|
|
1969
2006
|
startDate: Date;
|
|
1970
2007
|
endDate: Date;
|
|
1971
2008
|
}): Promise<number> {
|
|
1972
|
-
|
|
2009
|
+
// No monitor, so no incident on one to count.
|
|
2010
|
+
if (data.monitorIds.length === 0) {
|
|
2011
|
+
return 0;
|
|
2012
|
+
}
|
|
2013
|
+
|
|
2014
|
+
if (!data.statusPage.projectId) {
|
|
2015
|
+
throw new BadDataException(
|
|
2016
|
+
"Cannot count the incidents on a status page without its project.",
|
|
2017
|
+
);
|
|
2018
|
+
}
|
|
2019
|
+
|
|
2020
|
+
return await IncidentStatusPageScope.countIncidentsForStatusPage({
|
|
2021
|
+
statusPage: data.statusPage,
|
|
2022
|
+
projectId: data.statusPage.projectId,
|
|
1973
2023
|
query: {
|
|
1974
2024
|
monitors: data.monitorIds as any,
|
|
1975
2025
|
createdAt: QueryHelper.inBetween(data.startDate, data.endDate),
|
|
@@ -1978,24 +2028,31 @@ export class Service extends DatabaseService<StatusPage> {
|
|
|
1978
2028
|
isRoot: true,
|
|
1979
2029
|
},
|
|
1980
2030
|
});
|
|
1981
|
-
|
|
1982
|
-
return incidentCount.toNumber();
|
|
1983
2031
|
}
|
|
1984
2032
|
|
|
2033
|
+
// How many incidents the status page shows, over all of its monitors.
|
|
1985
2034
|
@CaptureSpan()
|
|
1986
2035
|
public async getIncidentCountOnStatusPage(data: {
|
|
1987
|
-
|
|
2036
|
+
// Loaded with INCIDENT_COUNT_STATUS_PAGE_SELECT.
|
|
2037
|
+
statusPage: StatusPage;
|
|
1988
2038
|
startDate: Date;
|
|
1989
2039
|
endDate: Date;
|
|
1990
2040
|
}): Promise<number> {
|
|
2041
|
+
if (!data.statusPage.id) {
|
|
2042
|
+
throw new BadDataException(
|
|
2043
|
+
"Cannot count the incidents on a status page without its id.",
|
|
2044
|
+
);
|
|
2045
|
+
}
|
|
2046
|
+
|
|
1991
2047
|
const monitorsOnStatusPage: {
|
|
1992
2048
|
monitorsOnStatusPage: Array<ObjectID>;
|
|
1993
2049
|
monitorsInGroup: Dictionary<Array<ObjectID>>;
|
|
1994
2050
|
} = await this.getMonitorIdsOnStatusPage({
|
|
1995
|
-
statusPageId: data.
|
|
2051
|
+
statusPageId: data.statusPage.id,
|
|
1996
2052
|
});
|
|
1997
2053
|
|
|
1998
2054
|
return this.getIncidentCountByMonitorIds({
|
|
2055
|
+
statusPage: data.statusPage,
|
|
1999
2056
|
monitorIds: monitorsOnStatusPage.monitorsOnStatusPage,
|
|
2000
2057
|
startDate: data.startDate,
|
|
2001
2058
|
endDate: data.endDate,
|
|
@@ -2,21 +2,256 @@ import DatabaseService from "./DatabaseService";
|
|
|
2
2
|
import Model from "../../Models/DatabaseModels/StatusPageSubscriberNotificationTemplate";
|
|
3
3
|
import StatusPageSubscriberNotificationTemplateStatusPage from "../../Models/DatabaseModels/StatusPageSubscriberNotificationTemplateStatusPage";
|
|
4
4
|
import ObjectID from "../../Types/ObjectID";
|
|
5
|
+
import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
6
|
+
import CreateBy from "../Types/Database/CreateBy";
|
|
7
|
+
import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
|
|
8
|
+
import Query from "../Types/Database/Query";
|
|
9
|
+
import QueryHelper from "../Types/Database/QueryHelper";
|
|
10
|
+
import UpdateBy from "../Types/Database/UpdateBy";
|
|
11
|
+
import SubscriberTemplateIncidentRecordAccess from "../Utils/StatusPage/SubscriberTemplateIncidentRecordAccess";
|
|
12
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
5
13
|
import StatusPageSubscriberNotificationEventType from "../../Types/StatusPage/StatusPageSubscriberNotificationEventType";
|
|
6
14
|
import StatusPageSubscriberNotificationMethod from "../../Types/StatusPage/StatusPageSubscriberNotificationMethod";
|
|
7
15
|
import StatusPageSubscriberNotificationTemplateStatusPageService from "./StatusPageSubscriberNotificationTemplateStatusPageService";
|
|
8
16
|
import SubscriberNotificationTemplateVariables, {
|
|
9
17
|
SubscriberNotificationTemplateVariable,
|
|
10
18
|
} from "../../Types/StatusPage/SubscriberNotificationTemplateVariables";
|
|
19
|
+
import SubscriberNotificationTemplateCompiler, {
|
|
20
|
+
SubscriberNotificationEmailBodyTemplateVariables,
|
|
21
|
+
SubscriberNotificationTextTemplateVariables,
|
|
22
|
+
} from "../../Types/StatusPage/SubscriberNotificationTemplateCompiler";
|
|
23
|
+
|
|
24
|
+
export type {
|
|
25
|
+
SubscriberNotificationEmailBodyTemplateVariables,
|
|
26
|
+
SubscriberNotificationTextTemplateVariables,
|
|
27
|
+
};
|
|
11
28
|
|
|
12
29
|
export class Service extends DatabaseService<Model> {
|
|
13
30
|
public constructor() {
|
|
14
31
|
super(Model);
|
|
15
32
|
}
|
|
16
33
|
|
|
34
|
+
/*
|
|
35
|
+
* A template's body and subject may place values from the team's incident
|
|
36
|
+
* records - {{incidentLabels}} and {{customFields.<key>}} - only when
|
|
37
|
+
* whoever writes them may read those records: the status page roles that
|
|
38
|
+
* may write templates may not (SubscriberTemplateIncidentRecordAccess).
|
|
39
|
+
*/
|
|
40
|
+
@CaptureSpan()
|
|
41
|
+
protected override async onBeforeCreate(
|
|
42
|
+
createBy: CreateBy<Model>,
|
|
43
|
+
): Promise<OnCreate<Model>> {
|
|
44
|
+
SubscriberTemplateIncidentRecordAccess.assertCanPlace({
|
|
45
|
+
placeholders:
|
|
46
|
+
SubscriberNotificationTemplateVariables.getIncidentRecordPlaceholders([
|
|
47
|
+
createBy.data.templateBody,
|
|
48
|
+
createBy.data.emailSubject,
|
|
49
|
+
]),
|
|
50
|
+
props: createBy.props,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
return { createBy, carryForward: null };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/*
|
|
57
|
+
* On an update, only what the write adds is checked: a placeholder the
|
|
58
|
+
* template already holds was allowed when it was written, so someone
|
|
59
|
+
* without incident access can still fix a typo, rename the template or
|
|
60
|
+
* move a placeholder from the subject to the body - but not add one.
|
|
61
|
+
*
|
|
62
|
+
* Pointing a template somewhere else counts as placing everything it
|
|
63
|
+
* holds: changing its channel or event type makes an admin's template
|
|
64
|
+
* send its incident records to wherever the new channel goes, and a
|
|
65
|
+
* status page role can add a Slack, Teams or webhook subscriber of its
|
|
66
|
+
* own. (Linking it to another status page is checked by
|
|
67
|
+
* StatusPageSubscriberNotificationTemplateStatusPageService.)
|
|
68
|
+
*/
|
|
69
|
+
@CaptureSpan()
|
|
70
|
+
protected override async onBeforeUpdate(
|
|
71
|
+
updateBy: UpdateBy<Model>,
|
|
72
|
+
): Promise<OnUpdate<Model>> {
|
|
73
|
+
SubscriberTemplateIncidentRecordAccess.assertCanPlace({
|
|
74
|
+
placeholders: await this.getIncidentRecordPlaceholdersToCheck(updateBy),
|
|
75
|
+
props: updateBy.props,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
return { updateBy, carryForward: null };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/*
|
|
82
|
+
* The incident record placeholders this update must be allowed to place,
|
|
83
|
+
* across every template it would change: those it writes into a body or
|
|
84
|
+
* subject that the template did not hold before, and, when it changes
|
|
85
|
+
* where the template is sent (its channel or event type), every one the
|
|
86
|
+
* template will hold once written. The templates are read as root and
|
|
87
|
+
* limited to the caller's project, like other update hooks: the update's
|
|
88
|
+
* own permission check has not run yet, and only narrows the rows further.
|
|
89
|
+
*/
|
|
90
|
+
private async getIncidentRecordPlaceholdersToCheck(
|
|
91
|
+
updateBy: UpdateBy<Model>,
|
|
92
|
+
): Promise<Array<string>> {
|
|
93
|
+
if (updateBy.props.isRoot || updateBy.props.isMasterAdmin) {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const data: {
|
|
98
|
+
templateBody?: unknown;
|
|
99
|
+
emailSubject?: unknown;
|
|
100
|
+
eventType?: unknown;
|
|
101
|
+
notificationMethod?: unknown;
|
|
102
|
+
} = updateBy.data as unknown as {
|
|
103
|
+
templateBody?: unknown;
|
|
104
|
+
emailSubject?: unknown;
|
|
105
|
+
eventType?: unknown;
|
|
106
|
+
notificationMethod?: unknown;
|
|
107
|
+
};
|
|
108
|
+
const writesBody: boolean = data.templateBody !== undefined;
|
|
109
|
+
const writesSubject: boolean = data.emailSubject !== undefined;
|
|
110
|
+
const writesTarget: boolean =
|
|
111
|
+
data.eventType !== undefined || data.notificationMethod !== undefined;
|
|
112
|
+
|
|
113
|
+
if (!writesBody && !writesSubject && !writesTarget) {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Anything but text places nothing: the column check refuses it anyway.
|
|
118
|
+
const writtenBody: string | null =
|
|
119
|
+
writesBody && typeof data.templateBody === "string"
|
|
120
|
+
? data.templateBody
|
|
121
|
+
: null;
|
|
122
|
+
const writtenSubject: string | null =
|
|
123
|
+
writesSubject && typeof data.emailSubject === "string"
|
|
124
|
+
? data.emailSubject
|
|
125
|
+
: null;
|
|
126
|
+
|
|
127
|
+
const written: Array<string> =
|
|
128
|
+
SubscriberNotificationTemplateVariables.getIncidentRecordPlaceholders([
|
|
129
|
+
writtenBody,
|
|
130
|
+
writtenSubject,
|
|
131
|
+
]);
|
|
132
|
+
|
|
133
|
+
if (written.length === 0 && !writesTarget) {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const query: Query<Model> = updateBy.props.tenantId
|
|
138
|
+
? { ...updateBy.query, projectId: updateBy.props.tenantId }
|
|
139
|
+
: updateBy.query;
|
|
140
|
+
|
|
141
|
+
const templates: Array<Model> = await this.findBy({
|
|
142
|
+
query: query,
|
|
143
|
+
select: {
|
|
144
|
+
templateBody: true,
|
|
145
|
+
emailSubject: true,
|
|
146
|
+
eventType: true,
|
|
147
|
+
notificationMethod: true,
|
|
148
|
+
},
|
|
149
|
+
limit: LIMIT_MAX,
|
|
150
|
+
skip: 0,
|
|
151
|
+
props: {
|
|
152
|
+
isRoot: true,
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
const added: Set<string> = new Set<string>();
|
|
157
|
+
|
|
158
|
+
for (const template of templates) {
|
|
159
|
+
const held: Array<string> =
|
|
160
|
+
SubscriberNotificationTemplateVariables.getIncidentRecordPlaceholders([
|
|
161
|
+
template.templateBody,
|
|
162
|
+
template.emailSubject,
|
|
163
|
+
]);
|
|
164
|
+
|
|
165
|
+
/*
|
|
166
|
+
* Only a real change: the edit form sends the channel and event type
|
|
167
|
+
* back as they were, and a typo fix must still go through.
|
|
168
|
+
*/
|
|
169
|
+
const changesTarget: boolean =
|
|
170
|
+
writesTarget &&
|
|
171
|
+
((data.eventType !== undefined &&
|
|
172
|
+
data.eventType !== template.eventType) ||
|
|
173
|
+
(data.notificationMethod !== undefined &&
|
|
174
|
+
data.notificationMethod !== template.notificationMethod));
|
|
175
|
+
|
|
176
|
+
if (changesTarget) {
|
|
177
|
+
// Everything the template will hold goes to the new target.
|
|
178
|
+
for (const name of SubscriberNotificationTemplateVariables.getIncidentRecordPlaceholders(
|
|
179
|
+
[
|
|
180
|
+
writesBody ? writtenBody : template.templateBody,
|
|
181
|
+
writesSubject ? writtenSubject : template.emailSubject,
|
|
182
|
+
],
|
|
183
|
+
)) {
|
|
184
|
+
added.add(name);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
for (const name of written) {
|
|
191
|
+
if (!held.includes(name)) {
|
|
192
|
+
added.add(name);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return Array.from(added).sort();
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/*
|
|
201
|
+
* The incident record placeholders the given templates hold, in the
|
|
202
|
+
* caller's project: what linking them to a status page places there
|
|
203
|
+
* (StatusPageSubscriberNotificationTemplateStatusPageService). Read as
|
|
204
|
+
* root, like the update hook above.
|
|
205
|
+
*/
|
|
206
|
+
public async getIncidentRecordPlaceholdersHeld(data: {
|
|
207
|
+
templateIds: Array<ObjectID>;
|
|
208
|
+
projectId?: ObjectID | undefined;
|
|
209
|
+
}): Promise<Array<string>> {
|
|
210
|
+
if (data.templateIds.length === 0) {
|
|
211
|
+
return [];
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const templates: Array<Model> = await this.findBy({
|
|
215
|
+
query: {
|
|
216
|
+
_id: QueryHelper.any(data.templateIds),
|
|
217
|
+
...(data.projectId ? { projectId: data.projectId } : {}),
|
|
218
|
+
},
|
|
219
|
+
select: {
|
|
220
|
+
templateBody: true,
|
|
221
|
+
emailSubject: true,
|
|
222
|
+
},
|
|
223
|
+
limit: LIMIT_MAX,
|
|
224
|
+
skip: 0,
|
|
225
|
+
props: {
|
|
226
|
+
isRoot: true,
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
const held: Set<string> = new Set<string>();
|
|
231
|
+
|
|
232
|
+
for (const template of templates) {
|
|
233
|
+
for (const name of SubscriberNotificationTemplateVariables.getIncidentRecordPlaceholders(
|
|
234
|
+
[template.templateBody, template.emailSubject],
|
|
235
|
+
)) {
|
|
236
|
+
held.add(name);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return Array.from(held).sort();
|
|
241
|
+
}
|
|
242
|
+
|
|
17
243
|
/**
|
|
18
244
|
* Get template for a specific status page, event type, and notification method.
|
|
19
245
|
* Returns null if no custom template is found (caller should use default template).
|
|
246
|
+
*
|
|
247
|
+
* Workers call this as root, so nothing but the query below keeps one
|
|
248
|
+
* project's page from reading another project's templates. The template
|
|
249
|
+
* query is therefore narrowed to the ids this page links to AND to the
|
|
250
|
+
* page's own project. It used to ask for every template of this event type
|
|
251
|
+
* and channel across all projects, 100 at a time, and look for the linked
|
|
252
|
+
* id in memory: once more than 100 such templates existed on a shared
|
|
253
|
+
* server, the linked one could fall outside those 100 and the page's
|
|
254
|
+
* subscribers silently got the default template instead of the branded one.
|
|
20
255
|
*/
|
|
21
256
|
public async getTemplateForStatusPage(data: {
|
|
22
257
|
statusPageId: ObjectID;
|
|
@@ -25,7 +260,11 @@ export class Service extends DatabaseService<Model> {
|
|
|
25
260
|
}): Promise<Model | null> {
|
|
26
261
|
const { statusPageId, eventType, notificationMethod } = data;
|
|
27
262
|
|
|
28
|
-
|
|
263
|
+
/*
|
|
264
|
+
* First find the template links for this status page. There is one per
|
|
265
|
+
* linked template, so a page has only a handful, but nothing enforces a
|
|
266
|
+
* cap - so read them all rather than risk the same truncation as above.
|
|
267
|
+
*/
|
|
29
268
|
const templateLinks: Array<StatusPageSubscriberNotificationTemplateStatusPage> =
|
|
30
269
|
await StatusPageSubscriberNotificationTemplateStatusPageService.findBy({
|
|
31
270
|
query: {
|
|
@@ -33,9 +272,13 @@ export class Service extends DatabaseService<Model> {
|
|
|
33
272
|
},
|
|
34
273
|
select: {
|
|
35
274
|
statusPageSubscriberNotificationTemplateId: true,
|
|
275
|
+
projectId: true,
|
|
276
|
+
statusPage: {
|
|
277
|
+
projectId: true,
|
|
278
|
+
},
|
|
36
279
|
},
|
|
37
280
|
skip: 0,
|
|
38
|
-
limit:
|
|
281
|
+
limit: LIMIT_PER_PROJECT,
|
|
39
282
|
props: {
|
|
40
283
|
isRoot: true,
|
|
41
284
|
},
|
|
@@ -45,27 +288,52 @@ export class Service extends DatabaseService<Model> {
|
|
|
45
288
|
return null;
|
|
46
289
|
}
|
|
47
290
|
|
|
48
|
-
|
|
291
|
+
const statusPageProjectId: ObjectID | undefined =
|
|
292
|
+
templateLinks.find(
|
|
293
|
+
(link: StatusPageSubscriberNotificationTemplateStatusPage) => {
|
|
294
|
+
return Boolean(link.statusPage?.projectId);
|
|
295
|
+
},
|
|
296
|
+
)?.statusPage?.projectId || undefined;
|
|
297
|
+
|
|
298
|
+
if (!statusPageProjectId) {
|
|
299
|
+
return null;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/*
|
|
303
|
+
* Only links the page's own project made count: a link row stamped with
|
|
304
|
+
* another project cannot pull that project's template onto this page.
|
|
305
|
+
*/
|
|
49
306
|
const templateIds: Array<ObjectID> = templateLinks
|
|
307
|
+
.filter((link: StatusPageSubscriberNotificationTemplateStatusPage) => {
|
|
308
|
+
return link.projectId?.toString() === statusPageProjectId.toString();
|
|
309
|
+
})
|
|
50
310
|
.map((link: StatusPageSubscriberNotificationTemplateStatusPage) => {
|
|
51
311
|
return link.statusPageSubscriberNotificationTemplateId;
|
|
52
312
|
})
|
|
53
313
|
.filter((id: ObjectID | undefined): id is ObjectID => {
|
|
54
|
-
return id !== undefined;
|
|
314
|
+
return id !== undefined && id !== null;
|
|
55
315
|
});
|
|
56
316
|
|
|
57
317
|
if (templateIds.length === 0) {
|
|
58
318
|
return null;
|
|
59
319
|
}
|
|
60
320
|
|
|
61
|
-
|
|
321
|
+
/*
|
|
322
|
+
* Find the linked template for this event type and notification method.
|
|
323
|
+
* Several linked templates can match (nothing stops a page linking two
|
|
324
|
+
* for the same event and channel); the default sort returns the newest
|
|
325
|
+
* first, which is the one this method has always picked.
|
|
326
|
+
*/
|
|
62
327
|
const templates: Array<Model> = await this.findBy({
|
|
63
328
|
query: {
|
|
329
|
+
_id: QueryHelper.any(templateIds),
|
|
330
|
+
projectId: statusPageProjectId,
|
|
64
331
|
eventType: eventType,
|
|
65
332
|
notificationMethod: notificationMethod,
|
|
66
333
|
},
|
|
67
334
|
select: {
|
|
68
335
|
_id: true,
|
|
336
|
+
projectId: true,
|
|
69
337
|
templateName: true,
|
|
70
338
|
templateBody: true,
|
|
71
339
|
emailSubject: true,
|
|
@@ -73,24 +341,13 @@ export class Service extends DatabaseService<Model> {
|
|
|
73
341
|
notificationMethod: true,
|
|
74
342
|
},
|
|
75
343
|
skip: 0,
|
|
76
|
-
limit:
|
|
344
|
+
limit: 1,
|
|
77
345
|
props: {
|
|
78
346
|
isRoot: true,
|
|
79
347
|
},
|
|
80
348
|
});
|
|
81
349
|
|
|
82
|
-
|
|
83
|
-
for (const template of templates) {
|
|
84
|
-
if (
|
|
85
|
-
templateIds.some((id: ObjectID) => {
|
|
86
|
-
return id.toString() === template._id?.toString();
|
|
87
|
-
})
|
|
88
|
-
) {
|
|
89
|
-
return template;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return null;
|
|
350
|
+
return templates[0] || null;
|
|
94
351
|
}
|
|
95
352
|
|
|
96
353
|
/**
|
|
@@ -108,31 +365,36 @@ export class Service extends DatabaseService<Model> {
|
|
|
108
365
|
}
|
|
109
366
|
|
|
110
367
|
/**
|
|
111
|
-
* Compile a template
|
|
112
|
-
*
|
|
368
|
+
* Compile a template for a channel that does not render HTML - an email
|
|
369
|
+
* subject, SMS, Slack or Microsoft Teams - replacing {{variableName}} with
|
|
370
|
+
* each value exactly as written.
|
|
113
371
|
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
* meaning, so a note mentioning "$$5" or a resource named "Store $&" was
|
|
117
|
-
* rewritten on its way to subscribers.
|
|
118
|
-
* - Replacing one variable at a time also expanded placeholders that
|
|
119
|
-
* appeared inside an earlier value, so a note containing
|
|
120
|
-
* "{{unsubscribeUrl}}" came out as a link.
|
|
121
|
-
* A placeholder with no variable is left as written.
|
|
372
|
+
* Never use it for the body of an email template, which is HTML: use
|
|
373
|
+
* compileEmailBodyTemplate. See SubscriberNotificationTemplateCompiler.
|
|
122
374
|
*/
|
|
123
375
|
public static compileTemplate(
|
|
124
376
|
template: string,
|
|
125
|
-
variables:
|
|
377
|
+
variables: SubscriberNotificationTextTemplateVariables,
|
|
126
378
|
): string {
|
|
127
|
-
return
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
379
|
+
return SubscriberNotificationTemplateCompiler.compileTemplate(
|
|
380
|
+
template,
|
|
381
|
+
variables,
|
|
382
|
+
);
|
|
383
|
+
}
|
|
133
384
|
|
|
134
|
-
|
|
135
|
-
|
|
385
|
+
/**
|
|
386
|
+
* Compile the body of an EMAIL template, which is sent as HTML. Plain
|
|
387
|
+
* values are HTML-escaped; only a SafeHtml value (rendered Markdown, the
|
|
388
|
+
* date helper's HTML, the escaped resource list) is inserted as it is. See
|
|
389
|
+
* SubscriberNotificationTemplateCompiler.
|
|
390
|
+
*/
|
|
391
|
+
public static compileEmailBodyTemplate(
|
|
392
|
+
template: string,
|
|
393
|
+
variables: SubscriberNotificationEmailBodyTemplateVariables,
|
|
394
|
+
): string {
|
|
395
|
+
return SubscriberNotificationTemplateCompiler.compileEmailBodyTemplate(
|
|
396
|
+
template,
|
|
397
|
+
variables,
|
|
136
398
|
);
|
|
137
399
|
}
|
|
138
400
|
}
|