@oneuptime/common 12.0.12 → 12.0.14
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/DatabaseBaseModel/DatabaseBaseModel.ts +32 -5
- package/Models/DatabaseModels/NetworkDevice.ts +64 -0
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
- package/Models/DatabaseModels/StatusPage.ts +59 -0
- package/Models/DatabaseModels/StatusPageOidc.ts +2 -0
- package/Models/DatabaseModels/UserCall.ts +94 -3
- package/Models/DatabaseModels/UserEmail.ts +94 -3
- package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
- package/Models/DatabaseModels/UserPush.ts +37 -0
- package/Models/DatabaseModels/UserSMS.ts +94 -3
- package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -2
- package/Server/API/AIChatAPI.ts +55 -56
- package/Server/API/BaseAPI.ts +79 -14
- package/Server/API/CommonAPI.ts +89 -0
- package/Server/API/MicrosoftTeamsAPI.ts +20 -9
- package/Server/API/SlackAPI.ts +13 -10
- package/Server/API/StatusPageAPI.ts +2197 -2128
- package/Server/API/TelemetryAPI.ts +72 -3
- package/Server/API/UserCallAPI.ts +53 -45
- package/Server/API/UserEmailAPI.ts +53 -44
- package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
- package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
- package/Server/API/UserPushAPI.ts +126 -2
- package/Server/API/UserSmsAPI.ts +53 -44
- package/Server/API/UserWhatsAppAPI.ts +53 -50
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.ts +30 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Middleware/UserAuthorization.ts +11 -2
- package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
- package/Server/Services/AnalyticsDatabaseService.ts +169 -0
- package/Server/Services/ApiKeyPermissionService.ts +116 -2
- package/Server/Services/DatabaseService.ts +118 -6
- package/Server/Services/LogAggregationService.ts +39 -0
- package/Server/Services/LogService.ts +21 -0
- package/Server/Services/NetworkSiteService.ts +12 -0
- package/Server/Services/PushNotificationService.ts +127 -12
- package/Server/Services/SpanService.ts +21 -0
- package/Server/Services/TeamMemberService.ts +53 -13
- package/Server/Services/TraceAggregationService.ts +15 -0
- package/Server/Services/UserCallService.ts +55 -24
- package/Server/Services/UserEmailService.ts +83 -17
- package/Server/Services/UserIncomingCallNumberService.ts +49 -85
- package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
- package/Server/Services/UserNotificationRuleService.ts +26 -0
- package/Server/Services/UserPushService.ts +89 -0
- package/Server/Services/UserSmsService.ts +50 -17
- package/Server/Services/UserWhatsAppService.ts +48 -15
- package/Server/Services/WorkspaceNotificationRuleService.ts +172 -220
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
- package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -16
- package/Server/Types/Database/QueryHelper.ts +30 -0
- package/Server/Utils/APIKey/AccessPermission.ts +16 -40
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +144 -0
- package/Server/Utils/ChannelVerification.ts +510 -0
- package/Server/Utils/LogRedaction.ts +576 -0
- package/Server/Utils/Logger.ts +123 -46
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
- package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +94 -23
- package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
- package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
- package/Server/Utils/Monitor/MonitorResource.ts +29 -9
- package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +28 -7
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
- package/Server/Utils/SessionReplay/SessionReplayGateCacheStore.ts +56 -10
- package/Server/Utils/StartServer.ts +30 -9
- package/Server/Utils/StatusPageSearchEngineIndexing.ts +33 -0
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +441 -0
- package/Server/Utils/TotpAuth.ts +137 -9
- package/Server/Utils/UserRegistrationToken.ts +182 -0
- package/Server/Utils/VerificationCode.ts +134 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +488 -46
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
- package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +328 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +130 -0
- package/Tests/Models/DatabaseModels/DatabaseBaseModelToJSONObjectCache.test.ts +180 -0
- package/Tests/Models/StatusPageEnableSearchEngineIndexing.test.ts +157 -0
- package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
- package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +23 -1
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +785 -0
- package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +21 -8
- package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +290 -0
- package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +7 -1
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
- package/Tests/Server/API/StatusPageOverviewCache.test.ts +474 -0
- package/Tests/Server/API/StatusPageSeoSearchEngineIndexing.test.ts +189 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
- package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
- package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
- package/Tests/Server/API/UserSmsApi.test.ts +107 -14
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
- package/Tests/Server/Infrastructure/InMemoryTTLCache.test.ts +158 -0
- package/Tests/Server/Infrastructure/Postgres/DeviceRoleAndDeclaredLinkParentMigration.test.ts +9 -60
- package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
- package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +24 -15
- package/Tests/Server/Middleware/UserAuthorization.test.ts +79 -0
- package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
- package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +280 -0
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
- package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +347 -0
- package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
- package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
- package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
- package/Tests/Server/Services/DatabaseServiceUpdateDebugLogging.test.ts +282 -0
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
- package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
- package/Tests/Server/Services/NetworkSiteService.test.ts +56 -2
- package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
- package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
- package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +267 -0
- package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
- package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
- package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleTestRuleChannels.test.ts +702 -0
- package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
- package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +165 -0
- package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
- package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
- package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
- package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
- package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
- package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +48 -36
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +213 -0
- package/Tests/Server/Utils/Browser.test.ts +162 -0
- package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
- package/Tests/Server/Utils/Express.test.ts +371 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +415 -0
- package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +245 -0
- package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
- package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
- package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +374 -4
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +455 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
- package/Tests/Server/Utils/Monitor/NetworkDeviceReachabilityRoundTrip.test.ts +369 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +86 -8
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
- package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +64 -0
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayGateCacheStore.test.ts +207 -0
- package/Tests/Server/Utils/StartServerBodyVerify.test.ts +335 -0
- package/Tests/Server/Utils/StatusPageSearchEngineIndexing.test.ts +60 -0
- package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +435 -0
- package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
- package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
- package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +607 -62
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstalledTeamIdSpace.test.ts +778 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +44 -10
- package/Tests/Types/API/HostnameFromAuthority.test.ts +164 -0
- package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
- package/Tests/Types/Call/CallRequest.test.ts +189 -0
- package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
- package/Tests/Types/Database/AccessControl/ColumnAccessControlCache.test.ts +344 -0
- package/Tests/Types/Database/DatabasePropertyFindOperator.test.ts +518 -0
- package/Tests/Types/Database/TableColumnMetadataCache.test.ts +286 -0
- package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
- package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
- package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
- package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
- package/Tests/Types/Monitor/MonitorStep.test.ts +100 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +360 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
- package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
- package/Tests/Types/StatusPage/SearchEngineIndexing.test.ts +86 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +254 -0
- package/Tests/Types/TextRandomGeneration.test.ts +211 -0
- package/Tests/UI/Components/Button.test.tsx +175 -1
- package/Tests/UI/Components/CardSelect.test.tsx +1021 -0
- package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
- package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
- package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
- package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
- package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
- package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
- package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
- package/Tests/UI/Components/List.test.tsx +9 -2
- package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
- package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
- package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
- package/Tests/UI/Components/MasterPage.test.tsx +36 -1
- package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
- package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
- package/Tests/UI/Components/Skeleton.test.tsx +71 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
- package/Tests/UI/Components/Tabs.test.tsx +24 -0
- package/Tests/UI/Components/Toast.test.tsx +130 -7
- package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
- package/Tests/UI/Utils/Dropdown.test.ts +423 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
- package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
- package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
- package/Tests/Utils/API.test.ts +16 -2
- package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
- package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +66 -1
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +115 -6
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +610 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +114 -45
- package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
- package/Types/API/Hostname.ts +79 -0
- package/Types/Database/AccessControl/ColumnAccessControl.ts +33 -11
- package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +33 -11
- package/Types/Database/DatabaseProperty.ts +38 -0
- package/Types/Database/TableColumn.ts +34 -7
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Events/Recurring.ts +16 -1
- package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
- package/Types/Monitor/MonitorStep.ts +13 -1
- package/Types/Monitor/MonitorType.ts +345 -40
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
- package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +43 -0
- package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
- package/Types/Permission.ts +35 -0
- package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
- package/Types/PushNotification/PushNotificationMessage.ts +15 -0
- package/Types/PushNotification/PushNotificationRequest.ts +8 -16
- package/Types/Service/ServiceLanguage.ts +144 -0
- package/Types/StatusPage/SearchEngineIndexing.ts +61 -0
- package/Types/Telemetry/ResourceEntityFacet.ts +211 -0
- package/Types/Text.ts +111 -19
- package/UI/Components/Button/Button.tsx +27 -14
- package/UI/Components/CardSelect/CardSelect.tsx +714 -105
- package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
- package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
- package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
- package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
- package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
- package/UI/Components/CommandPalette/Types.ts +49 -0
- package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/EmptyState/EmptyState.tsx +8 -1
- package/UI/Components/Feed/FeedItem.tsx +1 -1
- package/UI/Components/Footer/Footer.tsx +32 -6
- package/UI/Components/Forms/Fields/FormField.tsx +3 -0
- package/UI/Components/Forms/Types/Field.ts +8 -0
- package/UI/Components/List/List.tsx +37 -5
- package/UI/Components/List/ListSkeleton.tsx +54 -0
- package/UI/Components/Loader/PageLoader.tsx +29 -8
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +26 -4
- package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +23 -2
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
- package/UI/Components/MasterPage/MasterPage.tsx +24 -11
- package/UI/Components/Modal/Modal.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
- package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
- package/UI/Components/Navbar/NavBar.tsx +14 -1
- package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
- package/UI/Components/SideOver/SideOver.tsx +37 -2
- package/UI/Components/Skeleton/Skeleton.tsx +53 -0
- package/UI/Components/Table/Table.tsx +74 -44
- package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
- package/UI/Components/Tabs/Tab.tsx +1 -1
- package/UI/Components/Toast/Toast.tsx +118 -53
- package/UI/Components/Toast/ToastInit.tsx +82 -32
- package/UI/Styles/Theme.css +40 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
- package/UI/Utils/ModelListCache.ts +188 -0
- package/UI/Utils/Project.ts +29 -0
- package/Utils/API.ts +6 -1
- package/Utils/Monitor/MonitorMetricType.ts +16 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +60 -8
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +262 -0
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +41 -24
- package/Utils/Telemetry/CrossSignalScope.ts +75 -4
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +20 -4
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +66 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +60 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js +2 -0
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
- package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
- package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
- package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
- package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +48 -35
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +69 -13
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +59 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +20 -6
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +13 -10
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +745 -673
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +34 -3
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +42 -38
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +42 -38
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
- package/build/dist/Server/API/UserPushAPI.js +95 -2
- package/build/dist/Server/API/UserPushAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +42 -38
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +6 -2
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +90 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +89 -6
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +7 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/LogService.js +16 -0
- package/build/dist/Server/Services/LogService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +12 -0
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/PushNotificationService.js +69 -30
- package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
- package/build/dist/Server/Services/SpanService.js +16 -0
- package/build/dist/Server/Services/SpanService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +43 -7
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +2 -0
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserCallService.js +54 -22
- package/build/dist/Server/Services/UserCallService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +78 -17
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
- package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserPushService.js +77 -0
- package/build/dist/Server/Services/UserPushService.js.map +1 -1
- package/build/dist/Server/Services/UserSmsService.js +50 -17
- package/build/dist/Server/Services/UserSmsService.js.map +1 -1
- package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
- package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +137 -164
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +21 -13
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/APIKey/AccessPermission.js +9 -32
- package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +87 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/ChannelVerification.js +348 -0
- package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
- package/build/dist/Server/Utils/LogRedaction.js +449 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -0
- package/build/dist/Server/Utils/Logger.js +98 -45
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +65 -13
- package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +20 -3
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +27 -7
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js +29 -10
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +10 -7
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js +24 -0
- package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +311 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -0
- package/build/dist/Server/Utils/TotpAuth.js +127 -8
- package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
- package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
- package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
- package/build/dist/Server/Utils/VerificationCode.js +120 -0
- package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +366 -37
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/API/Hostname.js +63 -0
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +20 -6
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +20 -6
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
- package/build/dist/Types/Database/DatabaseProperty.js +38 -0
- package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
- package/build/dist/Types/Database/TableColumn.js +24 -6
- package/build/dist/Types/Database/TableColumn.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/Events/Recurring.js +13 -1
- package/build/dist/Types/Events/Recurring.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +9 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +330 -31
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
- package/build/dist/Types/Permission.js +33 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
- package/build/dist/Types/Service/ServiceLanguage.js +96 -0
- package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
- package/build/dist/Types/StatusPage/SearchEngineIndexing.js +55 -0
- package/build/dist/Types/StatusPage/SearchEngineIndexing.js.map +1 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js +156 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -0
- package/build/dist/Types/Text.js +82 -17
- package/build/dist/Types/Text.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +22 -14
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/CardSelect/CardSelect.js +360 -40
- package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
- package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.js +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/Footer/Footer.js +7 -4
- package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/List/List.js +19 -5
- package/build/dist/UI/Components/List/List.js.map +1 -1
- package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
- package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
- package/build/dist/UI/Components/Loader/PageLoader.js +15 -5
- package/build/dist/UI/Components/Loader/PageLoader.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +16 -3
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js +13 -1
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MasterPage/MasterPage.js +10 -2
- package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
- package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +35 -24
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
- package/build/dist/UI/Components/Tabs/Tab.js +1 -1
- package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
- package/build/dist/UI/Components/Toast/Toast.js +77 -23
- package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
- package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
- package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelListCache.js +126 -0
- package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
- package/build/dist/UI/Utils/Project.js +24 -1
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/Utils/API.js +6 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +13 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +34 -7
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +177 -0
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +23 -27
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +44 -4
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/jest.config.json +1 -1
- package/package.json +2 -3
- package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
- package/Tests/__mocks__/otpauth.js +0 -30
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import EmailVerificationToken from "../../../Models/DatabaseModels/EmailVerificationToken";
|
|
2
|
+
import Project from "../../../Models/DatabaseModels/Project";
|
|
3
|
+
import TeamMember from "../../../Models/DatabaseModels/TeamMember";
|
|
4
|
+
import User from "../../../Models/DatabaseModels/User";
|
|
5
|
+
import DatabaseConfig from "../../../Server/DatabaseConfig";
|
|
6
|
+
import EmailVerificationTokenService from "../../../Server/Services/EmailVerificationTokenService";
|
|
7
|
+
import MailService from "../../../Server/Services/MailService";
|
|
8
|
+
import ProjectSCIMService from "../../../Server/Services/ProjectSCIMService";
|
|
9
|
+
import ProjectService from "../../../Server/Services/ProjectService";
|
|
10
|
+
import TeamMemberService from "../../../Server/Services/TeamMemberService";
|
|
11
|
+
import UserNotificationRuleService from "../../../Server/Services/UserNotificationRuleService";
|
|
12
|
+
import UserNotificationSettingService from "../../../Server/Services/UserNotificationSettingService";
|
|
13
|
+
import UserService from "../../../Server/Services/UserService";
|
|
14
|
+
import CreateBy from "../../../Server/Types/Database/CreateBy";
|
|
15
|
+
import Hostname from "../../../Types/API/Hostname";
|
|
16
|
+
import Protocol from "../../../Types/API/Protocol";
|
|
17
|
+
import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
18
|
+
import Email from "../../../Types/Email";
|
|
19
|
+
import EmailMessage from "../../../Types/Email/EmailMessage";
|
|
20
|
+
import HashedString from "../../../Types/HashedString";
|
|
21
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
22
|
+
import PositiveNumber from "../../../Types/PositiveNumber";
|
|
23
|
+
import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
|
|
24
|
+
|
|
25
|
+
/*
|
|
26
|
+
* The invitation half of GHSA-qg84-6hrg-mr5g.
|
|
27
|
+
*
|
|
28
|
+
* Inviting somebody creates their User row with no password on it, and /signup
|
|
29
|
+
* used to hand that row to anyone who asked for it by address. The address is
|
|
30
|
+
* not a secret -- corporate ones are guessable by construction -- so the
|
|
31
|
+
* invitation now carries a registration token, and that token is the only thing
|
|
32
|
+
* that can claim the account.
|
|
33
|
+
*
|
|
34
|
+
* Which means the invitation email is the sole delivery channel for it, and the
|
|
35
|
+
* decision of whether to mint one has to key off "has this person registered
|
|
36
|
+
* yet", not "did we just create their row". Those two came apart for anyone
|
|
37
|
+
* invited to a second project before they ever signed up: they had a row, so
|
|
38
|
+
* they were treated as an existing user and sent a sign-in link they could not
|
|
39
|
+
* use, having no password to sign in with.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
43
|
+
"11111111-1111-4111-8111-111111111111",
|
|
44
|
+
);
|
|
45
|
+
const TEAM_ID: ObjectID = new ObjectID("22222222-2222-4222-8222-222222222222");
|
|
46
|
+
const USER_ID: ObjectID = new ObjectID("33333333-3333-4333-8333-333333333333");
|
|
47
|
+
const INVITER_ID: ObjectID = new ObjectID(
|
|
48
|
+
"55555555-5555-4555-8555-555555555555",
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
const MEMBER_EMAIL: Email = new Email("alice@company.com");
|
|
52
|
+
|
|
53
|
+
let sendMailSpy: jest.SpyInstance;
|
|
54
|
+
let createTokenSpy: jest.SpyInstance;
|
|
55
|
+
let findUserSpy: jest.SpyInstance;
|
|
56
|
+
|
|
57
|
+
// Calls a protected hook without widening the service's public surface.
|
|
58
|
+
function callHook(
|
|
59
|
+
service: unknown,
|
|
60
|
+
name: string,
|
|
61
|
+
...args: Array<unknown>
|
|
62
|
+
): Promise<unknown> {
|
|
63
|
+
const hooks: Record<
|
|
64
|
+
string,
|
|
65
|
+
(...hookArgs: Array<unknown>) => Promise<unknown>
|
|
66
|
+
> = service as Record<
|
|
67
|
+
string,
|
|
68
|
+
(...hookArgs: Array<unknown>) => Promise<unknown>
|
|
69
|
+
>;
|
|
70
|
+
|
|
71
|
+
return hooks[name]!.apply(service, args);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function inviteBy(): CreateBy<TeamMember> {
|
|
75
|
+
const member: TeamMember = new TeamMember();
|
|
76
|
+
member.projectId = PROJECT_ID;
|
|
77
|
+
member.teamId = TEAM_ID;
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
data: member,
|
|
81
|
+
props: {
|
|
82
|
+
userId: INVITER_ID,
|
|
83
|
+
tenantId: PROJECT_ID,
|
|
84
|
+
} as DatabaseCommonInteractionProps,
|
|
85
|
+
miscDataProps: { email: MEMBER_EMAIL.toString() },
|
|
86
|
+
} as CreateBy<TeamMember>;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* Somebody who has an account and can sign in. */
|
|
90
|
+
function registeredUser(): User {
|
|
91
|
+
const user: User = new User(USER_ID);
|
|
92
|
+
user._id = USER_ID.toString();
|
|
93
|
+
user.email = MEMBER_EMAIL;
|
|
94
|
+
user.password = new HashedString("already-registered", true);
|
|
95
|
+
|
|
96
|
+
return user;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* An invitation that nobody has claimed: a row, and no password on it. */
|
|
100
|
+
function unclaimedUser(): User {
|
|
101
|
+
const user: User = new User(USER_ID);
|
|
102
|
+
user._id = USER_ID.toString();
|
|
103
|
+
user.email = MEMBER_EMAIL;
|
|
104
|
+
|
|
105
|
+
return user;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function sentMail(): EmailMessage {
|
|
109
|
+
expect(sendMailSpy).toHaveBeenCalledTimes(1);
|
|
110
|
+
|
|
111
|
+
return sendMailSpy.mock.calls[0]![0] as EmailMessage;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function registerLink(): string {
|
|
115
|
+
return sentMail().vars["registerLink"] as string;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* The token actually written to the database for this invitation. */
|
|
119
|
+
function persistedToken(): EmailVerificationToken {
|
|
120
|
+
expect(createTokenSpy).toHaveBeenCalledTimes(1);
|
|
121
|
+
|
|
122
|
+
return createTokenSpy.mock.calls[0]![0]["data"] as EmailVerificationToken;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
beforeEach(() => {
|
|
126
|
+
jest
|
|
127
|
+
.spyOn(ProjectSCIMService, "countBy")
|
|
128
|
+
.mockResolvedValue(new PositiveNumber(0));
|
|
129
|
+
|
|
130
|
+
// No existing membership - the duplicate-invite guard at the end of the hook.
|
|
131
|
+
jest.spyOn(TeamMemberService, "findOneBy").mockResolvedValue(null);
|
|
132
|
+
|
|
133
|
+
jest
|
|
134
|
+
.spyOn(ProjectService, "findOneById")
|
|
135
|
+
.mockResolvedValue({ name: "Acme Production" } as Project);
|
|
136
|
+
|
|
137
|
+
jest
|
|
138
|
+
.spyOn(DatabaseConfig, "getHost")
|
|
139
|
+
.mockResolvedValue(new Hostname("oneuptime.test"));
|
|
140
|
+
jest
|
|
141
|
+
.spyOn(DatabaseConfig, "getHttpProtocol")
|
|
142
|
+
.mockResolvedValue(Protocol.HTTPS);
|
|
143
|
+
|
|
144
|
+
sendMailSpy = jest
|
|
145
|
+
.spyOn(MailService, "sendMail")
|
|
146
|
+
.mockResolvedValue(undefined as never);
|
|
147
|
+
|
|
148
|
+
createTokenSpy = jest
|
|
149
|
+
.spyOn(EmailVerificationTokenService, "create")
|
|
150
|
+
.mockResolvedValue(new EmailVerificationToken());
|
|
151
|
+
|
|
152
|
+
findUserSpy = jest
|
|
153
|
+
.spyOn(UserService, "findOneBy")
|
|
154
|
+
.mockResolvedValue(unclaimedUser());
|
|
155
|
+
jest.spyOn(UserService, "findOneById").mockResolvedValue(unclaimedUser());
|
|
156
|
+
jest.spyOn(UserService, "createByEmail").mockResolvedValue(unclaimedUser());
|
|
157
|
+
|
|
158
|
+
jest
|
|
159
|
+
.spyOn(
|
|
160
|
+
UserNotificationSettingService,
|
|
161
|
+
"addDefaultNotificationSettingsForUser",
|
|
162
|
+
)
|
|
163
|
+
.mockResolvedValue(undefined as never);
|
|
164
|
+
jest
|
|
165
|
+
.spyOn(UserNotificationRuleService, "addDefaultNotificationRuleForUser")
|
|
166
|
+
.mockResolvedValue(undefined as never);
|
|
167
|
+
|
|
168
|
+
jest
|
|
169
|
+
.spyOn(TeamMemberService, "refreshTokens")
|
|
170
|
+
.mockResolvedValue(undefined as never);
|
|
171
|
+
jest
|
|
172
|
+
.spyOn(
|
|
173
|
+
TeamMemberService,
|
|
174
|
+
"updateSubscriptionSeatsByUniqueTeamMembersInProject",
|
|
175
|
+
)
|
|
176
|
+
.mockResolvedValue(undefined as never);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
afterEach(() => {
|
|
180
|
+
jest.restoreAllMocks();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
describe("TeamMemberService.onBeforeCreate - inviting somebody with no account yet", () => {
|
|
184
|
+
beforeEach(() => {
|
|
185
|
+
// Nobody by this address: the invite creates the row.
|
|
186
|
+
findUserSpy.mockResolvedValue(null);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
test("mints a registration token bound to the invited address", async () => {
|
|
190
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
191
|
+
|
|
192
|
+
const token: EmailVerificationToken = persistedToken();
|
|
193
|
+
|
|
194
|
+
expect(token.email!.toString()).toBe(MEMBER_EMAIL.toString());
|
|
195
|
+
expect(token.userId!.toString()).toBe(USER_ID.toString());
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test("puts that same token on the link in the invitation", async () => {
|
|
199
|
+
/*
|
|
200
|
+
* The email is the only place the token is ever published. If the link and
|
|
201
|
+
* the stored row disagreed, every invitation would dead-end.
|
|
202
|
+
*/
|
|
203
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
204
|
+
|
|
205
|
+
expect(registerLink()).toContain(persistedToken().token!.toString());
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
test("sends them to register rather than to sign in", async () => {
|
|
209
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
210
|
+
|
|
211
|
+
expect(sentMail().vars["isNewUser"]).toBe("true");
|
|
212
|
+
expect(registerLink()).toContain("/accounts/register");
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
describe("TeamMemberService.onBeforeCreate - inviting somebody who was invited before but never signed up", () => {
|
|
217
|
+
beforeEach(() => {
|
|
218
|
+
// The row exists from an earlier invitation, and still has no password.
|
|
219
|
+
findUserSpy.mockResolvedValue(unclaimedUser());
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
test("still treats them as somebody who has to register", async () => {
|
|
223
|
+
/*
|
|
224
|
+
* The regression. Keying off "did we just create the row" called this an
|
|
225
|
+
* existing user and mailed them a sign-in link for an account that has no
|
|
226
|
+
* password.
|
|
227
|
+
*/
|
|
228
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
229
|
+
|
|
230
|
+
expect(sentMail().vars["isNewUser"]).toBe("true");
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
test("mints them a token, because their account is still claimable", async () => {
|
|
234
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
235
|
+
|
|
236
|
+
expect(registerLink()).toContain(persistedToken().token!.toString());
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
test("does not create a second user row for them", async () => {
|
|
240
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
241
|
+
|
|
242
|
+
expect(UserService.createByEmail).not.toHaveBeenCalled();
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
describe("TeamMemberService.onBeforeCreate - inviting somebody who already has an account", () => {
|
|
247
|
+
beforeEach(() => {
|
|
248
|
+
findUserSpy.mockResolvedValue(registeredUser());
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
test("sends them to sign in", async () => {
|
|
252
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
253
|
+
|
|
254
|
+
expect(sentMail().vars["isNewUser"]).toBe("false");
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test("mints no token, because there is nothing left to claim", async () => {
|
|
258
|
+
/*
|
|
259
|
+
* A registered account cannot be claimed through /signup at all, so a token
|
|
260
|
+
* for it would authorize nothing -- it would just be a spare key sitting in
|
|
261
|
+
* an inbox.
|
|
262
|
+
*/
|
|
263
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
264
|
+
|
|
265
|
+
expect(createTokenSpy).not.toHaveBeenCalled();
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
test("the link it does carry has no token on it", async () => {
|
|
269
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
270
|
+
|
|
271
|
+
expect(registerLink()).not.toContain("token=");
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
describe("TeamMemberService.onBeforeCreate - reading the invitee", () => {
|
|
276
|
+
test("asks for the password column, since that is what the decision turns on", async () => {
|
|
277
|
+
/*
|
|
278
|
+
* findByEmail selects only the id. Reading the invitee with it would make
|
|
279
|
+
* `user.password` undefined for everyone, and every invitation would mint a
|
|
280
|
+
* token -- including for accounts that cannot be claimed.
|
|
281
|
+
*/
|
|
282
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
283
|
+
|
|
284
|
+
const select: Record<string, unknown> = findUserSpy.mock.calls[0]![0][
|
|
285
|
+
"select"
|
|
286
|
+
] as Record<string, unknown>;
|
|
287
|
+
|
|
288
|
+
expect(select["password"]).toBe(true);
|
|
289
|
+
});
|
|
290
|
+
});
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The identifier lookup is stubbed: these tests are about what the SQL and
|
|
3
|
+
* the rewritten query look like, and leaving it live would make them depend
|
|
4
|
+
* on a reachable Postgres.
|
|
5
|
+
*/
|
|
6
|
+
const kubernetesClusterFindBy: jest.Mock = jest.fn();
|
|
7
|
+
|
|
8
|
+
jest.mock("../../../Server/Services/KubernetesClusterService", () => {
|
|
9
|
+
return { __esModule: true, default: { findBy: kubernetesClusterFindBy } };
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
import LogAggregationService from "../../../Server/Services/LogAggregationService";
|
|
13
|
+
import TraceAggregationService from "../../../Server/Services/TraceAggregationService";
|
|
14
|
+
import LogService from "../../../Server/Services/LogService";
|
|
15
|
+
import SpanService from "../../../Server/Services/SpanService";
|
|
16
|
+
import { Results } from "../../../Server/Services/AnalyticsDatabaseService";
|
|
17
|
+
import { Statement } from "../../../Server/Utils/AnalyticsDatabase/Statement";
|
|
18
|
+
import { ResourceEntityScope } from "../../../Server/Utils/Telemetry/ResourceEntityFilter";
|
|
19
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
20
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
21
|
+
import { keyForKubernetesCluster } from "../../../Utils/Telemetry/EntityKey";
|
|
22
|
+
import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* End of the read path for issue #3216. Selecting a Kubernetes cluster used to
|
|
26
|
+
* compile to `primaryEntityId = '<clusterId>'`, and OTLP telemetry that
|
|
27
|
+
* carries a `service.name` is primary-keyed on its SERVICE — the cluster only
|
|
28
|
+
* appears in `entityKeys`. So the predicate matched zero rows, and pairing the
|
|
29
|
+
* cluster with a service made results reappear because both ids shared one
|
|
30
|
+
* `IN (...)` list.
|
|
31
|
+
*
|
|
32
|
+
* These tests pin the two surfaces that have to agree on what a resource facet
|
|
33
|
+
* selects: the aggregation statements behind the histogram / facets / analytics
|
|
34
|
+
* panels, and the list query the rows themselves come from. A chart that
|
|
35
|
+
* disagrees with its list is its own bug.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
const projectId: ObjectID = ObjectID.generate();
|
|
39
|
+
const startTime: Date = new Date("2026-08-14T11:00:00.000Z");
|
|
40
|
+
const endTime: Date = new Date("2026-08-14T12:00:00.000Z");
|
|
41
|
+
|
|
42
|
+
const clusterId: string = ObjectID.generate().toString();
|
|
43
|
+
const serviceId: string = ObjectID.generate().toString();
|
|
44
|
+
const clusterEntityKey: string = keyForKubernetesCluster(
|
|
45
|
+
projectId.toString(),
|
|
46
|
+
"prod-eu",
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const clusterScope: ResourceEntityScope = {
|
|
50
|
+
entityIds: [clusterId],
|
|
51
|
+
entityKeys: [clusterEntityKey],
|
|
52
|
+
attributeKey: "resource.k8s.cluster.name",
|
|
53
|
+
attributeValues: ["prod-eu"],
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/*
|
|
57
|
+
* Capture the statements a service builds instead of running them. The
|
|
58
|
+
* assertions are about the SQL shape (which branches, how they are combined),
|
|
59
|
+
* which is what decides whether a row matches.
|
|
60
|
+
*/
|
|
61
|
+
function captureStatements(
|
|
62
|
+
service: { executeQuery: (statement: Statement) => Promise<Results> },
|
|
63
|
+
rows: Array<JSONObject> = [],
|
|
64
|
+
): Array<Statement> {
|
|
65
|
+
const captured: Array<Statement> = [];
|
|
66
|
+
|
|
67
|
+
jest.spyOn(service as never, "executeQuery").mockImplementation(((
|
|
68
|
+
statement: Statement,
|
|
69
|
+
): Promise<Results> => {
|
|
70
|
+
captured.push(statement);
|
|
71
|
+
|
|
72
|
+
return Promise.resolve({
|
|
73
|
+
json: (): Promise<unknown> => {
|
|
74
|
+
return Promise.resolve({ data: rows });
|
|
75
|
+
},
|
|
76
|
+
} as unknown as Results);
|
|
77
|
+
}) as never);
|
|
78
|
+
|
|
79
|
+
return captured;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
describe("resource facet filters reach the telemetry read path", () => {
|
|
83
|
+
beforeEach(() => {
|
|
84
|
+
kubernetesClusterFindBy.mockReset();
|
|
85
|
+
kubernetesClusterFindBy.mockResolvedValue([
|
|
86
|
+
{ clusterIdentifier: "prod-eu" },
|
|
87
|
+
]);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
afterEach(() => {
|
|
91
|
+
jest.restoreAllMocks();
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe("LogAggregationService", () => {
|
|
95
|
+
test("the histogram matches a cluster by entity key, not only by primaryEntityId", async () => {
|
|
96
|
+
const captured: Array<Statement> = captureStatements(LogService);
|
|
97
|
+
|
|
98
|
+
await LogAggregationService.getHistogram({
|
|
99
|
+
projectId,
|
|
100
|
+
startTime,
|
|
101
|
+
endTime,
|
|
102
|
+
bucketSizeInMinutes: 5,
|
|
103
|
+
resourceScopes: [clusterScope],
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const query: string = captured[0]!.query;
|
|
107
|
+
|
|
108
|
+
expect(query).toContain("primaryEntityId IN");
|
|
109
|
+
expect(query).toContain("hasAny(entityKeys,");
|
|
110
|
+
expect(query).toContain("attributes[");
|
|
111
|
+
expect(Object.values(captured[0]!.query_params)).toContainEqual([
|
|
112
|
+
clusterEntityKey,
|
|
113
|
+
]);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test("a cluster and a service are separate predicates, so they intersect", async () => {
|
|
117
|
+
const captured: Array<Statement> = captureStatements(LogService);
|
|
118
|
+
|
|
119
|
+
await LogAggregationService.getHistogram({
|
|
120
|
+
projectId,
|
|
121
|
+
startTime,
|
|
122
|
+
endTime,
|
|
123
|
+
bucketSizeInMinutes: 5,
|
|
124
|
+
serviceIds: [new ObjectID(serviceId)],
|
|
125
|
+
resourceScopes: [clusterScope],
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
const query: string = captured[0]!.query;
|
|
129
|
+
|
|
130
|
+
/*
|
|
131
|
+
* Two AND-ed predicates. Before the fix both ids went into ONE
|
|
132
|
+
* `primaryEntityId IN (...)`, which OR-ed them — that is why adding a
|
|
133
|
+
* service "fixed" the empty result while dropping the cluster.
|
|
134
|
+
*/
|
|
135
|
+
expect(query).toContain("AND primaryEntityId IN");
|
|
136
|
+
expect(query).toContain("AND (primaryEntityId IN");
|
|
137
|
+
expect(query).toContain("hasAny(entityKeys,");
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test("facet value queries carry the same scope as the histogram", async () => {
|
|
141
|
+
const captured: Array<Statement> = captureStatements(LogService);
|
|
142
|
+
|
|
143
|
+
await LogAggregationService.getFacetValues({
|
|
144
|
+
projectId,
|
|
145
|
+
startTime,
|
|
146
|
+
endTime,
|
|
147
|
+
facetKey: "severityText",
|
|
148
|
+
resourceScopes: [clusterScope],
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
expect(captured[0]!.query).toContain("hasAny(entityKeys,");
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
test("no resource scope leaves the statement exactly as it was", async () => {
|
|
155
|
+
const captured: Array<Statement> = captureStatements(LogService);
|
|
156
|
+
|
|
157
|
+
await LogAggregationService.getHistogram({
|
|
158
|
+
projectId,
|
|
159
|
+
startTime,
|
|
160
|
+
endTime,
|
|
161
|
+
bucketSizeInMinutes: 5,
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
expect(captured[0]!.query).not.toContain("hasAny(entityKeys,");
|
|
165
|
+
expect(captured[0]!.query).not.toContain("AND (primaryEntityId IN");
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
describe("TraceAggregationService", () => {
|
|
170
|
+
test("the span histogram matches a cluster by entity key too", async () => {
|
|
171
|
+
const captured: Array<Statement> = captureStatements(SpanService);
|
|
172
|
+
|
|
173
|
+
await TraceAggregationService.getHistogram({
|
|
174
|
+
projectId,
|
|
175
|
+
startTime,
|
|
176
|
+
endTime,
|
|
177
|
+
bucketSizeInMinutes: 5,
|
|
178
|
+
resourceScopes: [clusterScope],
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
const query: string = captured[0]!.query;
|
|
182
|
+
|
|
183
|
+
expect(query).toContain("primaryEntityId IN");
|
|
184
|
+
expect(query).toContain("hasAny(entityKeys,");
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test("no resource scope leaves the span statement unchanged", async () => {
|
|
188
|
+
const captured: Array<Statement> = captureStatements(SpanService);
|
|
189
|
+
|
|
190
|
+
await TraceAggregationService.getHistogram({
|
|
191
|
+
projectId,
|
|
192
|
+
startTime,
|
|
193
|
+
endTime,
|
|
194
|
+
bucketSizeInMinutes: 5,
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
expect(captured[0]!.query).not.toContain("hasAny(entityKeys,");
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
describe("list queries", () => {
|
|
202
|
+
/*
|
|
203
|
+
* The list runs through the generic analytics endpoint, so the ids the
|
|
204
|
+
* explorer sends have to be resolved in the service's own onBeforeFind
|
|
205
|
+
* hook — that is the last point where Postgres is still reachable.
|
|
206
|
+
*/
|
|
207
|
+
type FindByShape = {
|
|
208
|
+
query: Record<string, unknown>;
|
|
209
|
+
props: { tenantId: ObjectID };
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
test("LogService resolves the explorer's resource ids before compiling", async () => {
|
|
213
|
+
const findBy: FindByShape = {
|
|
214
|
+
query: { resourceFilters: { kubernetesClusterId: [clusterId] } },
|
|
215
|
+
props: { tenantId: projectId },
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
await (
|
|
219
|
+
LogService as unknown as {
|
|
220
|
+
onBeforeFind: (input: FindByShape) => Promise<unknown>;
|
|
221
|
+
}
|
|
222
|
+
).onBeforeFind(findBy);
|
|
223
|
+
|
|
224
|
+
expect(findBy.query["resourceFilters"]).toBeUndefined();
|
|
225
|
+
expect(findBy.query["resourceEntityScopes"]).toBeDefined();
|
|
226
|
+
|
|
227
|
+
const scopes: Array<ResourceEntityScope> = findBy.query[
|
|
228
|
+
"resourceEntityScopes"
|
|
229
|
+
] as Array<ResourceEntityScope>;
|
|
230
|
+
|
|
231
|
+
expect(scopes[0]!.entityIds).toEqual([clusterId]);
|
|
232
|
+
// Resolved through Postgres to the key ingest stamped on the rows.
|
|
233
|
+
expect(scopes[0]!.entityKeys).toEqual([clusterEntityKey]);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
test("SpanService resolves them the same way", async () => {
|
|
237
|
+
const findBy: FindByShape = {
|
|
238
|
+
query: { resourceFilters: { kubernetesClusterId: [clusterId] } },
|
|
239
|
+
props: { tenantId: projectId },
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
await (
|
|
243
|
+
SpanService as unknown as {
|
|
244
|
+
onBeforeFind: (input: FindByShape) => Promise<unknown>;
|
|
245
|
+
}
|
|
246
|
+
).onBeforeFind(findBy);
|
|
247
|
+
|
|
248
|
+
expect(findBy.query["resourceFilters"]).toBeUndefined();
|
|
249
|
+
expect(findBy.query["resourceEntityScopes"]).toBeDefined();
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
test("a query without resource filters is handed through untouched", async () => {
|
|
253
|
+
const findBy: FindByShape = {
|
|
254
|
+
query: { severityText: "Error" },
|
|
255
|
+
props: { tenantId: projectId },
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
await (
|
|
259
|
+
LogService as unknown as {
|
|
260
|
+
onBeforeFind: (input: FindByShape) => Promise<unknown>;
|
|
261
|
+
}
|
|
262
|
+
).onBeforeFind(findBy);
|
|
263
|
+
|
|
264
|
+
expect(findBy.query).toEqual({ severityText: "Error" });
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
});
|