@oneuptime/common 14.0.6 → 14.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/Incident.ts +267 -1
- package/Models/DatabaseModels/IncidentCustomField.ts +202 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +30 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +126 -1
- package/Models/DatabaseModels/InventoryItem.ts +23 -12
- package/Models/DatabaseModels/StatusPage.ts +55 -0
- package/Models/DatabaseModels/StatusPageSubscriber.ts +128 -0
- package/Server/API/IncidentAPI.ts +162 -0
- package/Server/API/StatusPageAPI.ts +487 -171
- package/Server/API/StatusPageSubscriberAPI.ts +63 -15
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.ts +217 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.ts +108 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.ts +168 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.ts +44 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +16 -0
- package/Server/Infrastructure/Semaphore.ts +10 -0
- package/Server/Middleware/IdentityRateLimit.ts +108 -3
- package/Server/Middleware/SubscriberNotificationPreviewRateLimit.ts +237 -0
- package/Server/Middleware/SubscriberNotificationTestSendRateLimit.ts +304 -0
- package/Server/Services/AlertService.ts +32 -36
- package/Server/Services/DatabaseService.ts +93 -10
- package/Server/Services/IncidentAlertService.ts +609 -2
- package/Server/Services/IncidentCustomFieldService.ts +276 -1
- package/Server/Services/IncidentEpisodePublicNoteService.ts +28 -0
- package/Server/Services/IncidentEpisodeService.ts +15 -0
- package/Server/Services/IncidentEpisodeStateTimelineService.ts +27 -1
- package/Server/Services/IncidentPublicNoteService.ts +30 -1
- package/Server/Services/IncidentService.ts +1663 -103
- package/Server/Services/IncidentStateTimelineService.ts +13 -0
- package/Server/Services/IncidentTemplateService.ts +109 -0
- package/Server/Services/InventoryItemService.ts +38 -0
- package/Server/Services/IoTDeviceCredentialService.ts +13 -4
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +30 -1
- package/Server/Services/ScheduledMaintenanceService.ts +118 -64
- package/Server/Services/SmsService.ts +10 -0
- package/Server/Services/StatusPageService.ts +65 -8
- package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +299 -37
- package/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.ts +129 -0
- package/Server/Services/StatusPageSubscriberService.ts +1161 -64
- package/Server/Services/UserNotificationRuleService.ts +55 -53
- package/Server/Services/WorkspaceNotificationSummaryService.ts +38 -20
- package/Server/Types/Markdown.ts +153 -6
- package/Server/Types/Workflow/Components/Email.ts +61 -2
- package/Server/Utils/AffectedResources/LinkedAffectedResources.ts +576 -0
- package/Server/Utils/Alert/AlertStateChangeAuthorization.ts +129 -0
- package/Server/Utils/CustomField/CustomFieldRename.ts +378 -0
- package/Server/Utils/DataSource/EgressGuard.ts +66 -21
- package/Server/Utils/Inventory/InventoryOverviewAggregation.ts +111 -0
- package/Server/Utils/Mail/PinnedSmtpSocket.ts +130 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +10 -0
- package/Server/Utils/Response.ts +31 -0
- package/Server/Utils/SSRFProtection.ts +76 -16
- package/Server/Utils/StatusPage/IncidentStatusPageScope.ts +948 -0
- package/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.ts +656 -0
- package/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.ts +805 -0
- package/Server/Utils/StatusPage/StatusPageExclusion.ts +18 -0
- package/Server/Utils/StatusPage/StatusPageReadAccess.ts +125 -0
- package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.ts +151 -0
- package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.ts +70 -0
- package/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.ts +421 -0
- package/Server/Utils/StatusPage/SubscriberNotificationClaim.ts +107 -0
- package/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.ts +1049 -0
- package/Server/Utils/StatusPage/SubscriberNotificationFanOut.ts +180 -0
- package/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.ts +839 -0
- package/Server/Utils/StatusPage/SubscriberNotificationResendAccess.ts +393 -0
- package/Server/Utils/StatusPage/SubscriberNotificationRunLimit.ts +246 -0
- package/Server/Utils/StatusPage/SubscriberNotificationTiming.ts +133 -0
- package/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.ts +215 -0
- package/Server/Utils/StatusPageResource.ts +51 -20
- package/Server/Utils/Topology/TopologyConcurrencyLimiter.ts +229 -0
- package/Server/Utils/Topology/TopologyQueries.ts +1350 -0
- package/Server/Utils/Topology/TopologyRequest.ts +463 -0
- package/Server/Utils/Topology/TopologyResponseCache.ts +183 -0
- package/Server/Utils/Topology/TopologySql.ts +1024 -0
- package/Server/Utils/VM/VMAPI.ts +1 -0
- package/Server/Utils/VM/VMRunner.ts +10 -0
- package/Server/Utils/Workflow/OAuth2TokenClient.ts +10 -0
- package/Server/Views/Partials/SensitiveUrlToken.ejs +8 -5
- package/Tests/App/Accounts/RegisterVerifyEmail.test.tsx +748 -0
- package/Tests/App/Accounts/ResendVerificationEmail.test.tsx +1222 -0
- package/Tests/App/Accounts/VerificationEmailResendUtils.test.ts +797 -0
- package/Tests/App/Accounts/VerifyEmailPending.test.tsx +538 -0
- package/Tests/App/Accounts/VerifyEmailResend.test.tsx +779 -0
- package/Tests/App/Dashboard/AcknowledgeAlertsOnDeclare.test.ts +369 -0
- package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +1 -1
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +510 -123
- package/Tests/App/Dashboard/AlertsTableAffectedResources.test.tsx +490 -0
- package/Tests/App/Dashboard/ChangeAlertStateDeclareIncident.test.tsx +886 -0
- package/Tests/App/Dashboard/CreateReviewStepRoleSummary.test.tsx +1250 -0
- package/Tests/App/Dashboard/CreateReviewStepSelectionSummary.test.tsx +738 -0
- package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +357 -0
- package/Tests/App/Dashboard/DeclareIncidentFromAlert.test.ts +417 -0
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +1948 -229
- package/Tests/App/Dashboard/EntityDetailPanelLifecycle.test.tsx +493 -0
- package/Tests/App/Dashboard/EntityDetailPanelNavigation.test.tsx +439 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +776 -0
- package/Tests/App/Dashboard/EventNotesPages.test.tsx +119 -0
- package/Tests/App/Dashboard/EventNotesUtil.test.ts +116 -17
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +534 -6
- package/Tests/App/Dashboard/EventStatusPanel.test.tsx +798 -2
- package/Tests/App/Dashboard/FetchStateAndSeverityElements.test.tsx +669 -0
- package/Tests/App/Dashboard/FetchUsers.test.tsx +230 -0
- package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +91 -1
- package/Tests/App/Dashboard/IncidentCreateAcknowledgeAlerts.test.tsx +1611 -0
- package/Tests/App/Dashboard/IncidentCreateDetailsStep.test.tsx +643 -0
- package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +8 -1
- package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +601 -0
- package/Tests/App/Dashboard/IncidentCustomFieldTemplateVariables.test.tsx +386 -0
- package/Tests/App/Dashboard/IncidentNoteTemplatePlaceholders.test.tsx +124 -0
- package/Tests/App/Dashboard/IncidentNoteTemplateVariablesLoader.test.ts +305 -0
- package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +112 -0
- package/Tests/App/Dashboard/IncidentSettingsRenotifyOnPublish.test.tsx +674 -0
- package/Tests/App/Dashboard/IncidentSettingsStatusPageScope.test.tsx +1051 -0
- package/Tests/App/Dashboard/IncidentTemplateCustomFields.test.tsx +384 -0
- package/Tests/App/Dashboard/IncidentTemplateStatusPageScopeCard.test.tsx +215 -0
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +1365 -57
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +964 -23
- package/Tests/App/Dashboard/InventoryRelationships.test.tsx +885 -0
- package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +113 -1
- package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +201 -15
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +508 -36
- package/Tests/App/Dashboard/SubscriberAudienceSummary.test.tsx +512 -0
- package/Tests/App/Dashboard/SubscriberNotificationPreviewModal.test.tsx +837 -0
- package/Tests/App/Dashboard/SubscriberNotificationStatusLabel.test.tsx +88 -0
- package/Tests/App/Dashboard/SubscriberNotificationStatusResend.test.tsx +473 -0
- package/Tests/App/Dashboard/SubscriberTemplateLivePreview.test.tsx +196 -0
- package/Tests/App/Dashboard/TeamAddedSubscribersUnsubscribedNotice.test.tsx +248 -0
- package/Tests/App/Dashboard/TopologyDataLifecycle.test.tsx +583 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +982 -218
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +818 -114
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +64 -3
- package/Tests/App/StatusPage/StatusPageUnsubscribePage.test.tsx +412 -0
- package/Tests/Models/IncidentCustomFieldApiSchemaContract.test.ts +217 -0
- package/Tests/Models/IncidentCustomFieldCreateSettingsColumns.test.ts +252 -0
- package/Tests/Models/StatusPageSubscriberUnsubscribeColumns.test.ts +218 -0
- package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +7 -0
- package/Tests/Server/API/IncidentSubscriberAudienceAPI.test.ts +1408 -0
- package/Tests/Server/API/StatusPageIncidentScope.test.ts +1868 -0
- package/Tests/Server/API/StatusPageIncidentScopePostgres.test.ts +790 -0
- package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +10 -1
- package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +206 -18
- package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +14 -2
- package/Tests/Server/API/StatusPageSubscriberCreateResponse.test.ts +217 -0
- package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +103 -2
- package/Tests/Server/API/StatusPageUnsubscribeAPI.test.ts +396 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentStatusPageScopeMigration.test.ts +395 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentTemplateStatusPageScopeFlagMigration.test.ts +150 -0
- package/Tests/Server/Infrastructure/Postgres/AddSubscriberNotificationClaimedAtMigration.test.ts +156 -0
- package/Tests/Server/Infrastructure/Postgres/RenameInventoryItemMigration.test.ts +90 -21
- package/Tests/Server/Infrastructure/Postgres/SkipHiddenIncidentCreatedNotificationsMigration.test.ts +410 -0
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +551 -1
- package/Tests/Server/Middleware/SubscriberNotificationPreviewRateLimit.test.ts +238 -0
- package/Tests/Server/Middleware/SubscriberNotificationTestSendRateLimit.test.ts +245 -0
- package/Tests/Server/Services/AddStatusPageSubscriberUnsubscribeTokenMigration.test.ts +152 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +221 -36
- package/Tests/Server/Services/DatabaseServiceCompareAndSetColumns.test.ts +191 -0
- package/Tests/Server/Services/DomainService.test.ts +525 -0
- package/Tests/Server/Services/IncidentAlertAcknowledgeOnDeclare.test.ts +2630 -0
- package/Tests/Server/Services/IncidentAlertPostgres.test.ts +1625 -1
- package/Tests/Server/Services/IncidentCreatedRenotifyOnPublish.test.ts +681 -0
- package/Tests/Server/Services/IncidentCreatedResend.test.ts +775 -0
- package/Tests/Server/Services/IncidentCustomFieldRenamePostgres.test.ts +713 -0
- package/Tests/Server/Services/IncidentCustomFieldService.test.ts +751 -0
- package/Tests/Server/Services/IncidentCustomFieldValueValidation.test.ts +556 -0
- package/Tests/Server/Services/IncidentDeclareAcknowledgeAlerts.test.ts +2189 -0
- package/Tests/Server/Services/IncidentStatusPageScope.test.ts +2971 -0
- package/Tests/Server/Services/IncidentStatusPageScopeFeed.test.ts +131 -0
- package/Tests/Server/Services/IncidentStatusPageScopePostgres.test.ts +625 -0
- package/Tests/Server/Services/IncidentTemplateCustomFieldsCopy.test.ts +311 -0
- package/Tests/Server/Services/IncidentTemplateStatusPageScope.test.ts +363 -0
- package/Tests/Server/Services/InventoryItemServiceOverviewCounts.test.ts +345 -0
- package/Tests/Server/Services/InventoryOverviewPostgres.test.ts +254 -0
- package/Tests/Server/Services/IoTDeviceCredentialService.test.ts +819 -0
- package/Tests/Server/Services/LinkedAffectedResourcesCreatedFeed.test.ts +420 -0
- package/Tests/Server/Services/PublicNoteEditFeedEventType.test.ts +213 -0
- package/Tests/Server/Services/PublicNoteResendAccess.test.ts +994 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +289 -9
- package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +92 -36
- package/Tests/Server/Services/SmsServiceFailIfNotSent.test.ts +67 -0
- package/Tests/Server/Services/StatusPageReportIncidentCounts.test.ts +610 -0
- package/Tests/Server/Services/StatusPageSubscriberAudienceCounts.test.ts +201 -0
- package/Tests/Server/Services/StatusPageSubscriberAudienceCountsPostgres.test.ts +271 -0
- package/Tests/Server/Services/StatusPageSubscriberConfirmationTemplateEscaping.test.ts +200 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationLogRedaction.test.ts +54 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +37 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateIncidentRecordAccess.test.ts +772 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookup.test.ts +506 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookupPostgres.test.ts +261 -0
- package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +21 -5
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribe.test.ts +1618 -0
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribeLinkSenders.test.ts +373 -0
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribePostgres.test.ts +388 -0
- package/Tests/Server/Services/SubscriberNotificationInFlightRequeue.test.ts +500 -0
- package/Tests/Server/Types/MarkdownEmailLinks.test.ts +320 -0
- package/Tests/Server/Types/Workflow/Components/Email.test.ts +491 -1
- package/Tests/Server/Types/Workflow/Components/EmailSmtpPinning.test.ts +398 -0
- package/Tests/Server/Utils/AffectedResources/LinkedAffectedResources.test.ts +858 -0
- package/Tests/Server/Utils/Alert/AlertStateChangeAuthorization.test.ts +1172 -0
- package/Tests/Server/Utils/CustomField/CustomFieldRename.test.ts +586 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +246 -10
- package/Tests/Server/Utils/DataSource/EgressGuardDeploymentConfig.test.ts +226 -0
- package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +131 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +4 -0
- package/Tests/Server/Utils/EgressPolicyEnvironment.ts +45 -0
- package/Tests/Server/Utils/Mail/PinnedSmtpSocket.test.ts +409 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +23 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionResolutionDetail.test.ts +314 -0
- package/Tests/Server/Utils/StatusPage/IncidentStatusPageScope.test.ts +1699 -0
- package/Tests/Server/Utils/StatusPage/IncidentStatusPageScopeQueriesPostgres.test.ts +508 -0
- package/Tests/Server/Utils/StatusPage/IncidentSubscriberAudienceCallerPermission.test.ts +246 -0
- package/Tests/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.test.ts +1348 -0
- package/Tests/Server/Utils/StatusPage/StatusPageReadAccess.test.ts +221 -0
- package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.test.ts +132 -0
- package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.test.ts +155 -0
- package/Tests/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.test.ts +708 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaim.test.ts +255 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaimPostgres.test.ts +528 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.test.ts +1238 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationFanOut.test.ts +472 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.test.ts +1168 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationRunLimit.test.ts +275 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationTiming.test.ts +131 -0
- package/Tests/Server/Utils/StatusPageResource.test.ts +98 -0
- package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigration.test.ts +386 -0
- package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigrationPostgres.test.ts +430 -0
- package/Tests/Server/Utils/Topology/TopologyActivityParityPostgres.test.ts +279 -0
- package/Tests/Server/Utils/Topology/TopologyConcurrencyLimiter.test.ts +534 -0
- package/Tests/Server/Utils/Topology/TopologyEstateGenerator.ts +624 -0
- package/Tests/Server/Utils/Topology/TopologyJsonResponse.test.ts +90 -0
- package/Tests/Server/Utils/Topology/TopologyQueries.test.ts +1634 -0
- package/Tests/Server/Utils/Topology/TopologyQueriesDifferentialPostgres.test.ts +683 -0
- package/Tests/Server/Utils/Topology/TopologyQueriesPostgres.test.ts +2624 -0
- package/Tests/Server/Utils/Topology/TopologyReference.ts +1018 -0
- package/Tests/Server/Utils/Topology/TopologyRequest.test.ts +643 -0
- package/Tests/Server/Utils/Topology/TopologyResponseCache.test.ts +305 -0
- package/Tests/Server/Utils/Topology/TopologySql.test.ts +973 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +17 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +75 -0
- package/Tests/Types/CustomField/CustomFieldSavedViews.test.ts +247 -0
- package/Tests/Types/CustomField/CustomFieldTemplateValues.test.ts +186 -0
- package/Tests/Types/CustomField/CustomFieldTypeCorrespondence.test.ts +48 -0
- package/Tests/Types/CustomField/CustomFieldValueFormat.test.ts +215 -0
- package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +343 -0
- package/Tests/Types/CustomField/CustomFieldVariableKey.test.ts +364 -0
- package/Tests/Types/SafeHtml.test.ts +102 -0
- package/Tests/Types/StatusPage/IncidentCreatedRenotify.test.ts +419 -0
- package/Tests/Types/StatusPage/IncidentCreatedResend.test.ts +118 -0
- package/Tests/Types/StatusPage/IncidentScopeAddedPagesNotification.test.ts +558 -0
- package/Tests/Types/StatusPage/IncidentSubscriberAudience.test.ts +284 -0
- package/Tests/Types/StatusPage/StatusPageSubscriberUnsubscribe.test.ts +341 -0
- package/Tests/Types/StatusPage/SubscriberNotificationPreview.test.ts +196 -0
- package/Tests/Types/StatusPage/SubscriberNotificationResend.test.ts +201 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateCompiler.test.ts +277 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplatePreview.test.ts +179 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +324 -0
- package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +60 -13
- package/Tests/Types/Topology/TopologyTypeRules.test.ts +176 -0
- package/Tests/UI/Components/CustomFields/CustomFieldFormFields.test.ts +432 -0
- package/Tests/UI/Components/CustomFields/CustomFieldModelFormFields.test.tsx +685 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetailOrder.test.tsx +469 -0
- package/Tests/UI/Components/Forms/ModelFormCustomFieldInputs.test.tsx +325 -0
- package/Tests/UI/Components/Forms/ModelFormDropdownOptionsRefused.test.tsx +358 -0
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +22 -0
- package/Tests/UI/Monitor/NetworkPathView.test.tsx +289 -0
- package/Tests/Utils/Incident/IncidentFromAlerts.test.ts +302 -0
- package/Tests/Utils/Incident/IncidentNoteTemplateVariables.test.ts +623 -0
- package/Tests/Utils/Markdown/MarkdownEscape.test.ts +89 -0
- package/Tests/Utils/ProbeNetworkFailureUtil.test.ts +992 -0
- package/Tests/Utils/RequestFailedDetails.test.ts +575 -0
- package/Types/CustomField/CustomFieldOrder.ts +55 -0
- package/Types/CustomField/CustomFieldSavedViews.ts +225 -0
- package/Types/CustomField/CustomFieldTemplateMerge.ts +71 -0
- package/Types/CustomField/CustomFieldType.ts +14 -0
- package/Types/CustomField/CustomFieldValueFormat.ts +161 -0
- package/Types/CustomField/CustomFieldValueValidator.ts +488 -0
- package/Types/CustomField/CustomFieldVariableKey.ts +211 -0
- package/Types/Incident/IncidentAlertLink.ts +19 -0
- package/Types/SafeHtml.ts +93 -0
- package/Types/StatusPage/IncidentCreatedRenotify.ts +224 -0
- package/Types/StatusPage/IncidentCreatedResend.ts +108 -0
- package/Types/StatusPage/IncidentScopeAddedPagesNotification.ts +343 -0
- package/Types/StatusPage/IncidentSubscriberAudience.ts +332 -0
- package/Types/StatusPage/StatusPageSubscriberUnsubscribe.ts +405 -0
- package/Types/StatusPage/SubscriberNotificationInterruption.ts +32 -0
- package/Types/StatusPage/SubscriberNotificationPreview.ts +322 -0
- package/Types/StatusPage/SubscriberNotificationResend.ts +132 -0
- package/Types/StatusPage/SubscriberNotificationTemplateCompiler.ts +180 -0
- package/Types/StatusPage/SubscriberNotificationTemplatePreview.ts +301 -0
- package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +217 -4
- package/Types/StatusPage/SubscriberUpdateNotification.ts +32 -11
- package/Types/Telemetry/InventoryLiveness.ts +26 -0
- package/Types/Topology/TopologyApi.ts +428 -0
- package/Types/Topology/TopologyTypeRules.ts +191 -0
- package/UI/Components/CustomFields/CustomFieldFormFields.ts +317 -0
- package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +395 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +95 -55
- package/UI/Components/Forms/ModelForm.tsx +70 -8
- package/UI/Components/Forms/Validation.ts +1 -1
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +2 -4
- package/UI/Components/ModelTable/AnalyticsModelTable.tsx +2 -6
- package/UI/Components/ModelTable/BaseModelTable.tsx +9 -8
- package/UI/Components/ModelTable/CustomFieldColumns.tsx +14 -1
- package/UI/Components/ModelTable/ModelTable.tsx +6 -7
- package/UI/Utils/SensitiveUrlToken.ts +10 -5
- package/Utils/API.ts +247 -2
- package/Utils/Incident/IncidentFromAlerts.ts +78 -0
- package/Utils/Incident/IncidentNoteTemplateVariables.ts +304 -0
- package/Utils/Markdown/MarkdownEscape.ts +65 -0
- package/Utils/ProbeNetworkFailureUtil.ts +673 -0
- package/build/dist/Models/DatabaseModels/Incident.js +267 -1
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js +207 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +31 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +124 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js +20 -11
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +56 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +131 -0
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +100 -1
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +417 -176
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageSubscriberAPI.js +52 -13
- package/build/dist/Server/API/StatusPageSubscriberAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js +165 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js +57 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js +29 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +3 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +89 -3
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js +149 -0
- package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js.map +1 -0
- package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js +190 -0
- package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AlertService.js +21 -33
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +56 -7
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentAlertService.js +457 -3
- package/build/dist/Server/Services/IncidentAlertService.js.map +1 -1
- package/build/dist/Server/Services/IncidentCustomFieldService.js +204 -8
- package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +14 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +26 -0
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +26 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +1148 -42
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +83 -0
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +31 -0
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/IoTDeviceCredentialService.js +12 -5
- package/build/dist/Server/Services/IoTDeviceCredentialService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +26 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +84 -57
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/SmsService.js +2 -22
- package/build/dist/Server/Services/SmsService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +47 -9
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +237 -32
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js +109 -0
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +925 -99
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +55 -51
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +42 -25
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +110 -6
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Email.js +55 -6
- package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
- package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js +405 -0
- package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js.map +1 -0
- package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js +112 -0
- package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldRename.js +211 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldRename.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +41 -12
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js +81 -0
- package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js.map +1 -0
- package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js +101 -0
- package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +30 -0
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +48 -6
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js +631 -0
- package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js +403 -0
- package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js +451 -0
- package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js +13 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js +91 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js +101 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js +47 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js +273 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js +73 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js +722 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js +102 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js +527 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js +278 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js +137 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js +103 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js +114 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPageResource.js +39 -7
- package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
- package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js +178 -0
- package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyQueries.js +884 -0
- package/build/dist/Server/Utils/Topology/TopologyQueries.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyRequest.js +275 -0
- package/build/dist/Server/Utils/Topology/TopologyRequest.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyResponseCache.js +146 -0
- package/build/dist/Server/Utils/Topology/TopologyResponseCache.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologySql.js +688 -0
- package/build/dist/Server/Utils/Topology/TopologySql.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +1 -0
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +3 -0
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldOrder.js +36 -0
- package/build/dist/Types/CustomField/CustomFieldOrder.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldSavedViews.js +135 -0
- package/build/dist/Types/CustomField/CustomFieldSavedViews.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js +27 -0
- package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldType.js +12 -0
- package/build/dist/Types/CustomField/CustomFieldType.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldValueFormat.js +126 -0
- package/build/dist/Types/CustomField/CustomFieldValueFormat.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js +280 -0
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldVariableKey.js +150 -0
- package/build/dist/Types/CustomField/CustomFieldVariableKey.js.map +1 -0
- package/build/dist/Types/Incident/IncidentAlertLink.js +17 -0
- package/build/dist/Types/Incident/IncidentAlertLink.js.map +1 -1
- package/build/dist/Types/SafeHtml.js +84 -0
- package/build/dist/Types/SafeHtml.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js +117 -0
- package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentCreatedResend.js +86 -0
- package/build/dist/Types/StatusPage/IncidentCreatedResend.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js +246 -0
- package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js +183 -0
- package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js +277 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js +27 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js +190 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationResend.js +102 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationResend.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js +97 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js +175 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +144 -4
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -1
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +29 -9
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -1
- package/build/dist/Types/Telemetry/InventoryLiveness.js +23 -0
- package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -1
- package/build/dist/Types/Topology/TopologyApi.js +55 -0
- package/build/dist/Types/Topology/TopologyApi.js.map +1 -0
- package/build/dist/Types/Topology/TopologyTypeRules.js +165 -0
- package/build/dist/Types/Topology/TopologyTypeRules.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js +169 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +212 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +64 -49
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +39 -5
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +1 -1
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/AnalyticsModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +13 -1
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +10 -5
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -1
- package/build/dist/Utils/API.js +177 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Incident/IncidentFromAlerts.js +38 -0
- package/build/dist/Utils/Incident/IncidentFromAlerts.js.map +1 -1
- package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js +155 -0
- package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js.map +1 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js +48 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -1
- package/build/dist/Utils/ProbeNetworkFailureUtil.js +460 -0
- package/build/dist/Utils/ProbeNetworkFailureUtil.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
import SortOrder from "../../../Types/BaseDatabase/SortOrder";
|
|
2
|
+
import { sortCustomFieldDefinitions } from "../../../Types/CustomField/CustomFieldOrder";
|
|
3
|
+
import CustomFieldType from "../../../Types/CustomField/CustomFieldType";
|
|
4
|
+
import { customFieldValueToDate, customFieldValueToText, formatCustomFieldBoolean, formatCustomFieldCalendarDate, } from "../../../Types/CustomField/CustomFieldValueFormat";
|
|
5
|
+
import { isCustomFieldValueEmpty } from "../../../Types/CustomField/CustomFieldValueMapping";
|
|
6
|
+
import { getCustomFieldTemplateVariableName, isValidCustomFieldVariableKey, } from "../../../Types/CustomField/CustomFieldVariableKey";
|
|
7
|
+
import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
|
|
8
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
9
|
+
import SafeHtml from "../../../Types/SafeHtml";
|
|
10
|
+
import SubscriberNotificationTemplateCompiler from "../../../Types/StatusPage/SubscriberNotificationTemplateCompiler";
|
|
11
|
+
import Timezone from "../../../Types/Timezone";
|
|
12
|
+
import { escapeMarkdownInline } from "../../../Utils/Markdown/MarkdownEscape";
|
|
13
|
+
import IncidentCustomFieldService from "../../Services/IncidentCustomFieldService";
|
|
14
|
+
import Markdown, { MarkdownContentType } from "../../Types/Markdown";
|
|
15
|
+
import { syncIsPublicForMarkdownImages } from "../InlineImageAccessTokenSync";
|
|
16
|
+
import StatusPageResourceUtil from "../StatusPageResource";
|
|
17
|
+
const LINE_BREAK_PATTERN = /\r\n|\r|\n/g;
|
|
18
|
+
export class IncidentTemplateVariables {
|
|
19
|
+
constructor(data) {
|
|
20
|
+
/*
|
|
21
|
+
* Fields whose images are being or have been made public in this send, by
|
|
22
|
+
* name, with the sync that does it. A send awaits several subscribers'
|
|
23
|
+
* messages at once (SubscriberNotificationFanOut), so a second message
|
|
24
|
+
* that carries a field waits for the sync the first one started rather
|
|
25
|
+
* than going out before it has finished.
|
|
26
|
+
*/
|
|
27
|
+
this.publishedImageFields = new Map();
|
|
28
|
+
// What went out, for the feed.
|
|
29
|
+
this.includedFieldsSent = false;
|
|
30
|
+
this.includedFieldsPublished = null;
|
|
31
|
+
this.fieldKeysSent = new Set();
|
|
32
|
+
this.incident = data.incident;
|
|
33
|
+
this.customFields = data.customFields;
|
|
34
|
+
this.textVariables = data.textVariables;
|
|
35
|
+
this.markdownVariables = data.markdownVariables;
|
|
36
|
+
this.incidentLabels = data.incidentLabels;
|
|
37
|
+
this.affectedStatusPages = data.affectedStatusPages;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Every value one status page's messages are filled with, in each
|
|
41
|
+
* channel's format, except the subscriber's own unsubscribeUrl, which the
|
|
42
|
+
* job adds per subscriber.
|
|
43
|
+
*/
|
|
44
|
+
forStatusPage(data) {
|
|
45
|
+
var _a;
|
|
46
|
+
const statusPage = data.statusPage;
|
|
47
|
+
const noResourcesText = data.noResourcesText || "";
|
|
48
|
+
// Empty when the page lists none: the default messages test for that.
|
|
49
|
+
const resourcesAffectedHtml = StatusPageResourceUtil.getResourcesGroupedByGroupName(data.resources);
|
|
50
|
+
const resourcesAffectedPlainText = StatusPageResourceUtil.getResourcesGroupedByGroupNameAsPlainText(data.resources);
|
|
51
|
+
const timezones = statusPage.subscriberTimezones || [];
|
|
52
|
+
// The values that read the same on every channel.
|
|
53
|
+
const shared = Object.assign({ statusPageName: IncidentTemplateVariableBuilder.getStatusPageName(statusPage), statusPageUrl: data.statusPageUrl, detailsUrl: data.detailsUrl, incidentTitle: this.incident.title || "", incidentSeverity: ((_a = this.incident.incidentSeverity) === null || _a === void 0 ? void 0 : _a.name) || " - ", incidentLabels: this.incidentLabels, affectedStatusPages: this.affectedStatusPages }, this.textVariables);
|
|
54
|
+
const emailBody = Object.assign(Object.assign({}, shared), { resourcesAffected: SafeHtml.fromTrustedHtml(resourcesAffectedHtml || SafeHtml.escape(noResourcesText)) });
|
|
55
|
+
const plainText = Object.assign(Object.assign({}, shared), { resourcesAffected: resourcesAffectedPlainText || noResourcesText });
|
|
56
|
+
const markdown = Object.assign(Object.assign({}, shared), { resourcesAffected: resourcesAffectedPlainText || noResourcesText });
|
|
57
|
+
for (const [name, value] of Object.entries(this.markdownVariables)) {
|
|
58
|
+
emailBody[name] = SafeHtml.fromTrustedHtml(value.html);
|
|
59
|
+
plainText[name] = value.plainText;
|
|
60
|
+
markdown[name] = value.source;
|
|
61
|
+
}
|
|
62
|
+
const customFieldRows = [];
|
|
63
|
+
const customFieldsMarkdownLines = [];
|
|
64
|
+
for (const field of this.customFields) {
|
|
65
|
+
const formatted = this.formatValue(field, timezones);
|
|
66
|
+
if (field.variableKey) {
|
|
67
|
+
const variableName = getCustomFieldTemplateVariableName(field.variableKey);
|
|
68
|
+
emailBody[variableName] = formatted.html || formatted.plainText;
|
|
69
|
+
plainText[variableName] = formatted.plainText;
|
|
70
|
+
markdown[variableName] = formatted.markdown;
|
|
71
|
+
}
|
|
72
|
+
if (!field.isIncludedInSubscriberNotifications || !field.hasValue) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
customFieldRows.push(formatted.html
|
|
76
|
+
? { title: field.name, renderedHtml: formatted.html.toHtml() }
|
|
77
|
+
: { title: field.name, plainText: formatted.plainText });
|
|
78
|
+
customFieldsMarkdownLines.push(field.customFieldType === CustomFieldType.Markdown ||
|
|
79
|
+
field.customFieldType === CustomFieldType.LongText
|
|
80
|
+
? `**${field.name}:**\n${formatted.markdown}`
|
|
81
|
+
: `**${field.name}:** ${formatted.markdown}`);
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
emailBody: emailBody,
|
|
85
|
+
plainText: plainText,
|
|
86
|
+
markdown: markdown,
|
|
87
|
+
resourcesAffectedHtml: resourcesAffectedHtml,
|
|
88
|
+
resourcesAffectedPlainText: resourcesAffectedPlainText,
|
|
89
|
+
customFieldRows: customFieldRows,
|
|
90
|
+
customFieldsMarkdownLines: customFieldsMarkdownLines,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/*
|
|
94
|
+
* One of the event's Markdown values (markdownVariables), in its three
|
|
95
|
+
* forms, for a default template: "" in each when it has none.
|
|
96
|
+
*/
|
|
97
|
+
getMarkdownVariable(name) {
|
|
98
|
+
return (this.markdownVariables[name] || { source: "", html: "", plainText: "" });
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* A default message is about to go out on a channel that carries the
|
|
102
|
+
* included fields: the default email, Slack or Teams message, or a
|
|
103
|
+
* webhook. Awaited before the message is sent: the first time, it makes
|
|
104
|
+
* the included Rich text fields' images public, so the recipient can load
|
|
105
|
+
* them. Never throws.
|
|
106
|
+
*/
|
|
107
|
+
async recordIncludedFieldsSent() {
|
|
108
|
+
if (!this.includedFieldsPublished) {
|
|
109
|
+
this.includedFieldsSent = true;
|
|
110
|
+
this.includedFieldsPublished = (async () => {
|
|
111
|
+
for (const field of this.customFields) {
|
|
112
|
+
if (field.isIncludedInSubscriberNotifications && field.hasValue) {
|
|
113
|
+
await this.publishImages(field);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
})();
|
|
117
|
+
}
|
|
118
|
+
await this.includedFieldsPublished;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* A message is about to go out through these custom templates - the ones
|
|
122
|
+
* actually compiled into it. Awaited before the message is sent: it makes
|
|
123
|
+
* the images of the Rich text fields they place ({{customFields.<key>}})
|
|
124
|
+
* public, each field once per send. Never throws.
|
|
125
|
+
*/
|
|
126
|
+
async recordFieldsUsedBy(templates) {
|
|
127
|
+
const keys = IncidentTemplateVariables.getKeysUsedBy(templates);
|
|
128
|
+
for (const key of keys) {
|
|
129
|
+
this.fieldKeysSent.add(key);
|
|
130
|
+
}
|
|
131
|
+
for (const field of this.customFields) {
|
|
132
|
+
if (field.variableKey && keys.has(field.variableKey) && field.hasValue) {
|
|
133
|
+
await this.publishImages(field);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The custom field values this send put into a message, as Markdown for
|
|
139
|
+
* the incident feed's "Subscriber Notification Sent" item, or "" when it
|
|
140
|
+
* sent none. Fields with no value are left out.
|
|
141
|
+
*/
|
|
142
|
+
getSentCustomFieldsMarkdown() {
|
|
143
|
+
var _a;
|
|
144
|
+
const sent = this.customFields.filter((field) => {
|
|
145
|
+
if (!field.hasValue) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
return ((this.includedFieldsSent &&
|
|
149
|
+
field.isIncludedInSubscriberNotifications) ||
|
|
150
|
+
Boolean(field.variableKey && this.fieldKeysSent.has(field.variableKey)));
|
|
151
|
+
});
|
|
152
|
+
if (sent.length === 0) {
|
|
153
|
+
return "";
|
|
154
|
+
}
|
|
155
|
+
const listLines = [];
|
|
156
|
+
const richTextBlocks = [];
|
|
157
|
+
for (const field of sent) {
|
|
158
|
+
const name = escapeMarkdownInline(field.name);
|
|
159
|
+
// Rich text is Markdown already, and goes in as the block it is.
|
|
160
|
+
if (field.customFieldType === CustomFieldType.Markdown) {
|
|
161
|
+
richTextBlocks.push(`**${name}:**\n\n${((_a = field.markdown) === null || _a === void 0 ? void 0 : _a.source) || ""}`);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const value = this.formatValue(field, [
|
|
165
|
+
Timezone.UTC,
|
|
166
|
+
]);
|
|
167
|
+
listLines.push(`- **${name}:** ${escapeMarkdownInline(value.plainText)}`);
|
|
168
|
+
}
|
|
169
|
+
return ["**Custom fields sent:**", listLines.join("\n"), ...richTextBlocks]
|
|
170
|
+
.filter(Boolean)
|
|
171
|
+
.join("\n\n");
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* The included fields for a webhook's data, by Template Variable key:
|
|
175
|
+
* each field's name, type and value as stored (null when it holds none),
|
|
176
|
+
* so an integration reads typed values under keys that survive a rename.
|
|
177
|
+
*/
|
|
178
|
+
getWebhookCustomFields() {
|
|
179
|
+
const customFields = {};
|
|
180
|
+
for (const field of this.customFields) {
|
|
181
|
+
if (!field.isIncludedInSubscriberNotifications || !field.variableKey) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
customFields[field.variableKey] = {
|
|
185
|
+
name: field.name,
|
|
186
|
+
type: field.customFieldType || null,
|
|
187
|
+
value: field.hasValue ? field.value : null,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
return customFields;
|
|
191
|
+
}
|
|
192
|
+
async publishImages(field) {
|
|
193
|
+
var _a;
|
|
194
|
+
if (!field.markdown || !field.markdown.source) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
let published = this.publishedImageFields.get(field.name);
|
|
198
|
+
if (!published) {
|
|
199
|
+
// Never rejects: syncIsPublicForMarkdownImages logs and swallows.
|
|
200
|
+
published = Promise.resolve(syncIsPublicForMarkdownImages(field.markdown.source, true, `incident ${((_a = this.incident.id) === null || _a === void 0 ? void 0 : _a.toString()) || ""} custom field "${field.name}"`));
|
|
201
|
+
this.publishedImageFields.set(field.name, published);
|
|
202
|
+
}
|
|
203
|
+
await published;
|
|
204
|
+
}
|
|
205
|
+
formatValue(field, timezones) {
|
|
206
|
+
if (!field.hasValue) {
|
|
207
|
+
return { plainText: "", markdown: "", html: null };
|
|
208
|
+
}
|
|
209
|
+
const value = field.value;
|
|
210
|
+
switch (field.customFieldType) {
|
|
211
|
+
case CustomFieldType.Markdown: {
|
|
212
|
+
const rendered = field.markdown || { source: "", html: "", plainText: "" };
|
|
213
|
+
return {
|
|
214
|
+
plainText: rendered.plainText,
|
|
215
|
+
markdown: rendered.source,
|
|
216
|
+
html: SafeHtml.fromTrustedHtml(rendered.html),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// Several lines of plain text: escaped, with its line breaks kept.
|
|
220
|
+
case CustomFieldType.LongText: {
|
|
221
|
+
const text = customFieldValueToText(value);
|
|
222
|
+
return {
|
|
223
|
+
plainText: text,
|
|
224
|
+
markdown: text,
|
|
225
|
+
html: SafeHtml.fromTrustedHtml(SafeHtml.escape(text).replace(LINE_BREAK_PATTERN, "<br/>")),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
case CustomFieldType.Boolean: {
|
|
229
|
+
const text = formatCustomFieldBoolean(value);
|
|
230
|
+
return { plainText: text, markdown: text, html: null };
|
|
231
|
+
}
|
|
232
|
+
/*
|
|
233
|
+
* The day that was picked. It is stored as the author's local
|
|
234
|
+
* midnight, not as the day (see formatCustomFieldCalendarDate), so it
|
|
235
|
+
* is not read in the page's time zones: those are the subscribers',
|
|
236
|
+
* not the author's.
|
|
237
|
+
*/
|
|
238
|
+
case CustomFieldType.Date: {
|
|
239
|
+
const text = formatCustomFieldCalendarDate(value);
|
|
240
|
+
return { plainText: text, markdown: text, html: null };
|
|
241
|
+
}
|
|
242
|
+
/*
|
|
243
|
+
* A date and time in the status page's subscriber time zones, as its
|
|
244
|
+
* scheduled maintenance emails show one: a line each in HTML, and
|
|
245
|
+
* separated by commas in text.
|
|
246
|
+
*/
|
|
247
|
+
case CustomFieldType.DateTime: {
|
|
248
|
+
const date = customFieldValueToDate(value);
|
|
249
|
+
if (!date) {
|
|
250
|
+
const text = customFieldValueToText(value);
|
|
251
|
+
return { plainText: text, markdown: text, html: null };
|
|
252
|
+
}
|
|
253
|
+
const lines = OneUptimeDate.getDateAsFormattedArrayInMultipleTimezones({
|
|
254
|
+
date: date,
|
|
255
|
+
timezones: timezones,
|
|
256
|
+
use12HourFormat: true,
|
|
257
|
+
});
|
|
258
|
+
return {
|
|
259
|
+
plainText: lines.join(", "),
|
|
260
|
+
markdown: lines.join(", "),
|
|
261
|
+
html: SafeHtml.fromTrustedHtml(lines
|
|
262
|
+
.map((line) => {
|
|
263
|
+
return SafeHtml.escape(line);
|
|
264
|
+
})
|
|
265
|
+
.join("<br/>")),
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
default: {
|
|
269
|
+
const text = customFieldValueToText(value);
|
|
270
|
+
return { plainText: text, markdown: text, html: null };
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/*
|
|
275
|
+
* The custom field keys these templates place, {{customFields.<key>}},
|
|
276
|
+
* found the way the compiler finds the placeholders it fills.
|
|
277
|
+
*/
|
|
278
|
+
static getKeysUsedBy(templates) {
|
|
279
|
+
const keys = new Set();
|
|
280
|
+
const prefix = getCustomFieldTemplateVariableName("");
|
|
281
|
+
for (const name of SubscriberNotificationTemplateCompiler.getPlaceholderNames(templates)) {
|
|
282
|
+
if (name.startsWith(prefix)) {
|
|
283
|
+
keys.add(name.slice(prefix.length));
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return keys;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
export default class IncidentTemplateVariableBuilder {
|
|
290
|
+
/**
|
|
291
|
+
* Reads what an incident's subscriber messages need, once per send.
|
|
292
|
+
*
|
|
293
|
+
* The incident needs projectId, title, incidentSeverity.name, labels.name
|
|
294
|
+
* and customFields selected. statusPages are the pages the send reaches
|
|
295
|
+
* (IncidentStatusPageScope), and name {{affectedStatusPages}}.
|
|
296
|
+
* markdownVariables are the event's Markdown values - the description, a
|
|
297
|
+
* note, the postmortem - rendered here once for every page;
|
|
298
|
+
* textVariables are its plain ones, such as incidentState and postedAt.
|
|
299
|
+
*
|
|
300
|
+
* customFieldDefinitions skips reading the project's incident custom
|
|
301
|
+
* fields, for a caller that has them already.
|
|
302
|
+
*/
|
|
303
|
+
static async build(data) {
|
|
304
|
+
const incident = data.incident;
|
|
305
|
+
const definitions = data.customFieldDefinitions ||
|
|
306
|
+
(await this.getCustomFieldDefinitions(incident.projectId));
|
|
307
|
+
const customFields = await this.prepareCustomFields({
|
|
308
|
+
definitions: definitions,
|
|
309
|
+
values: incident.customFields,
|
|
310
|
+
});
|
|
311
|
+
const markdownVariables = {};
|
|
312
|
+
for (const [name, source] of Object.entries(data.markdownVariables || {})) {
|
|
313
|
+
markdownVariables[name] = await this.renderMarkdown(source || "");
|
|
314
|
+
}
|
|
315
|
+
/*
|
|
316
|
+
* No image is made public here: nothing has gone out yet, and a send may
|
|
317
|
+
* reach no one (see recordIncludedFieldsSent).
|
|
318
|
+
*/
|
|
319
|
+
return new IncidentTemplateVariables({
|
|
320
|
+
incident: incident,
|
|
321
|
+
customFields: customFields,
|
|
322
|
+
textVariables: Object.assign({}, (data.textVariables || {})),
|
|
323
|
+
markdownVariables: markdownVariables,
|
|
324
|
+
incidentLabels: this.getLabelNames(incident.labels).join(", "),
|
|
325
|
+
affectedStatusPages: this.getAffectedStatusPageNames(data.statusPages).join(", "),
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
/*
|
|
329
|
+
* The name a status page goes by in its subscribers' messages: its page
|
|
330
|
+
* title, or its name.
|
|
331
|
+
*/
|
|
332
|
+
static getStatusPageName(statusPage) {
|
|
333
|
+
return statusPage.pageTitle || statusPage.name || "Status Page";
|
|
334
|
+
}
|
|
335
|
+
/*
|
|
336
|
+
* The pages that show the incident, by the name their subscribers know
|
|
337
|
+
* them by, in the order given (name order, from IncidentStatusPageScope).
|
|
338
|
+
* A page that does not show incidents is left out: the incident is not on
|
|
339
|
+
* it.
|
|
340
|
+
*/
|
|
341
|
+
static getAffectedStatusPageNames(statusPages) {
|
|
342
|
+
const names = [];
|
|
343
|
+
for (const statusPage of statusPages) {
|
|
344
|
+
if (statusPage.showIncidentsOnStatusPage === false) {
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
const name = this.getStatusPageName(statusPage).trim();
|
|
348
|
+
if (name && !names.includes(name)) {
|
|
349
|
+
names.push(name);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return names;
|
|
353
|
+
}
|
|
354
|
+
// Label names, alphabetically, so the order does not depend on a join.
|
|
355
|
+
static getLabelNames(labels) {
|
|
356
|
+
return (labels || [])
|
|
357
|
+
.map((label) => {
|
|
358
|
+
return (label.name || "").trim();
|
|
359
|
+
})
|
|
360
|
+
.filter((name) => {
|
|
361
|
+
return name.length > 0;
|
|
362
|
+
})
|
|
363
|
+
.sort((a, b) => {
|
|
364
|
+
return a.localeCompare(b, undefined, { sensitivity: "base" });
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
// The project's incident custom fields, in the order they are shown.
|
|
368
|
+
static async getCustomFieldDefinitions(projectId) {
|
|
369
|
+
if (!projectId) {
|
|
370
|
+
return [];
|
|
371
|
+
}
|
|
372
|
+
const fields = await IncidentCustomFieldService.findBy({
|
|
373
|
+
query: {
|
|
374
|
+
projectId: projectId,
|
|
375
|
+
},
|
|
376
|
+
select: {
|
|
377
|
+
name: true,
|
|
378
|
+
variableKey: true,
|
|
379
|
+
customFieldType: true,
|
|
380
|
+
includeInSubscriberNotifications: true,
|
|
381
|
+
sortOrder: true,
|
|
382
|
+
},
|
|
383
|
+
// Creation order breaks ties in the order below.
|
|
384
|
+
sort: {
|
|
385
|
+
createdAt: SortOrder.Ascending,
|
|
386
|
+
},
|
|
387
|
+
limit: LIMIT_PER_PROJECT,
|
|
388
|
+
skip: 0,
|
|
389
|
+
props: {
|
|
390
|
+
isRoot: true,
|
|
391
|
+
},
|
|
392
|
+
});
|
|
393
|
+
return fields;
|
|
394
|
+
}
|
|
395
|
+
static async prepareCustomFields(data) {
|
|
396
|
+
// Values are stored under each field's name.
|
|
397
|
+
const values = data.values &&
|
|
398
|
+
typeof data.values === "object" &&
|
|
399
|
+
!Array.isArray(data.values)
|
|
400
|
+
? data.values
|
|
401
|
+
: {};
|
|
402
|
+
const prepared = [];
|
|
403
|
+
const seenNames = new Set();
|
|
404
|
+
for (const definition of sortCustomFieldDefinitions(data.definitions)) {
|
|
405
|
+
const name = typeof definition.name === "string" ? definition.name : "";
|
|
406
|
+
if (!name || seenNames.has(name)) {
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
seenNames.add(name);
|
|
410
|
+
const variableKey = isValidCustomFieldVariableKey(definition.variableKey)
|
|
411
|
+
? definition.variableKey
|
|
412
|
+
: null;
|
|
413
|
+
const value = Object.prototype.hasOwnProperty.call(values, name)
|
|
414
|
+
? values[name]
|
|
415
|
+
: undefined;
|
|
416
|
+
/*
|
|
417
|
+
* 0 and false are values (a Boolean left at No, a count of zero); an
|
|
418
|
+
* answer of only spaces is not, and would show a subscriber a row
|
|
419
|
+
* with nothing in it.
|
|
420
|
+
*/
|
|
421
|
+
const hasValue = !isCustomFieldValueEmpty(value) &&
|
|
422
|
+
!(typeof value === "string" && value.trim().length === 0);
|
|
423
|
+
const field = {
|
|
424
|
+
name: name,
|
|
425
|
+
variableKey: variableKey,
|
|
426
|
+
customFieldType: definition.customFieldType || undefined,
|
|
427
|
+
isIncludedInSubscriberNotifications: definition.includeInSubscriberNotifications === true,
|
|
428
|
+
value: value,
|
|
429
|
+
hasValue: hasValue,
|
|
430
|
+
};
|
|
431
|
+
if (hasValue && field.customFieldType === CustomFieldType.Markdown) {
|
|
432
|
+
field.markdown = await this.renderMarkdown(customFieldValueToText(value));
|
|
433
|
+
}
|
|
434
|
+
prepared.push(field);
|
|
435
|
+
}
|
|
436
|
+
return prepared;
|
|
437
|
+
}
|
|
438
|
+
/*
|
|
439
|
+
* Markdown in the three forms the channels take: HTML through the email
|
|
440
|
+
* renderer (which escapes raw HTML and keeps only safe links), plain text,
|
|
441
|
+
* and the source as written.
|
|
442
|
+
*/
|
|
443
|
+
static async renderMarkdown(source) {
|
|
444
|
+
return {
|
|
445
|
+
source: source,
|
|
446
|
+
html: await Markdown.convertToHTML(source, MarkdownContentType.Email),
|
|
447
|
+
plainText: Markdown.convertToPlainText(source),
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=IncidentTemplateVariableBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncidentTemplateVariableBuilder.js","sourceRoot":"","sources":["../../../../../Server/Utils/StatusPage/IncidentTemplateVariableBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Why a status page that lists an incident's monitors does not reach it (see
|
|
3
|
+
* IncidentStatusPageScope). Kept on its own so the delivery record can name
|
|
4
|
+
* the reason without loading the services the scope helper queries.
|
|
5
|
+
*/
|
|
6
|
+
export var StatusPageExclusionReason;
|
|
7
|
+
(function (StatusPageExclusionReason) {
|
|
8
|
+
// The incident is limited to other status pages.
|
|
9
|
+
StatusPageExclusionReason["OutsideIncidentScope"] = "OutsideIncidentScope";
|
|
10
|
+
// The page only shows incidents limited to it, and this one is not.
|
|
11
|
+
StatusPageExclusionReason["OnlyShowsScopedIncidents"] = "OnlyShowsScopedIncidents";
|
|
12
|
+
})(StatusPageExclusionReason || (StatusPageExclusionReason = {}));
|
|
13
|
+
//# sourceMappingURL=StatusPageExclusion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusPageExclusion.js","sourceRoot":"","sources":["../../../../../Server/Utils/StatusPage/StatusPageExclusion.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAN,IAAY,yBAKX;AALD,WAAY,yBAAyB;IACnC,iDAAiD;IACjD,0EAA6C,CAAA;IAC7C,oEAAoE;IACpE,kFAAqD,CAAA;AACvD,CAAC,EALW,yBAAyB,KAAzB,yBAAyB,QAKpC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import LIMIT_MAX from "../../../Types/Database/LimitMax";
|
|
2
|
+
import NotAuthorizedException from "../../../Types/Exception/NotAuthorizedException";
|
|
3
|
+
import IncidentScopeAddedPagesNotification from "../../../Types/StatusPage/IncidentScopeAddedPagesNotification";
|
|
4
|
+
import StatusPageService from "../../Services/StatusPageService";
|
|
5
|
+
import QueryHelper from "../../Types/Database/QueryHelper";
|
|
6
|
+
/*
|
|
7
|
+
* Which status pages a caller may pick for an incident or an incident
|
|
8
|
+
* template to be limited to.
|
|
9
|
+
*
|
|
10
|
+
* Limiting an incident to a status page decides who is told about it, so
|
|
11
|
+
* picking a page needs read access to it - the way picking an incident's
|
|
12
|
+
* monitors needs monitor read access. Incident roles do not read status
|
|
13
|
+
* pages, and status page access can be limited to pages with some labels, so
|
|
14
|
+
* someone who may edit an incident may still be unable to see some (or all)
|
|
15
|
+
* of the project's status pages. The dashboard's picker only lists the pages
|
|
16
|
+
* the person can read; this is the same rule for the API, so an incident
|
|
17
|
+
* member cannot reach a page they were deliberately not given through a
|
|
18
|
+
* hand-written request.
|
|
19
|
+
*
|
|
20
|
+
* Only pages being added are checked. Pages an incident or template is
|
|
21
|
+
* already limited to stay, even when the person saving cannot read them
|
|
22
|
+
* (IncidentService keeps them on every edit).
|
|
23
|
+
*/
|
|
24
|
+
export default class StatusPageReadAccess {
|
|
25
|
+
/*
|
|
26
|
+
* Which of these status pages the caller can read, through the status page
|
|
27
|
+
* permissions and labels they actually hold, lower-cased. A caller with no
|
|
28
|
+
* status page read access at all can read none of them.
|
|
29
|
+
*/
|
|
30
|
+
static async getReadableStatusPageIds(data) {
|
|
31
|
+
const statusPageIds = IncidentScopeAddedPagesNotification.normalizeStatusPageIds(data.statusPageIds);
|
|
32
|
+
if (statusPageIds.length === 0) {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
if (data.props.isRoot) {
|
|
36
|
+
return statusPageIds;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const statusPages = await StatusPageService.findBy({
|
|
40
|
+
query: {
|
|
41
|
+
_id: QueryHelper.any(statusPageIds),
|
|
42
|
+
},
|
|
43
|
+
select: {
|
|
44
|
+
_id: true,
|
|
45
|
+
},
|
|
46
|
+
limit: LIMIT_MAX,
|
|
47
|
+
skip: 0,
|
|
48
|
+
props: data.props,
|
|
49
|
+
});
|
|
50
|
+
return IncidentScopeAddedPagesNotification.normalizeStatusPageIds(statusPages);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (err instanceof NotAuthorizedException) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/*
|
|
60
|
+
* Refuses status pages the caller cannot read. `allowedStatusPageIds` are
|
|
61
|
+
* pages the caller may pick without reading them - an incident template's
|
|
62
|
+
* pages, which a project admin chose for everyone who declares from it.
|
|
63
|
+
* Root (internal) callers pick any page.
|
|
64
|
+
*/
|
|
65
|
+
static async assertCallerCanPickStatusPages(data) {
|
|
66
|
+
if (data.props.isRoot) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const allowed = IncidentScopeAddedPagesNotification.normalizeStatusPageIds(data.allowedStatusPageIds || []);
|
|
70
|
+
const toCheck = IncidentScopeAddedPagesNotification.normalizeStatusPageIds(data.statusPageIds).filter((id) => {
|
|
71
|
+
return !allowed.includes(id);
|
|
72
|
+
});
|
|
73
|
+
if (toCheck.length === 0) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const readable = await this.getReadableStatusPageIds({
|
|
77
|
+
statusPageIds: toCheck,
|
|
78
|
+
props: data.props,
|
|
79
|
+
});
|
|
80
|
+
const unreadable = toCheck.filter((id) => {
|
|
81
|
+
return !readable.includes(id);
|
|
82
|
+
});
|
|
83
|
+
if (unreadable.length > 0) {
|
|
84
|
+
throw new NotAuthorizedException(this.getRefusalMessage(data.subject));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
static getRefusalMessage(subject) {
|
|
88
|
+
return `You do not have access to some of the status pages you picked, so this ${subject} cannot be limited to them. Picking status pages needs a role that can read them, such as Status Page Viewer (it can be limited to pages with certain labels).`;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=StatusPageReadAccess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusPageReadAccess.js","sourceRoot":"","sources":["../../../../../Server/Utils/StatusPage/StatusPageReadAccess.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,kCAAkC,CAAC;AACzD,OAAO,sBAAsB,MAAM,iDAAiD,CAAC;AACrF,OAAO,mCAAmC,MAAM,+DAA+D,CAAC;AAChH,OAAO,iBAAiB,MAAM,kCAAkC,CAAC;AACjE,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAE3D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC;;;;OAIG;IACI,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAG5C;QACC,MAAM,aAAa,GACjB,mCAAmC,CAAC,sBAAsB,CACxD,IAAI,CAAC,aAAa,CACnB,CAAC;QAEJ,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,GAAsB,MAAM,iBAAiB,CAAC,MAAM,CAAC;gBACpE,KAAK,EAAE;oBACL,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC;iBACpC;gBACD,MAAM,EAAE;oBACN,GAAG,EAAE,IAAI;iBACV;gBACD,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;YAEH,OAAO,mCAAmC,CAAC,sBAAsB,CAC/D,WAAW,CACZ,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;gBAC1C,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,IAMlD;QACC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GACX,mCAAmC,CAAC,sBAAsB,CACxD,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAChC,CAAC;QAEJ,MAAM,OAAO,GACX,mCAAmC,CAAC,sBAAsB,CACxD,IAAI,CAAC,aAAa,CACnB,CAAC,MAAM,CAAC,CAAC,EAAU,EAAW,EAAE;YAC/B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEL,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAkB,MAAM,IAAI,CAAC,wBAAwB,CAAC;YAClE,aAAa,EAAE,OAAO;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAkB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAU,EAAW,EAAE;YACvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,sBAAsB,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,iBAAiB,CAAC,OAAe;QAC7C,OAAO,0EAA0E,OAAO,gKAAgK,CAAC;IAC3P,CAAC;CACF"}
|