@oneuptime/common 13.0.1 → 13.0.3
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/AnalyticsModels/RumSession.ts +34 -0
- package/Models/DatabaseModels/AlertEpisodeLabelRule.ts +2 -2
- package/Models/DatabaseModels/AlertEpisodeOnCallRule.ts +2 -2
- package/Models/DatabaseModels/AlertEpisodeOwnerRule.ts +2 -2
- package/Models/DatabaseModels/AlertEpisodePrivacyRule.ts +2 -2
- package/Models/DatabaseModels/AlertGroupingRule.ts +2 -2
- package/Models/DatabaseModels/AlertLabelRule.ts +2 -2
- package/Models/DatabaseModels/AlertOnCallRule.ts +2 -2
- package/Models/DatabaseModels/AlertOwnerRule.ts +2 -2
- package/Models/DatabaseModels/AlertPrivacyRule.ts +2 -2
- package/Models/DatabaseModels/AlertReminderRule.ts +6 -4
- package/Models/DatabaseModels/AutoRemediationRule.ts +2 -2
- package/Models/DatabaseModels/CephClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/CephClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/CloudResourceLabelRule.ts +2 -2
- package/Models/DatabaseModels/CloudResourceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/DashboardLabelRule.ts +2 -2
- package/Models/DatabaseModels/DashboardOwnerRule.ts +2 -2
- package/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.ts +11 -0
- package/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.ts +44 -0
- package/Models/DatabaseModels/DockerHostLabelRule.ts +2 -2
- package/Models/DatabaseModels/DockerHostOwnerRule.ts +2 -2
- package/Models/DatabaseModels/DockerSwarmClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/DockerSwarmClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/HostLabelRule.ts +2 -2
- package/Models/DatabaseModels/HostOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodeLabelRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodeOnCallRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodeOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodePrivacyRule.ts +2 -2
- package/Models/DatabaseModels/IncidentGroupingRule.ts +2 -2
- package/Models/DatabaseModels/IncidentLabelRule.ts +2 -2
- package/Models/DatabaseModels/IncidentOnCallRule.ts +2 -2
- package/Models/DatabaseModels/IncidentOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncidentPrivacyRule.ts +2 -2
- package/Models/DatabaseModels/IncidentReminderRule.ts +6 -4
- package/Models/DatabaseModels/IncidentSlaRule.ts +2 -2
- package/Models/DatabaseModels/IncomingCallPolicy.ts +3 -4
- package/Models/DatabaseModels/IncomingCallPolicyLabelRule.ts +2 -2
- package/Models/DatabaseModels/IncomingCallPolicyOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.ts +254 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/IoTFleetLabelRule.ts +2 -2
- package/Models/DatabaseModels/IoTFleetOwnerRule.ts +2 -2
- package/Models/DatabaseModels/KubernetesClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/KubernetesClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/MonitorLabelRule.ts +2 -2
- package/Models/DatabaseModels/MonitorOwnerRule.ts +2 -2
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +2 -2
- package/Models/DatabaseModels/NetworkDeviceLabelRule.ts +2 -2
- package/Models/DatabaseModels/NetworkDeviceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyLabelRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.ts +2 -2
- package/Models/DatabaseModels/PodmanHostLabelRule.ts +2 -2
- package/Models/DatabaseModels/PodmanHostOwnerRule.ts +2 -2
- package/Models/DatabaseModels/ProxmoxClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/ProxmoxClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/RumApplicationLabelRule.ts +2 -2
- package/Models/DatabaseModels/RumApplicationOwnerRule.ts +2 -2
- package/Models/DatabaseModels/RunbookLabelRule.ts +2 -2
- package/Models/DatabaseModels/RunbookOwnerRule.ts +2 -2
- package/Models/DatabaseModels/RunbookRule.ts +2 -2
- package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +2 -2
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/ScheduledMaintenanceReminderRule.ts +6 -4
- package/Models/DatabaseModels/ServerlessFunctionLabelRule.ts +2 -2
- package/Models/DatabaseModels/ServerlessFunctionOwnerRule.ts +2 -2
- package/Models/DatabaseModels/ServiceLabelRule.ts +2 -2
- package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +283 -4
- package/Models/DatabaseModels/ServiceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/StatusPageLabelRule.ts +2 -2
- package/Models/DatabaseModels/StatusPageMonitorRule.ts +2 -2
- package/Models/DatabaseModels/StatusPageOwnerRule.ts +2 -2
- package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +2 -2
- package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/WorkflowLabelRule.ts +2 -2
- package/Models/DatabaseModels/WorkflowOwnerRule.ts +2 -2
- package/Server/API/TelemetryAPI.ts +323 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.ts +111 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.ts +644 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.ts +72 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/MultipartFormData.ts +46 -21
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +21 -0
- package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +21 -0
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +21 -0
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +21 -0
- package/Server/Services/AlertGroupingEngineService.ts +27 -0
- package/Server/Services/AlertLabelRuleEngineService.ts +27 -0
- package/Server/Services/AlertOnCallRuleEngineService.ts +27 -0
- package/Server/Services/AlertOwnerRuleEngineService.ts +27 -0
- package/Server/Services/AlertPrivacyRuleEngineService.ts +27 -0
- package/Server/Services/AlertReminderRuleService.ts +65 -33
- package/Server/Services/AutoRemediationRuleEngineService.ts +90 -8
- package/Server/Services/CephClusterLabelRuleEngineService.ts +20 -0
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +20 -0
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +20 -0
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +20 -0
- package/Server/Services/DashboardLabelRuleEngineService.ts +20 -0
- package/Server/Services/DashboardOwnerRuleEngineService.ts +20 -0
- package/Server/Services/DatabaseService.ts +409 -6
- package/Server/Services/DockerHostLabelRuleEngineService.ts +20 -0
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +20 -0
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +23 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/HostLabelRuleEngineService.ts +13 -0
- package/Server/Services/HostOwnerRuleEngineService.ts +13 -0
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +21 -0
- package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +21 -0
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +21 -0
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +21 -0
- package/Server/Services/IncidentGroupingEngineService.ts +64 -13
- package/Server/Services/IncidentLabelRuleEngineService.ts +64 -9
- package/Server/Services/IncidentOnCallRuleEngineService.ts +64 -10
- package/Server/Services/IncidentOwnerRuleEngineService.ts +64 -10
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +64 -10
- package/Server/Services/IncidentReminderRuleService.ts +66 -34
- package/Server/Services/IncidentSlaRuleService.ts +55 -12
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +20 -0
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +20 -0
- package/Server/Services/IncomingCallPolicyPhoneNumberService.ts +184 -0
- package/Server/Services/IncomingCallPolicyService.ts +276 -5
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +20 -0
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +20 -0
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +23 -0
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/LabelService.ts +50 -7
- package/Server/Services/MonitorLabelRuleEngineService.ts +20 -0
- package/Server/Services/MonitorOwnerRuleEngineService.ts +20 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +2 -0
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +93 -1
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +26 -0
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +25 -0
- package/Server/Services/NetworkDeviceService.ts +2 -0
- package/Server/Services/NetworkSiteAssignmentRuleService.ts +90 -1
- package/Server/Services/NetworkSiteService.ts +242 -29
- package/Server/Services/NetworkSiteTypeService.ts +177 -77
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +20 -0
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +20 -0
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +22 -0
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +22 -0
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +20 -0
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +20 -0
- package/Server/Services/ProjectCallSMSConfigService.ts +156 -7
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +25 -0
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +25 -0
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +22 -0
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +22 -0
- package/Server/Services/RunbookLabelRuleEngineService.ts +20 -0
- package/Server/Services/RunbookOwnerRuleEngineService.ts +20 -0
- package/Server/Services/RunbookRuleEngineService.ts +18 -1
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +62 -10
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +62 -11
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +48 -18
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +25 -0
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +25 -0
- package/Server/Services/ServiceLabelRuleEngineService.ts +20 -0
- package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +675 -12
- package/Server/Services/ServiceLevelObjectiveService.ts +55 -13
- package/Server/Services/ServiceOwnerRuleEngineService.ts +20 -0
- package/Server/Services/StatusPageLabelRuleEngineService.ts +20 -0
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +31 -2
- package/Server/Services/StatusPageMonitorRuleService.ts +34 -1
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +20 -0
- package/Server/Services/UserService.ts +23 -50
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +25 -0
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +25 -0
- package/Server/Services/WorkflowLabelRuleEngineService.ts +20 -0
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +20 -0
- package/Server/Static/Brand/README.md +10 -5
- package/Server/Static/Brand/favicons/oneuptime-up-v1.svg +8 -0
- package/Server/Types/Database/QueryHelper.ts +88 -0
- package/Server/Utils/AI/Toolbox/SloTools.ts +19 -2
- package/Server/Utils/IncomingCallPhoneNumber.ts +29 -16
- package/Server/Utils/Profiling.ts +13 -1
- package/Server/Utils/Rules/MonitorRuleCriteriaCache.ts +38 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +498 -0
- package/Server/Utils/Telemetry.ts +3 -1
- package/Server/Utils/VendorAssets.ts +3 -0
- package/Tests/App/Dashboard/AIInsightViewTriage.test.tsx +348 -0
- package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +476 -0
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +25 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +449 -24
- package/Tests/App/Dashboard/DashboardPersistentSideMenuLayouts.test.tsx +702 -0
- package/Tests/App/Dashboard/ExceptionsLandingRedirect.test.tsx +63 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +150 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +279 -100
- package/Tests/App/Dashboard/InventoryItemSideMenu.test.tsx +155 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +11 -0
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +215 -71
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +347 -0
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +263 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +413 -17
- package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +138 -0
- package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +940 -0
- package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +378 -0
- package/Tests/App/Dashboard/TelemetryIngestionKeyForm.test.tsx +735 -0
- package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +275 -108
- package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +13 -3
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +127 -4
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -4
- package/Tests/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.test.ts +362 -0
- package/Tests/Models/DatabaseModels/RuleBaseModel.test.ts +69 -0
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +181 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +1303 -145
- package/Tests/Server/API/UserTwoFactorSelfService.test.ts +407 -0
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +611 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +61 -3
- package/Tests/Server/Middleware/TelemetryIngestionDisabled.test.ts +211 -0
- package/Tests/Server/Services/AlertIncidentRuleCriteriaEngineServices.test.ts +651 -0
- package/Tests/Server/Services/AutoRemediationRuleEngineService.test.ts +79 -0
- package/Tests/Server/Services/DatabaseServiceRelationOnlyRuleRollout.test.ts +330 -0
- package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +522 -0
- package/Tests/Server/Services/IncidentSlaRuleCriteriaCorrelation.test.ts +99 -0
- package/Tests/Server/Services/IncomingCallPolicyPhoneNumberService.test.ts +1540 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +179 -2
- package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +170 -0
- package/Tests/Server/Services/NetworkSiteService.test.ts +559 -53
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +122 -55
- package/Tests/Server/Services/ReminderRuleCriteria.test.ts +173 -0
- package/Tests/Server/Services/ResourceRuleCriteriaEngineServices.test.ts +170 -0
- package/Tests/Server/Services/ScheduledMaintenanceRuleCriteriaCorrelation.test.ts +154 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +2450 -470
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +464 -121
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +281 -0
- package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +132 -0
- package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +159 -14
- package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +6 -8
- package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +203 -34
- package/Tests/Server/Types/Database/QueryHelperJsonArrayObjects.test.ts +128 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +190 -1
- package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +461 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +25 -0
- package/Tests/Server/Utils/Billing/BillingFailureNoticeThrottle.test.ts +359 -0
- package/Tests/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.test.ts +318 -0
- package/Tests/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.test.ts +220 -0
- package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +1043 -0
- package/Tests/Server/Utils/Execute.test.ts +302 -0
- package/Tests/Server/Utils/GracefulShutdown.test.ts +565 -0
- package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +36 -20
- package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +750 -0
- package/Tests/Server/Utils/ProductAnalytics.test.ts +404 -0
- package/Tests/Server/Utils/Profiling.test.ts +366 -0
- package/Tests/Server/Utils/Rules/MonitorRuleCriteriaCache.test.ts +99 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +558 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +17 -0
- package/Tests/Types/Dashboard/DashboardTemplateEditorialInvariants.test.ts +659 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +97 -0
- package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +1179 -0
- package/Tests/Types/Database/AccessControl/OwnedThrough.test.ts +136 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +180 -1
- package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +13 -6
- package/Tests/UI/Components/Alert.test.tsx +532 -93
- package/Tests/UI/Components/Feed.test.tsx +241 -0
- package/Tests/UI/Components/Forms/BasicFormStepNavigation.test.tsx +368 -0
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +454 -0
- package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +290 -0
- package/Tests/UI/Components/Forms/ModelFormRuleCriteria.test.tsx +331 -0
- package/Tests/UI/Components/IconOpticalSize.test.tsx +79 -31
- package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +6 -6
- package/Tests/UI/Components/NavBar.test.tsx +91 -2
- package/Tests/UI/Components/PencilButton.test.tsx +211 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaBuilder.test.tsx +510 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +350 -0
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +50 -0
- package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +329 -0
- package/Tests/UI/Components/useFeedItems.test.tsx +107 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +401 -0
- package/Tests/UI/Rum/RecordingHealthCard.test.tsx +1 -1
- package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +7 -1
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +2 -0
- package/Tests/UI/Rum/ReplayEngine.test.ts +1069 -5
- package/Tests/UI/Rum/ReplayHeader.test.tsx +579 -2
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +23 -5
- package/Tests/UI/Rum/ReplayRail.test.tsx +143 -1
- package/Tests/UI/Rum/ReplayRenderBudget.test.tsx +338 -0
- package/Tests/UI/Rum/ReplaySignals.test.ts +179 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +210 -3
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +180 -1
- package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +405 -0
- package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +13 -16
- package/Tests/UI/Rum/SessionReplayFacets.test.tsx +199 -0
- package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +58 -21
- package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +2 -0
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +717 -4
- package/Tests/UI/Rum/SessionReplayUsersPage.test.tsx +435 -0
- package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +577 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +1 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -1
- package/Tests/UI/Utils/LabelRuleImportExport.test.ts +192 -0
- package/Tests/UI/Utils/Navigation.test.ts +30 -0
- package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +880 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +158 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +93 -0
- package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +138 -0
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +174 -0
- package/Tests/Utils/Rules/RuleCriteriaMatcher.test.ts +1424 -0
- package/Tests/Utils/Rum/SessionIdentity.test.ts +72 -0
- package/Tests/Utils/Slo/SloBurnRateRuleState.test.ts +374 -28
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +118 -0
- package/Types/Dashboard/DashboardTemplates.ts +465 -0
- package/Types/Rules/RuleCriteria.ts +51 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +437 -0
- package/Types/Rum/SessionReplay.ts +75 -0
- package/Types/Rum/SessionReplayApi.ts +93 -0
- package/UI/Components/Alerts/Alert.tsx +102 -72
- package/UI/Components/Button/Button.tsx +4 -1
- package/UI/Components/Dropdown/Dropdown.tsx +2 -0
- package/UI/Components/Feed/Feed.tsx +15 -0
- package/UI/Components/Feed/useFeedItems.ts +227 -0
- package/UI/Components/Forms/BasicForm.tsx +42 -21
- package/UI/Components/Forms/ModelForm.tsx +80 -1
- package/UI/Components/Icon/Icon.tsx +3 -35
- package/UI/Components/ModelTable/ModelTable.tsx +19 -0
- package/UI/Components/Navbar/NavBar.tsx +1 -0
- package/UI/Components/RuleCriteria/RuleCriteriaBuilder.tsx +735 -0
- package/UI/Components/RuleCriteria/RuleCriteriaModelForm.tsx +209 -0
- package/UI/Components/RuleCriteria/RuleCriteriaModelTable.tsx +205 -0
- package/UI/Components/RuleCriteria/RuleCriteriaSummary.tsx +123 -0
- package/UI/Components/Table/Table.tsx +3 -0
- package/UI/Components/Table/TableBody.tsx +3 -0
- package/UI/Components/Table/TableRow.tsx +8 -2
- package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +14 -2
- package/UI/Styles/Theme.css +1 -0
- package/UI/Utils/LabelRuleImportExport.ts +114 -6
- package/UI/Utils/Navigation.ts +1 -2
- package/UI/esbuild-config.js +46 -0
- package/Utils/Faker.ts +93 -6
- package/Utils/LabelRuleImportExport.ts +295 -2
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +108 -8
- package/Utils/NetworkSite/CidrMatchUtil.ts +102 -0
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +152 -2
- package/Utils/Rules/RuleCriteriaMatcher.ts +931 -0
- package/Utils/Rum/SessionIdentity.ts +16 -0
- package/Utils/Slo/SloBurnRateRuleState.ts +87 -33
- package/Utils/Telemetry/OriginAllowList.ts +74 -0
- package/build/dist/Models/AnalyticsModels/RumSession.js +32 -0
- package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertReminderRule.js +6 -5
- package/build/dist/Models/DatabaseModels/AlertReminderRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AutoRemediationRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AutoRemediationRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DashboardLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js +12 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js +50 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/HostLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/HostOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentReminderRule.js +6 -5
- package/build/dist/Models/DatabaseModels/IncidentReminderRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentSlaRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentSlaRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js +3 -4
- package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js +277 -0
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/MonitorLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RunbookRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js +6 -5
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServiceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +281 -4
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +2 -2
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +211 -4
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js +301 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +38 -21
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +21 -0
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +44 -26
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +54 -11
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +235 -10
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +12 -0
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +12 -0
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +39 -13
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +39 -9
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +39 -10
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +39 -10
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +39 -10
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +44 -26
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js +33 -12
- package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js +127 -0
- package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js.map +1 -0
- package/build/dist/Server/Services/IncomingCallPolicyService.js +187 -4
- package/build/dist/Server/Services/IncomingCallPolicyService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +39 -7
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +2 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +57 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +17 -0
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +2 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +56 -1
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +187 -22
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +126 -51
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js +115 -6
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js +12 -0
- package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +38 -9
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +38 -10
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +32 -14
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +554 -12
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +50 -14
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +25 -2
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js +19 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +14 -49
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +67 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +21 -4
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/IncomingCallPhoneNumber.js +9 -3
- package/build/dist/Server/Utils/IncomingCallPhoneNumber.js.map +1 -1
- package/build/dist/Server/Utils/Profiling.js +10 -1
- package/build/dist/Server/Utils/Profiling.js.map +1 -1
- package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js +30 -0
- package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +344 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +1 -1
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +2 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +425 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteria.js +18 -0
- package/build/dist/Types/Rules/RuleCriteria.js.map +1 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +426 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplay.js +64 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/UI/Components/Alerts/Alert.js +63 -41
- package/build/dist/UI/Components/Alerts/Alert.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +3 -1
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Feed/Feed.js +4 -1
- package/build/dist/UI/Components/Feed/Feed.js.map +1 -1
- package/build/dist/UI/Components/Feed/useFeedItems.js +137 -0
- package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -0
- package/build/dist/UI/Components/Forms/BasicForm.js +38 -19
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +65 -1
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +3 -35
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +12 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +1 -0
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js +383 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js +124 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js +126 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js +63 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +1 -1
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableBody.js +4 -2
- package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +3 -2
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +14 -2
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +1 -1
- package/build/dist/UI/Utils/LabelRuleImportExport.js +81 -5
- package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/Utils/Faker.js +76 -6
- package/build/dist/Utils/Faker.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +157 -3
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +81 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +77 -0
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +109 -2
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -1
- package/build/dist/Utils/Rules/RuleCriteriaMatcher.js +526 -0
- package/build/dist/Utils/Rules/RuleCriteriaMatcher.js.map +1 -0
- package/build/dist/Utils/Rum/SessionIdentity.js +13 -1
- package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
- package/build/dist/Utils/Slo/SloBurnRateRuleState.js +28 -15
- package/build/dist/Utils/Slo/SloBurnRateRuleState.js.map +1 -1
- package/build/dist/Utils/Telemetry/OriginAllowList.js +61 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
- package/package.json +20 -20
|
@@ -34,6 +34,7 @@ import NetworkDeviceHydrationUtil from "../Utils/Monitor/NetworkDeviceHydrationU
|
|
|
34
34
|
import logger, { LogAttributes } from "../Utils/Logger";
|
|
35
35
|
import PartialEntity from "../../Types/Database/PartialEntity";
|
|
36
36
|
import { NetworkDeviceMonitoringMethodUtil } from "../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
|
|
37
|
+
import ColumnLength from "../../Types/Database/ColumnLength";
|
|
37
38
|
import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
38
39
|
import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
39
40
|
import { FindWhereProperty } from "../../Types/BaseDatabase/Query";
|
|
@@ -127,6 +128,23 @@ const DIRECT_CHILD_TYPE_VALIDATION_PAGE_SIZE: number = 1000;
|
|
|
127
128
|
*/
|
|
128
129
|
const SUBTREE_REBASE_PAGE_SIZE: number = 1000;
|
|
129
130
|
|
|
131
|
+
/*
|
|
132
|
+
* How deep a site tree may go, derived from the column that has to hold it:
|
|
133
|
+
* materializedPath is varchar(ColumnLength.LongText) and every segment costs a
|
|
134
|
+
* 36-character id plus its separator, after the leading slash.
|
|
135
|
+
*
|
|
136
|
+
* The bound has to be stated here now. It used to fall out of the placement
|
|
137
|
+
* rule for free - a site's depth was exactly its type's depth in the catalog,
|
|
138
|
+
* because the parent type was pinned recursively. Placement no longer pins
|
|
139
|
+
* anything (a site may sit under one of its own type), so without this a chain
|
|
140
|
+
* of thirteen sites would silently overflow the column: Postgres refuses the
|
|
141
|
+
* write, and it refuses it in onUpdateSuccess, after the parent change has
|
|
142
|
+
* already been committed.
|
|
143
|
+
*/
|
|
144
|
+
const MAX_SITE_HIERARCHY_PATH_SEGMENTS: number = Math.floor(
|
|
145
|
+
(ColumnLength.LongText - 1) / 37,
|
|
146
|
+
);
|
|
147
|
+
|
|
130
148
|
/*
|
|
131
149
|
* Model instances initialise optional fields to undefined. Those properties
|
|
132
150
|
* are omissions, not requests to clear a relation; null is the explicit
|
|
@@ -786,6 +804,27 @@ export class Service extends DatabaseService<Model> {
|
|
|
786
804
|
networkSiteTypeId: ObjectID,
|
|
787
805
|
cache: Map<string, NetworkSiteType>,
|
|
788
806
|
): Promise<NetworkSiteType> {
|
|
807
|
+
const networkSiteType: NetworkSiteType | null =
|
|
808
|
+
await this.findNetworkSiteTypeForHierarchy(networkSiteTypeId, cache);
|
|
809
|
+
|
|
810
|
+
if (!networkSiteType) {
|
|
811
|
+
throw new BadDataException("Network site type not found.");
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
return networkSiteType;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
/*
|
|
818
|
+
* The nullable form, for rows that are read as CONTEXT rather than written.
|
|
819
|
+
* A parent site's type - or a link further up the catalog - can be missing
|
|
820
|
+
* after a direct database edit, and an unresolvable ancestor proves nothing
|
|
821
|
+
* about the proposed edge; refusing the whole write there would strand the
|
|
822
|
+
* site instead of describing a problem the operator can act on.
|
|
823
|
+
*/
|
|
824
|
+
private async findNetworkSiteTypeForHierarchy(
|
|
825
|
+
networkSiteTypeId: ObjectID,
|
|
826
|
+
cache: Map<string, NetworkSiteType>,
|
|
827
|
+
): Promise<NetworkSiteType | null> {
|
|
789
828
|
const key: string = normalizeId(networkSiteTypeId);
|
|
790
829
|
const cached: NetworkSiteType | undefined = cache.get(key);
|
|
791
830
|
|
|
@@ -798,7 +837,9 @@ export class Service extends DatabaseService<Model> {
|
|
|
798
837
|
id: networkSiteTypeId,
|
|
799
838
|
select: {
|
|
800
839
|
_id: true,
|
|
840
|
+
name: true,
|
|
801
841
|
projectId: true,
|
|
842
|
+
isUnitLevel: true,
|
|
802
843
|
parentNetworkSiteTypeId: true,
|
|
803
844
|
},
|
|
804
845
|
props: {
|
|
@@ -806,19 +847,27 @@ export class Service extends DatabaseService<Model> {
|
|
|
806
847
|
},
|
|
807
848
|
});
|
|
808
849
|
|
|
809
|
-
if (
|
|
810
|
-
|
|
850
|
+
if (networkSiteType) {
|
|
851
|
+
cache.set(key, networkSiteType);
|
|
811
852
|
}
|
|
812
853
|
|
|
813
|
-
cache.set(key, networkSiteType);
|
|
814
854
|
return networkSiteType;
|
|
815
855
|
}
|
|
816
856
|
|
|
817
857
|
/*
|
|
818
|
-
* Assert one proposed site edge against the type hierarchy.
|
|
819
|
-
*
|
|
820
|
-
*
|
|
821
|
-
* parent site
|
|
858
|
+
* Assert one proposed site edge against the type hierarchy.
|
|
859
|
+
*
|
|
860
|
+
* The type tree describes which levels sit above which; it does NOT dictate
|
|
861
|
+
* an exact placement. A parent site is always optional, may skip levels, and
|
|
862
|
+
* may be of an unrelated type — the only inversion refused is a parent whose
|
|
863
|
+
* type sits BELOW the child's own type. The stricter reading this replaces
|
|
864
|
+
* (parent must be exactly the configured direct parent type, root types may
|
|
865
|
+
* never have a parent) made whole hierarchies impossible to build: see
|
|
866
|
+
* GitHub issue #3744, where every type in the project was top-level and no
|
|
867
|
+
* parent could be linked at all, by hand or by CSV.
|
|
868
|
+
*
|
|
869
|
+
* A unit-level type is the declared leaf of the hierarchy, so its sites hold
|
|
870
|
+
* devices rather than more sites and can never be a parent here.
|
|
822
871
|
*/
|
|
823
872
|
private async validateSiteTypeEdge(data: {
|
|
824
873
|
networkSiteTypeId: ObjectID | null;
|
|
@@ -852,33 +901,81 @@ export class Service extends DatabaseService<Model> {
|
|
|
852
901
|
);
|
|
853
902
|
}
|
|
854
903
|
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
if (!requiredParentTypeId) {
|
|
859
|
-
if (data.parentSite) {
|
|
860
|
-
throw new BadDataException(
|
|
861
|
-
"A site with a root network site type cannot have a parent site.",
|
|
862
|
-
);
|
|
863
|
-
}
|
|
904
|
+
if (!data.parentSite) {
|
|
905
|
+
return;
|
|
906
|
+
}
|
|
864
907
|
|
|
908
|
+
/*
|
|
909
|
+
* A parent that predates site types belongs to no level, so no inversion
|
|
910
|
+
* can be proven against it. Refusing it would make legacy rows permanently
|
|
911
|
+
* unusable as parents without a data migration nobody can safely write.
|
|
912
|
+
*/
|
|
913
|
+
if (!data.parentSite.networkSiteTypeId) {
|
|
865
914
|
return;
|
|
866
915
|
}
|
|
867
916
|
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
917
|
+
const parentNetworkSiteType: NetworkSiteType | null =
|
|
918
|
+
await this.findNetworkSiteTypeForHierarchy(
|
|
919
|
+
data.parentSite.networkSiteTypeId,
|
|
920
|
+
data.typeCache,
|
|
871
921
|
);
|
|
922
|
+
|
|
923
|
+
if (!parentNetworkSiteType) {
|
|
924
|
+
return;
|
|
872
925
|
}
|
|
873
926
|
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
927
|
+
const childTypeName: string =
|
|
928
|
+
networkSiteType.name || "this site's network site type";
|
|
929
|
+
const parentTypeName: string =
|
|
930
|
+
parentNetworkSiteType.name || "the parent site's network site type";
|
|
931
|
+
|
|
932
|
+
if (parentNetworkSiteType.isUnitLevel === true) {
|
|
878
933
|
throw new BadDataException(
|
|
879
|
-
|
|
934
|
+
`Sites of network site type "${parentTypeName}" are unit level, so they cannot have child sites.`,
|
|
880
935
|
);
|
|
881
936
|
}
|
|
937
|
+
|
|
938
|
+
if (sameId(data.networkSiteTypeId, data.parentSite.networkSiteTypeId)) {
|
|
939
|
+
return;
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
/*
|
|
943
|
+
* Walk UP from the parent's type. Reaching the child's type means the
|
|
944
|
+
* parent sits below it, which is the one arrangement that contradicts the
|
|
945
|
+
* configured hierarchy. The visited set bounds a catalog cycle written
|
|
946
|
+
* straight into the database, which must fail the request rather than
|
|
947
|
+
* spin the event loop.
|
|
948
|
+
*/
|
|
949
|
+
const visited: Set<string> = new Set<string>([
|
|
950
|
+
normalizeId(data.parentSite.networkSiteTypeId),
|
|
951
|
+
]);
|
|
952
|
+
let ancestorTypeId: ObjectID | null =
|
|
953
|
+
parentNetworkSiteType.parentNetworkSiteTypeId || null;
|
|
954
|
+
|
|
955
|
+
while (ancestorTypeId) {
|
|
956
|
+
if (sameId(ancestorTypeId, data.networkSiteTypeId)) {
|
|
957
|
+
throw new BadDataException(
|
|
958
|
+
`A site of network site type "${childTypeName}" cannot be placed under a site of network site type "${parentTypeName}", because "${parentTypeName}" sits below "${childTypeName}" in the site type hierarchy.`,
|
|
959
|
+
);
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
if (visited.has(normalizeId(ancestorTypeId))) {
|
|
963
|
+
break;
|
|
964
|
+
}
|
|
965
|
+
visited.add(normalizeId(ancestorTypeId));
|
|
966
|
+
|
|
967
|
+
const ancestorType: NetworkSiteType | null =
|
|
968
|
+
await this.findNetworkSiteTypeForHierarchy(
|
|
969
|
+
ancestorTypeId,
|
|
970
|
+
data.typeCache,
|
|
971
|
+
);
|
|
972
|
+
|
|
973
|
+
if (!ancestorType) {
|
|
974
|
+
break;
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
ancestorTypeId = ancestorType.parentNetworkSiteTypeId || null;
|
|
978
|
+
}
|
|
882
979
|
}
|
|
883
980
|
|
|
884
981
|
/*
|
|
@@ -925,6 +1022,19 @@ export class Service extends DatabaseService<Model> {
|
|
|
925
1022
|
});
|
|
926
1023
|
|
|
927
1024
|
for (const child of children) {
|
|
1025
|
+
/*
|
|
1026
|
+
* An untyped site is tolerated as a parent only where legacy data
|
|
1027
|
+
* already made it one. Clearing the type of a site that still owns
|
|
1028
|
+
* children would manufacture that shape deliberately, and every
|
|
1029
|
+
* placement check below it would then have nothing to compare
|
|
1030
|
+
* against.
|
|
1031
|
+
*/
|
|
1032
|
+
if (!data.proposedNetworkSiteTypeId) {
|
|
1033
|
+
throw new BadDataException(
|
|
1034
|
+
"A network site with child sites must have a network site type.",
|
|
1035
|
+
);
|
|
1036
|
+
}
|
|
1037
|
+
|
|
928
1038
|
await this.validateSiteTypeEdge({
|
|
929
1039
|
networkSiteTypeId: child.networkSiteTypeId || null,
|
|
930
1040
|
parentSite: proposedParent,
|
|
@@ -1216,6 +1326,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
1216
1326
|
|
|
1217
1327
|
if (parentSiteId) {
|
|
1218
1328
|
parentPath = await this.getMaterializedPathForSite(parentSiteId);
|
|
1329
|
+
this.assertHierarchyDepthFits({
|
|
1330
|
+
parentPath: parentPath,
|
|
1331
|
+
additionalSegments: 1,
|
|
1332
|
+
});
|
|
1219
1333
|
}
|
|
1220
1334
|
|
|
1221
1335
|
return {
|
|
@@ -1226,6 +1340,80 @@ export class Service extends DatabaseService<Model> {
|
|
|
1226
1340
|
};
|
|
1227
1341
|
}
|
|
1228
1342
|
|
|
1343
|
+
/*
|
|
1344
|
+
* Refuse a placement whose resulting path would not fit the column, before
|
|
1345
|
+
* anything is written. `additionalSegments` is the height of what is being
|
|
1346
|
+
* hung off this parent: 1 for a new leaf, and for a move the moved site plus
|
|
1347
|
+
* the deepest thing already under it.
|
|
1348
|
+
*/
|
|
1349
|
+
private assertHierarchyDepthFits(data: {
|
|
1350
|
+
parentPath: string | null;
|
|
1351
|
+
additionalSegments: number;
|
|
1352
|
+
}): void {
|
|
1353
|
+
const parentSegments: number = MaterializedPathUtil.segmentsOf(
|
|
1354
|
+
data.parentPath,
|
|
1355
|
+
).length;
|
|
1356
|
+
|
|
1357
|
+
if (
|
|
1358
|
+
parentSegments + data.additionalSegments <=
|
|
1359
|
+
MAX_SITE_HIERARCHY_PATH_SEGMENTS
|
|
1360
|
+
) {
|
|
1361
|
+
return;
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
throw new BadDataException(
|
|
1365
|
+
`A network site hierarchy can be at most ${MAX_SITE_HIERARCHY_PATH_SEGMENTS} levels deep, and this placement would make it deeper. Move the sites below it first, or attach this one higher up.`,
|
|
1366
|
+
);
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
/*
|
|
1370
|
+
* How many levels the subtree rooted at `site` occupies, itself included, so
|
|
1371
|
+
* a move can be measured before it is made rather than discovered when the
|
|
1372
|
+
* post-commit rebase writes an over-long path.
|
|
1373
|
+
*/
|
|
1374
|
+
private async getSubtreeHeight(site: Model): Promise<number> {
|
|
1375
|
+
if (!site.materializedPath || !site.projectId) {
|
|
1376
|
+
return 1;
|
|
1377
|
+
}
|
|
1378
|
+
|
|
1379
|
+
const ownSegments: number = MaterializedPathUtil.segmentsOf(
|
|
1380
|
+
site.materializedPath,
|
|
1381
|
+
).length;
|
|
1382
|
+
|
|
1383
|
+
/*
|
|
1384
|
+
* Ordering on the maintained `depth` column keeps this to one row. Rows
|
|
1385
|
+
* with no depth at all are excluded rather than sorted first: such a row
|
|
1386
|
+
* predates path maintenance and would otherwise answer the question with a
|
|
1387
|
+
* shallow path, and leaving the bound permissive for already-broken data
|
|
1388
|
+
* is better than refusing a move the operator can see is fine.
|
|
1389
|
+
*/
|
|
1390
|
+
const deepest: Array<Model> = await this.findBy({
|
|
1391
|
+
query: {
|
|
1392
|
+
projectId: site.projectId,
|
|
1393
|
+
materializedPath: this.pathStartsWith(site.materializedPath),
|
|
1394
|
+
depth: QueryHelper.notNull(),
|
|
1395
|
+
},
|
|
1396
|
+
select: {
|
|
1397
|
+
_id: true,
|
|
1398
|
+
materializedPath: true,
|
|
1399
|
+
},
|
|
1400
|
+
sort: {
|
|
1401
|
+
depth: SortOrder.Descending,
|
|
1402
|
+
},
|
|
1403
|
+
limit: 1,
|
|
1404
|
+
skip: 0,
|
|
1405
|
+
props: {
|
|
1406
|
+
isRoot: true,
|
|
1407
|
+
},
|
|
1408
|
+
});
|
|
1409
|
+
|
|
1410
|
+
const deepestSegments: number = MaterializedPathUtil.segmentsOf(
|
|
1411
|
+
deepest[0]?.materializedPath,
|
|
1412
|
+
).length;
|
|
1413
|
+
|
|
1414
|
+
return Math.max(1, deepestSegments - ownSegments + 1);
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1229
1417
|
@CaptureSpan()
|
|
1230
1418
|
protected override async onCreateSuccess(
|
|
1231
1419
|
onCreate: OnCreate<Model>,
|
|
@@ -1499,6 +1687,17 @@ export class Service extends DatabaseService<Model> {
|
|
|
1499
1687
|
"Cannot move a site under itself or one of its own descendants.",
|
|
1500
1688
|
);
|
|
1501
1689
|
}
|
|
1690
|
+
|
|
1691
|
+
/*
|
|
1692
|
+
* The whole subtree moves with the site, so the deepest row in it is
|
|
1693
|
+
* what decides whether the move fits. Measuring it here is the only
|
|
1694
|
+
* chance: the rebase that writes those paths runs after the parent
|
|
1695
|
+
* change has been committed.
|
|
1696
|
+
*/
|
|
1697
|
+
this.assertHierarchyDepthFits({
|
|
1698
|
+
parentPath: newParentPath,
|
|
1699
|
+
additionalSegments: await this.getSubtreeHeight(item),
|
|
1700
|
+
});
|
|
1502
1701
|
}
|
|
1503
1702
|
}
|
|
1504
1703
|
|
|
@@ -1825,11 +2024,16 @@ export class Service extends DatabaseService<Model> {
|
|
|
1825
2024
|
);
|
|
1826
2025
|
|
|
1827
2026
|
/*
|
|
1828
|
-
*
|
|
1829
|
-
*
|
|
1830
|
-
*
|
|
1831
|
-
*
|
|
1832
|
-
*
|
|
2027
|
+
* Reject the delete unless every direct child is part of this same bulk
|
|
2028
|
+
* delete.
|
|
2029
|
+
*
|
|
2030
|
+
* This used to be argued from the type rule - promoting an orphan to root
|
|
2031
|
+
* or to its grandparent was said to be impossible without breaking its
|
|
2032
|
+
* type. That argument no longer holds: a parent is optional now, and a
|
|
2033
|
+
* grandparent is usually a legal parent. The guard stays on its own terms.
|
|
2034
|
+
* Deleting one site is not permission to silently restructure the tree
|
|
2035
|
+
* underneath it, and the operator, not the repair loop, should decide
|
|
2036
|
+
* where those sites belong.
|
|
1833
2037
|
*
|
|
1834
2038
|
* Parent ids and result rows are both batched so neither a wide delete nor
|
|
1835
2039
|
* a wide site is silently truncated at a service query limit.
|
|
@@ -1953,6 +2157,15 @@ export class Service extends DatabaseService<Model> {
|
|
|
1953
2157
|
* Rewrites the deleted site's former subtree so the '/deletedId/' segment
|
|
1954
2158
|
* is dropped from every path, and re-points its direct children at the
|
|
1955
2159
|
* deleted site's parent.
|
|
2160
|
+
*
|
|
2161
|
+
* onBeforeDelete refuses a delete that would leave a surviving child, so
|
|
2162
|
+
* this only runs for rows that got past it - a hard delete, or a child
|
|
2163
|
+
* created in the window between the check and the write. It writes the
|
|
2164
|
+
* promotion without re-checking the placement rule: the grandparent it
|
|
2165
|
+
* promotes to is almost always legal, the alternative is leaving a site
|
|
2166
|
+
* pointing at a row that no longer exists, and the result is visible and
|
|
2167
|
+
* fixable in the parent picker. A repair prefers a whole tree to a
|
|
2168
|
+
* perfectly modelled one.
|
|
1956
2169
|
*/
|
|
1957
2170
|
private async reattachOrphanedSubtree(deletedSite: Model): Promise<void> {
|
|
1958
2171
|
const oldPath: string | null = deletedSite.materializedPath || null;
|
|
@@ -29,8 +29,8 @@ const PARENT_NETWORK_SITE_TYPE_KEYS: Array<string> = [
|
|
|
29
29
|
|
|
30
30
|
const PROJECT_KEYS: Array<string> = ["projectId", "project"];
|
|
31
31
|
|
|
32
|
-
const
|
|
33
|
-
"This site type's parent cannot be changed because existing
|
|
32
|
+
const EXISTING_SITES_WOULD_INVERT_MESSAGE: string =
|
|
33
|
+
"This site type's parent cannot be changed because an existing site is already placed under a site that the move would push below it. Move that site first, then change the type.";
|
|
34
34
|
|
|
35
35
|
const REFERENCE_VALIDATION_BATCH_SIZE: number = 1000;
|
|
36
36
|
|
|
@@ -742,111 +742,177 @@ export class Service extends DatabaseService<Model> {
|
|
|
742
742
|
}
|
|
743
743
|
|
|
744
744
|
/*
|
|
745
|
-
* Changing a type
|
|
746
|
-
* tree
|
|
747
|
-
*
|
|
745
|
+
* Changing a type's place in the catalog must not retroactively invert the
|
|
746
|
+
* concrete site tree. Site placement itself is permissive — a site may sit
|
|
747
|
+
* under any site whose type is not BELOW its own — so the rows at risk are
|
|
748
|
+
* not the moved type's own sites.
|
|
749
|
+
*
|
|
750
|
+
* Moving type X from its old ancestor chain to a new one adds "sits above"
|
|
751
|
+
* pairs (Z, Y) for exactly Z in newAncestors = chain(newParent) minus
|
|
752
|
+
* chain(oldParent), and Y in movedSubtree = {X} + descendants(X): X keeps
|
|
753
|
+
* its own subtree, so nothing below X changes relative to X. An existing
|
|
754
|
+
* edge breaks only when its CHILD site is typed in newAncestors and its
|
|
755
|
+
* PARENT site is typed in movedSubtree, because that edge would then place a
|
|
756
|
+
* higher-level site beneath a lower-level one.
|
|
757
|
+
*
|
|
758
|
+
* Two corollaries fall straight out and are worth knowing when reading the
|
|
759
|
+
* early returns: clearing a type's parent has an empty newAncestors, so it
|
|
760
|
+
* can never break anything; and moving a type DEEPER along the chain it is
|
|
761
|
+
* already under only adds ancestors the sites already had.
|
|
748
762
|
*/
|
|
749
|
-
private async
|
|
763
|
+
private async assertExistingSitesWouldNotInvert(data: {
|
|
750
764
|
networkSiteTypeId: ObjectID;
|
|
765
|
+
projectId: ObjectID;
|
|
766
|
+
currentParentNetworkSiteTypeId: ObjectID | string | null;
|
|
751
767
|
proposedParentNetworkSiteTypeId: ObjectID | null;
|
|
768
|
+
networkSiteTypes: Array<Model>;
|
|
752
769
|
}): Promise<void> {
|
|
753
|
-
|
|
754
|
-
query: { networkSiteTypeId: data.networkSiteTypeId },
|
|
755
|
-
select: {
|
|
756
|
-
_id: true,
|
|
757
|
-
parentSiteId: true,
|
|
758
|
-
},
|
|
759
|
-
});
|
|
760
|
-
|
|
761
|
-
if (sites.length === 0) {
|
|
770
|
+
if (!data.proposedParentNetworkSiteTypeId) {
|
|
762
771
|
return;
|
|
763
772
|
}
|
|
764
773
|
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
) {
|
|
771
|
-
|
|
774
|
+
const chainOf: (startId: ObjectID | string | null) => Set<string> = (
|
|
775
|
+
startId: ObjectID | string | null,
|
|
776
|
+
): Set<string> => {
|
|
777
|
+
const chain: Set<string> = new Set<string>();
|
|
778
|
+
|
|
779
|
+
if (!startId) {
|
|
780
|
+
return chain;
|
|
772
781
|
}
|
|
773
782
|
|
|
774
|
-
|
|
775
|
-
|
|
783
|
+
const start: Model | undefined = data.networkSiteTypes.find(
|
|
784
|
+
(networkSiteType: Model) => {
|
|
785
|
+
return Boolean(
|
|
786
|
+
networkSiteType.id && sameId(networkSiteType.id, startId),
|
|
787
|
+
);
|
|
788
|
+
},
|
|
789
|
+
);
|
|
776
790
|
|
|
777
|
-
|
|
778
|
-
const distinctParentSiteIds: Set<string> = new Set<string>();
|
|
791
|
+
chain.add(normalizeId(startId));
|
|
779
792
|
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
throw new BadDataException(EXISTING_SITES_DO_NOT_MATCH_MESSAGE);
|
|
793
|
+
if (!start) {
|
|
794
|
+
return chain;
|
|
783
795
|
}
|
|
784
796
|
|
|
785
|
-
const
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
797
|
+
for (const ancestor of NetworkSiteTypeHierarchyUtil.getAncestorNetworkSiteTypes(
|
|
798
|
+
{
|
|
799
|
+
networkSiteType: start,
|
|
800
|
+
networkSiteTypes: data.networkSiteTypes,
|
|
801
|
+
},
|
|
802
|
+
)) {
|
|
803
|
+
if (ancestor.id) {
|
|
804
|
+
chain.add(normalizeId(ancestor.id));
|
|
805
|
+
}
|
|
789
806
|
}
|
|
807
|
+
|
|
808
|
+
return chain;
|
|
809
|
+
};
|
|
810
|
+
|
|
811
|
+
const oldChain: Set<string> = chainOf(data.currentParentNetworkSiteTypeId);
|
|
812
|
+
const newAncestorIds: Array<string> = [
|
|
813
|
+
...chainOf(data.proposedParentNetworkSiteTypeId),
|
|
814
|
+
].filter((typeId: string) => {
|
|
815
|
+
return !oldChain.has(typeId);
|
|
816
|
+
});
|
|
817
|
+
|
|
818
|
+
if (newAncestorIds.length === 0) {
|
|
819
|
+
return;
|
|
790
820
|
}
|
|
791
821
|
|
|
792
|
-
const
|
|
822
|
+
const movingType: Model = new Model();
|
|
823
|
+
movingType.id = data.networkSiteTypeId;
|
|
824
|
+
|
|
825
|
+
const movedSubtreeTypeIds: Set<string> = new Set<string>([
|
|
826
|
+
normalizeId(data.networkSiteTypeId),
|
|
827
|
+
]);
|
|
828
|
+
for (const descendant of NetworkSiteTypeHierarchyUtil.getDescendantNetworkSiteTypes(
|
|
829
|
+
{
|
|
830
|
+
networkSiteType: movingType,
|
|
831
|
+
networkSiteTypes: data.networkSiteTypes,
|
|
832
|
+
},
|
|
833
|
+
)) {
|
|
834
|
+
if (descendant.id) {
|
|
835
|
+
movedSubtreeTypeIds.add(normalizeId(descendant.id));
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
/*
|
|
840
|
+
* Only sites typed in the newly gained ancestor chain can break, and only
|
|
841
|
+
* through the parent they already point at. Reading that narrow slice
|
|
842
|
+
* rather than every site in the project is what keeps a settings save on a
|
|
843
|
+
* large estate proportional to the move.
|
|
844
|
+
*/
|
|
845
|
+
const sitesAtRisk: Array<NetworkSite> = [];
|
|
793
846
|
|
|
794
847
|
for (
|
|
795
848
|
let offset: number = 0;
|
|
796
|
-
offset <
|
|
797
|
-
offset +=
|
|
849
|
+
offset < newAncestorIds.length;
|
|
850
|
+
offset += REFERENCE_VALIDATION_BATCH_SIZE
|
|
798
851
|
) {
|
|
799
|
-
|
|
800
|
-
offset,
|
|
801
|
-
offset + LIMIT_MAX,
|
|
802
|
-
);
|
|
803
|
-
|
|
804
|
-
parentSites.push(
|
|
852
|
+
sitesAtRisk.push(
|
|
805
853
|
...(await this.findAllNetworkSites({
|
|
806
854
|
query: {
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
855
|
+
projectId: data.projectId,
|
|
856
|
+
networkSiteTypeId: QueryHelper.any(
|
|
857
|
+
newAncestorIds.slice(
|
|
858
|
+
offset,
|
|
859
|
+
offset + REFERENCE_VALIDATION_BATCH_SIZE,
|
|
860
|
+
),
|
|
811
861
|
),
|
|
812
862
|
},
|
|
813
863
|
select: {
|
|
814
864
|
_id: true,
|
|
815
|
-
|
|
865
|
+
parentSiteId: true,
|
|
816
866
|
},
|
|
817
867
|
})),
|
|
818
868
|
);
|
|
819
869
|
}
|
|
820
870
|
|
|
821
|
-
const
|
|
822
|
-
string
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
}
|
|
833
|
-
}
|
|
871
|
+
const parentSiteIds: Array<string> = [
|
|
872
|
+
...new Set<string>(
|
|
873
|
+
sitesAtRisk
|
|
874
|
+
.map((site: NetworkSite): string | null => {
|
|
875
|
+
return site.parentSiteId ? normalizeId(site.parentSiteId) : null;
|
|
876
|
+
})
|
|
877
|
+
.filter((parentSiteId: string | null): parentSiteId is string => {
|
|
878
|
+
return Boolean(parentSiteId);
|
|
879
|
+
}),
|
|
880
|
+
),
|
|
881
|
+
];
|
|
834
882
|
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
normalizeId(parentSiteId),
|
|
839
|
-
);
|
|
883
|
+
if (parentSiteIds.length === 0) {
|
|
884
|
+
return;
|
|
885
|
+
}
|
|
840
886
|
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
887
|
+
for (
|
|
888
|
+
let offset: number = 0;
|
|
889
|
+
offset < parentSiteIds.length;
|
|
890
|
+
offset += REFERENCE_VALIDATION_BATCH_SIZE
|
|
891
|
+
) {
|
|
892
|
+
const parentSites: Array<NetworkSite> = await this.findAllNetworkSites({
|
|
893
|
+
query: {
|
|
894
|
+
projectId: data.projectId,
|
|
895
|
+
_id: QueryHelper.any(
|
|
896
|
+
parentSiteIds.slice(
|
|
897
|
+
offset,
|
|
898
|
+
offset + REFERENCE_VALIDATION_BATCH_SIZE,
|
|
899
|
+
),
|
|
900
|
+
),
|
|
901
|
+
},
|
|
902
|
+
select: {
|
|
903
|
+
_id: true,
|
|
904
|
+
networkSiteTypeId: true,
|
|
905
|
+
},
|
|
906
|
+
});
|
|
847
907
|
|
|
848
|
-
|
|
849
|
-
|
|
908
|
+
for (const parentSite of parentSites) {
|
|
909
|
+
if (
|
|
910
|
+
parentSite.networkSiteTypeId &&
|
|
911
|
+
movedSubtreeTypeIds.has(normalizeId(parentSite.networkSiteTypeId))
|
|
912
|
+
) {
|
|
913
|
+
throw new BadDataException(EXISTING_SITES_WOULD_INVERT_MESSAGE);
|
|
914
|
+
}
|
|
915
|
+
}
|
|
850
916
|
}
|
|
851
917
|
}
|
|
852
918
|
|
|
@@ -1062,6 +1128,17 @@ export class Service extends DatabaseService<Model> {
|
|
|
1062
1128
|
}
|
|
1063
1129
|
|
|
1064
1130
|
if (isParentWritten) {
|
|
1131
|
+
/*
|
|
1132
|
+
* The catalog is read once for the whole update: the inversion check
|
|
1133
|
+
* walks ancestors of the proposed parent and descendants of the moving
|
|
1134
|
+
* type, and a bulk move would otherwise re-read the same rows per item.
|
|
1135
|
+
* Clearing a parent cannot invert anything, so nothing is read for it.
|
|
1136
|
+
*/
|
|
1137
|
+
const networkSiteTypesByProjectId: Map<string, Array<Model>> = new Map<
|
|
1138
|
+
string,
|
|
1139
|
+
Array<Model>
|
|
1140
|
+
>();
|
|
1141
|
+
|
|
1065
1142
|
for (const networkSiteType of networkSiteTypesBeingUpdated) {
|
|
1066
1143
|
if (!networkSiteType.id || !networkSiteType.projectId) {
|
|
1067
1144
|
continue;
|
|
@@ -1083,10 +1160,33 @@ export class Service extends DatabaseService<Model> {
|
|
|
1083
1160
|
: Boolean(currentParentId);
|
|
1084
1161
|
|
|
1085
1162
|
if (parentChanged) {
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1163
|
+
if (proposedParentNetworkSiteTypeId) {
|
|
1164
|
+
const projectKey: string = normalizeId(networkSiteType.projectId);
|
|
1165
|
+
let projectNetworkSiteTypes: Array<Model> | undefined =
|
|
1166
|
+
networkSiteTypesByProjectId.get(projectKey);
|
|
1167
|
+
|
|
1168
|
+
if (!projectNetworkSiteTypes) {
|
|
1169
|
+
projectNetworkSiteTypes = await this.findAllNetworkSiteTypes({
|
|
1170
|
+
query: { projectId: networkSiteType.projectId },
|
|
1171
|
+
select: {
|
|
1172
|
+
_id: true,
|
|
1173
|
+
parentNetworkSiteTypeId: true,
|
|
1174
|
+
},
|
|
1175
|
+
});
|
|
1176
|
+
networkSiteTypesByProjectId.set(
|
|
1177
|
+
projectKey,
|
|
1178
|
+
projectNetworkSiteTypes,
|
|
1179
|
+
);
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
await this.assertExistingSitesWouldNotInvert({
|
|
1183
|
+
networkSiteTypeId: networkSiteType.id,
|
|
1184
|
+
projectId: networkSiteType.projectId,
|
|
1185
|
+
currentParentNetworkSiteTypeId: currentParentId,
|
|
1186
|
+
proposedParentNetworkSiteTypeId,
|
|
1187
|
+
networkSiteTypes: projectNetworkSiteTypes,
|
|
1188
|
+
});
|
|
1189
|
+
}
|
|
1090
1190
|
|
|
1091
1191
|
if (
|
|
1092
1192
|
networkSiteTypesBeingUpdated.length === 1 &&
|