@oneuptime/common 13.0.0 → 13.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/Alert.ts +55 -0
- package/Models/DatabaseModels/CloudResource.ts +45 -7
- package/Models/DatabaseModels/CodeRepository.ts +85 -0
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +57 -7
- package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +263 -0
- package/Models/DatabaseModels/Incident.ts +55 -0
- package/Models/DatabaseModels/Index.ts +16 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
- package/Models/DatabaseModels/User.ts +51 -2
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +43 -2
- package/Models/DatabaseModels/UserWebAuthn.ts +17 -0
- package/Models/DatabaseModels/VMwareResource.ts +1149 -0
- package/Models/DatabaseModels/VMwareVCenter.ts +1122 -0
- package/Models/DatabaseModels/VMwareVCenterFeed.ts +625 -0
- package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +514 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +596 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +485 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +484 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +22 -1
- package/Server/API/AIAgentDataAPI.ts +79 -4
- package/Server/API/AIAgentGitHubAPI.ts +523 -0
- package/Server/API/AIChatAPI.ts +20 -1
- package/Server/API/BillingAPI.ts +33 -0
- package/Server/API/DashboardAPI.ts +10 -0
- package/Server/API/GitHubAPI.ts +47 -5
- package/Server/API/GoogleSecOpsConnectionAPI.ts +79 -0
- package/Server/API/UserWebAuthnAPI.ts +21 -1
- package/Server/API/VMwareResourceAPI.ts +143 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.ts +68 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.ts +636 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.ts +83 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Middleware/IdentityRateLimit.ts +101 -0
- package/Server/Services/AIRunService.ts +13 -0
- package/Server/Services/BillingPaymentMethodService.ts +99 -28
- package/Server/Services/BillingService.ts +287 -20
- package/Server/Services/CloudResourceInstanceService.ts +70 -0
- package/Server/Services/ExceptionAggregationService.ts +1 -0
- package/Server/Services/GoogleSecOpsConnectionRunService.ts +10 -0
- package/Server/Services/GoogleSecOpsConnectionService.ts +12 -0
- package/Server/Services/Index.ts +16 -0
- package/Server/Services/LogAggregationService.ts +1 -0
- package/Server/Services/MetricAggregationService.ts +1 -0
- package/Server/Services/MobilePasskeyLoginService.ts +216 -0
- package/Server/Services/MonitorService.ts +51 -1
- package/Server/Services/MonitorTemplateService.ts +91 -29
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +132 -1
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +176 -2
- package/Server/Services/OpenTelemetryIngestService.ts +17 -0
- package/Server/Services/PayAsYouGoBillingService.ts +446 -0
- package/Server/Services/ProjectService.ts +46 -2
- package/Server/Services/ServerlessFunctionInstanceService.ts +71 -0
- package/Server/Services/TeamMemberService.ts +96 -36
- package/Server/Services/TelemetryIngestionKeyService.ts +80 -10
- package/Server/Services/TelemetryUsageBillingService.ts +95 -5
- package/Server/Services/TraceAggregationService.ts +5 -4
- package/Server/Services/UserWebAuthnService.ts +592 -133
- package/Server/Services/VMwareResourceService.ts +648 -0
- package/Server/Services/VMwareVCenterFeedService.ts +99 -0
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +240 -0
- package/Server/Services/VMwareVCenterLabelRuleService.ts +14 -0
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +252 -0
- package/Server/Services/VMwareVCenterOwnerRuleService.ts +14 -0
- package/Server/Services/VMwareVCenterOwnerTeamService.ts +139 -0
- package/Server/Services/VMwareVCenterOwnerUserService.ts +133 -0
- package/Server/Services/VMwareVCenterService.ts +629 -0
- package/Server/Services/WorkflowVariableService.ts +203 -0
- package/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.ts +17 -0
- package/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.ts +31 -1
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +7 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.ts +341 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.ts +274 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.ts +375 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubConversation.ts +846 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.ts +360 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubRunReply.ts +421 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.ts +140 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.ts +906 -0
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +143 -0
- package/Server/Utils/DataSource/EgressGuard.ts +160 -15
- package/Server/Utils/Database/TruncateColumnValue.ts +1 -1
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +2 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +33 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +44 -0
- package/Server/Utils/LogRedaction.ts +2 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +1 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +302 -3
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +26 -4
- package/Server/Utils/Monitor/MonitorResourceContext.ts +5 -3
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +14 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +26 -0
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +28 -5
- package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +3 -3
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +14 -9
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +116 -84
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +594 -195
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +466 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +5 -0
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +2 -1
- package/Server/Utils/Telemetry/TelemetryEntity.ts +181 -1
- package/Server/Utils/Telemetry/VMwareSnapshotScan.ts +1352 -0
- package/Tests/App/Accounts/LoginPasskey.test.tsx +529 -0
- package/Tests/App/Accounts/MobilePasskey.test.tsx +620 -0
- package/Tests/App/Accounts/PasswordRequirements.test.tsx +254 -0
- package/Tests/App/Accounts/RegisterPassword.test.tsx +553 -0
- package/Tests/App/Dashboard/AskAiAvailability.test.ts +224 -0
- package/Tests/App/Dashboard/AskAiDisabled.test.tsx +432 -0
- package/Tests/App/Dashboard/BackupCodes.test.tsx +414 -0
- package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +530 -0
- package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +195 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +199 -0
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +198 -0
- package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +215 -0
- package/Tests/App/Dashboard/CloudFleetSummary.test.ts +183 -0
- package/Tests/App/Dashboard/CloudFleetSummaryComponent.test.tsx +248 -0
- package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +215 -0
- package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +3 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +441 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +458 -0
- package/Tests/App/Dashboard/DashboardToolbarPopupLayering.test.tsx +566 -0
- package/Tests/App/Dashboard/DiscoveryScanLivePage.test.tsx +376 -0
- package/Tests/App/Dashboard/DiscoveryScanLiveUpdates.test.tsx +642 -0
- package/Tests/App/Dashboard/DiscoveryScanProgress.test.tsx +267 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +69 -231
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +244 -0
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +724 -0
- package/Tests/App/Dashboard/MonitorTemplateSyncFields.test.tsx +539 -0
- package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +24 -7
- package/Tests/App/Dashboard/OnCallOverridePresentation.test.ts +496 -0
- package/Tests/App/Dashboard/OnCallScheduleOverrideClarity.test.tsx +677 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +31 -3
- package/Tests/App/Dashboard/PaidUsageConsent.test.tsx +180 -0
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +1220 -0
- package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +176 -275
- package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +380 -233
- package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +3 -23
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +1 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +260 -0
- package/Tests/App/Dashboard/VMwareDashboardWidgets.test.ts +573 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
- package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +768 -0
- package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +532 -40
- package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +19 -2
- package/Tests/Fixtures/MobilePasskeyUser.json +8 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +25 -6
- package/Tests/Models/DatabaseModels/VMwareModels.test.ts +1134 -0
- package/Tests/Models/RunnerVersionLabel.test.ts +4 -2
- package/Tests/Server/API/AIChatProvidersAIEnabled.test.ts +259 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +31 -2
- package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +116 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +29 -1
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +13 -2
- package/Tests/Server/API/GitHubWebhookSignature.test.ts +368 -0
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +248 -0
- package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +330 -0
- package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +172 -0
- package/Tests/Server/API/VMwareResourceAPI.test.ts +546 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupMetadataMigration.test.ts +85 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +34 -3
- package/Tests/Server/Middleware/PasskeyRateLimit.test.ts +141 -0
- package/Tests/Server/Services/AutoImportRuleRearmRecentScans.test.ts +343 -0
- package/Tests/Server/Services/AutoImportRuleWriteRearmsScans.test.ts +381 -0
- package/Tests/Server/Services/BillingPaymentMethodServiceSync.test.ts +175 -0
- package/Tests/Server/Services/BillingService.test.ts +26 -11
- package/Tests/Server/Services/BillingServiceMeteredPaymentAuthorization.test.ts +245 -0
- package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +362 -0
- package/Tests/Server/Services/CloudResourceInstanceStalePrune.test.ts +188 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +16 -2
- package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +153 -0
- package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +13 -0
- package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +5 -0
- package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +36 -0
- package/Tests/Server/Services/InventoryUpsertTruncationGuard.test.ts +151 -0
- package/Tests/Server/Services/MobilePasskeyLoginIntegration.test.ts +231 -0
- package/Tests/Server/Services/MobilePasskeyLoginService.test.ts +315 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +302 -0
- package/Tests/Server/Services/MonitorTemplateServiceFieldSync.test.ts +994 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +22 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
- package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +857 -0
- package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +379 -0
- package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +99 -1
- package/Tests/Server/Services/ProjectServiceSubscriptionSeats.test.ts +134 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +3 -2
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +32 -6
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +363 -175
- package/Tests/Server/Services/ServerlessFunctionInstanceStalePrune.test.ts +200 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +3 -0
- package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +762 -0
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +3 -0
- package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +72 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +17 -4
- package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +355 -0
- package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +41 -4
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +37 -0
- package/Tests/Server/Services/UserWebAuthnPasskeyIntegration.test.ts +401 -0
- package/Tests/Server/Services/UserWebAuthnPasskeyService.test.ts +769 -0
- package/Tests/Server/Services/UserWebAuthnUserVerification.test.ts +649 -0
- package/Tests/Server/Services/VMwareResourceService.test.ts +945 -0
- package/Tests/Server/Services/VMwareVCenterService.test.ts +722 -0
- package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +842 -0
- package/Tests/Server/TestingUtils/PasskeyHttpIntegration.ts +102 -0
- package/Tests/Server/TestingUtils/SecurityKey.ts +464 -0
- package/Tests/Server/TestingUtils/WebAuthnServiceMocks.ts +60 -0
- package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +573 -0
- package/Tests/Server/Types/Database/Permissions/ProjectCustomerSupportAccessColumn.test.ts +261 -0
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +95 -0
- package/Tests/Server/Utils/CodeRepository/GitHubAgentTaskTrigger.test.ts +2101 -0
- package/Tests/Server/Utils/CodeRepository/GitHubCommandAuthorizer.test.ts +883 -0
- package/Tests/Server/Utils/CodeRepository/GitHubCommandParser.test.ts +1474 -0
- package/Tests/Server/Utils/CodeRepository/GitHubConversation.test.ts +1526 -0
- package/Tests/Server/Utils/CodeRepository/GitHubReplyComposer.test.ts +1389 -0
- package/Tests/Server/Utils/CodeRepository/GitHubRunReply.test.ts +1707 -0
- package/Tests/Server/Utils/CodeRepository/GitHubWebhookHandler.test.ts +2202 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +345 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +896 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupMetadataIntegration.test.ts +246 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +299 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +6 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +185 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +33 -0
- package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +2 -1
- package/Tests/Server/Utils/Monitor/Criteria/TelemetryStepMetricAlias.test.ts +10 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +66 -1
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +362 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +60 -1
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +60 -0
- package/Tests/Server/Utils/Monitor/MonitorRootCauseTargetResolution.test.ts +423 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +6 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +46 -2
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +81 -45
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +711 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClickhouseIntegration.test.ts +223 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +69 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +838 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsErrorHandling.test.ts +241 -28
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +651 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +11 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +13 -12
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +112 -127
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsRequestContract.test.ts +12 -18
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsResponseParsing.test.ts +43 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +580 -0
- package/Tests/Server/Utils/Telemetry/VMwareSnapshotScan.test.ts +1748 -0
- package/Tests/Types/Cloud/CloudPlatform.test.ts +574 -0
- package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +2 -0
- package/Tests/Types/Monitor/MonitorCriteriaMetricVariables.test.ts +9 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +53 -8
- package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +97 -0
- package/Tests/Types/Monitor/MonitorStepMetricViewConfigUtil.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorStepTemplateSyncFields.test.ts +107 -0
- package/Tests/Types/Monitor/MonitorTemplateSyncField.test.ts +172 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +2 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +1 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +9 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +131 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +10 -0
- package/Tests/Types/Monitor/VMwareAlertTemplates.test.ts +1608 -0
- package/Tests/Types/Monitor/VMwareMetricCatalog.test.ts +488 -0
- package/Tests/Types/OnCallDutyPolicy/OverrideProvenance.test.ts +295 -0
- package/Tests/Types/Runner/RunnerLiveStatus.test.ts +2 -2
- package/Tests/Types/SignupPassword.test.ts +205 -0
- package/Tests/Types/StatusPage/StatusPageLanguage.test.ts +44 -0
- package/Tests/Types/SupportedLanguages.test.ts +119 -0
- package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +19 -0
- package/Tests/UI/ColorPickerBuild.test.ts +86 -0
- package/Tests/UI/Components/Breadcrumbs.test.tsx +32 -0
- package/Tests/UI/Components/Forms/ModelFormPreservesUserInput.test.tsx +937 -0
- package/Tests/UI/Components/Forms/ModelFormWriteOnlyColumnSelect.test.tsx +230 -0
- package/Tests/UI/Components/Forms/ValidationFormSteps.test.ts +3 -4
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +907 -0
- package/Tests/UI/Components/ModelTable/ModelTableCreateAfterEdit.test.tsx +514 -0
- package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +301 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +2 -1
- package/Tests/UI/Components/TooltipLazyContent.test.tsx +373 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsMessagingEndpointGuidance.test.tsx +43 -12
- package/Tests/UI/ReactDomBuild.test.ts +104 -0
- package/Tests/UI/ReactRouterSingletonBuild.test.ts +11 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +148 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +29 -0
- package/Tests/UI/Utils/DashboardStackingLayers.test.ts +197 -0
- package/Tests/UI/Utils/LabelRuleImportExport.test.ts +546 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +109 -2
- package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +7 -2
- package/Tests/UI/Utils/UserEmailRegistrationStatus.test.tsx +295 -0
- package/Tests/UI/Utils/WebAuthn.test.ts +265 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +5 -0
- package/Tests/Utils/Dashboard/Components/DashboardVMwareListComponents.test.ts +548 -0
- package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +17 -3
- package/Tests/Utils/LabelRuleImportExport.test.ts +583 -0
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/MonitorTemplateSyncUtil.test.ts +590 -0
- package/Tests/Utils/RequestFailedDetails.test.ts +325 -0
- package/Tests/Utils/Telemetry/CloudInstanceIdentity.test.ts +255 -0
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +167 -0
- package/Tests/Utils/WebAuthnTestUtil.ts +79 -0
- package/Tests/__mocks__/simplewebauthn.js +33 -4
- package/Types/AI/CodeFixTaskContext.ts +122 -0
- package/Types/AI/CodeFixTaskType.ts +62 -0
- package/Types/Accounts/AccountsLanguage.ts +1 -0
- package/Types/AdminDashboard/AdminDashboardLanguage.ts +1 -0
- package/Types/Calendar/CalendarEvent.ts +16 -0
- package/Types/Cloud/CloudPlatform.ts +372 -0
- package/Types/CodeRepository/GitHubCommand.ts +69 -0
- package/Types/Dashboard/DashboardComponentType.ts +2 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.ts +23 -0
- package/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.ts +30 -0
- package/Types/Dashboard/DashboardLanguage.ts +1 -0
- package/Types/Dashboard/DashboardTemplates.ts +314 -0
- package/Types/Docs/DocsLanguage.ts +1 -0
- package/Types/Exception/EgressGuardException.ts +65 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +36 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +1 -0
- package/Types/Monitor/MonitorStep.ts +78 -17
- package/Types/Monitor/MonitorStepMetricViewConfigUtil.ts +1 -0
- package/Types/Monitor/MonitorStepVMwareMonitor.ts +127 -0
- package/Types/Monitor/MonitorTemplateSyncField.ts +291 -0
- package/Types/Monitor/MonitorType.ts +24 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +33 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +2 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +3 -0
- package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +158 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +61 -0
- package/Types/Monitor/VMwareAlertTemplates.ts +1070 -0
- package/Types/Monitor/VMwareMetricCatalog.ts +914 -0
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +29 -0
- package/Types/OnCallDutyPolicy/UserOverrideUtil.ts +16 -0
- package/Types/Password.ts +84 -5
- package/Types/Permission.ts +265 -0
- package/Types/Probe/RequestFailedDetails.ts +7 -0
- package/Types/Runner/RunnerLiveStatus.ts +1 -1
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -0
- package/Types/StatusPage/StatusPageLanguage.ts +1 -0
- package/Types/Telemetry/EntityType.ts +21 -0
- package/Types/Telemetry/ServiceType.ts +1 -0
- package/Typings/Index.d.ts +63 -0
- package/UI/Components/Breadcrumbs/Breadcrumbs.tsx +2 -2
- package/UI/Components/Calendar/Calendar.css +78 -0
- package/UI/Components/Calendar/Calendar.tsx +28 -3
- package/UI/Components/Forms/BasicForm.tsx +44 -2
- package/UI/Components/Forms/Fields/ColorPicker.tsx +2 -1
- package/UI/Components/Forms/Fields/FormField.tsx +16 -3
- package/UI/Components/Forms/ModelForm.tsx +159 -5
- package/UI/Components/Forms/Types/Field.ts +8 -1
- package/UI/Components/Graphs/DayUptimeGraph.tsx +8 -10
- package/UI/Components/Icon/Icon.tsx +16 -0
- package/UI/Components/Input/Input.tsx +42 -7
- package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +441 -0
- package/UI/Components/LabelRule/LabelRuleTable.tsx +142 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +22 -5
- package/UI/Components/ModelTable/ModelTable.tsx +14 -6
- package/UI/Components/MonitorGraphs/Uptime.tsx +17 -27
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +3 -1
- package/UI/Components/Tooltip/Tooltip.tsx +52 -6
- package/UI/Utils/DashboardStackingLayers.ts +85 -0
- package/UI/Utils/LabelRuleImportExport.ts +310 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +4 -3
- package/UI/Utils/TelemetryService.ts +4 -3
- package/UI/Utils/UseDashboardGridDnd.ts +4 -1
- package/UI/Utils/UserEmailRegistrationStatus.ts +33 -5
- package/UI/Utils/WebAuthn.ts +220 -0
- package/UI/esbuild-config.js +4 -0
- package/Utils/API.ts +34 -0
- package/Utils/Dashboard/Components/DashboardVMwareHostListComponent.ts +38 -0
- package/Utils/Dashboard/Components/DashboardVMwareResourceListShared.ts +70 -0
- package/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.ts +76 -0
- package/Utils/Dashboard/Components/Index.ts +16 -0
- package/Utils/LabelRuleImportExport.ts +496 -0
- package/Utils/Monitor/MonitorTemplateSyncUtil.ts +164 -0
- package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +8 -0
- package/Utils/Telemetry/CloudInstanceIdentity.ts +94 -0
- package/Utils/Telemetry/EntityKey.ts +19 -0
- package/Utils/Telemetry/EntityRelationship.ts +19 -0
- package/build/dist/Models/DatabaseModels/Alert.js +54 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResource.js +44 -7
- package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +87 -0
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +60 -7
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +287 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Incident.js +54 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +16 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +57 -4
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +47 -2
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +18 -0
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareResource.js +1201 -0
- package/build/dist/Models/DatabaseModels/VMwareResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js +1149 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +22 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +63 -3
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentGitHubAPI.js +363 -0
- package/build/dist/Server/API/AIAgentGitHubAPI.js.map +1 -0
- package/build/dist/Server/API/AIChatAPI.js +19 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +22 -0
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +10 -0
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GitHubAPI.js +33 -5
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +56 -0
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -0
- package/build/dist/Server/API/UserWebAuthnAPI.js +17 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/API/VMwareResourceAPI.js +106 -0
- package/build/dist/Server/API/VMwareResourceAPI.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js +241 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.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/Middleware/IdentityRateLimit.js +80 -0
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +14 -1
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/BillingPaymentMethodService.js +71 -21
- package/build/dist/Server/Services/BillingPaymentMethodService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +210 -22
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceInstanceService.js +66 -0
- package/build/dist/Server/Services/CloudResourceInstanceService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +1 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +9 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +1 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +7 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +16 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +1 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +1 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MobilePasskeyLoginService.js +137 -0
- package/build/dist/Server/Services/MobilePasskeyLoginService.js.map +1 -0
- package/build/dist/Server/Services/MonitorService.js +34 -1
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +64 -26
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +124 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +142 -2
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +28 -13
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PayAsYouGoBillingService.js +297 -0
- package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -0
- package/build/dist/Server/Services/ProjectService.js +38 -2
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js +66 -0
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +85 -28
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +61 -10
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +62 -5
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +5 -4
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserWebAuthnService.js +345 -113
- package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
- package/build/dist/Server/Services/VMwareResourceService.js +395 -0
- package/build/dist/Server/Services/VMwareResourceService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterFeedService.js +89 -0
- package/build/dist/Server/Services/VMwareVCenterFeedService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +197 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js +13 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +214 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js +129 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js +122 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterService.js +533 -0
- package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -0
- package/build/dist/Server/Services/WorkflowVariableService.js +169 -0
- package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js +12 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js +25 -2
- package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js +275 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js +226 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js +297 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js +582 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js +275 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js +365 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js +103 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js +661 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +113 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +99 -15
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +2 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +18 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +31 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +2 -1
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +219 -4
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +12 -4
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +5 -3
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +22 -9
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +21 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +21 -6
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +3 -3
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +9 -9
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +92 -71
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +428 -143
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +376 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +136 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js +933 -0
- package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js +40 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
- package/build/dist/Types/AI/CodeFixTaskType.js +57 -0
- package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -1
- package/build/dist/Types/Accounts/AccountsLanguage.js +1 -0
- package/build/dist/Types/Accounts/AccountsLanguage.js.map +1 -1
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +1 -0
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -1
- package/build/dist/Types/Cloud/CloudPlatform.js +277 -0
- package/build/dist/Types/Cloud/CloudPlatform.js.map +1 -0
- package/build/dist/Types/CodeRepository/GitHubCommand.js +52 -0
- package/build/dist/Types/CodeRepository/GitHubCommand.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +286 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Docs/DocsLanguage.js +1 -0
- package/build/dist/Types/Docs/DocsLanguage.js.map +1 -1
- package/build/dist/Types/Exception/EgressGuardException.js +59 -0
- package/build/dist/Types/Exception/EgressGuardException.js.map +1 -0
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +61 -18
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js +1 -0
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js +71 -0
- package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorTemplateSyncField.js +211 -0
- package/build/dist/Types/Monitor/MonitorTemplateSyncField.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +23 -0
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +28 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +2 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +120 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +60 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/Monitor/VMwareAlertTemplates.js +775 -0
- package/build/dist/Types/Monitor/VMwareAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/VMwareMetricCatalog.js +799 -0
- package/build/dist/Types/Monitor/VMwareMetricCatalog.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +25 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js +5 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js.map +1 -1
- package/build/dist/Types/Password.js +63 -5
- package/build/dist/Types/Password.js.map +1 -1
- package/build/dist/Types/Permission.js +234 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Probe/RequestFailedDetails.js +7 -0
- package/build/dist/Types/Probe/RequestFailedDetails.js.map +1 -1
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +2 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageLanguage.js +1 -0
- package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +21 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js +2 -2
- package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/build/dist/UI/Components/Calendar/Calendar.js +24 -4
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +28 -3
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -3
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +89 -6
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +5 -6
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +14 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +37 -8
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +228 -0
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -0
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +102 -0
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +15 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +13 -5
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +14 -15
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +2 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +33 -4
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/DashboardStackingLayers.js +44 -0
- package/build/dist/UI/Utils/DashboardStackingLayers.js.map +1 -0
- package/build/dist/UI/Utils/LabelRuleImportExport.js +195 -0
- package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -0
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +4 -4
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +3 -2
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- package/build/dist/UI/Utils/UseDashboardGridDnd.js +2 -1
- package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -1
- package/build/dist/UI/Utils/UserEmailRegistrationStatus.js +21 -4
- package/build/dist/UI/Utils/UserEmailRegistrationStatus.js.map +1 -1
- package/build/dist/UI/Utils/WebAuthn.js +121 -0
- package/build/dist/UI/Utils/WebAuthn.js.map +1 -0
- package/build/dist/Utils/API.js +29 -0
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js +33 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js +54 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js +60 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +356 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js +110 -0
- package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +6 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -1
- package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js +88 -0
- package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +15 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityRelationship.js +13 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import DatabaseService from "./DatabaseService";
|
|
2
2
|
import MonitorTemplateService from "./MonitorTemplateService";
|
|
3
3
|
import NetworkAlertPolicyService from "./NetworkAlertPolicyService";
|
|
4
|
+
import NetworkDeviceAutoImportRuleEngineService from "./NetworkDeviceAutoImportRuleEngineService";
|
|
4
5
|
import NetworkDeviceOidTemplateService from "./NetworkDeviceOidTemplateService";
|
|
5
6
|
import Model from "../../Models/DatabaseModels/NetworkDeviceAutoImportRule";
|
|
6
7
|
import Monitor from "../../Models/DatabaseModels/Monitor";
|
|
@@ -22,6 +23,8 @@ import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCom
|
|
|
22
23
|
import DatabaseRequestType from "../Types/BaseDatabase/DatabaseRequestType";
|
|
23
24
|
import TablePermission from "../Types/Database/Permissions/TablePermission";
|
|
24
25
|
import NetworkDeviceMonitorTemplateUtil from "../../Utils/Monitor/NetworkDeviceMonitorTemplateUtil";
|
|
26
|
+
import QueryHelper from "../Types/Database/QueryHelper";
|
|
27
|
+
import logger, { LogAttributes } from "../Utils/Logger";
|
|
25
28
|
|
|
26
29
|
/*
|
|
27
30
|
* Write-time validation for auto-import rules, following the
|
|
@@ -60,6 +63,20 @@ function readOidTemplateId(data: Record<string, unknown>): ObjectID | null {
|
|
|
60
63
|
);
|
|
61
64
|
}
|
|
62
65
|
|
|
66
|
+
/*
|
|
67
|
+
* What onUpdateSuccess needs to know about an update it did not see the
|
|
68
|
+
* payload of: did this save change anything about WHICH hosts the rule
|
|
69
|
+
* claims, or what it does with them?
|
|
70
|
+
*
|
|
71
|
+
* Only the answer travels — not the rule's resulting state, which is read
|
|
72
|
+
* back from the row instead. A payload's `isEnabled` may arrive as the string
|
|
73
|
+
* "false" from a form post, and a rule mis-read as enabled would re-arm the
|
|
74
|
+
* project's scans on the very save that switched the rule off.
|
|
75
|
+
*/
|
|
76
|
+
interface AutoImportRuleUpdatePlan {
|
|
77
|
+
isRuleReachChanged: boolean;
|
|
78
|
+
}
|
|
79
|
+
|
|
63
80
|
export class Service extends DatabaseService<Model> {
|
|
64
81
|
public constructor() {
|
|
65
82
|
super(Model);
|
|
@@ -133,6 +150,28 @@ export class Service extends DatabaseService<Model> {
|
|
|
133
150
|
OID_TEMPLATE_KEYS,
|
|
134
151
|
);
|
|
135
152
|
|
|
153
|
+
/*
|
|
154
|
+
* Everything that can change what this rule imports, or what it creates
|
|
155
|
+
* for what it imports — the trigger for re-arming the project's recent
|
|
156
|
+
* scan results in onUpdateSuccess.
|
|
157
|
+
*
|
|
158
|
+
* `includePingOnlyHosts` is here even though it is not a "criteria
|
|
159
|
+
* change" above: it decides whether a whole class of discovered host is
|
|
160
|
+
* claimed, which is precisely reach. A rename or a description edit is
|
|
161
|
+
* not, and must not cost the project a sweep.
|
|
162
|
+
*
|
|
163
|
+
* The OID template is deliberately absent: it is copied onto devices as
|
|
164
|
+
* they are created and is not reconciled onto devices that already
|
|
165
|
+
* exist, so pointing a rule at a different one changes nothing about
|
|
166
|
+
* results already evaluated.
|
|
167
|
+
*/
|
|
168
|
+
const plan: AutoImportRuleUpdatePlan = {
|
|
169
|
+
isRuleReachChanged:
|
|
170
|
+
isCriteriaChange ||
|
|
171
|
+
isMonitorProvisioningChange ||
|
|
172
|
+
dataKeys.includes("includePingOnlyHosts"),
|
|
173
|
+
};
|
|
174
|
+
|
|
136
175
|
/*
|
|
137
176
|
* Validated before the early return and independently of the rest: an OID
|
|
138
177
|
* Collection Template is the collect half of the rule, so pointing at one
|
|
@@ -154,7 +193,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
154
193
|
}
|
|
155
194
|
|
|
156
195
|
if (!isCriteriaChange && !isMonitorProvisioningChange) {
|
|
157
|
-
return { updateBy, carryForward:
|
|
196
|
+
return { updateBy, carryForward: plan };
|
|
158
197
|
}
|
|
159
198
|
|
|
160
199
|
/*
|
|
@@ -253,7 +292,142 @@ export class Service extends DatabaseService<Model> {
|
|
|
253
292
|
}
|
|
254
293
|
}
|
|
255
294
|
|
|
256
|
-
return { updateBy, carryForward:
|
|
295
|
+
return { updateBy, carryForward: plan };
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/*
|
|
299
|
+
* A rule that can import must not have to wait for the next scan to prove
|
|
300
|
+
* it — see rearmRecentScansForRuleChange on the engine, and issue #3487.
|
|
301
|
+
*
|
|
302
|
+
* The sweep only ever looks at results nothing has evaluated yet, so
|
|
303
|
+
* without this a rule written after a scan finished reaches nothing at all
|
|
304
|
+
* until that scan runs again — never, for the one-shot scans most projects
|
|
305
|
+
* start with — and the operator is left pressing "Run Now" by hand for
|
|
306
|
+
* work the product describes as automatic.
|
|
307
|
+
*/
|
|
308
|
+
@CaptureSpan()
|
|
309
|
+
protected override async onCreateSuccess(
|
|
310
|
+
onCreate: OnCreate<Model>,
|
|
311
|
+
createdItem: Model,
|
|
312
|
+
): Promise<Model> {
|
|
313
|
+
this.rearmRecentScansForRules([
|
|
314
|
+
/*
|
|
315
|
+
* projectId off the saved row, falling back to the tenant the write
|
|
316
|
+
* ran under: a create that named the project through the relation
|
|
317
|
+
* alone still has to reach the right scans.
|
|
318
|
+
*/
|
|
319
|
+
{
|
|
320
|
+
projectId: createdItem.projectId || onCreate.createBy.props.tenantId,
|
|
321
|
+
isEnabled: createdItem.isEnabled,
|
|
322
|
+
isExclusion: createdItem.isExclusion,
|
|
323
|
+
},
|
|
324
|
+
]);
|
|
325
|
+
|
|
326
|
+
return createdItem;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/*
|
|
330
|
+
* The same re-arm for an EDIT that changes what the rule claims: enabling a
|
|
331
|
+
* rule, widening its criteria, or attaching a monitor template to it all
|
|
332
|
+
* make the project's recent results answer differently than they did when
|
|
333
|
+
* the sweep last read them.
|
|
334
|
+
*/
|
|
335
|
+
@CaptureSpan()
|
|
336
|
+
protected override async onUpdateSuccess(
|
|
337
|
+
onUpdate: OnUpdate<Model>,
|
|
338
|
+
updatedItemIds: Array<ObjectID>,
|
|
339
|
+
): Promise<OnUpdate<Model>> {
|
|
340
|
+
const plan: AutoImportRuleUpdatePlan | null =
|
|
341
|
+
(onUpdate.carryForward as AutoImportRuleUpdatePlan | null) || null;
|
|
342
|
+
|
|
343
|
+
if (!plan?.isRuleReachChanged || updatedItemIds.length === 0) {
|
|
344
|
+
return onUpdate;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/*
|
|
348
|
+
* The rules as they stand now that the update has landed, read back
|
|
349
|
+
* rather than predicted from the payload — one update payload is shared
|
|
350
|
+
* by every row its query matched, and the toggles that decide whether a
|
|
351
|
+
* re-arm is worth anything arrive from a form as strings. See
|
|
352
|
+
* AutoImportRuleUpdatePlan.
|
|
353
|
+
*/
|
|
354
|
+
const updatedRules: Array<Model> = await this.findBy({
|
|
355
|
+
query: {
|
|
356
|
+
_id: QueryHelper.any(updatedItemIds),
|
|
357
|
+
},
|
|
358
|
+
select: {
|
|
359
|
+
_id: true,
|
|
360
|
+
projectId: true,
|
|
361
|
+
isEnabled: true,
|
|
362
|
+
isExclusion: true,
|
|
363
|
+
},
|
|
364
|
+
limit: LIMIT_MAX,
|
|
365
|
+
skip: 0,
|
|
366
|
+
props: {
|
|
367
|
+
isRoot: true,
|
|
368
|
+
},
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
this.rearmRecentScansForRules(updatedRules);
|
|
372
|
+
|
|
373
|
+
return onUpdate;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/*
|
|
377
|
+
* Hand every affected project's recent scan results back to the auto-import
|
|
378
|
+
* sweep, once per project however many of its rules one write touched.
|
|
379
|
+
*
|
|
380
|
+
* Detached on purpose, in the shape NetworkDeviceService.onCreateSuccess
|
|
381
|
+
* uses for its own rule chain: the caller is a rule save, the operator is
|
|
382
|
+
* waiting on its response, and this is a query plus up to a hundred small
|
|
383
|
+
* writes. It must also never fail that save — a re-arm that could not run
|
|
384
|
+
* costs a delay until the next scan result (or one press of Run Now),
|
|
385
|
+
* which is not worth failing an otherwise valid edit over.
|
|
386
|
+
*/
|
|
387
|
+
private rearmRecentScansForRules(
|
|
388
|
+
rules: Array<{
|
|
389
|
+
projectId?: ObjectID | undefined;
|
|
390
|
+
isEnabled?: boolean | undefined;
|
|
391
|
+
isExclusion?: boolean | undefined;
|
|
392
|
+
}>,
|
|
393
|
+
): void {
|
|
394
|
+
const projectIds: Map<string, ObjectID> = new Map<string, ObjectID>();
|
|
395
|
+
|
|
396
|
+
for (const rule of rules) {
|
|
397
|
+
/*
|
|
398
|
+
* A disabled rule imports nothing, and an exclusion rule only vetoes
|
|
399
|
+
* what other rules claim — neither can newly take a host, so neither
|
|
400
|
+
* is worth a sweep of the project's results. isEnabled is checked
|
|
401
|
+
* against `false` rather than for truth because the column defaults to
|
|
402
|
+
* true: a create that never mentioned it is enabled.
|
|
403
|
+
*
|
|
404
|
+
* The mirror case — an exclusion rule switched off or deleted, which
|
|
405
|
+
* lifts a veto and so widens what the OTHER rules claim — is left to
|
|
406
|
+
* the next scan result or to Run Now. Re-arming needs a write that says
|
|
407
|
+
* "this now claims hosts", and lifting a veto says it only about rules
|
|
408
|
+
* this write never mentioned.
|
|
409
|
+
*/
|
|
410
|
+
if (rule.isEnabled === false || rule.isExclusion) {
|
|
411
|
+
continue;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
if (!rule.projectId) {
|
|
415
|
+
continue;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
projectIds.set(rule.projectId.toString(), rule.projectId);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
for (const projectId of projectIds.values()) {
|
|
422
|
+
NetworkDeviceAutoImportRuleEngineService.rearmRecentScansForRuleChange({
|
|
423
|
+
projectId: projectId,
|
|
424
|
+
}).catch((error: Error) => {
|
|
425
|
+
logger.error(
|
|
426
|
+
`Error re-arming discovery scan results after an auto-import rule was written: ${error}`,
|
|
427
|
+
{ projectId: projectId.toString() } as LogAttributes,
|
|
428
|
+
);
|
|
429
|
+
});
|
|
430
|
+
}
|
|
257
431
|
}
|
|
258
432
|
|
|
259
433
|
/*
|
|
@@ -23,6 +23,7 @@ import DockerHost from "../../Models/DatabaseModels/DockerHost";
|
|
|
23
23
|
import PodmanHost from "../../Models/DatabaseModels/PodmanHost";
|
|
24
24
|
import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
|
|
25
25
|
import ProxmoxCluster from "../../Models/DatabaseModels/ProxmoxCluster";
|
|
26
|
+
import VMwareVCenter from "../../Models/DatabaseModels/VMwareVCenter";
|
|
26
27
|
import CephCluster from "../../Models/DatabaseModels/CephCluster";
|
|
27
28
|
import DockerSwarmCluster from "../../Models/DatabaseModels/DockerSwarmCluster";
|
|
28
29
|
import ServerlessFunction from "../../Models/DatabaseModels/ServerlessFunction";
|
|
@@ -34,6 +35,7 @@ import DockerHostService from "./DockerHostService";
|
|
|
34
35
|
import PodmanHostService from "./PodmanHostService";
|
|
35
36
|
import KubernetesClusterService from "./KubernetesClusterService";
|
|
36
37
|
import ProxmoxClusterService from "./ProxmoxClusterService";
|
|
38
|
+
import VMwareVCenterService from "./VMwareVCenterService";
|
|
37
39
|
import CephClusterService from "./CephClusterService";
|
|
38
40
|
import DockerSwarmClusterService from "./DockerSwarmClusterService";
|
|
39
41
|
import ServerlessFunctionService from "./ServerlessFunctionService";
|
|
@@ -1015,6 +1017,21 @@ export default class OTelIngestService {
|
|
|
1015
1017
|
telemetryRetentionConfig: cluster?.telemetryRetentionConfig ?? null,
|
|
1016
1018
|
};
|
|
1017
1019
|
}
|
|
1020
|
+
if (primaryEntityType === ServiceType.VMwareVCenter) {
|
|
1021
|
+
const vcenter: VMwareVCenter | null =
|
|
1022
|
+
await VMwareVCenterService.findOneById({
|
|
1023
|
+
id: resourceId,
|
|
1024
|
+
select: {
|
|
1025
|
+
retainTelemetryDataForDays: true,
|
|
1026
|
+
telemetryRetentionConfig: true,
|
|
1027
|
+
},
|
|
1028
|
+
props: { isRoot: true },
|
|
1029
|
+
});
|
|
1030
|
+
return {
|
|
1031
|
+
retainTelemetryDataForDays: vcenter?.retainTelemetryDataForDays ?? null,
|
|
1032
|
+
telemetryRetentionConfig: vcenter?.telemetryRetentionConfig ?? null,
|
|
1033
|
+
};
|
|
1034
|
+
}
|
|
1018
1035
|
if (primaryEntityType === ServiceType.IoTDevice) {
|
|
1019
1036
|
const fleet: IoTFleet | null = await IoTFleetService.findOneById({
|
|
1020
1037
|
id: resourceId,
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
import Project from "../../Models/DatabaseModels/Project";
|
|
2
|
+
import PromoCode from "../../Models/DatabaseModels/PromoCode";
|
|
3
|
+
import SubscriptionPlan, {
|
|
4
|
+
PlanType,
|
|
5
|
+
} from "../../Types/Billing/SubscriptionPlan";
|
|
6
|
+
import PaymentRequiredException from "../../Types/Exception/PaymentRequiredException";
|
|
7
|
+
import ObjectID from "../../Types/ObjectID";
|
|
8
|
+
import { getAllEnvVars } from "../EnvironmentConfig";
|
|
9
|
+
import InMemoryTTLCache from "../Infrastructure/InMemoryTTLCache";
|
|
10
|
+
import BillingService from "./BillingService";
|
|
11
|
+
import ProjectService from "./ProjectService";
|
|
12
|
+
import PromoCodeService from "./PromoCodeService";
|
|
13
|
+
import Stripe from "stripe";
|
|
14
|
+
|
|
15
|
+
export const PAY_AS_YOU_GO_PAYMENT_REQUIRED_MESSAGE: string =
|
|
16
|
+
"Add a payment method in Project Settings > Billing before using paid monitoring or telemetry. These features have usage charges even on the Free plan. Manual monitors remain free.";
|
|
17
|
+
|
|
18
|
+
type PaymentAuthorization = "payment-method" | "invoice" | "reseller";
|
|
19
|
+
|
|
20
|
+
type NotAuthorized = "none";
|
|
21
|
+
const NOT_AUTHORIZED: NotAuthorized = "none";
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* A denial is the expensive answer. An authorized project answers from the
|
|
25
|
+
* positive cache and costs one provider read a minute; an unauthorized one
|
|
26
|
+
* re-ran the full check every time, and that check costs a payment-method
|
|
27
|
+
* read per supported type, plus - on a paid plan - the subscription read that
|
|
28
|
+
* rules out an invoice agreement. On the telemetry admission path - which
|
|
29
|
+
* runs for every ingested batch over OTLP, gRPC, MQTT and session replay, and
|
|
30
|
+
* which deliberately re-checks even on a key-cache hit - that is a provider
|
|
31
|
+
* read storm proportional to ingest traffic, for exactly the projects that
|
|
32
|
+
* are not paying. It is enough on its own to hold a Stripe account at its
|
|
33
|
+
* rate limit indefinitely, which then breaks the billing page for every other
|
|
34
|
+
* project.
|
|
35
|
+
*
|
|
36
|
+
* So denials are cacheable, but only where a few seconds of staleness is
|
|
37
|
+
* harmless: admission control, which the client retries anyway. Every
|
|
38
|
+
* user-facing check - the billing page's own gate, creating a monitor -
|
|
39
|
+
* still reads through, so "add a card and it works" keeps meaning that.
|
|
40
|
+
*/
|
|
41
|
+
const DENIAL_CACHE_TTL_IN_MS: number = 10_000;
|
|
42
|
+
const AUTHORIZATION_CACHE_TTL_IN_MS: number = 60_000;
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* How long a live authorization from authorizeUsageNow may stand in for the
|
|
46
|
+
* next live check of the same project. One metered report used to read the
|
|
47
|
+
* owner's payment setup three times in as many seconds - to decide, again
|
|
48
|
+
* while staging, and again before the usage write - and every one of those
|
|
49
|
+
* reads repeated the provider calls the first had just made.
|
|
50
|
+
*
|
|
51
|
+
* Equal to AUTHORIZATION_CACHE_TTL_IN_MS on purpose: it is never looser than
|
|
52
|
+
* the positive cache every other caller already accepts. Nothing stores a
|
|
53
|
+
* token, so it lives only as long as the report that asked for it.
|
|
54
|
+
*/
|
|
55
|
+
const LIVE_AUTHORIZATION_REUSE_WINDOW_IN_MS: number =
|
|
56
|
+
AUTHORIZATION_CACHE_TTL_IN_MS;
|
|
57
|
+
|
|
58
|
+
declare const liveUsageAuthorizationBrand: unique symbol;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Proof that a project's payment setup was read live a moment ago. Only
|
|
62
|
+
* authorizeUsageNow mints one: the brand is not exported and has no runtime
|
|
63
|
+
* value, so any other way of making one is a visible cast. It is honoured
|
|
64
|
+
* only for the project it names, and only inside
|
|
65
|
+
* LIVE_AUTHORIZATION_REUSE_WINDOW_IN_MS.
|
|
66
|
+
*/
|
|
67
|
+
export interface LiveUsageAuthorization {
|
|
68
|
+
readonly projectId: string;
|
|
69
|
+
readonly decidedAt: number;
|
|
70
|
+
readonly [liveUsageAuthorizationBrand]: true;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export class Service {
|
|
74
|
+
private authorizedProjects: InMemoryTTLCache<
|
|
75
|
+
PaymentAuthorization | NotAuthorized
|
|
76
|
+
> = new InMemoryTTLCache(10_000);
|
|
77
|
+
|
|
78
|
+
/*
|
|
79
|
+
* Whether a project bills under an agreement that already covers its earlier
|
|
80
|
+
* telemetry, and so takes no cutoff. Kept apart from authorizedProjects,
|
|
81
|
+
* which records only what authorized the project first - and for an invoice
|
|
82
|
+
* customer who also keeps a card on file, that is the card.
|
|
83
|
+
*/
|
|
84
|
+
private noCutoffAgreements: InMemoryTTLCache<boolean> = new InMemoryTTLCache(
|
|
85
|
+
10_000,
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* A subscription created during signup is not permission to incur charges.
|
|
90
|
+
* Require a payment method, or a real invoice/reseller billing agreement.
|
|
91
|
+
* Short positive caching keeps the telemetry admission path affordable.
|
|
92
|
+
*
|
|
93
|
+
* `allowStaleDenial` additionally lets a recent denial answer without going
|
|
94
|
+
* back to the provider. Only admission control should pass it - see
|
|
95
|
+
* DENIAL_CACHE_TTL_IN_MS above.
|
|
96
|
+
*/
|
|
97
|
+
public async canUsePayAsYouGo(
|
|
98
|
+
projectId: ObjectID,
|
|
99
|
+
options?: { useCache?: boolean; allowStaleDenial?: boolean },
|
|
100
|
+
): Promise<boolean> {
|
|
101
|
+
if (!BillingService.isBillingEnabled()) {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const cacheKey: string = projectId.toString();
|
|
106
|
+
if (options?.useCache !== false) {
|
|
107
|
+
const cached: PaymentAuthorization | NotAuthorized | undefined =
|
|
108
|
+
this.authorizedProjects.get(cacheKey);
|
|
109
|
+
|
|
110
|
+
if (cached && cached !== NOT_AUTHORIZED) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (cached === NOT_AUTHORIZED && options?.allowStaleDenial) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const authorization: PaymentAuthorization | null =
|
|
120
|
+
await this.checkPaymentAuthorization(projectId);
|
|
121
|
+
if (authorization) {
|
|
122
|
+
this.authorizedProjects.set(
|
|
123
|
+
cacheKey,
|
|
124
|
+
authorization,
|
|
125
|
+
AUTHORIZATION_CACHE_TTL_IN_MS,
|
|
126
|
+
);
|
|
127
|
+
} else {
|
|
128
|
+
this.authorizedProjects.set(
|
|
129
|
+
cacheKey,
|
|
130
|
+
NOT_AUTHORIZED,
|
|
131
|
+
DENIAL_CACHE_TTL_IN_MS,
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
return Boolean(authorization);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* A live check of the project's payment setup, as a token the rest of one
|
|
139
|
+
* metered report hands on instead of repeating the check - see
|
|
140
|
+
* LIVE_AUTHORIZATION_REUSE_WINDOW_IN_MS. Null when the project may not
|
|
141
|
+
* incur usage charges. A provider failure propagates like any other live
|
|
142
|
+
* check: it becomes neither a token nor a denial.
|
|
143
|
+
*/
|
|
144
|
+
public async authorizeUsageNow(
|
|
145
|
+
projectId: ObjectID,
|
|
146
|
+
): Promise<LiveUsageAuthorization | null> {
|
|
147
|
+
// Stamped before the read, so a token never outlives the answer it carries.
|
|
148
|
+
const decidedAt: number = Date.now();
|
|
149
|
+
|
|
150
|
+
if (!(await this.canUsePayAsYouGo(projectId, { useCache: false }))) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
projectId: projectId.toString(),
|
|
156
|
+
decidedAt: decidedAt,
|
|
157
|
+
} as LiveUsageAuthorization;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Whether a token from authorizeUsageNow still vouches for this project.
|
|
162
|
+
* No token, another project's token, or one past the reuse window is not an
|
|
163
|
+
* answer at all, and the caller has to check live.
|
|
164
|
+
*/
|
|
165
|
+
public isLiveAuthorizationFor(
|
|
166
|
+
authorization: LiveUsageAuthorization | undefined,
|
|
167
|
+
projectId: ObjectID,
|
|
168
|
+
): boolean {
|
|
169
|
+
if (!authorization || authorization.projectId !== projectId.toString()) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const ageInMs: number = Date.now() - authorization.decidedAt;
|
|
174
|
+
|
|
175
|
+
return ageInMs >= 0 && ageInMs <= LIVE_AUTHORIZATION_REUSE_WINDOW_IN_MS;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Forget everything cached about a project's authorization and billing
|
|
180
|
+
* agreement. Called when the payment methods on file are re-read and when
|
|
181
|
+
* one is removed, so a card added a moment ago is honoured on the next
|
|
182
|
+
* admission check rather than at the end of the denial TTL.
|
|
183
|
+
*/
|
|
184
|
+
public invalidate(projectId: ObjectID): void {
|
|
185
|
+
this.authorizedProjects.delete(projectId.toString());
|
|
186
|
+
this.noCutoffAgreements.delete(projectId.toString());
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
public async requirePayAsYouGo(
|
|
190
|
+
projectId: ObjectID,
|
|
191
|
+
options?: { allowStaleDenial?: boolean },
|
|
192
|
+
): Promise<void> {
|
|
193
|
+
if (!(await this.canUsePayAsYouGo(projectId, options))) {
|
|
194
|
+
throw new PaymentRequiredException(
|
|
195
|
+
PAY_AS_YOU_GO_PAYMENT_REQUIRED_MESSAGE,
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
public async getTelemetryBillingStartDate(
|
|
201
|
+
projectId: ObjectID,
|
|
202
|
+
): Promise<Date | undefined> {
|
|
203
|
+
await this.requirePayAsYouGo(projectId);
|
|
204
|
+
if (!BillingService.isBillingEnabled()) {
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const authorization: PaymentAuthorization | NotAuthorized | undefined =
|
|
209
|
+
this.authorizedProjects.get(projectId.toString());
|
|
210
|
+
if (authorization === "invoice" || authorization === "reseller") {
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/*
|
|
215
|
+
* "payment-method" is not the whole answer. The card is checked before the
|
|
216
|
+
* invoice agreement, so an invoice customer who also keeps a card on file
|
|
217
|
+
* is authorized by the card - and a cutoff stamped for them would waive
|
|
218
|
+
* telemetry their contract already bills. Ask about the agreement itself
|
|
219
|
+
* before any marker is written.
|
|
220
|
+
*/
|
|
221
|
+
if (await this.hasNoCutoffAgreement(projectId)) {
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const project: Project | null = await ProjectService.findOneById({
|
|
226
|
+
id: projectId,
|
|
227
|
+
select: {
|
|
228
|
+
paymentProviderCustomerId: true,
|
|
229
|
+
},
|
|
230
|
+
props: { isRoot: true, ignoreHooks: true },
|
|
231
|
+
});
|
|
232
|
+
if (!project?.paymentProviderCustomerId) {
|
|
233
|
+
throw new PaymentRequiredException(
|
|
234
|
+
PAY_AS_YOU_GO_PAYMENT_REQUIRED_MESSAGE,
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const authorizedAt: Date = await BillingService.getMeteredBillingStartDate(
|
|
239
|
+
project.paymentProviderCustomerId,
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
* Daily aggregates cannot separate pre-card and post-card usage. Forgive
|
|
244
|
+
* the partial authorization day and begin with the next complete UTC day.
|
|
245
|
+
*/
|
|
246
|
+
return new Date(
|
|
247
|
+
Date.UTC(
|
|
248
|
+
authorizedAt.getUTCFullYear(),
|
|
249
|
+
authorizedAt.getUTCMonth(),
|
|
250
|
+
authorizedAt.getUTCDate() + 1,
|
|
251
|
+
),
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
public async requireMeteredSubscriptionPayment(
|
|
256
|
+
subscription: Stripe.Subscription,
|
|
257
|
+
options?: { liveAuthorization?: LiveUsageAuthorization | undefined },
|
|
258
|
+
): Promise<void> {
|
|
259
|
+
const customerId: string =
|
|
260
|
+
typeof subscription.customer === "string"
|
|
261
|
+
? subscription.customer
|
|
262
|
+
: subscription.customer.id;
|
|
263
|
+
const project: Project | null = await ProjectService.findOneBy({
|
|
264
|
+
query: { paymentProviderCustomerId: customerId },
|
|
265
|
+
select: { _id: true },
|
|
266
|
+
props: { isRoot: true, ignoreHooks: true },
|
|
267
|
+
});
|
|
268
|
+
if (!project?.id) {
|
|
269
|
+
throw new PaymentRequiredException(
|
|
270
|
+
PAY_AS_YOU_GO_PAYMENT_REQUIRED_MESSAGE,
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/*
|
|
275
|
+
* The owner comes from the subscription's own customer, never from the
|
|
276
|
+
* caller, so a token only spares the read when it was made for the
|
|
277
|
+
* project this usage is about to be charged to.
|
|
278
|
+
*/
|
|
279
|
+
if (this.isLiveAuthorizationFor(options?.liveAuthorization, project.id)) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (!(await this.canUsePayAsYouGo(project.id, { useCache: false }))) {
|
|
284
|
+
throw new PaymentRequiredException(
|
|
285
|
+
PAY_AS_YOU_GO_PAYMENT_REQUIRED_MESSAGE,
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
private async checkPaymentAuthorization(
|
|
291
|
+
projectId: ObjectID,
|
|
292
|
+
): Promise<PaymentAuthorization | null> {
|
|
293
|
+
const project: Project | null = await this.findBillingSetup(projectId);
|
|
294
|
+
|
|
295
|
+
if (!project) {
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (await this.hasResellerAgreement(projectId, project)) {
|
|
300
|
+
return "reseller";
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
if (!project.paymentProviderPlanId || !project.paymentProviderCustomerId) {
|
|
304
|
+
return null;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const plan: SubscriptionPlan | undefined =
|
|
308
|
+
SubscriptionPlan.getSubscriptionPlanById(
|
|
309
|
+
project.paymentProviderPlanId,
|
|
310
|
+
getAllEnvVars(),
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
if (!plan) {
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/*
|
|
318
|
+
* Card first, and a card holder's subscription is never read. Stripe
|
|
319
|
+
* rate-limits GET /v1/subscriptions/:id on its own, apart from the
|
|
320
|
+
* account-wide limit, and this check sits on synchronous paths - creating
|
|
321
|
+
* a monitor, the billing page's gate, every metered report. Reading the
|
|
322
|
+
* subscription first put that endpoint in front of every answer, three or
|
|
323
|
+
* four times per monitor create, and held it at its limit. Only a project
|
|
324
|
+
* with no card needs the subscription: it is what tells an invoice
|
|
325
|
+
* agreement apart from no agreement at all.
|
|
326
|
+
*/
|
|
327
|
+
if (
|
|
328
|
+
await BillingService.hasPaymentMethods(project.paymentProviderCustomerId)
|
|
329
|
+
) {
|
|
330
|
+
return "payment-method";
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return (await this.hasInvoiceAgreement(project)) ? "invoice" : null;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/*
|
|
337
|
+
* Cached per project because a telemetry billing pass asks for every product
|
|
338
|
+
* type, twice each, seconds apart - one subscription read a pass rather than
|
|
339
|
+
* fourteen. A failure is never cached and never read as "no agreement": that
|
|
340
|
+
* answer stamps a cutoff, and a cutoff waives usage.
|
|
341
|
+
*/
|
|
342
|
+
private async hasNoCutoffAgreement(projectId: ObjectID): Promise<boolean> {
|
|
343
|
+
const cacheKey: string = projectId.toString();
|
|
344
|
+
const cached: boolean | undefined = this.noCutoffAgreements.get(cacheKey);
|
|
345
|
+
|
|
346
|
+
if (cached !== undefined) {
|
|
347
|
+
return cached;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
const project: Project | null = await this.findBillingSetup(projectId);
|
|
351
|
+
|
|
352
|
+
const hasAgreement: boolean = project
|
|
353
|
+
? (await this.hasResellerAgreement(projectId, project)) ||
|
|
354
|
+
(await this.hasInvoiceAgreement(project))
|
|
355
|
+
: false;
|
|
356
|
+
|
|
357
|
+
this.noCutoffAgreements.set(
|
|
358
|
+
cacheKey,
|
|
359
|
+
hasAgreement,
|
|
360
|
+
AUTHORIZATION_CACHE_TTL_IN_MS,
|
|
361
|
+
);
|
|
362
|
+
|
|
363
|
+
return hasAgreement;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
private async findBillingSetup(projectId: ObjectID): Promise<Project | null> {
|
|
367
|
+
return await ProjectService.findOneById({
|
|
368
|
+
id: projectId,
|
|
369
|
+
select: {
|
|
370
|
+
paymentProviderPlanId: true,
|
|
371
|
+
paymentProviderCustomerId: true,
|
|
372
|
+
paymentProviderSubscriptionId: true,
|
|
373
|
+
resellerId: true,
|
|
374
|
+
resellerPlanId: true,
|
|
375
|
+
},
|
|
376
|
+
props: { isRoot: true, ignoreHooks: true },
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
private async hasResellerAgreement(
|
|
381
|
+
projectId: ObjectID,
|
|
382
|
+
project: Project,
|
|
383
|
+
): Promise<boolean> {
|
|
384
|
+
if (!project.resellerId || !project.resellerPlanId) {
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/*
|
|
389
|
+
* The redeemed license is bound to the project and reseller. Its
|
|
390
|
+
* original plan can differ after an authenticated reseller tier change.
|
|
391
|
+
*/
|
|
392
|
+
const redeemedLicense: PromoCode | null = await PromoCodeService.findOneBy({
|
|
393
|
+
query: {
|
|
394
|
+
projectId: projectId,
|
|
395
|
+
resellerId: project.resellerId,
|
|
396
|
+
isPromoCodeUsed: true,
|
|
397
|
+
},
|
|
398
|
+
select: { _id: true },
|
|
399
|
+
props: { isRoot: true, ignoreHooks: true },
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
return Boolean(redeemedLicense);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/*
|
|
406
|
+
* A paid plan whose own subscription, billed to this project's own customer,
|
|
407
|
+
* is active and collected by invoice. The single definition behind both the
|
|
408
|
+
* "invoice" authorization and the telemetry cutoff exemption.
|
|
409
|
+
*/
|
|
410
|
+
private async hasInvoiceAgreement(project: Project): Promise<boolean> {
|
|
411
|
+
if (
|
|
412
|
+
!project.paymentProviderPlanId ||
|
|
413
|
+
!project.paymentProviderCustomerId ||
|
|
414
|
+
!project.paymentProviderSubscriptionId
|
|
415
|
+
) {
|
|
416
|
+
return false;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
const plan: SubscriptionPlan | undefined =
|
|
420
|
+
SubscriptionPlan.getSubscriptionPlanById(
|
|
421
|
+
project.paymentProviderPlanId,
|
|
422
|
+
getAllEnvVars(),
|
|
423
|
+
);
|
|
424
|
+
|
|
425
|
+
if (!plan || plan.getName() === PlanType.Free) {
|
|
426
|
+
return false;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
const subscription: Stripe.Subscription =
|
|
430
|
+
await BillingService.getSubscription(
|
|
431
|
+
project.paymentProviderSubscriptionId,
|
|
432
|
+
);
|
|
433
|
+
const customerId: string =
|
|
434
|
+
typeof subscription.customer === "string"
|
|
435
|
+
? subscription.customer
|
|
436
|
+
: subscription.customer.id;
|
|
437
|
+
|
|
438
|
+
return (
|
|
439
|
+
customerId === project.paymentProviderCustomerId &&
|
|
440
|
+
subscription.collection_method === "send_invoice" &&
|
|
441
|
+
subscription.status === "active"
|
|
442
|
+
);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
export default new Service();
|