@oneuptime/common 12.0.32 → 12.0.33
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/Span.ts +14 -0
- package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
- package/Models/DatabaseModels/Index.ts +10 -0
- package/Models/DatabaseModels/Monitor.ts +76 -0
- package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
- package/Models/DatabaseModels/NetworkDevice.ts +176 -1
- package/Models/DatabaseModels/NetworkSite.ts +201 -2
- package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
- package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
- package/Models/DatabaseModels/TelemetryException.ts +119 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
- package/Server/API/EnterpriseLicenseAPI.ts +391 -64
- package/Server/API/LlmProviderAPI.ts +137 -22
- package/Server/EnvironmentConfig.ts +14 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Infrastructure/QueueWorker.ts +38 -8
- package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
- package/Server/Middleware/ProjectAuthorization.ts +11 -0
- package/Server/Middleware/SCIMAuthorization.ts +12 -0
- package/Server/Middleware/TelemetryIngest.ts +11 -0
- package/Server/Services/AIBillingService.ts +101 -27
- package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
- package/Server/Services/EnterpriseLicenseService.ts +55 -0
- package/Server/Services/Index.ts +10 -0
- package/Server/Services/MonitorService.ts +143 -21
- package/Server/Services/MonitorStatusTimelineService.ts +150 -8
- package/Server/Services/MonitorTemplateService.ts +217 -1
- package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
- package/Server/Services/NetworkAlertPolicyService.ts +944 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
- package/Server/Services/NetworkDeviceService.ts +1032 -73
- package/Server/Services/NetworkSiteService.ts +1502 -129
- package/Server/Services/NetworkSiteTypeService.ts +1216 -0
- package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
- package/Server/Services/NotificationService.ts +118 -28
- package/Server/Services/ProjectService.ts +105 -48
- package/Server/Services/StatusPagePrivateUserService.ts +103 -3
- package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
- package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
- package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
- package/Server/Services/UserNotificationSettingService.ts +62 -25
- package/Server/Services/UserService.ts +95 -0
- package/Server/Types/Database/QueryHelper.ts +2 -2
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
- package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
- package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
- package/Server/Utils/DataSource/HttpFetch.ts +9 -2
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
- package/Server/Utils/LLM/LLMService.ts +78 -0
- package/Server/Utils/LogRedaction.ts +8 -0
- package/Server/Utils/Logger.ts +79 -1
- package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
- package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
- package/Server/Utils/OutboundUserAgent.ts +152 -0
- package/Server/Utils/StartServer.ts +51 -19
- package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
- package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
- package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
- package/Server/Utils/Telemetry.ts +198 -51
- package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
- package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
- package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
- package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
- package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
- package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
- package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
- package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
- package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
- package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
- package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
- package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
- package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
- package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
- package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
- package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
- package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
- package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
- package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
- package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
- package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
- package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
- package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
- package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
- package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
- package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
- package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
- package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
- package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
- package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
- package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
- package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
- package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
- package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
- package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
- package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
- package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
- package/Tests/Server/Utils/Captcha.test.ts +422 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
- package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
- package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
- package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
- package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
- package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
- package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
- package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
- package/Tests/Server/Utils/Telemetry.test.ts +456 -66
- package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
- package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
- package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
- package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
- package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
- package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
- package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
- package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
- package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
- package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
- package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
- package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
- package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
- package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
- package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
- package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
- package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
- package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
- package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
- package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
- package/Types/AI/ExceptionAIClassification.ts +10 -24
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
- package/Types/Exception/ApiException.ts +10 -0
- package/Types/Exception/BadDataException.ts +11 -0
- package/Types/Exception/BadRequestException.ts +11 -0
- package/Types/Exception/Exception.ts +65 -0
- package/Types/Exception/ForbiddenException.ts +10 -0
- package/Types/Exception/NotAuthenticatedException.ts +10 -0
- package/Types/Exception/NotAuthorizedException.ts +10 -0
- package/Types/Exception/NotFoundException.ts +11 -0
- package/Types/Exception/PayloadTooLargeException.ts +11 -0
- package/Types/Exception/PaymentRequiredException.ts +10 -0
- package/Types/Exception/ServiceUnavailableException.ts +10 -0
- package/Types/Exception/SsoAuthorizationException.ts +10 -0
- package/Types/Exception/TenantNotFoundException.ts +11 -0
- package/Types/Exception/TimeoutException.ts +10 -0
- package/Types/Exception/TooManyRequestsException.ts +10 -0
- package/Types/Exception/UnableToReachServer.ts +10 -0
- package/Types/Exception/WebsiteRequestException.ts +10 -0
- package/Types/Monitor/CriteriaFilter.ts +60 -2
- package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
- package/Types/Monitor/MonitorMetricType.ts +71 -0
- package/Types/Monitor/MonitorStep.ts +76 -0
- package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
- package/Types/Monitor/MonitorType.ts +47 -1
- package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
- package/Types/Monitor/SqlConnectionConfig.ts +31 -0
- package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
- package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
- package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
- package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
- package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
- package/Types/Permission.ts +90 -0
- package/Types/Probe/ProbeMonitorResponse.ts +16 -0
- package/Types/Telemetry/ErrorClass.ts +274 -0
- package/Types/Telemetry/UnitOfWork.ts +59 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
- package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
- package/UI/Components/Modal/Modal.tsx +2 -8
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
- package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
- package/UI/Components/SideMenu/SideMenu.tsx +123 -5
- package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
- package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
- package/UI/Components/SideOver/SideOver.tsx +21 -20
- package/UI/Utils/PageScrollLock.ts +79 -3
- package/UI/Utils/PermissionGate.ts +61 -0
- package/UI/Utils/SensitiveUrlToken.ts +112 -0
- package/UI/Utils/TestLLMProvider.ts +11 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
- package/Utils/Monitor/MonitorMetricType.ts +153 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
- package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
- package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
- package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
- package/build/dist/Models/AnalyticsModels/Span.js +14 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +10 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/LlmProviderAPI.js +108 -13
- package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +12 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIBillingService.js +70 -16
- package/build/dist/Server/Services/AIBillingService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +10 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +119 -21
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
- package/build/dist/Server/Services/NotificationService.js +80 -17
- package/build/dist/Server/Services/NotificationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +66 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +90 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
- package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +8 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +63 -1
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +38 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +162 -46
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
- package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
- package/build/dist/Types/Exception/ApiException.js +9 -0
- package/build/dist/Types/Exception/ApiException.js.map +1 -1
- package/build/dist/Types/Exception/BadDataException.js +10 -0
- package/build/dist/Types/Exception/BadDataException.js.map +1 -1
- package/build/dist/Types/Exception/BadRequestException.js +10 -0
- package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
- package/build/dist/Types/Exception/Exception.js +56 -0
- package/build/dist/Types/Exception/Exception.js.map +1 -1
- package/build/dist/Types/Exception/ForbiddenException.js +9 -0
- package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
- package/build/dist/Types/Exception/NotFoundException.js +10 -0
- package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
- package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
- package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
- package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
- package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
- package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
- package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
- package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
- package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
- package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/TimeoutException.js +9 -0
- package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
- package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
- package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
- package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
- package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
- package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +54 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +45 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
- package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
- package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +80 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
- package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -7
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Utils/PageScrollLock.js +31 -3
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +42 -1
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
- package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
- package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,752 @@
|
|
|
1
|
+
import DatabaseConfig from "../../../../Server/DatabaseConfig";
|
|
2
|
+
import Semaphore, {
|
|
3
|
+
SemaphoreMutex,
|
|
4
|
+
} from "../../../../Server/Infrastructure/Semaphore";
|
|
5
|
+
import MailService from "../../../../Server/Services/MailService";
|
|
6
|
+
import ProjectService from "../../../../Server/Services/ProjectService";
|
|
7
|
+
import UserEmailService from "../../../../Server/Services/UserEmailService";
|
|
8
|
+
import UserNotificationEmailRollupBatchService from "../../../../Server/Services/UserNotificationEmailRollupBatchService";
|
|
9
|
+
import UserNotificationEmailRollupItemService from "../../../../Server/Services/UserNotificationEmailRollupItemService";
|
|
10
|
+
import logger from "../../../../Server/Utils/Logger";
|
|
11
|
+
import UserNotificationEmailRollupBatch, {
|
|
12
|
+
RollupBatchStatus,
|
|
13
|
+
} from "../../../../Models/DatabaseModels/UserNotificationEmailRollupBatch";
|
|
14
|
+
import UserNotificationEmailRollupItem from "../../../../Models/DatabaseModels/UserNotificationEmailRollupItem";
|
|
15
|
+
import URL from "../../../../Types/API/URL";
|
|
16
|
+
import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
|
|
17
|
+
import Dictionary from "../../../../Types/Dictionary";
|
|
18
|
+
import Email from "../../../../Types/Email";
|
|
19
|
+
import { JSONObject } from "../../../../Types/JSON";
|
|
20
|
+
import RollupCategory from "../../../../Types/NotificationSetting/NotificationEmailRollupCategory";
|
|
21
|
+
import NotificationSettingEventType from "../../../../Types/NotificationSetting/NotificationSettingEventType";
|
|
22
|
+
import ObjectID from "../../../../Types/ObjectID";
|
|
23
|
+
import PositiveNumber from "../../../../Types/PositiveNumber";
|
|
24
|
+
import { matchesQuery } from "../OnCall/OnCallResolverTestHarness";
|
|
25
|
+
|
|
26
|
+
/*
|
|
27
|
+
* NOT A TEST FILE. Common/jest.config.json's testRegex only picks up
|
|
28
|
+
* *.test.ts, which is exactly how the on-call harnesses live beside the suites
|
|
29
|
+
* that use them.
|
|
30
|
+
*
|
|
31
|
+
* In-memory stand-ins for every collaborator EmailRollupFlushRunner touches,
|
|
32
|
+
* so the REAL runner runs end to end - discovery, the epoch claim, the stamp,
|
|
33
|
+
* the read-back, the recipient re-validation, the render and the send -
|
|
34
|
+
* against rows a test can inspect afterwards.
|
|
35
|
+
*
|
|
36
|
+
* Two things here are not "just enough to pass", and both are the point of
|
|
37
|
+
* having a harness at all rather than a pile of ad-hoc mocks:
|
|
38
|
+
*
|
|
39
|
+
* 1. THE BATCH TABLE ENFORCES ITS UNIQUE INDEX. A second insert for the same
|
|
40
|
+
* (projectId, userId, toEmail, claimEpochStartsAt) throws an object that
|
|
41
|
+
* PostgresErrorTranslator.isUniqueViolation recognises, exactly as
|
|
42
|
+
* Postgres would. The whole exactly-once argument rests on that insert
|
|
43
|
+
* being atomic, so a harness that let the duplicate through would make
|
|
44
|
+
* the claim tests prove nothing.
|
|
45
|
+
*
|
|
46
|
+
* 2. updateBy RETURNS AN HONEST AFFECTED COUNT and honours its limit. The
|
|
47
|
+
* runner branches on "did I stamp anything?" to decide Empty, and it
|
|
48
|
+
* relies on the limit to bound a batch at MAX_ITEMS_PER_ROLLUP.
|
|
49
|
+
*
|
|
50
|
+
* Query matching is matchesQuery from OnCallResolverTestHarness rather than a
|
|
51
|
+
* second implementation: it already interprets ObjectID stringification, IS
|
|
52
|
+
* NULL and the <= / >= operators QueryHelper builds, which is precisely the
|
|
53
|
+
* vocabulary this runner queries in.
|
|
54
|
+
*
|
|
55
|
+
* `select` is honoured too, so a row handed back by discovery carries only the
|
|
56
|
+
* four columns discovery asked for. A runner that started reading a column it
|
|
57
|
+
* had not selected would fail here rather than in production.
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
export type FakeRow = Record<string, unknown>;
|
|
61
|
+
|
|
62
|
+
export interface FakeItemRow {
|
|
63
|
+
_id: ObjectID;
|
|
64
|
+
id: ObjectID;
|
|
65
|
+
projectId: ObjectID;
|
|
66
|
+
userId: ObjectID;
|
|
67
|
+
toEmail: Email;
|
|
68
|
+
eventType: NotificationSettingEventType;
|
|
69
|
+
rollupCategory: RollupCategory;
|
|
70
|
+
subject: string;
|
|
71
|
+
viewLink: string | null;
|
|
72
|
+
sentAt: Date | null;
|
|
73
|
+
rollupBatchId: ObjectID | null;
|
|
74
|
+
createdAt: Date;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface FakeBatchRow {
|
|
78
|
+
_id: ObjectID;
|
|
79
|
+
id: ObjectID;
|
|
80
|
+
projectId: ObjectID;
|
|
81
|
+
userId: ObjectID;
|
|
82
|
+
toEmail: Email;
|
|
83
|
+
claimEpochStartsAt: Date;
|
|
84
|
+
claimedAt: Date;
|
|
85
|
+
sentAt: Date | null;
|
|
86
|
+
itemCount: number | null;
|
|
87
|
+
status: RollupBatchStatus;
|
|
88
|
+
statusMessage: string | null;
|
|
89
|
+
createdAt: Date;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export interface SentRollupMail {
|
|
93
|
+
toEmail: string;
|
|
94
|
+
subject: string;
|
|
95
|
+
templateType: string | undefined;
|
|
96
|
+
vars: Dictionary<string | JSONObject>;
|
|
97
|
+
options: Record<string, unknown> | undefined;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface RollupHarness {
|
|
101
|
+
items: Array<FakeItemRow>;
|
|
102
|
+
batches: Array<FakeBatchRow>;
|
|
103
|
+
// UserEmail rows: { _id, id, userId, projectId, isVerified, email }.
|
|
104
|
+
userEmails: Array<FakeRow>;
|
|
105
|
+
// Project rows: { _id, id, name }.
|
|
106
|
+
projects: Array<FakeRow>;
|
|
107
|
+
|
|
108
|
+
/*
|
|
109
|
+
* Every sendMail the runner attempted, including the ones that threw;
|
|
110
|
+
* `sent` is the subset that was delivered.
|
|
111
|
+
*/
|
|
112
|
+
sendAttempts: Array<SentRollupMail>;
|
|
113
|
+
sent: Array<SentRollupMail>;
|
|
114
|
+
|
|
115
|
+
/*
|
|
116
|
+
* An ordered trace of the collaborator calls whose ORDER is load-bearing.
|
|
117
|
+
* "stamp" is pushed by the item updateBy, "send" by MailService.sendMail:
|
|
118
|
+
* stamp-before-send is the property that stops a permanently failing send
|
|
119
|
+
* re-spamming an address every epoch, and it is only observable as an
|
|
120
|
+
* ordering.
|
|
121
|
+
*/
|
|
122
|
+
callLog: Array<string>;
|
|
123
|
+
|
|
124
|
+
lockAvailable: boolean;
|
|
125
|
+
lockCalls: Array<Record<string, unknown>>;
|
|
126
|
+
releasedMutexes: Array<SemaphoreMutex>;
|
|
127
|
+
|
|
128
|
+
/*
|
|
129
|
+
* Added to the real Date.now() the runner sees, so a test can make wall
|
|
130
|
+
* clock jump forward mid-sweep (the sweep budget) without freezing time for
|
|
131
|
+
* jest itself.
|
|
132
|
+
*/
|
|
133
|
+
clockOffsetMs: number;
|
|
134
|
+
|
|
135
|
+
// Return an Error to make that send throw; null to deliver.
|
|
136
|
+
failSend: (mail: SentRollupMail) => Error | null;
|
|
137
|
+
/*
|
|
138
|
+
* Return an Error to make that claim insert throw something that is NOT a
|
|
139
|
+
* unique violation; null to insert normally (the unique index still
|
|
140
|
+
* applies).
|
|
141
|
+
*/
|
|
142
|
+
failBatchCreate: (batch: FakeBatchRow) => Error | null;
|
|
143
|
+
// Runs immediately before a claim insert; lets a test inject a racing write.
|
|
144
|
+
beforeBatchCreate: (() => void) | null;
|
|
145
|
+
|
|
146
|
+
itemFindByCalls: number;
|
|
147
|
+
// Every argument object the item findBy was handed, in call order.
|
|
148
|
+
itemFindByArgs: Array<Record<string, unknown>>;
|
|
149
|
+
itemUpdateByCalls: number;
|
|
150
|
+
batchCreateCalls: number;
|
|
151
|
+
|
|
152
|
+
debugs: Array<string>;
|
|
153
|
+
warnings: Array<string>;
|
|
154
|
+
errors: Array<unknown>;
|
|
155
|
+
|
|
156
|
+
nextItemId: number;
|
|
157
|
+
nextBatchId: number;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export const HARNESS_DASHBOARD_URL: string =
|
|
161
|
+
"https://oneuptime.example.com/dashboard";
|
|
162
|
+
|
|
163
|
+
export function emptyRollupHarness(): RollupHarness {
|
|
164
|
+
return {
|
|
165
|
+
items: [],
|
|
166
|
+
batches: [],
|
|
167
|
+
userEmails: [],
|
|
168
|
+
projects: [],
|
|
169
|
+
sendAttempts: [],
|
|
170
|
+
sent: [],
|
|
171
|
+
callLog: [],
|
|
172
|
+
lockAvailable: true,
|
|
173
|
+
lockCalls: [],
|
|
174
|
+
releasedMutexes: [],
|
|
175
|
+
clockOffsetMs: 0,
|
|
176
|
+
failSend: (): Error | null => {
|
|
177
|
+
return null;
|
|
178
|
+
},
|
|
179
|
+
failBatchCreate: (): Error | null => {
|
|
180
|
+
return null;
|
|
181
|
+
},
|
|
182
|
+
beforeBatchCreate: null,
|
|
183
|
+
itemFindByCalls: 0,
|
|
184
|
+
itemFindByArgs: [],
|
|
185
|
+
itemUpdateByCalls: 0,
|
|
186
|
+
batchCreateCalls: 0,
|
|
187
|
+
debugs: [],
|
|
188
|
+
warnings: [],
|
|
189
|
+
errors: [],
|
|
190
|
+
nextItemId: 1,
|
|
191
|
+
nextBatchId: 1,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
type ToKeyFunction = (value: unknown) => string;
|
|
196
|
+
|
|
197
|
+
const toKey: ToKeyFunction = (value: unknown): string => {
|
|
198
|
+
if (value === null || value === undefined) {
|
|
199
|
+
return "";
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return String(value);
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
type ToLimitFunction = (value: unknown, fallback: number) => number;
|
|
206
|
+
|
|
207
|
+
/*
|
|
208
|
+
* FindBy.limit and UpdateBy.limit are `PositiveNumber | number`, and the
|
|
209
|
+
* limit is load-bearing in both places (a bounded scan, and a batch capped at
|
|
210
|
+
* MAX_ITEMS_PER_ROLLUP), so both shapes are honoured rather than assumed.
|
|
211
|
+
*/
|
|
212
|
+
const toLimit: ToLimitFunction = (value: unknown, fallback: number): number => {
|
|
213
|
+
if (value instanceof PositiveNumber) {
|
|
214
|
+
return value.toNumber();
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (typeof value === "number") {
|
|
218
|
+
return value;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return fallback;
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
type ToComparableFunction = (value: unknown) => number;
|
|
225
|
+
|
|
226
|
+
const toComparable: ToComparableFunction = (value: unknown): number => {
|
|
227
|
+
if (value instanceof Date) {
|
|
228
|
+
return value.getTime();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (typeof value === "number") {
|
|
232
|
+
return value;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return new Date(String(value)).getTime();
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
type ApplySortFunction = (
|
|
239
|
+
rows: Array<FakeRow>,
|
|
240
|
+
sort: Record<string, unknown> | undefined,
|
|
241
|
+
) => Array<FakeRow>;
|
|
242
|
+
|
|
243
|
+
const applySort: ApplySortFunction = (
|
|
244
|
+
rows: Array<FakeRow>,
|
|
245
|
+
sort: Record<string, unknown> | undefined,
|
|
246
|
+
): Array<FakeRow> => {
|
|
247
|
+
if (!sort) {
|
|
248
|
+
return rows;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const entry: [string, unknown] | undefined = Object.entries(sort)[0];
|
|
252
|
+
|
|
253
|
+
if (!entry) {
|
|
254
|
+
return rows;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const key: string = entry[0];
|
|
258
|
+
const descending: boolean = String(entry[1]).toLowerCase().startsWith("desc");
|
|
259
|
+
|
|
260
|
+
return [...rows].sort((a: FakeRow, b: FakeRow): number => {
|
|
261
|
+
const left: number = toComparable(a[key]);
|
|
262
|
+
const right: number = toComparable(b[key]);
|
|
263
|
+
return descending ? right - left : left - right;
|
|
264
|
+
});
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
type ApplySelectFunction = (
|
|
268
|
+
row: FakeRow,
|
|
269
|
+
select: Record<string, unknown> | undefined,
|
|
270
|
+
) => FakeRow;
|
|
271
|
+
|
|
272
|
+
/*
|
|
273
|
+
* Project a row the way the database would: the selected columns, plus the id
|
|
274
|
+
* columns DatabaseService always returns. A runner that reads a column it did
|
|
275
|
+
* not select gets undefined here, which is what it would get in production.
|
|
276
|
+
*/
|
|
277
|
+
const applySelect: ApplySelectFunction = (
|
|
278
|
+
row: FakeRow,
|
|
279
|
+
select: Record<string, unknown> | undefined,
|
|
280
|
+
): FakeRow => {
|
|
281
|
+
if (!select) {
|
|
282
|
+
return { ...row };
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const projected: FakeRow = {
|
|
286
|
+
_id: row["_id"],
|
|
287
|
+
id: row["id"],
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
for (const key of Object.keys(select)) {
|
|
291
|
+
projected[key] = row[key];
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return projected;
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
/*
|
|
298
|
+
* What Postgres throws on 23505. PostgresErrorTranslator.isUniqueViolation
|
|
299
|
+
* recognises this shape, which is the point: the runner must recover through
|
|
300
|
+
* the translator rather than by sniffing the code itself.
|
|
301
|
+
*/
|
|
302
|
+
export class RollupUniqueViolationError extends Error {
|
|
303
|
+
public postgresErrorCode: string = "23505";
|
|
304
|
+
|
|
305
|
+
public constructor() {
|
|
306
|
+
super(
|
|
307
|
+
'duplicate key value violates unique constraint "UserNotificationEmailRollupBatch_claim_unique"',
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
type BatchUniqueKeyFunction = (row: {
|
|
313
|
+
projectId: ObjectID;
|
|
314
|
+
userId: ObjectID;
|
|
315
|
+
toEmail: Email;
|
|
316
|
+
claimEpochStartsAt: Date;
|
|
317
|
+
}) => string;
|
|
318
|
+
|
|
319
|
+
const batchUniqueKey: BatchUniqueKeyFunction = (row: {
|
|
320
|
+
projectId: ObjectID;
|
|
321
|
+
userId: ObjectID;
|
|
322
|
+
toEmail: Email;
|
|
323
|
+
claimEpochStartsAt: Date;
|
|
324
|
+
}): string => {
|
|
325
|
+
return [
|
|
326
|
+
toKey(row.projectId),
|
|
327
|
+
toKey(row.userId),
|
|
328
|
+
toKey(row.toEmail),
|
|
329
|
+
row.claimEpochStartsAt.getTime(),
|
|
330
|
+
].join("|");
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
// -- Row builders ----------------------------------------------------------
|
|
334
|
+
|
|
335
|
+
export function seedItem(
|
|
336
|
+
harness: RollupHarness,
|
|
337
|
+
data: {
|
|
338
|
+
projectId: ObjectID;
|
|
339
|
+
userId: ObjectID;
|
|
340
|
+
toEmail: Email;
|
|
341
|
+
createdAt: Date;
|
|
342
|
+
subject?: string | undefined;
|
|
343
|
+
eventType?: NotificationSettingEventType | undefined;
|
|
344
|
+
rollupCategory?: RollupCategory | undefined;
|
|
345
|
+
viewLink?: string | null | undefined;
|
|
346
|
+
sentAt?: Date | null | undefined;
|
|
347
|
+
rollupBatchId?: ObjectID | null | undefined;
|
|
348
|
+
},
|
|
349
|
+
): FakeItemRow {
|
|
350
|
+
const id: ObjectID = new ObjectID(`item-${harness.nextItemId++}`);
|
|
351
|
+
const row: FakeItemRow = {
|
|
352
|
+
_id: id,
|
|
353
|
+
id: id,
|
|
354
|
+
projectId: data.projectId,
|
|
355
|
+
userId: data.userId,
|
|
356
|
+
toEmail: data.toEmail,
|
|
357
|
+
eventType:
|
|
358
|
+
data.eventType ??
|
|
359
|
+
NotificationSettingEventType.SEND_INCIDENT_CREATED_OWNER_NOTIFICATION,
|
|
360
|
+
rollupCategory: data.rollupCategory ?? RollupCategory.Incidents,
|
|
361
|
+
subject: data.subject ?? `Incident created ${id.toString()}`,
|
|
362
|
+
viewLink: data.viewLink ?? null,
|
|
363
|
+
sentAt: data.sentAt ?? null,
|
|
364
|
+
rollupBatchId: data.rollupBatchId ?? null,
|
|
365
|
+
createdAt: data.createdAt,
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
harness.items.push(row);
|
|
369
|
+
|
|
370
|
+
return row;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
export function seedVerifiedEmail(
|
|
374
|
+
harness: RollupHarness,
|
|
375
|
+
data: {
|
|
376
|
+
projectId: ObjectID;
|
|
377
|
+
userId: ObjectID;
|
|
378
|
+
email: Email;
|
|
379
|
+
isVerified?: boolean | undefined;
|
|
380
|
+
},
|
|
381
|
+
): void {
|
|
382
|
+
const id: ObjectID = ObjectID.generate();
|
|
383
|
+
|
|
384
|
+
harness.userEmails.push({
|
|
385
|
+
_id: id,
|
|
386
|
+
id: id,
|
|
387
|
+
projectId: data.projectId,
|
|
388
|
+
userId: data.userId,
|
|
389
|
+
email: data.email,
|
|
390
|
+
isVerified: data.isVerified ?? true,
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
export function seedProject(
|
|
395
|
+
harness: RollupHarness,
|
|
396
|
+
data: { projectId: ObjectID; name: string },
|
|
397
|
+
): void {
|
|
398
|
+
harness.projects.push({
|
|
399
|
+
_id: data.projectId,
|
|
400
|
+
id: data.projectId,
|
|
401
|
+
name: data.name,
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
export function batchesOfStatus(
|
|
406
|
+
harness: RollupHarness,
|
|
407
|
+
status: RollupBatchStatus,
|
|
408
|
+
): Array<FakeBatchRow> {
|
|
409
|
+
return harness.batches.filter((row: FakeBatchRow): boolean => {
|
|
410
|
+
return row.status === status;
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
export function pendingItems(harness: RollupHarness): Array<FakeItemRow> {
|
|
415
|
+
return harness.items.filter((row: FakeItemRow): boolean => {
|
|
416
|
+
return row.sentAt === null;
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// -- Installation ----------------------------------------------------------
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Spy every collaborator of EmailRollupFlushRunner and answer from `harness`.
|
|
424
|
+
* Call in a test or beforeEach; restore with jest.restoreAllMocks().
|
|
425
|
+
*/
|
|
426
|
+
export function installRollupHarness(harness: RollupHarness): void {
|
|
427
|
+
// Logger: silent, but captured.
|
|
428
|
+
jest.spyOn(logger, "debug").mockImplementation((message: unknown): void => {
|
|
429
|
+
harness.debugs.push(toKey(message));
|
|
430
|
+
return undefined;
|
|
431
|
+
});
|
|
432
|
+
jest.spyOn(logger, "info").mockImplementation((): void => {
|
|
433
|
+
return undefined;
|
|
434
|
+
});
|
|
435
|
+
jest.spyOn(logger, "warn").mockImplementation((message: unknown): void => {
|
|
436
|
+
harness.warnings.push(toKey(message));
|
|
437
|
+
return undefined;
|
|
438
|
+
});
|
|
439
|
+
jest.spyOn(logger, "error").mockImplementation((message: unknown): void => {
|
|
440
|
+
harness.errors.push(message);
|
|
441
|
+
return undefined;
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
/*
|
|
445
|
+
* Real elapsed time plus a test-controlled offset, rather than a frozen
|
|
446
|
+
* clock: the sweep's budget check is the only thing in the runner that reads
|
|
447
|
+
* Date.now, and freezing it outright would also freeze it for jest.
|
|
448
|
+
*/
|
|
449
|
+
const realNow: () => number = Date.now.bind(Date);
|
|
450
|
+
|
|
451
|
+
jest.spyOn(Date, "now").mockImplementation((): number => {
|
|
452
|
+
return realNow() + harness.clockOffsetMs;
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
// -- The item table ------------------------------------------------------
|
|
456
|
+
|
|
457
|
+
jest
|
|
458
|
+
.spyOn(UserNotificationEmailRollupItemService, "findBy")
|
|
459
|
+
.mockImplementation(((args: {
|
|
460
|
+
query?: Record<string, unknown>;
|
|
461
|
+
select?: Record<string, unknown>;
|
|
462
|
+
sort?: Record<string, unknown>;
|
|
463
|
+
limit?: unknown;
|
|
464
|
+
}) => {
|
|
465
|
+
harness.itemFindByCalls = harness.itemFindByCalls + 1;
|
|
466
|
+
harness.itemFindByArgs.push(args as Record<string, unknown>);
|
|
467
|
+
|
|
468
|
+
const matched: Array<FakeRow> = harness.items
|
|
469
|
+
.map((row: FakeItemRow): FakeRow => {
|
|
470
|
+
return row as unknown as FakeRow;
|
|
471
|
+
})
|
|
472
|
+
.filter((row: FakeRow): boolean => {
|
|
473
|
+
return matchesQuery(args.query, row);
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
const sorted: Array<FakeRow> = applySort(matched, args.sort);
|
|
477
|
+
const limited: Array<FakeRow> = sorted.slice(
|
|
478
|
+
0,
|
|
479
|
+
toLimit(args.limit, sorted.length),
|
|
480
|
+
);
|
|
481
|
+
|
|
482
|
+
return Promise.resolve(
|
|
483
|
+
limited.map((row: FakeRow): UserNotificationEmailRollupItem => {
|
|
484
|
+
return applySelect(
|
|
485
|
+
row,
|
|
486
|
+
args.select,
|
|
487
|
+
) as unknown as UserNotificationEmailRollupItem;
|
|
488
|
+
}),
|
|
489
|
+
);
|
|
490
|
+
}) as never);
|
|
491
|
+
|
|
492
|
+
/*
|
|
493
|
+
* Used only on the failure path, where flushBucket counts how many rows it
|
|
494
|
+
* had already stamped into the batch so the Failed row can say how many
|
|
495
|
+
* notifications went with it. Modelled on findBy so the same query matcher
|
|
496
|
+
* decides membership; an unmocked countBy would throw inside the catch that
|
|
497
|
+
* records the failure and leave the batch stuck on Claimed, which is exactly
|
|
498
|
+
* the state the recording exists to avoid.
|
|
499
|
+
*/
|
|
500
|
+
jest
|
|
501
|
+
.spyOn(UserNotificationEmailRollupItemService, "countBy")
|
|
502
|
+
.mockImplementation(((args: { query?: Record<string, unknown> }) => {
|
|
503
|
+
const matched: Array<FakeRow> = harness.items
|
|
504
|
+
.map((row: FakeItemRow): FakeRow => {
|
|
505
|
+
return row as unknown as FakeRow;
|
|
506
|
+
})
|
|
507
|
+
.filter((row: FakeRow): boolean => {
|
|
508
|
+
return matchesQuery(args.query, row);
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
return Promise.resolve(new PositiveNumber(matched.length));
|
|
512
|
+
}) as never);
|
|
513
|
+
|
|
514
|
+
jest
|
|
515
|
+
.spyOn(UserNotificationEmailRollupItemService, "updateBy")
|
|
516
|
+
.mockImplementation(((args: {
|
|
517
|
+
query?: Record<string, unknown>;
|
|
518
|
+
data: Record<string, unknown>;
|
|
519
|
+
limit?: unknown;
|
|
520
|
+
}) => {
|
|
521
|
+
harness.itemUpdateByCalls = harness.itemUpdateByCalls + 1;
|
|
522
|
+
harness.callLog.push("stamp");
|
|
523
|
+
|
|
524
|
+
const limit: number = toLimit(args.limit, harness.items.length);
|
|
525
|
+
|
|
526
|
+
/*
|
|
527
|
+
* updateBy RESOLVES ITS ROWS NEWEST-FIRST, exactly as DatabaseService
|
|
528
|
+
* does, and that is not a detail this harness may round off.
|
|
529
|
+
*
|
|
530
|
+
* _updateBy loads the rows it is about to write with an internal _findBy
|
|
531
|
+
* that takes no sort from the caller - UpdateBy has no sort field - so
|
|
532
|
+
* it gets _findBy's default of createdAt DESCENDING. The default is
|
|
533
|
+
* invisible until an update is LIMITED, and then it decides WHICH rows
|
|
534
|
+
* win: a bare `updateBy(..., limit: MAX_ITEMS_PER_ROLLUP)` over an
|
|
535
|
+
* over-full bucket stamps the NEWEST rows and starves the oldest.
|
|
536
|
+
*
|
|
537
|
+
* Iterating insertion order here instead would make a LIFO drain look
|
|
538
|
+
* FIFO whenever a fixture happened to be seeded oldest-first, which is
|
|
539
|
+
* every fixture - so the flush runner's explicit oldest-first select
|
|
540
|
+
* could be deleted with the suite still green.
|
|
541
|
+
*/
|
|
542
|
+
const candidates: Array<FakeItemRow> = applySort(
|
|
543
|
+
harness.items as unknown as Array<FakeRow>,
|
|
544
|
+
{ createdAt: SortOrder.Descending },
|
|
545
|
+
) as unknown as Array<FakeItemRow>;
|
|
546
|
+
|
|
547
|
+
let affected: number = 0;
|
|
548
|
+
|
|
549
|
+
for (const row of candidates) {
|
|
550
|
+
if (affected >= limit) {
|
|
551
|
+
break;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
if (!matchesQuery(args.query, row as unknown as FakeRow)) {
|
|
555
|
+
continue;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
Object.assign(row, args.data);
|
|
559
|
+
affected = affected + 1;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
return Promise.resolve(affected);
|
|
563
|
+
}) as never);
|
|
564
|
+
|
|
565
|
+
// -- The batch table -----------------------------------------------------
|
|
566
|
+
|
|
567
|
+
jest
|
|
568
|
+
.spyOn(UserNotificationEmailRollupBatchService, "create")
|
|
569
|
+
.mockImplementation(((args: { data: UserNotificationEmailRollupBatch }) => {
|
|
570
|
+
harness.batchCreateCalls = harness.batchCreateCalls + 1;
|
|
571
|
+
|
|
572
|
+
const data: UserNotificationEmailRollupBatch = args.data;
|
|
573
|
+
|
|
574
|
+
if (
|
|
575
|
+
!data.projectId ||
|
|
576
|
+
!data.userId ||
|
|
577
|
+
!data.toEmail ||
|
|
578
|
+
!data.claimEpochStartsAt ||
|
|
579
|
+
!data.claimedAt ||
|
|
580
|
+
!data.status
|
|
581
|
+
) {
|
|
582
|
+
return Promise.reject(
|
|
583
|
+
new Error("fake rollup batch: missing required column"),
|
|
584
|
+
);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
const id: ObjectID = new ObjectID(`batch-${harness.nextBatchId++}`);
|
|
588
|
+
const row: FakeBatchRow = {
|
|
589
|
+
_id: id,
|
|
590
|
+
id: id,
|
|
591
|
+
projectId: data.projectId,
|
|
592
|
+
userId: data.userId,
|
|
593
|
+
toEmail: data.toEmail,
|
|
594
|
+
claimEpochStartsAt: data.claimEpochStartsAt,
|
|
595
|
+
claimedAt: data.claimedAt,
|
|
596
|
+
sentAt: null,
|
|
597
|
+
itemCount: null,
|
|
598
|
+
status: data.status,
|
|
599
|
+
statusMessage: null,
|
|
600
|
+
createdAt: data.claimedAt,
|
|
601
|
+
};
|
|
602
|
+
|
|
603
|
+
if (harness.beforeBatchCreate) {
|
|
604
|
+
harness.beforeBatchCreate();
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
const failure: Error | null = harness.failBatchCreate(row);
|
|
608
|
+
|
|
609
|
+
if (failure) {
|
|
610
|
+
return Promise.reject(failure);
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
const key: string = batchUniqueKey(row);
|
|
614
|
+
|
|
615
|
+
for (const existing of harness.batches) {
|
|
616
|
+
if (batchUniqueKey(existing) === key) {
|
|
617
|
+
return Promise.reject(new RollupUniqueViolationError());
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
harness.batches.push(row);
|
|
622
|
+
|
|
623
|
+
const created: UserNotificationEmailRollupBatch =
|
|
624
|
+
new UserNotificationEmailRollupBatch();
|
|
625
|
+
created.id = id;
|
|
626
|
+
|
|
627
|
+
return Promise.resolve(created);
|
|
628
|
+
}) as never);
|
|
629
|
+
|
|
630
|
+
jest
|
|
631
|
+
.spyOn(UserNotificationEmailRollupBatchService, "updateOneById")
|
|
632
|
+
.mockImplementation(((args: {
|
|
633
|
+
id: ObjectID;
|
|
634
|
+
data: Record<string, unknown>;
|
|
635
|
+
}) => {
|
|
636
|
+
let affected: number = 0;
|
|
637
|
+
|
|
638
|
+
for (const row of harness.batches) {
|
|
639
|
+
if (toKey(row._id) !== toKey(args.id)) {
|
|
640
|
+
continue;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
Object.assign(row, args.data);
|
|
644
|
+
affected = affected + 1;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
return Promise.resolve(affected);
|
|
648
|
+
}) as never);
|
|
649
|
+
|
|
650
|
+
// -- The recipient re-validation ----------------------------------------
|
|
651
|
+
|
|
652
|
+
jest.spyOn(UserEmailService, "findBy").mockImplementation(((args: {
|
|
653
|
+
query?: Record<string, unknown>;
|
|
654
|
+
select?: Record<string, unknown>;
|
|
655
|
+
}) => {
|
|
656
|
+
const matched: Array<FakeRow> = harness.userEmails.filter(
|
|
657
|
+
(row: FakeRow): boolean => {
|
|
658
|
+
return matchesQuery(args.query, row);
|
|
659
|
+
},
|
|
660
|
+
);
|
|
661
|
+
|
|
662
|
+
return Promise.resolve(
|
|
663
|
+
matched.map((row: FakeRow): FakeRow => {
|
|
664
|
+
return applySelect(row, args.select);
|
|
665
|
+
}),
|
|
666
|
+
);
|
|
667
|
+
}) as never);
|
|
668
|
+
|
|
669
|
+
// -- The project name ----------------------------------------------------
|
|
670
|
+
|
|
671
|
+
jest.spyOn(ProjectService, "findOneById").mockImplementation(((args: {
|
|
672
|
+
id: ObjectID;
|
|
673
|
+
select?: Record<string, unknown>;
|
|
674
|
+
}) => {
|
|
675
|
+
const row: FakeRow | undefined = harness.projects.find(
|
|
676
|
+
(candidate: FakeRow): boolean => {
|
|
677
|
+
return toKey(candidate["_id"]) === toKey(args.id);
|
|
678
|
+
},
|
|
679
|
+
);
|
|
680
|
+
|
|
681
|
+
if (!row) {
|
|
682
|
+
return Promise.resolve(null);
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
return Promise.resolve(applySelect(row, args.select));
|
|
686
|
+
}) as never);
|
|
687
|
+
|
|
688
|
+
// -- Dashboard URL -------------------------------------------------------
|
|
689
|
+
|
|
690
|
+
jest
|
|
691
|
+
.spyOn(DatabaseConfig, "getDashboardUrl")
|
|
692
|
+
.mockImplementation((): Promise<URL> => {
|
|
693
|
+
return Promise.resolve(URL.fromString(HARNESS_DASHBOARD_URL));
|
|
694
|
+
});
|
|
695
|
+
|
|
696
|
+
// -- The sweep lock ------------------------------------------------------
|
|
697
|
+
|
|
698
|
+
jest.spyOn(Semaphore, "lock").mockImplementation(((
|
|
699
|
+
options: Record<string, unknown>,
|
|
700
|
+
) => {
|
|
701
|
+
harness.lockCalls.push(options);
|
|
702
|
+
|
|
703
|
+
if (!harness.lockAvailable) {
|
|
704
|
+
return Promise.reject(new Error("lock held"));
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
return Promise.resolve({
|
|
708
|
+
fake: true,
|
|
709
|
+
key: options["key"],
|
|
710
|
+
} as unknown as SemaphoreMutex);
|
|
711
|
+
}) as never);
|
|
712
|
+
|
|
713
|
+
jest.spyOn(Semaphore, "release").mockImplementation(((
|
|
714
|
+
mutex: SemaphoreMutex,
|
|
715
|
+
) => {
|
|
716
|
+
harness.releasedMutexes.push(mutex);
|
|
717
|
+
return Promise.resolve();
|
|
718
|
+
}) as never);
|
|
719
|
+
|
|
720
|
+
// -- The send ------------------------------------------------------------
|
|
721
|
+
|
|
722
|
+
jest.spyOn(MailService, "sendMail").mockImplementation(((
|
|
723
|
+
mail: {
|
|
724
|
+
toEmail: Email;
|
|
725
|
+
subject: string;
|
|
726
|
+
templateType?: string | undefined;
|
|
727
|
+
vars: Dictionary<string | JSONObject>;
|
|
728
|
+
},
|
|
729
|
+
options?: Record<string, unknown>,
|
|
730
|
+
) => {
|
|
731
|
+
const call: SentRollupMail = {
|
|
732
|
+
toEmail: toKey(mail.toEmail),
|
|
733
|
+
subject: mail.subject,
|
|
734
|
+
templateType: mail.templateType,
|
|
735
|
+
vars: mail.vars,
|
|
736
|
+
options: options,
|
|
737
|
+
};
|
|
738
|
+
|
|
739
|
+
harness.callLog.push("send");
|
|
740
|
+
harness.sendAttempts.push(call);
|
|
741
|
+
|
|
742
|
+
const failure: Error | null = harness.failSend(call);
|
|
743
|
+
|
|
744
|
+
if (failure) {
|
|
745
|
+
return Promise.reject(failure);
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
harness.sent.push(call);
|
|
749
|
+
|
|
750
|
+
return Promise.resolve(undefined);
|
|
751
|
+
}) as never);
|
|
752
|
+
}
|