@oneuptime/common 14.0.7 → 14.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/Incident.ts +267 -1
- package/Models/DatabaseModels/IncidentCustomField.ts +202 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +30 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +126 -1
- package/Models/DatabaseModels/StatusPage.ts +55 -0
- package/Models/DatabaseModels/StatusPageSubscriber.ts +128 -0
- package/Server/API/IncidentAPI.ts +162 -0
- package/Server/API/StatusPageAPI.ts +487 -171
- package/Server/API/StatusPageSubscriberAPI.ts +63 -15
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.ts +108 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.ts +168 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.ts +44 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Infrastructure/Semaphore.ts +10 -0
- package/Server/Middleware/IdentityRateLimit.ts +108 -3
- package/Server/Middleware/SubscriberNotificationPreviewRateLimit.ts +237 -0
- package/Server/Middleware/SubscriberNotificationTestSendRateLimit.ts +304 -0
- package/Server/Services/DatabaseService.ts +93 -10
- package/Server/Services/IncidentCustomFieldService.ts +276 -1
- package/Server/Services/IncidentEpisodePublicNoteService.ts +28 -0
- package/Server/Services/IncidentEpisodeService.ts +15 -0
- package/Server/Services/IncidentEpisodeStateTimelineService.ts +27 -1
- package/Server/Services/IncidentPublicNoteService.ts +30 -1
- package/Server/Services/IncidentService.ts +1535 -65
- package/Server/Services/IncidentStateTimelineService.ts +13 -0
- package/Server/Services/IncidentTemplateService.ts +109 -0
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +30 -1
- package/Server/Services/ScheduledMaintenanceService.ts +68 -18
- package/Server/Services/SmsService.ts +10 -0
- package/Server/Services/StatusPageService.ts +65 -8
- package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +299 -37
- package/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.ts +129 -0
- package/Server/Services/StatusPageSubscriberService.ts +1161 -64
- package/Server/Types/Markdown.ts +153 -6
- package/Server/Types/Workflow/Components/Email.ts +61 -2
- package/Server/Utils/CustomField/CustomFieldRename.ts +378 -0
- package/Server/Utils/DataSource/EgressGuard.ts +66 -21
- package/Server/Utils/Mail/PinnedSmtpSocket.ts +130 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +10 -0
- package/Server/Utils/SSRFProtection.ts +76 -16
- package/Server/Utils/StatusPage/IncidentStatusPageScope.ts +948 -0
- package/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.ts +656 -0
- package/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.ts +805 -0
- package/Server/Utils/StatusPage/StatusPageExclusion.ts +18 -0
- package/Server/Utils/StatusPage/StatusPageReadAccess.ts +125 -0
- package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.ts +151 -0
- package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.ts +70 -0
- package/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.ts +421 -0
- package/Server/Utils/StatusPage/SubscriberNotificationClaim.ts +107 -0
- package/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.ts +1049 -0
- package/Server/Utils/StatusPage/SubscriberNotificationFanOut.ts +180 -0
- package/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.ts +839 -0
- package/Server/Utils/StatusPage/SubscriberNotificationResendAccess.ts +393 -0
- package/Server/Utils/StatusPage/SubscriberNotificationRunLimit.ts +246 -0
- package/Server/Utils/StatusPage/SubscriberNotificationTiming.ts +133 -0
- package/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.ts +215 -0
- package/Server/Utils/StatusPageResource.ts +51 -20
- package/Server/Utils/VM/VMAPI.ts +1 -0
- package/Server/Utils/VM/VMRunner.ts +10 -0
- package/Server/Utils/Workflow/OAuth2TokenClient.ts +10 -0
- package/Server/Views/Partials/SensitiveUrlToken.ejs +8 -5
- package/Tests/App/Accounts/RegisterVerifyEmail.test.tsx +748 -0
- package/Tests/App/Accounts/ResendVerificationEmail.test.tsx +1222 -0
- package/Tests/App/Accounts/VerificationEmailResendUtils.test.ts +797 -0
- package/Tests/App/Accounts/VerifyEmailPending.test.tsx +538 -0
- package/Tests/App/Accounts/VerifyEmailResend.test.tsx +779 -0
- package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +357 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +776 -0
- package/Tests/App/Dashboard/EventNotesPages.test.tsx +119 -0
- package/Tests/App/Dashboard/EventNotesUtil.test.ts +116 -17
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +242 -5
- package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +91 -1
- package/Tests/App/Dashboard/IncidentCreateDetailsStep.test.tsx +643 -0
- package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +8 -1
- package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +601 -0
- package/Tests/App/Dashboard/IncidentCustomFieldTemplateVariables.test.tsx +386 -0
- package/Tests/App/Dashboard/IncidentNoteTemplatePlaceholders.test.tsx +124 -0
- package/Tests/App/Dashboard/IncidentNoteTemplateVariablesLoader.test.ts +305 -0
- package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +112 -0
- package/Tests/App/Dashboard/IncidentSettingsRenotifyOnPublish.test.tsx +674 -0
- package/Tests/App/Dashboard/IncidentSettingsStatusPageScope.test.tsx +1051 -0
- package/Tests/App/Dashboard/IncidentTemplateCustomFields.test.tsx +384 -0
- package/Tests/App/Dashboard/IncidentTemplateStatusPageScopeCard.test.tsx +215 -0
- package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +113 -1
- package/Tests/App/Dashboard/SubscriberAudienceSummary.test.tsx +512 -0
- package/Tests/App/Dashboard/SubscriberNotificationPreviewModal.test.tsx +837 -0
- package/Tests/App/Dashboard/SubscriberNotificationStatusLabel.test.tsx +88 -0
- package/Tests/App/Dashboard/SubscriberNotificationStatusResend.test.tsx +473 -0
- package/Tests/App/Dashboard/SubscriberTemplateLivePreview.test.tsx +196 -0
- package/Tests/App/Dashboard/TeamAddedSubscribersUnsubscribedNotice.test.tsx +248 -0
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +64 -3
- package/Tests/App/StatusPage/StatusPageUnsubscribePage.test.tsx +412 -0
- package/Tests/Models/IncidentCustomFieldApiSchemaContract.test.ts +217 -0
- package/Tests/Models/IncidentCustomFieldCreateSettingsColumns.test.ts +252 -0
- package/Tests/Models/StatusPageSubscriberUnsubscribeColumns.test.ts +218 -0
- package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +7 -0
- package/Tests/Server/API/IncidentSubscriberAudienceAPI.test.ts +1408 -0
- package/Tests/Server/API/StatusPageIncidentScope.test.ts +1868 -0
- package/Tests/Server/API/StatusPageIncidentScopePostgres.test.ts +790 -0
- package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +10 -1
- package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +206 -18
- package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +14 -2
- package/Tests/Server/API/StatusPageSubscriberCreateResponse.test.ts +217 -0
- package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +103 -2
- package/Tests/Server/API/StatusPageUnsubscribeAPI.test.ts +396 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentStatusPageScopeMigration.test.ts +395 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentTemplateStatusPageScopeFlagMigration.test.ts +150 -0
- package/Tests/Server/Infrastructure/Postgres/AddSubscriberNotificationClaimedAtMigration.test.ts +156 -0
- package/Tests/Server/Infrastructure/Postgres/SkipHiddenIncidentCreatedNotificationsMigration.test.ts +410 -0
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +551 -1
- package/Tests/Server/Middleware/SubscriberNotificationPreviewRateLimit.test.ts +238 -0
- package/Tests/Server/Middleware/SubscriberNotificationTestSendRateLimit.test.ts +245 -0
- package/Tests/Server/Services/AddStatusPageSubscriberUnsubscribeTokenMigration.test.ts +152 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +221 -36
- package/Tests/Server/Services/DatabaseServiceCompareAndSetColumns.test.ts +191 -0
- package/Tests/Server/Services/IncidentCreatedRenotifyOnPublish.test.ts +681 -0
- package/Tests/Server/Services/IncidentCreatedResend.test.ts +775 -0
- package/Tests/Server/Services/IncidentCustomFieldRenamePostgres.test.ts +713 -0
- package/Tests/Server/Services/IncidentCustomFieldService.test.ts +751 -0
- package/Tests/Server/Services/IncidentCustomFieldValueValidation.test.ts +556 -0
- package/Tests/Server/Services/IncidentStatusPageScope.test.ts +2971 -0
- package/Tests/Server/Services/IncidentStatusPageScopeFeed.test.ts +131 -0
- package/Tests/Server/Services/IncidentStatusPageScopePostgres.test.ts +625 -0
- package/Tests/Server/Services/IncidentTemplateCustomFieldsCopy.test.ts +311 -0
- package/Tests/Server/Services/IncidentTemplateStatusPageScope.test.ts +363 -0
- package/Tests/Server/Services/PublicNoteEditFeedEventType.test.ts +213 -0
- package/Tests/Server/Services/PublicNoteResendAccess.test.ts +994 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +289 -9
- package/Tests/Server/Services/SmsServiceFailIfNotSent.test.ts +67 -0
- package/Tests/Server/Services/StatusPageReportIncidentCounts.test.ts +610 -0
- package/Tests/Server/Services/StatusPageSubscriberAudienceCounts.test.ts +201 -0
- package/Tests/Server/Services/StatusPageSubscriberAudienceCountsPostgres.test.ts +271 -0
- package/Tests/Server/Services/StatusPageSubscriberConfirmationTemplateEscaping.test.ts +200 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationLogRedaction.test.ts +54 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +37 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateIncidentRecordAccess.test.ts +772 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookup.test.ts +506 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookupPostgres.test.ts +261 -0
- package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +21 -5
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribe.test.ts +1618 -0
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribeLinkSenders.test.ts +373 -0
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribePostgres.test.ts +388 -0
- package/Tests/Server/Services/SubscriberNotificationInFlightRequeue.test.ts +500 -0
- package/Tests/Server/Types/MarkdownEmailLinks.test.ts +320 -0
- package/Tests/Server/Types/Workflow/Components/Email.test.ts +491 -1
- package/Tests/Server/Types/Workflow/Components/EmailSmtpPinning.test.ts +398 -0
- package/Tests/Server/Utils/CustomField/CustomFieldRename.test.ts +586 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +246 -10
- package/Tests/Server/Utils/DataSource/EgressGuardDeploymentConfig.test.ts +226 -0
- package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +131 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +4 -0
- package/Tests/Server/Utils/EgressPolicyEnvironment.ts +45 -0
- package/Tests/Server/Utils/Mail/PinnedSmtpSocket.test.ts +409 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +23 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionResolutionDetail.test.ts +314 -0
- package/Tests/Server/Utils/StatusPage/IncidentStatusPageScope.test.ts +1699 -0
- package/Tests/Server/Utils/StatusPage/IncidentStatusPageScopeQueriesPostgres.test.ts +508 -0
- package/Tests/Server/Utils/StatusPage/IncidentSubscriberAudienceCallerPermission.test.ts +246 -0
- package/Tests/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.test.ts +1348 -0
- package/Tests/Server/Utils/StatusPage/StatusPageReadAccess.test.ts +221 -0
- package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.test.ts +132 -0
- package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.test.ts +155 -0
- package/Tests/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.test.ts +708 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaim.test.ts +255 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaimPostgres.test.ts +528 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.test.ts +1238 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationFanOut.test.ts +472 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.test.ts +1168 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationRunLimit.test.ts +275 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationTiming.test.ts +131 -0
- package/Tests/Server/Utils/StatusPageResource.test.ts +98 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +17 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +75 -0
- package/Tests/Types/CustomField/CustomFieldSavedViews.test.ts +247 -0
- package/Tests/Types/CustomField/CustomFieldTemplateValues.test.ts +186 -0
- package/Tests/Types/CustomField/CustomFieldTypeCorrespondence.test.ts +48 -0
- package/Tests/Types/CustomField/CustomFieldValueFormat.test.ts +215 -0
- package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +343 -0
- package/Tests/Types/CustomField/CustomFieldVariableKey.test.ts +364 -0
- package/Tests/Types/SafeHtml.test.ts +102 -0
- package/Tests/Types/StatusPage/IncidentCreatedRenotify.test.ts +419 -0
- package/Tests/Types/StatusPage/IncidentCreatedResend.test.ts +118 -0
- package/Tests/Types/StatusPage/IncidentScopeAddedPagesNotification.test.ts +558 -0
- package/Tests/Types/StatusPage/IncidentSubscriberAudience.test.ts +284 -0
- package/Tests/Types/StatusPage/StatusPageSubscriberUnsubscribe.test.ts +341 -0
- package/Tests/Types/StatusPage/SubscriberNotificationPreview.test.ts +196 -0
- package/Tests/Types/StatusPage/SubscriberNotificationResend.test.ts +201 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateCompiler.test.ts +277 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplatePreview.test.ts +179 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +324 -0
- package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +60 -13
- package/Tests/UI/Components/CustomFields/CustomFieldFormFields.test.ts +432 -0
- package/Tests/UI/Components/CustomFields/CustomFieldModelFormFields.test.tsx +685 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetailOrder.test.tsx +469 -0
- package/Tests/UI/Components/Forms/ModelFormCustomFieldInputs.test.tsx +325 -0
- package/Tests/UI/Components/Forms/ModelFormDropdownOptionsRefused.test.tsx +358 -0
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +22 -0
- package/Tests/UI/Monitor/NetworkPathView.test.tsx +289 -0
- package/Tests/Utils/Incident/IncidentNoteTemplateVariables.test.ts +623 -0
- package/Tests/Utils/Markdown/MarkdownEscape.test.ts +89 -0
- package/Tests/Utils/ProbeNetworkFailureUtil.test.ts +992 -0
- package/Tests/Utils/RequestFailedDetails.test.ts +575 -0
- package/Types/CustomField/CustomFieldOrder.ts +55 -0
- package/Types/CustomField/CustomFieldSavedViews.ts +225 -0
- package/Types/CustomField/CustomFieldTemplateMerge.ts +71 -0
- package/Types/CustomField/CustomFieldType.ts +14 -0
- package/Types/CustomField/CustomFieldValueFormat.ts +161 -0
- package/Types/CustomField/CustomFieldValueValidator.ts +488 -0
- package/Types/CustomField/CustomFieldVariableKey.ts +211 -0
- package/Types/SafeHtml.ts +93 -0
- package/Types/StatusPage/IncidentCreatedRenotify.ts +224 -0
- package/Types/StatusPage/IncidentCreatedResend.ts +108 -0
- package/Types/StatusPage/IncidentScopeAddedPagesNotification.ts +343 -0
- package/Types/StatusPage/IncidentSubscriberAudience.ts +332 -0
- package/Types/StatusPage/StatusPageSubscriberUnsubscribe.ts +405 -0
- package/Types/StatusPage/SubscriberNotificationInterruption.ts +32 -0
- package/Types/StatusPage/SubscriberNotificationPreview.ts +322 -0
- package/Types/StatusPage/SubscriberNotificationResend.ts +132 -0
- package/Types/StatusPage/SubscriberNotificationTemplateCompiler.ts +180 -0
- package/Types/StatusPage/SubscriberNotificationTemplatePreview.ts +301 -0
- package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +217 -4
- package/Types/StatusPage/SubscriberUpdateNotification.ts +32 -11
- package/UI/Components/CustomFields/CustomFieldFormFields.ts +317 -0
- package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +395 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +95 -55
- package/UI/Components/Forms/ModelForm.tsx +70 -8
- package/UI/Components/Forms/Validation.ts +1 -1
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +2 -4
- package/UI/Components/ModelTable/AnalyticsModelTable.tsx +2 -6
- package/UI/Components/ModelTable/BaseModelTable.tsx +9 -8
- package/UI/Components/ModelTable/CustomFieldColumns.tsx +14 -1
- package/UI/Components/ModelTable/ModelTable.tsx +6 -7
- package/UI/Utils/SensitiveUrlToken.ts +10 -5
- package/Utils/API.ts +247 -2
- package/Utils/Incident/IncidentNoteTemplateVariables.ts +304 -0
- package/Utils/Markdown/MarkdownEscape.ts +65 -0
- package/Utils/ProbeNetworkFailureUtil.ts +673 -0
- package/build/dist/Models/DatabaseModels/Incident.js +267 -1
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js +207 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +31 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +124 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +56 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +131 -0
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +100 -1
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +417 -176
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageSubscriberAPI.js +52 -13
- package/build/dist/Server/API/StatusPageSubscriberAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js +57 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js +29 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +3 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +89 -3
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js +149 -0
- package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js.map +1 -0
- package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js +190 -0
- package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js.map +1 -0
- package/build/dist/Server/Services/DatabaseService.js +56 -7
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentCustomFieldService.js +204 -8
- package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +14 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +26 -0
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +26 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +1052 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +83 -0
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +26 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +47 -17
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/SmsService.js +2 -22
- package/build/dist/Server/Services/SmsService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +47 -9
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +237 -32
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js +109 -0
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +925 -99
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +110 -6
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Email.js +55 -6
- package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
- package/build/dist/Server/Utils/CustomField/CustomFieldRename.js +211 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldRename.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +41 -12
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js +101 -0
- package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +48 -6
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js +631 -0
- package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js +403 -0
- package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js +451 -0
- package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js +13 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js +91 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js +101 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js +47 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js +273 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js +73 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js +722 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js +102 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js +527 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js +278 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js +137 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js +103 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js +114 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPageResource.js +39 -7
- package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +1 -0
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +3 -0
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldOrder.js +36 -0
- package/build/dist/Types/CustomField/CustomFieldOrder.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldSavedViews.js +135 -0
- package/build/dist/Types/CustomField/CustomFieldSavedViews.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js +27 -0
- package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldType.js +12 -0
- package/build/dist/Types/CustomField/CustomFieldType.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldValueFormat.js +126 -0
- package/build/dist/Types/CustomField/CustomFieldValueFormat.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js +280 -0
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldVariableKey.js +150 -0
- package/build/dist/Types/CustomField/CustomFieldVariableKey.js.map +1 -0
- package/build/dist/Types/SafeHtml.js +84 -0
- package/build/dist/Types/SafeHtml.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js +117 -0
- package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentCreatedResend.js +86 -0
- package/build/dist/Types/StatusPage/IncidentCreatedResend.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js +246 -0
- package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js +183 -0
- package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js +277 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js +27 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js +190 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationResend.js +102 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationResend.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js +97 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js +175 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +144 -4
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -1
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +29 -9
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js +169 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +212 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +64 -49
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +39 -5
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +1 -1
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/AnalyticsModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +13 -1
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +10 -5
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -1
- package/build/dist/Utils/API.js +177 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js +155 -0
- package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js.map +1 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js +48 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -1
- package/build/dist/Utils/ProbeNetworkFailureUtil.js +460 -0
- package/build/dist/Utils/ProbeNetworkFailureUtil.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,631 @@
|
|
|
1
|
+
import SortOrder from "../../../Types/BaseDatabase/SortOrder";
|
|
2
|
+
import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
|
|
3
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
4
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
5
|
+
import IncidentScopeAddedPagesNotification from "../../../Types/StatusPage/IncidentScopeAddedPagesNotification";
|
|
6
|
+
import IncidentEpisodeMemberService from "../../Services/IncidentEpisodeMemberService";
|
|
7
|
+
import IncidentService from "../../Services/IncidentService";
|
|
8
|
+
import StatusPageResourceService from "../../Services/StatusPageResourceService";
|
|
9
|
+
import StatusPageSubscriberService from "../../Services/StatusPageSubscriberService";
|
|
10
|
+
import QueryHelper from "../../Types/Database/QueryHelper";
|
|
11
|
+
import logger from "../Logger";
|
|
12
|
+
import { StatusPageExclusionReason, } from "./StatusPageExclusion";
|
|
13
|
+
/*
|
|
14
|
+
* Which status pages an incident reaches - which pages show it, and whose
|
|
15
|
+
* subscribers hear about it. This is the only place that decides it; the
|
|
16
|
+
* subscriber jobs, the public status page and the reports all ask here, and
|
|
17
|
+
* a guard test (IncidentStatusPageScopeCallSites.test.ts) fails on code that
|
|
18
|
+
* works it out for itself from an incident's monitors.
|
|
19
|
+
*
|
|
20
|
+
* An incident reaches a status page through its monitors: a page reaches
|
|
21
|
+
* every incident on a monitor it lists (directly or through a monitor group).
|
|
22
|
+
* Two things narrow that:
|
|
23
|
+
*
|
|
24
|
+
* - Incident.statusPages. A scoped incident (isScopedToStatusPages) reaches
|
|
25
|
+
* only the pages it is limited to AMONG the pages its monitors reach. The
|
|
26
|
+
* two sets intersect: a scope never puts an incident on a page that does
|
|
27
|
+
* not list its monitors. A scope whose pages have all been deleted is a
|
|
28
|
+
* scope to nothing - the incident reaches no page at all, rather than every
|
|
29
|
+
* page its monitors reach.
|
|
30
|
+
* - StatusPage.onlyShowScopedIncidents. Such a page never reaches an unscoped
|
|
31
|
+
* incident, so an incident a monitor, Slack, Teams, the API or AI created
|
|
32
|
+
* on a monitor shared by many pages reaches none of them until someone
|
|
33
|
+
* scopes it.
|
|
34
|
+
*
|
|
35
|
+
* Both flags fail closed. isScopedToStatusPages is read here, never trusted
|
|
36
|
+
* from a caller. A status page whose onlyShowScopedIncidents was not loaded
|
|
37
|
+
* is treated as showing only scoped incidents, and an incident whose scope
|
|
38
|
+
* was not loaded is in no page's scope: a select that forgets a column then
|
|
39
|
+
* hides an incident, visibly, instead of broadcasting it to pages that opted
|
|
40
|
+
* out.
|
|
41
|
+
*
|
|
42
|
+
* Scope is applied in SQL for the status page queries (two queries split on
|
|
43
|
+
* isScopedToStatusPages), never as a post-filter: those queries are capped at
|
|
44
|
+
* LIMIT_PER_PROJECT, and a filter applied after the cap would silently drop
|
|
45
|
+
* incidents that are in scope.
|
|
46
|
+
*
|
|
47
|
+
* Nothing here selects statusPages, isScopedToStatusPages or
|
|
48
|
+
* statusPagesNotifiedOnCreation into the incidents it returns for display, so
|
|
49
|
+
* one audience's page names cannot reach another audience's public page.
|
|
50
|
+
*/
|
|
51
|
+
export { StatusPageExclusionReason };
|
|
52
|
+
// The incident columns that say where an incident reaches. Never public.
|
|
53
|
+
export const INCIDENT_SCOPE_COLUMNS = [
|
|
54
|
+
"statusPages",
|
|
55
|
+
"isScopedToStatusPages",
|
|
56
|
+
"statusPagesNotifiedOnCreation",
|
|
57
|
+
];
|
|
58
|
+
/*
|
|
59
|
+
* What isIncidentInScope reads of an incident, for a caller that reads
|
|
60
|
+
* incidents by id (an episode's members) and applies the scope in memory.
|
|
61
|
+
* Such a caller removes the columns again (removeScopeColumns) before
|
|
62
|
+
* anything it read is serialized.
|
|
63
|
+
*/
|
|
64
|
+
export const INCIDENT_SCOPE_SELECT = {
|
|
65
|
+
isScopedToStatusPages: true,
|
|
66
|
+
statusPages: {
|
|
67
|
+
_id: true,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
// What every subscriber job reads of the resources an incident affects.
|
|
71
|
+
export const SUBSCRIBER_NOTIFICATION_RESOURCE_SELECT = {
|
|
72
|
+
_id: true,
|
|
73
|
+
displayName: true,
|
|
74
|
+
statusPageId: true,
|
|
75
|
+
statusPageGroupId: true,
|
|
76
|
+
statusPageGroup: {
|
|
77
|
+
name: true,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
export default class IncidentStatusPageScope {
|
|
81
|
+
/*
|
|
82
|
+
* The status pages these saved incidents reach, with the resources each
|
|
83
|
+
* page lists that they affect. Several incidents - an episode's members -
|
|
84
|
+
* reach the union of what each one reaches, each through its own scope.
|
|
85
|
+
*
|
|
86
|
+
* Each incident needs _id and its monitors. Its scope is read from the
|
|
87
|
+
* database here rather than taken from the objects passed in, so a caller
|
|
88
|
+
* that did not select it (or selected it a while ago) cannot widen the
|
|
89
|
+
* reach. An incident that is no longer found reaches nothing.
|
|
90
|
+
*/
|
|
91
|
+
static async resolvePagesForIncidents(data) {
|
|
92
|
+
const incidentIds = [];
|
|
93
|
+
for (const incident of data.incidents) {
|
|
94
|
+
const incidentId = this.getIncidentId(incident);
|
|
95
|
+
if (!incidentId) {
|
|
96
|
+
throw new BadDataException("Cannot work out which status pages an incident reaches without its id.");
|
|
97
|
+
}
|
|
98
|
+
if (!incidentIds.includes(incidentId)) {
|
|
99
|
+
incidentIds.push(incidentId);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const scopes = await this.getIncidentScopes(incidentIds);
|
|
103
|
+
const reaches = [];
|
|
104
|
+
for (const incident of data.incidents) {
|
|
105
|
+
const incidentId = this.getIncidentId(incident);
|
|
106
|
+
reaches.push({
|
|
107
|
+
incidentId: incidentId,
|
|
108
|
+
monitorIds: this.getMonitorIds(incident.monitors),
|
|
109
|
+
/*
|
|
110
|
+
* Not found: deleted since, or not readable. Scoped to nothing, so it
|
|
111
|
+
* reaches no page.
|
|
112
|
+
*/
|
|
113
|
+
scopedStatusPageIds: Object.prototype.hasOwnProperty.call(scopes, incidentId)
|
|
114
|
+
? scopes[incidentId]
|
|
115
|
+
: [],
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return this.resolvePagesForReaches({
|
|
119
|
+
reaches: reaches,
|
|
120
|
+
resourceSelect: data.resourceSelect,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/*
|
|
124
|
+
* The status pages an incident that is not saved yet would reach: the
|
|
125
|
+
* monitors and pages picked on a form. An empty page list is unscoped, the
|
|
126
|
+
* way IncidentService derives isScopedToStatusPages on create.
|
|
127
|
+
*/
|
|
128
|
+
static async resolvePagesForDraftIncident(data) {
|
|
129
|
+
const statusPageIds = IncidentScopeAddedPagesNotification.normalizeStatusPageIds(data.statusPageIds || []);
|
|
130
|
+
return this.resolvePagesForReaches({
|
|
131
|
+
reaches: [
|
|
132
|
+
{
|
|
133
|
+
monitorIds: data.monitorIds,
|
|
134
|
+
scopedStatusPageIds: statusPageIds.length > 0 ? statusPageIds : null,
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
resourceSelect: data.resourceSelect,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/*
|
|
141
|
+
* The incidents of an episode, each with its _id and monitors, ready for
|
|
142
|
+
* resolvePagesForIncidents. An episode reaches the union of the pages its
|
|
143
|
+
* member incidents reach.
|
|
144
|
+
*/
|
|
145
|
+
static async getEpisodeMemberIncidents(incidentEpisodeId) {
|
|
146
|
+
const members = await IncidentEpisodeMemberService.findBy({
|
|
147
|
+
query: {
|
|
148
|
+
incidentEpisodeId: incidentEpisodeId,
|
|
149
|
+
},
|
|
150
|
+
select: {
|
|
151
|
+
incidentId: true,
|
|
152
|
+
incident: {
|
|
153
|
+
_id: true,
|
|
154
|
+
monitors: {
|
|
155
|
+
_id: true,
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
props: {
|
|
160
|
+
isRoot: true,
|
|
161
|
+
},
|
|
162
|
+
limit: LIMIT_PER_PROJECT,
|
|
163
|
+
skip: 0,
|
|
164
|
+
});
|
|
165
|
+
const incidents = [];
|
|
166
|
+
const seenIncidentIds = new Set();
|
|
167
|
+
for (const member of members) {
|
|
168
|
+
const incident = member.incident;
|
|
169
|
+
if (!incident) {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
// The relation's own _id, or the member's foreign key when it is not.
|
|
173
|
+
if (!incident._id && member.incidentId) {
|
|
174
|
+
incident._id = member.incidentId.toString();
|
|
175
|
+
}
|
|
176
|
+
const incidentId = this.getIncidentId(incident);
|
|
177
|
+
if (!incidentId || seenIncidentIds.has(incidentId)) {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
seenIncidentIds.add(incidentId);
|
|
181
|
+
incidents.push(incident);
|
|
182
|
+
}
|
|
183
|
+
return incidents;
|
|
184
|
+
}
|
|
185
|
+
/*
|
|
186
|
+
* The pages a set of reaches adds up to. Unscoped incidents are looked up
|
|
187
|
+
* together (their pages are filtered the same way); each scoped incident on
|
|
188
|
+
* its own, since its resources are filtered to its own pages.
|
|
189
|
+
*/
|
|
190
|
+
static async resolvePagesForReaches(data) {
|
|
191
|
+
const resourceSelect = Object.assign(Object.assign({}, (data.resourceSelect || SUBSCRIBER_NOTIFICATION_RESOURCE_SELECT)), {
|
|
192
|
+
// Needed to group and to dedupe, whatever the caller asked for.
|
|
193
|
+
_id: true, statusPageId: true });
|
|
194
|
+
const isScoped = data.reaches.some((reach) => {
|
|
195
|
+
return reach.scopedStatusPageIds !== null;
|
|
196
|
+
});
|
|
197
|
+
const batches = [];
|
|
198
|
+
const unscopedMonitorIds = this.distinctMonitorIds(data.reaches
|
|
199
|
+
.filter((reach) => {
|
|
200
|
+
return reach.scopedStatusPageIds === null;
|
|
201
|
+
})
|
|
202
|
+
.flatMap((reach) => {
|
|
203
|
+
return reach.monitorIds;
|
|
204
|
+
}));
|
|
205
|
+
if (unscopedMonitorIds.length > 0) {
|
|
206
|
+
batches.push({
|
|
207
|
+
resources: await StatusPageResourceService.findByMonitors({
|
|
208
|
+
monitorIds: unscopedMonitorIds,
|
|
209
|
+
select: resourceSelect,
|
|
210
|
+
}),
|
|
211
|
+
scopedStatusPageIds: null,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
for (const reach of data.reaches) {
|
|
215
|
+
if (reach.scopedStatusPageIds === null) {
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
const monitorIds = this.distinctMonitorIds(reach.monitorIds);
|
|
219
|
+
// Scoped to nothing, or on no monitor: it reaches no page to look up.
|
|
220
|
+
if (reach.scopedStatusPageIds.length === 0 || monitorIds.length === 0) {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
batches.push({
|
|
224
|
+
resources: await StatusPageResourceService.findByMonitors({
|
|
225
|
+
monitorIds: monitorIds,
|
|
226
|
+
select: resourceSelect,
|
|
227
|
+
}),
|
|
228
|
+
scopedStatusPageIds: reach.scopedStatusPageIds,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
const candidateStatusPageIds = [];
|
|
232
|
+
for (const batch of batches) {
|
|
233
|
+
for (const resource of batch.resources) {
|
|
234
|
+
const statusPageId = this.normalizeId(resource.statusPageId);
|
|
235
|
+
if (statusPageId && !candidateStatusPageIds.includes(statusPageId)) {
|
|
236
|
+
candidateStatusPageIds.push(statusPageId);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (candidateStatusPageIds.length === 0) {
|
|
241
|
+
return {
|
|
242
|
+
statusPages: [],
|
|
243
|
+
statusPageToResources: {},
|
|
244
|
+
isScoped: isScoped,
|
|
245
|
+
excludedStatusPages: [],
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
const loadedStatusPages = await StatusPageSubscriberService.getStatusPagesToSendNotification(candidateStatusPageIds.map((id) => {
|
|
249
|
+
return new ObjectID(id);
|
|
250
|
+
}));
|
|
251
|
+
const statusPageById = new Map();
|
|
252
|
+
for (const statusPage of loadedStatusPages) {
|
|
253
|
+
const statusPageId = this.normalizeId(statusPage._id);
|
|
254
|
+
if (statusPageId) {
|
|
255
|
+
statusPageById.set(statusPageId, statusPage);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Keyed by the lower-cased page id while collecting.
|
|
259
|
+
const reachedResources = new Map();
|
|
260
|
+
/*
|
|
261
|
+
* The pages a scoped incident's monitors are on that its scope left out:
|
|
262
|
+
* it is limited to other pages. A page only an unscoped incident's
|
|
263
|
+
* monitors reached, and which only shows scoped incidents, is left out for
|
|
264
|
+
* that instead.
|
|
265
|
+
*/
|
|
266
|
+
const outsideScopedIncidentReach = new Set();
|
|
267
|
+
for (const batch of batches) {
|
|
268
|
+
for (const resource of batch.resources) {
|
|
269
|
+
const statusPageId = this.normalizeId(resource.statusPageId);
|
|
270
|
+
if (!statusPageId) {
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
const statusPage = statusPageById.get(statusPageId);
|
|
274
|
+
// Deleted since the resource was read: nothing to tell.
|
|
275
|
+
if (!statusPage) {
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
const isInScope = batch.scopedStatusPageIds === null
|
|
279
|
+
? !this.showsOnlyScopedIncidents(statusPage)
|
|
280
|
+
: batch.scopedStatusPageIds.includes(statusPageId);
|
|
281
|
+
if (!isInScope) {
|
|
282
|
+
if (batch.scopedStatusPageIds !== null) {
|
|
283
|
+
outsideScopedIncidentReach.add(statusPageId);
|
|
284
|
+
}
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
const resources = reachedResources.get(statusPageId) || [];
|
|
288
|
+
const resourceId = this.normalizeId(resource._id);
|
|
289
|
+
const isDuplicate = resources.some((existing) => {
|
|
290
|
+
return (resourceId !== undefined &&
|
|
291
|
+
this.normalizeId(existing._id) === resourceId);
|
|
292
|
+
});
|
|
293
|
+
if (!isDuplicate) {
|
|
294
|
+
resources.push(resource);
|
|
295
|
+
}
|
|
296
|
+
reachedResources.set(statusPageId, resources);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
const statusPages = [];
|
|
300
|
+
const excludedStatusPages = [];
|
|
301
|
+
const statusPageToResources = {};
|
|
302
|
+
for (const [statusPageId, statusPage] of statusPageById.entries()) {
|
|
303
|
+
const resources = reachedResources.get(statusPageId);
|
|
304
|
+
if (resources && resources.length > 0) {
|
|
305
|
+
statusPages.push(statusPage);
|
|
306
|
+
// Keyed as the subscriber jobs look pages up: by the page's own _id.
|
|
307
|
+
statusPageToResources[statusPage._id || statusPageId] = resources;
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
/*
|
|
311
|
+
* Why it was left out. A scoped incident that lists the page's monitors
|
|
312
|
+
* but not the page is limited to other pages, whatever the page's own
|
|
313
|
+
* setting; only a page reached by unscoped incidents alone was left
|
|
314
|
+
* out because it only shows incidents limited to it.
|
|
315
|
+
*/
|
|
316
|
+
excludedStatusPages.push({
|
|
317
|
+
statusPage: statusPage,
|
|
318
|
+
reason: !outsideScopedIncidentReach.has(statusPageId) &&
|
|
319
|
+
this.showsOnlyScopedIncidents(statusPage)
|
|
320
|
+
? StatusPageExclusionReason.OnlyShowsScopedIncidents
|
|
321
|
+
: StatusPageExclusionReason.OutsideIncidentScope,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
statusPages.sort(this.compareStatusPagesByName);
|
|
325
|
+
excludedStatusPages.sort((a, b) => {
|
|
326
|
+
return this.compareStatusPagesByName(a.statusPage, b.statusPage);
|
|
327
|
+
});
|
|
328
|
+
logger.debug(`Incident status page scope: ${data.reaches.length} incident(s) reach ${statusPages.length} status page(s); ${excludedStatusPages.length} left out by scope.`);
|
|
329
|
+
return {
|
|
330
|
+
statusPages: statusPages,
|
|
331
|
+
statusPageToResources: statusPageToResources,
|
|
332
|
+
isScoped: isScoped,
|
|
333
|
+
excludedStatusPages: excludedStatusPages,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
/*
|
|
337
|
+
* The incidents a status page shows that match `query`. The caller's query
|
|
338
|
+
* keeps its monitors filter (the pages' monitors); this runs it twice,
|
|
339
|
+
* split on isScopedToStatusPages:
|
|
340
|
+
*
|
|
341
|
+
* - unscoped incidents, unless the page only shows scoped incidents;
|
|
342
|
+
* - incidents scoped to this page (the join-table filter QueryUtil builds
|
|
343
|
+
* from an id list, as the scheduled maintenance queries use).
|
|
344
|
+
*
|
|
345
|
+
* The two halves are disjoint. They are merged, sorted by `sort` as the
|
|
346
|
+
* database would have, and cut to `skip` and `limit` - each half is read up
|
|
347
|
+
* to skip + limit rows, so the cut sees every row that can make the page.
|
|
348
|
+
* Sort keys must be top-level columns; any the caller did not select are
|
|
349
|
+
* read for the merge and removed again.
|
|
350
|
+
*/
|
|
351
|
+
static async findIncidentsForStatusPage(data) {
|
|
352
|
+
const skip = Math.max(0, data.skip || 0);
|
|
353
|
+
const limit = Math.max(0, data.limit);
|
|
354
|
+
if (limit === 0) {
|
|
355
|
+
return [];
|
|
356
|
+
}
|
|
357
|
+
const sort = data.sort;
|
|
358
|
+
const sortKeys = Object.keys(sort || {});
|
|
359
|
+
const select = Object.assign({}, data.select);
|
|
360
|
+
const addedKeys = [];
|
|
361
|
+
for (const key of ["_id", ...sortKeys]) {
|
|
362
|
+
if (!select[key]) {
|
|
363
|
+
select[key] = true;
|
|
364
|
+
addedKeys.push(key);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
const results = await Promise.all(this.getScopedQueries({
|
|
368
|
+
statusPage: data.statusPage,
|
|
369
|
+
query: data.query,
|
|
370
|
+
}).map((query) => {
|
|
371
|
+
return IncidentService.findBy({
|
|
372
|
+
query: query,
|
|
373
|
+
select: select,
|
|
374
|
+
sort: sort,
|
|
375
|
+
limit: skip + limit,
|
|
376
|
+
skip: 0,
|
|
377
|
+
props: data.props,
|
|
378
|
+
});
|
|
379
|
+
}));
|
|
380
|
+
const incidents = this.mergeIncidents({
|
|
381
|
+
results: results,
|
|
382
|
+
sort: sort,
|
|
383
|
+
}).slice(skip, skip + limit);
|
|
384
|
+
for (const incident of incidents) {
|
|
385
|
+
for (const key of addedKeys) {
|
|
386
|
+
// _id stays: it is what every caller keys on.
|
|
387
|
+
if (key !== "_id") {
|
|
388
|
+
delete incident[key];
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return incidents;
|
|
393
|
+
}
|
|
394
|
+
// The one incident matching `query` that a status page shows, if any.
|
|
395
|
+
static async findOneIncidentForStatusPage(data) {
|
|
396
|
+
const incidents = await this.findIncidentsForStatusPage({
|
|
397
|
+
statusPage: data.statusPage,
|
|
398
|
+
query: data.query,
|
|
399
|
+
select: data.select,
|
|
400
|
+
sort: data.sort,
|
|
401
|
+
limit: 1,
|
|
402
|
+
skip: 0,
|
|
403
|
+
props: data.props,
|
|
404
|
+
});
|
|
405
|
+
return incidents[0] || null;
|
|
406
|
+
}
|
|
407
|
+
/*
|
|
408
|
+
* How many incidents matching `query` a status page shows: the unscoped
|
|
409
|
+
* ones (unless the page only shows scoped incidents) plus the ones scoped
|
|
410
|
+
* to it. The two counts are disjoint, so they add up. Only the project's
|
|
411
|
+
* incidents that are visible on status pages count.
|
|
412
|
+
*/
|
|
413
|
+
static async countIncidentsForStatusPage(data) {
|
|
414
|
+
const counts = await Promise.all(this.getScopedQueries({
|
|
415
|
+
statusPage: data.statusPage,
|
|
416
|
+
query: Object.assign(Object.assign({}, data.query), { projectId: data.projectId, isVisibleOnStatusPage: true }),
|
|
417
|
+
}).map((query) => {
|
|
418
|
+
return IncidentService.countBy({
|
|
419
|
+
query: query,
|
|
420
|
+
props: data.props || {
|
|
421
|
+
isRoot: true,
|
|
422
|
+
},
|
|
423
|
+
});
|
|
424
|
+
}));
|
|
425
|
+
return counts.reduce((total, count) => {
|
|
426
|
+
return total + count.toNumber();
|
|
427
|
+
}, 0);
|
|
428
|
+
}
|
|
429
|
+
/*
|
|
430
|
+
* Whether a status page shows this incident, as far as scope goes (whether
|
|
431
|
+
* the page lists its monitors is the caller's query). For incidents already
|
|
432
|
+
* read, like an episode's members: the incident needs isScopedToStatusPages
|
|
433
|
+
* and statusPages loaded, and the page onlyShowScopedIncidents. Missing
|
|
434
|
+
* either fails closed.
|
|
435
|
+
*/
|
|
436
|
+
static isIncidentInScope(incident, statusPage) {
|
|
437
|
+
if (incident.isScopedToStatusPages === true) {
|
|
438
|
+
const statusPageId = this.getStatusPageId(statusPage);
|
|
439
|
+
return Boolean(statusPageId &&
|
|
440
|
+
IncidentScopeAddedPagesNotification.normalizeStatusPageIds(incident.statusPages).includes(statusPageId));
|
|
441
|
+
}
|
|
442
|
+
if (incident.isScopedToStatusPages === false) {
|
|
443
|
+
return !this.showsOnlyScopedIncidents(statusPage);
|
|
444
|
+
}
|
|
445
|
+
// Not loaded: in no page's scope.
|
|
446
|
+
return false;
|
|
447
|
+
}
|
|
448
|
+
/*
|
|
449
|
+
* Removes the scope columns from an incident about to be serialized for a
|
|
450
|
+
* public status page - the model or its JSON - in case a select brought
|
|
451
|
+
* them in.
|
|
452
|
+
*/
|
|
453
|
+
static removeScopeColumns(incident) {
|
|
454
|
+
for (const column of INCIDENT_SCOPE_COLUMNS) {
|
|
455
|
+
delete incident[column];
|
|
456
|
+
}
|
|
457
|
+
return incident;
|
|
458
|
+
}
|
|
459
|
+
/*
|
|
460
|
+
* Visiting order for a send: by name, then id. Email and SMS go once per
|
|
461
|
+
* address across the pages of a scoped incident, so the page visited first
|
|
462
|
+
* is the one whose template, branding and unsubscribe link a person on
|
|
463
|
+
* several of them gets - and name order makes that predictable.
|
|
464
|
+
*/
|
|
465
|
+
static compareStatusPagesByName(a, b) {
|
|
466
|
+
const nameA = (a.name || a.pageTitle || "").trim();
|
|
467
|
+
const nameB = (b.name || b.pageTitle || "").trim();
|
|
468
|
+
const byName = nameA.localeCompare(nameB, "en", {
|
|
469
|
+
sensitivity: "base",
|
|
470
|
+
numeric: true,
|
|
471
|
+
});
|
|
472
|
+
if (byName !== 0) {
|
|
473
|
+
return byName;
|
|
474
|
+
}
|
|
475
|
+
return (a._id || "").localeCompare(b._id || "");
|
|
476
|
+
}
|
|
477
|
+
// The two halves of a display query for one status page.
|
|
478
|
+
static getScopedQueries(data) {
|
|
479
|
+
const statusPageId = this.getStatusPageId(data.statusPage);
|
|
480
|
+
if (!statusPageId) {
|
|
481
|
+
throw new BadDataException("Cannot find the incidents a status page shows without its id.");
|
|
482
|
+
}
|
|
483
|
+
const queries = [];
|
|
484
|
+
if (!this.showsOnlyScopedIncidents(data.statusPage)) {
|
|
485
|
+
queries.push(Object.assign(Object.assign({}, data.query), { isScopedToStatusPages: false }));
|
|
486
|
+
}
|
|
487
|
+
queries.push(Object.assign(Object.assign({}, data.query), { isScopedToStatusPages: true,
|
|
488
|
+
// An id list on an entity-array column becomes a join-table filter.
|
|
489
|
+
statusPages: [statusPageId] }));
|
|
490
|
+
return queries;
|
|
491
|
+
}
|
|
492
|
+
/*
|
|
493
|
+
* One list out of the two halves: each incident once, sorted by `sort`
|
|
494
|
+
* the way Postgres sorts - NULLs last ascending and first descending. With
|
|
495
|
+
* no sort, unscoped incidents come first, as each half came back.
|
|
496
|
+
*/
|
|
497
|
+
static mergeIncidents(data) {
|
|
498
|
+
const merged = [];
|
|
499
|
+
const seen = new Set();
|
|
500
|
+
for (const incident of data.results.flat()) {
|
|
501
|
+
const incidentId = this.getIncidentId(incident);
|
|
502
|
+
if (incidentId) {
|
|
503
|
+
if (seen.has(incidentId)) {
|
|
504
|
+
continue;
|
|
505
|
+
}
|
|
506
|
+
seen.add(incidentId);
|
|
507
|
+
}
|
|
508
|
+
merged.push(incident);
|
|
509
|
+
}
|
|
510
|
+
const sortEntries = Object.entries(data.sort || {});
|
|
511
|
+
if (sortEntries.length === 0) {
|
|
512
|
+
return merged;
|
|
513
|
+
}
|
|
514
|
+
return merged.sort((a, b) => {
|
|
515
|
+
for (const [key, order] of sortEntries) {
|
|
516
|
+
const compared = this.compareSortValues(a[key], b[key]);
|
|
517
|
+
if (compared !== 0) {
|
|
518
|
+
return order === SortOrder.Descending ? -compared : compared;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
return 0;
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
// Ascending order of two column values; a missing value sorts last.
|
|
525
|
+
static compareSortValues(a, b) {
|
|
526
|
+
const aMissing = a === undefined || a === null;
|
|
527
|
+
const bMissing = b === undefined || b === null;
|
|
528
|
+
if (aMissing || bMissing) {
|
|
529
|
+
return aMissing === bMissing ? 0 : aMissing ? 1 : -1;
|
|
530
|
+
}
|
|
531
|
+
const aValue = a instanceof Date ? a.getTime() : a;
|
|
532
|
+
const bValue = b instanceof Date ? b.getTime() : b;
|
|
533
|
+
if (typeof aValue === "number" && typeof bValue === "number") {
|
|
534
|
+
return aValue - bValue;
|
|
535
|
+
}
|
|
536
|
+
if (typeof aValue === "boolean" && typeof bValue === "boolean") {
|
|
537
|
+
return Number(aValue) - Number(bValue);
|
|
538
|
+
}
|
|
539
|
+
return String(aValue).localeCompare(String(bValue));
|
|
540
|
+
}
|
|
541
|
+
/*
|
|
542
|
+
* Each incident's scope as stored: the lower-cased ids of the pages it is
|
|
543
|
+
* limited to, or null when unscoped. Incidents not found are left out.
|
|
544
|
+
*/
|
|
545
|
+
static async getIncidentScopes(incidentIds) {
|
|
546
|
+
const scopes = {};
|
|
547
|
+
if (incidentIds.length === 0) {
|
|
548
|
+
return scopes;
|
|
549
|
+
}
|
|
550
|
+
const incidents = await IncidentService.findBy({
|
|
551
|
+
query: {
|
|
552
|
+
_id: QueryHelper.any(incidentIds),
|
|
553
|
+
},
|
|
554
|
+
select: {
|
|
555
|
+
_id: true,
|
|
556
|
+
isScopedToStatusPages: true,
|
|
557
|
+
statusPages: {
|
|
558
|
+
_id: true,
|
|
559
|
+
},
|
|
560
|
+
},
|
|
561
|
+
limit: LIMIT_MAX,
|
|
562
|
+
skip: 0,
|
|
563
|
+
props: {
|
|
564
|
+
isRoot: true,
|
|
565
|
+
},
|
|
566
|
+
});
|
|
567
|
+
for (const incident of incidents) {
|
|
568
|
+
const incidentId = this.getIncidentId(incident);
|
|
569
|
+
if (!incidentId) {
|
|
570
|
+
continue;
|
|
571
|
+
}
|
|
572
|
+
/*
|
|
573
|
+
* The flag decides, not the list: a scoped incident whose pages were
|
|
574
|
+
* all deleted has an empty list and still reaches nothing.
|
|
575
|
+
*/
|
|
576
|
+
scopes[incidentId] =
|
|
577
|
+
incident.isScopedToStatusPages === false
|
|
578
|
+
? null
|
|
579
|
+
: IncidentScopeAddedPagesNotification.normalizeStatusPageIds(incident.statusPages);
|
|
580
|
+
}
|
|
581
|
+
return scopes;
|
|
582
|
+
}
|
|
583
|
+
/*
|
|
584
|
+
* Whether a page only shows scoped incidents. Not loaded counts as yes (see
|
|
585
|
+
* the top of this file): the column is NOT NULL, so a read that has it is
|
|
586
|
+
* always true or false.
|
|
587
|
+
*/
|
|
588
|
+
static showsOnlyScopedIncidents(statusPage) {
|
|
589
|
+
return statusPage.onlyShowScopedIncidents !== false;
|
|
590
|
+
}
|
|
591
|
+
static getStatusPageId(statusPage) {
|
|
592
|
+
return this.normalizeId(statusPage._id || statusPage.id);
|
|
593
|
+
}
|
|
594
|
+
static getIncidentId(incident) {
|
|
595
|
+
return this.normalizeId(incident._id || incident.id);
|
|
596
|
+
}
|
|
597
|
+
static getMonitorIds(monitors) {
|
|
598
|
+
return this.distinctMonitorIds((monitors || [])
|
|
599
|
+
.map((monitor) => {
|
|
600
|
+
return this.normalizeId((monitor === null || monitor === void 0 ? void 0 : monitor._id) || (monitor === null || monitor === void 0 ? void 0 : monitor.id));
|
|
601
|
+
})
|
|
602
|
+
.filter((id) => {
|
|
603
|
+
return Boolean(id);
|
|
604
|
+
})
|
|
605
|
+
.map((id) => {
|
|
606
|
+
return new ObjectID(id);
|
|
607
|
+
}));
|
|
608
|
+
}
|
|
609
|
+
static distinctMonitorIds(monitorIds) {
|
|
610
|
+
const seen = new Set();
|
|
611
|
+
const distinct = [];
|
|
612
|
+
for (const monitorId of monitorIds) {
|
|
613
|
+
const id = this.normalizeId(monitorId);
|
|
614
|
+
if (!id || seen.has(id)) {
|
|
615
|
+
continue;
|
|
616
|
+
}
|
|
617
|
+
seen.add(id);
|
|
618
|
+
distinct.push(new ObjectID(id));
|
|
619
|
+
}
|
|
620
|
+
return distinct;
|
|
621
|
+
}
|
|
622
|
+
// An id in any shape it arrives in, lower-cased as the database returns it.
|
|
623
|
+
static normalizeId(value) {
|
|
624
|
+
if (value === undefined || value === null) {
|
|
625
|
+
return undefined;
|
|
626
|
+
}
|
|
627
|
+
const id = value.toString().trim().toLowerCase();
|
|
628
|
+
return id || undefined;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
//# sourceMappingURL=IncidentStatusPageScope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncidentStatusPageScope.js","sourceRoot":"","sources":["../../../../../Server/Utils/StatusPage/IncidentStatusPageScope.ts"],"names":[],"mappings":"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"}
|