@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
|
@@ -1542,6 +1542,159 @@ export default class AnalyticsDatabaseService<
|
|
|
1542
1542
|
return { ...sort, _id: direction } as Sort<TBaseModel>;
|
|
1543
1543
|
}
|
|
1544
1544
|
|
|
1545
|
+
/**
|
|
1546
|
+
* Bounds the rows an `ORDER BY ... , _id` find has to sort, without
|
|
1547
|
+
* changing which rows it returns.
|
|
1548
|
+
*
|
|
1549
|
+
* ClickHouse can read in sorting-key order — and stop early — only when the
|
|
1550
|
+
* ORDER BY lines up with the table's physical key. The `_id` tiebreaker
|
|
1551
|
+
* appended by `toPaginationStableSort` is deliberately NOT a sorting-key
|
|
1552
|
+
* column, so it denies that plan: the engine reads every row matching the
|
|
1553
|
+
* WHERE, sorts the lot in memory, then discards all but one page. On the
|
|
1554
|
+
* Logs viewer that turned a 100-row page into a full-window scan and tripped
|
|
1555
|
+
* the 3 GiB `max_memory_usage` ceiling (Code 241, surfacing as
|
|
1556
|
+
* "Server Error").
|
|
1557
|
+
*
|
|
1558
|
+
* Weakening the tiebreaker would reintroduce the skip/repeat paging bug it
|
|
1559
|
+
* was added to fix, so bound the input instead. `min(k)` over the top
|
|
1560
|
+
* `skip + limit` values of the leading sort key `k` is a rank statistic of
|
|
1561
|
+
* k's MULTISET: it does not depend on which of several tied rows the inner
|
|
1562
|
+
* LIMIT happened to keep. Every row that could reach position `skip + limit`
|
|
1563
|
+
* satisfies `k >= min(k)`, and every row tied at the boundary value is
|
|
1564
|
+
* admitted — so the page is exactly the page the unbounded query returns.
|
|
1565
|
+
* That is what makes this a pure cost change: every gate below is a
|
|
1566
|
+
* performance gate, and getting one wrong can only make a query slower,
|
|
1567
|
+
* never lose or repeat a row.
|
|
1568
|
+
*
|
|
1569
|
+
* The inner pass reads one narrow key column in physical order and stops at
|
|
1570
|
+
* `skip + limit` rows, so it costs far less than the wide outer read it
|
|
1571
|
+
* saves.
|
|
1572
|
+
*
|
|
1573
|
+
* `min()` is nested over a subquery rather than taken as the N-th value via
|
|
1574
|
+
* `ORDER BY k DESC LIMIT 1 OFFSET n - 1` on purpose: on a final page with
|
|
1575
|
+
* fewer than `skip + limit` matching rows the latter returns no row, the
|
|
1576
|
+
* scalar is NULL, `k >= NULL` is NULL, and the page comes back empty.
|
|
1577
|
+
* `min()` over the available rows degrades to the smallest matching value.
|
|
1578
|
+
*/
|
|
1579
|
+
private toSortKeyBoundaryFilter(
|
|
1580
|
+
findBy: FindBy<TBaseModel>,
|
|
1581
|
+
sort: Sort<TBaseModel>,
|
|
1582
|
+
options: { hasGroupBy: boolean; databaseName: string },
|
|
1583
|
+
): Statement | null {
|
|
1584
|
+
/*
|
|
1585
|
+
* Under GROUP BY the predicate would restrict the aggregation INPUT
|
|
1586
|
+
* rather than the page, so it would change results. Mirrors the
|
|
1587
|
+
* tiebreaker's own exemption, leaving grouped finds byte-identical.
|
|
1588
|
+
*/
|
|
1589
|
+
if (options.hasGroupBy) {
|
|
1590
|
+
return null;
|
|
1591
|
+
}
|
|
1592
|
+
|
|
1593
|
+
/*
|
|
1594
|
+
* Without an `_id` column there is no off-key tiebreaker — the six
|
|
1595
|
+
* `includeBaseColumns: false` aggregate targets — so the ORDER BY is
|
|
1596
|
+
* already key-aligned and the bound would be pure overhead. Same
|
|
1597
|
+
* condition toPaginationStableSort bails on.
|
|
1598
|
+
*/
|
|
1599
|
+
const hasIdColumn: boolean = this.model.tableColumns.some(
|
|
1600
|
+
(column: AnalyticsTableColumn): boolean => {
|
|
1601
|
+
return column.key === "_id";
|
|
1602
|
+
},
|
|
1603
|
+
);
|
|
1604
|
+
|
|
1605
|
+
if (!hasIdColumn) {
|
|
1606
|
+
return null;
|
|
1607
|
+
}
|
|
1608
|
+
|
|
1609
|
+
const leadingSortKey: string | undefined = Object.keys(sort || {})[0];
|
|
1610
|
+
|
|
1611
|
+
if (!leadingSortKey) {
|
|
1612
|
+
return null;
|
|
1613
|
+
}
|
|
1614
|
+
|
|
1615
|
+
/*
|
|
1616
|
+
* Only a column in the physical sorting key can be read in order, so
|
|
1617
|
+
* only there can the off-key `_id` term have cost anything. Off-key
|
|
1618
|
+
* leads (e.g. Log by `severityText`) already plan a bounded top-N and
|
|
1619
|
+
* an extra pass would be pure waste.
|
|
1620
|
+
*/
|
|
1621
|
+
if (!this.model.sortKeys.includes(leadingSortKey)) {
|
|
1622
|
+
return null;
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1625
|
+
/*
|
|
1626
|
+
* A non-required column is `Nullable(...)` in the DDL, and `k >= NULL`
|
|
1627
|
+
* is NULL — the predicate would DROP those rows rather than just
|
|
1628
|
+
* narrowing the scan. Fail safe to today's behavior.
|
|
1629
|
+
*/
|
|
1630
|
+
const leadingSortColumn: AnalyticsTableColumn | null =
|
|
1631
|
+
this.model.getTableColumn(leadingSortKey);
|
|
1632
|
+
|
|
1633
|
+
if (!leadingSortColumn || !leadingSortColumn.required) {
|
|
1634
|
+
return null;
|
|
1635
|
+
}
|
|
1636
|
+
|
|
1637
|
+
/*
|
|
1638
|
+
* `findOneById` funnels a point lookup through `findOneBy` carrying the
|
|
1639
|
+
* model's default sort. At most one row can match, so bounding it would
|
|
1640
|
+
* double a query that has no ordering problem to begin with.
|
|
1641
|
+
*/
|
|
1642
|
+
if ((findBy.query as Record<string, unknown> | undefined)?.["_id"]) {
|
|
1643
|
+
return null;
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
/*
|
|
1647
|
+
* The predicate is valid only BECAUSE of LIMIT/OFFSET: it admits the
|
|
1648
|
+
* rows that can reach position `skip + limit` and no more. Guards the
|
|
1649
|
+
* `new PositiveNumber(undefined)` -> NaN path that exists upstream.
|
|
1650
|
+
*/
|
|
1651
|
+
const limit: number = Number(findBy.limit);
|
|
1652
|
+
const skip: number = Number(findBy.skip);
|
|
1653
|
+
|
|
1654
|
+
if (!Number.isFinite(limit) || !Number.isFinite(skip)) {
|
|
1655
|
+
return null;
|
|
1656
|
+
}
|
|
1657
|
+
|
|
1658
|
+
const boundaryRowCount: number = skip + limit;
|
|
1659
|
+
|
|
1660
|
+
if (boundaryRowCount <= 0) {
|
|
1661
|
+
return null;
|
|
1662
|
+
}
|
|
1663
|
+
|
|
1664
|
+
const isDescending: boolean =
|
|
1665
|
+
(sort as Record<string, SortOrder | undefined>)[leadingSortKey] !==
|
|
1666
|
+
SortOrder.Ascending;
|
|
1667
|
+
|
|
1668
|
+
/*
|
|
1669
|
+
* The bound must be computed over the same row set the outer query
|
|
1670
|
+
* filters on, so the WHERE is regenerated rather than shared: appending
|
|
1671
|
+
* one Statement into two places would bind its parameters twice.
|
|
1672
|
+
*/
|
|
1673
|
+
const boundaryWhereStatement: Statement =
|
|
1674
|
+
this.statementGenerator.toWhereStatement(findBy.query);
|
|
1675
|
+
|
|
1676
|
+
const boundaryStatement: Statement = SQL` AND ${leadingSortKey} `;
|
|
1677
|
+
|
|
1678
|
+
boundaryStatement.append(isDescending ? SQL`>=` : SQL`<=`);
|
|
1679
|
+
boundaryStatement.append(
|
|
1680
|
+
isDescending
|
|
1681
|
+
? SQL` (SELECT min(${leadingSortKey}) FROM (SELECT ${leadingSortKey} FROM ${options.databaseName}.${this.model.tableName} WHERE TRUE `
|
|
1682
|
+
: SQL` (SELECT max(${leadingSortKey}) FROM (SELECT ${leadingSortKey} FROM ${options.databaseName}.${this.model.tableName} WHERE TRUE `,
|
|
1683
|
+
);
|
|
1684
|
+
boundaryStatement.append(boundaryWhereStatement);
|
|
1685
|
+
boundaryStatement.append(this.getRetentionReadFilter());
|
|
1686
|
+
boundaryStatement.append(SQL` ORDER BY ${leadingSortKey} `);
|
|
1687
|
+
boundaryStatement.append(isDescending ? SQL`DESC` : SQL`ASC`);
|
|
1688
|
+
boundaryStatement.append(
|
|
1689
|
+
SQL` LIMIT ${{
|
|
1690
|
+
value: boundaryRowCount,
|
|
1691
|
+
type: TableColumnType.Number,
|
|
1692
|
+
}}))`,
|
|
1693
|
+
);
|
|
1694
|
+
|
|
1695
|
+
return boundaryStatement;
|
|
1696
|
+
}
|
|
1697
|
+
|
|
1545
1698
|
public toFindStatement(findBy: FindBy<TBaseModel>): {
|
|
1546
1699
|
statement: Statement;
|
|
1547
1700
|
columns: Array<string>;
|
|
@@ -1577,6 +1730,18 @@ export default class AnalyticsDatabaseService<
|
|
|
1577
1730
|
}),
|
|
1578
1731
|
);
|
|
1579
1732
|
|
|
1733
|
+
/*
|
|
1734
|
+
* Keeps the `_id` tiebreaker affordable. Result-preserving by
|
|
1735
|
+
* construction, so it is appended to the WHERE without touching the
|
|
1736
|
+
* ORDER BY above. Null whenever the bound cannot help or cannot be
|
|
1737
|
+
* proven safe.
|
|
1738
|
+
*/
|
|
1739
|
+
const sortKeyBoundaryStatement: Statement | null =
|
|
1740
|
+
this.toSortKeyBoundaryFilter(findBy, findBy.sort!, {
|
|
1741
|
+
hasGroupBy: Boolean(groupByStatement),
|
|
1742
|
+
databaseName: databaseName,
|
|
1743
|
+
});
|
|
1744
|
+
|
|
1580
1745
|
const statement: Statement = SQL``;
|
|
1581
1746
|
|
|
1582
1747
|
statement.append(SQL`SELECT `.append(select.statement));
|
|
@@ -1586,6 +1751,10 @@ export default class AnalyticsDatabaseService<
|
|
|
1586
1751
|
.append(whereStatement)
|
|
1587
1752
|
.append(this.getRetentionReadFilter());
|
|
1588
1753
|
|
|
1754
|
+
if (sortKeyBoundaryStatement) {
|
|
1755
|
+
statement.append(sortKeyBoundaryStatement);
|
|
1756
|
+
}
|
|
1757
|
+
|
|
1589
1758
|
if (groupByStatement) {
|
|
1590
1759
|
statement.append(SQL` GROUP BY `).append(groupByStatement);
|
|
1591
1760
|
}
|
|
@@ -1,20 +1,120 @@
|
|
|
1
1
|
import CreateBy from "../Types/Database/CreateBy";
|
|
2
|
-
import
|
|
2
|
+
import DeleteBy from "../Types/Database/DeleteBy";
|
|
3
|
+
import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
|
|
3
4
|
import UpdateBy from "../Types/Database/UpdateBy";
|
|
4
5
|
import DatabaseService from "./DatabaseService";
|
|
5
|
-
import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
6
|
+
import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
6
7
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
7
8
|
import Model from "../../Models/DatabaseModels/ApiKeyPermission";
|
|
9
|
+
import Label from "../../Models/DatabaseModels/Label";
|
|
10
|
+
import ObjectID from "../../Types/ObjectID";
|
|
11
|
+
import Permission from "../../Types/Permission";
|
|
8
12
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
13
|
+
import InMemoryTTLCache from "../Infrastructure/InMemoryTTLCache";
|
|
14
|
+
|
|
15
|
+
/*
|
|
16
|
+
* 60s is the worst-case staleness on any single API node after a key's
|
|
17
|
+
* permissions are edited. We invalidate in-process immediately on
|
|
18
|
+
* create/update/delete; this TTL is the upper bound for *other* processes
|
|
19
|
+
* (same bound the ApiKeyService key cache accepted).
|
|
20
|
+
*/
|
|
21
|
+
const PERMISSIONS_TTL_MS: number = 60 * 1000;
|
|
22
|
+
|
|
23
|
+
interface CachedApiKeyPermissionRow {
|
|
24
|
+
permission: Permission;
|
|
25
|
+
labelIds: Array<string>;
|
|
26
|
+
isBlockPermission: boolean | undefined;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface ApiKeyPermissionRow {
|
|
30
|
+
permission: Permission;
|
|
31
|
+
labelIds: Array<ObjectID>;
|
|
32
|
+
isBlockPermission: boolean | undefined;
|
|
33
|
+
}
|
|
34
|
+
|
|
9
35
|
export class Service extends DatabaseService<Model> {
|
|
36
|
+
/*
|
|
37
|
+
* Cache of `apiKeyId -> permission rows`. The API-key auth path builds the
|
|
38
|
+
* request's tenant permissions from these rows on every request; without it
|
|
39
|
+
* that's a Postgres findBy (with a labels join) per request.
|
|
40
|
+
*/
|
|
41
|
+
private permissionCache: InMemoryTTLCache<Array<CachedApiKeyPermissionRow>> =
|
|
42
|
+
new InMemoryTTLCache(10_000);
|
|
43
|
+
|
|
10
44
|
public constructor() {
|
|
11
45
|
super(Model);
|
|
12
46
|
}
|
|
13
47
|
|
|
48
|
+
public clearCache(): void {
|
|
49
|
+
this.permissionCache.clear();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Resolves the permission rows granted to an API key, with a short-lived
|
|
54
|
+
* in-process cache. Returns freshly built objects on every call (hit or
|
|
55
|
+
* miss), so callers never share mutable state with the cache. Use this from
|
|
56
|
+
* the auth hot path instead of calling `findBy` directly.
|
|
57
|
+
*/
|
|
58
|
+
@CaptureSpan()
|
|
59
|
+
public async findPermissionsByApiKeyId(
|
|
60
|
+
apiKeyId: ObjectID,
|
|
61
|
+
): Promise<Array<ApiKeyPermissionRow>> {
|
|
62
|
+
const cacheKey: string = apiKeyId.toString();
|
|
63
|
+
|
|
64
|
+
let cachedRows: Array<CachedApiKeyPermissionRow> | undefined =
|
|
65
|
+
this.permissionCache.get(cacheKey);
|
|
66
|
+
|
|
67
|
+
if (cachedRows === undefined) {
|
|
68
|
+
const rows: Array<Model> = await this.findBy({
|
|
69
|
+
query: {
|
|
70
|
+
apiKeyId: apiKeyId,
|
|
71
|
+
},
|
|
72
|
+
select: {
|
|
73
|
+
permission: true,
|
|
74
|
+
labels: {
|
|
75
|
+
_id: true,
|
|
76
|
+
},
|
|
77
|
+
isBlockPermission: true,
|
|
78
|
+
},
|
|
79
|
+
limit: LIMIT_MAX,
|
|
80
|
+
skip: 0,
|
|
81
|
+
props: {
|
|
82
|
+
isRoot: true,
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
cachedRows = rows.map((row: Model): CachedApiKeyPermissionRow => {
|
|
87
|
+
return {
|
|
88
|
+
permission: row.permission!,
|
|
89
|
+
labelIds: (row.labels ?? []).map((label: Label) => {
|
|
90
|
+
return label.id!.toString();
|
|
91
|
+
}),
|
|
92
|
+
isBlockPermission: row.isBlockPermission,
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
this.permissionCache.set(cacheKey, cachedRows, PERMISSIONS_TTL_MS);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return cachedRows.map(
|
|
100
|
+
(row: CachedApiKeyPermissionRow): ApiKeyPermissionRow => {
|
|
101
|
+
return {
|
|
102
|
+
permission: row.permission,
|
|
103
|
+
labelIds: row.labelIds.map((id: string) => {
|
|
104
|
+
return new ObjectID(id);
|
|
105
|
+
}),
|
|
106
|
+
isBlockPermission: row.isBlockPermission,
|
|
107
|
+
};
|
|
108
|
+
},
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
14
112
|
@CaptureSpan()
|
|
15
113
|
protected override async onBeforeCreate(
|
|
16
114
|
createBy: CreateBy<Model>,
|
|
17
115
|
): Promise<OnCreate<Model>> {
|
|
116
|
+
this.clearCache();
|
|
117
|
+
|
|
18
118
|
if (!createBy.data.apiKeyId) {
|
|
19
119
|
throw new BadDataException("API Key ID is required to create permission");
|
|
20
120
|
}
|
|
@@ -92,6 +192,12 @@ export class Service extends DatabaseService<Model> {
|
|
|
92
192
|
protected override async onBeforeUpdate(
|
|
93
193
|
updateBy: UpdateBy<Model>,
|
|
94
194
|
): Promise<OnUpdate<Model>> {
|
|
195
|
+
/*
|
|
196
|
+
* We don't know which keys are being updated without a query; updates
|
|
197
|
+
* are rare so clearing is cheap.
|
|
198
|
+
*/
|
|
199
|
+
this.clearCache();
|
|
200
|
+
|
|
95
201
|
if (updateBy.data.labels && updateBy.data.labels.length > 0) {
|
|
96
202
|
const existingPermissions: Array<Model> = await this.findBy({
|
|
97
203
|
query: updateBy.query,
|
|
@@ -153,6 +259,14 @@ export class Service extends DatabaseService<Model> {
|
|
|
153
259
|
|
|
154
260
|
return { updateBy, carryForward: null };
|
|
155
261
|
}
|
|
262
|
+
|
|
263
|
+
@CaptureSpan()
|
|
264
|
+
protected override async onBeforeDelete(
|
|
265
|
+
deleteBy: DeleteBy<Model>,
|
|
266
|
+
): Promise<OnDelete<Model>> {
|
|
267
|
+
this.clearCache();
|
|
268
|
+
return { deleteBy, carryForward: null };
|
|
269
|
+
}
|
|
156
270
|
}
|
|
157
271
|
|
|
158
272
|
export default new Service();
|
|
@@ -34,6 +34,7 @@ import Encryption from "../Utils/Encryption";
|
|
|
34
34
|
import PasswordHash from "../Utils/PasswordHash";
|
|
35
35
|
import PostgresErrorTranslator from "../Utils/Database/PostgresErrorTranslator";
|
|
36
36
|
import logger, { LogAttributes } from "../Utils/Logger";
|
|
37
|
+
import ConfigLogLevel from "../Types/ConfigLogLevel";
|
|
37
38
|
import BaseService from "./BaseService";
|
|
38
39
|
import BaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
39
40
|
import { WorkflowRoute } from "../../ServiceRoute";
|
|
@@ -2268,6 +2269,14 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
|
|
|
2268
2269
|
*/
|
|
2269
2270
|
const affectedItems: Array<TBaseModel> = [];
|
|
2270
2271
|
|
|
2272
|
+
/*
|
|
2273
|
+
* The per-item debug payload below is a pretty-printed JSON.stringify
|
|
2274
|
+
* of every matched row; skip building it entirely unless the log level
|
|
2275
|
+
* is DEBUG, since logger.debug() no-ops at any other level.
|
|
2276
|
+
*/
|
|
2277
|
+
const isDebugLogEnabled: boolean =
|
|
2278
|
+
logger.getLogLevel() === ConfigLogLevel.DEBUG;
|
|
2279
|
+
|
|
2271
2280
|
for (const item of items) {
|
|
2272
2281
|
/*
|
|
2273
2282
|
* _id must be set AFTER the spread: update data can carry an
|
|
@@ -2282,12 +2291,14 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
|
|
|
2282
2291
|
_id: item._id!,
|
|
2283
2292
|
} as any;
|
|
2284
2293
|
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2294
|
+
if (isDebugLogEnabled) {
|
|
2295
|
+
logger.debug("Updated Item", {
|
|
2296
|
+
projectId: updateBy.props.tenantId?.toString(),
|
|
2297
|
+
} as LogAttributes);
|
|
2298
|
+
logger.debug(JSON.stringify(updatedItem, null, 2), {
|
|
2299
|
+
projectId: updateBy.props.tenantId?.toString(),
|
|
2300
|
+
} as LogAttributes);
|
|
2301
|
+
}
|
|
2291
2302
|
|
|
2292
2303
|
if (hasRelationUpdates) {
|
|
2293
2304
|
await this.getRepository().save(updatedItem);
|
|
@@ -2875,6 +2886,107 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
|
|
|
2875
2886
|
await repository.manager.query(sql, params);
|
|
2876
2887
|
}
|
|
2877
2888
|
|
|
2889
|
+
/*
|
|
2890
|
+
* Add one to a numeric column and return what it became, in a SINGLE
|
|
2891
|
+
* statement.
|
|
2892
|
+
*
|
|
2893
|
+
* This exists for counters that GATE something, where the read and the
|
|
2894
|
+
* write cannot be allowed to come apart. The motivating case is the failed
|
|
2895
|
+
* attempt counter on a notification-channel verification code: read the
|
|
2896
|
+
* count, decide, then write it back, and N requests racing each other all
|
|
2897
|
+
* read the same pre-increment value and all decide they are under the
|
|
2898
|
+
* limit — which is precisely the shape an attacker running a brute-force
|
|
2899
|
+
* loop produces. `atomicAddToColumnsByIdWithoutHooks` closes the
|
|
2900
|
+
* lost-update half of that but cannot answer "and what is it now?", and
|
|
2901
|
+
* `getRepository().increment()` cannot either.
|
|
2902
|
+
*
|
|
2903
|
+
* RETURNING makes the increment and the observation the same operation, so
|
|
2904
|
+
* every concurrent caller gets a distinct value and the k-th attempt is
|
|
2905
|
+
* refused no matter how the requests interleave.
|
|
2906
|
+
*
|
|
2907
|
+
* COALESCE so a NULL counter starts from zero rather than staying NULL.
|
|
2908
|
+
*
|
|
2909
|
+
* The column and table identifiers come from entity metadata, never from
|
|
2910
|
+
* the caller, and the id is bound as a parameter. Hooks, the `version`
|
|
2911
|
+
* bump and access control are all skipped: use ONLY for trusted internal
|
|
2912
|
+
* counter writes.
|
|
2913
|
+
*/
|
|
2914
|
+
@CaptureSpan()
|
|
2915
|
+
public async atomicIncrementColumnValueByOneAndGetValue(data: {
|
|
2916
|
+
id: ObjectID;
|
|
2917
|
+
columnName: keyof TBaseModel;
|
|
2918
|
+
}): Promise<number> {
|
|
2919
|
+
if (!data.id) {
|
|
2920
|
+
throw new BadDataException("id is required");
|
|
2921
|
+
}
|
|
2922
|
+
|
|
2923
|
+
const repository: Repository<TBaseModel> = this.getRepository();
|
|
2924
|
+
const metadata: EntityMetadata = repository.metadata;
|
|
2925
|
+
|
|
2926
|
+
const column: ColumnMetadata | undefined =
|
|
2927
|
+
metadata.findColumnWithPropertyName(data.columnName as string);
|
|
2928
|
+
|
|
2929
|
+
if (!column) {
|
|
2930
|
+
throw new BadDataException(
|
|
2931
|
+
`atomicIncrementColumnValueByOneAndGetValue: unknown column "${String(
|
|
2932
|
+
data.columnName,
|
|
2933
|
+
)}" on "${metadata.tableName}"`,
|
|
2934
|
+
);
|
|
2935
|
+
}
|
|
2936
|
+
|
|
2937
|
+
const primaryColumnName: string =
|
|
2938
|
+
metadata.primaryColumns[0]?.databaseName || "_id";
|
|
2939
|
+
|
|
2940
|
+
const quoted: string = `"${column.databaseName}"`;
|
|
2941
|
+
|
|
2942
|
+
const sql: string = `UPDATE "${metadata.tableName}" SET ${quoted} = COALESCE(${quoted}, 0) + 1 WHERE "${primaryColumnName}" = $1 RETURNING ${quoted}`;
|
|
2943
|
+
|
|
2944
|
+
const result: unknown = await repository.manager.query(sql, [
|
|
2945
|
+
data.id.toString(),
|
|
2946
|
+
]);
|
|
2947
|
+
|
|
2948
|
+
/*
|
|
2949
|
+
* TypeORM's Postgres driver returns `[rows, affectedCount]` for an UPDATE
|
|
2950
|
+
* and a bare row array for everything else, so both shapes are unwrapped
|
|
2951
|
+
* rather than one being assumed.
|
|
2952
|
+
*/
|
|
2953
|
+
const rows: Array<unknown> = Array.isArray(result)
|
|
2954
|
+
? Array.isArray(result[0])
|
|
2955
|
+
? (result[0] as Array<unknown>)
|
|
2956
|
+
: (result as Array<unknown>)
|
|
2957
|
+
: [];
|
|
2958
|
+
|
|
2959
|
+
const row: unknown = rows[0];
|
|
2960
|
+
|
|
2961
|
+
if (!row || typeof row !== "object" || Array.isArray(row)) {
|
|
2962
|
+
/*
|
|
2963
|
+
* Nothing came back, so the row does not exist — deleted underneath us,
|
|
2964
|
+
* or never there. Callers gate on the returned count, so this must be an
|
|
2965
|
+
* error and not a zero, which would read as a fresh allowance.
|
|
2966
|
+
*/
|
|
2967
|
+
throw new BadDataException(
|
|
2968
|
+
`Item with ID ${data.id.toString()} not found`,
|
|
2969
|
+
);
|
|
2970
|
+
}
|
|
2971
|
+
|
|
2972
|
+
const value: unknown = (row as Record<string, unknown>)[
|
|
2973
|
+
column.databaseName
|
|
2974
|
+
];
|
|
2975
|
+
|
|
2976
|
+
const parsed: number =
|
|
2977
|
+
typeof value === "number" ? value : parseInt(String(value), 10);
|
|
2978
|
+
|
|
2979
|
+
if (!Number.isFinite(parsed)) {
|
|
2980
|
+
throw new BadDataException(
|
|
2981
|
+
`atomicIncrementColumnValueByOneAndGetValue: "${String(
|
|
2982
|
+
data.columnName,
|
|
2983
|
+
)}" did not return a number`,
|
|
2984
|
+
);
|
|
2985
|
+
}
|
|
2986
|
+
|
|
2987
|
+
return parsed;
|
|
2988
|
+
}
|
|
2989
|
+
|
|
2878
2990
|
@CaptureSpan()
|
|
2879
2991
|
protected async atomicIncrementColumnValueByOne(data: {
|
|
2880
2992
|
id: ObjectID;
|
|
@@ -10,6 +10,10 @@ import AnalyticsTableName from "../../Types/AnalyticsDatabase/AnalyticsTableName
|
|
|
10
10
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
11
11
|
import { DbJSONResponse, Results } from "./AnalyticsDatabaseService";
|
|
12
12
|
import ServiceType from "../../Types/Telemetry/ServiceType";
|
|
13
|
+
import {
|
|
14
|
+
appendResourceScopeFilters,
|
|
15
|
+
ResourceEntityScope,
|
|
16
|
+
} from "../Utils/Telemetry/ResourceEntityFilter";
|
|
13
17
|
|
|
14
18
|
export interface HistogramBucket {
|
|
15
19
|
time: string;
|
|
@@ -27,6 +31,15 @@ export interface HistogramRequest {
|
|
|
27
31
|
bucketSizeInMinutes: number;
|
|
28
32
|
serviceIds?: Array<ObjectID> | undefined;
|
|
29
33
|
entityKeys?: Array<string> | undefined;
|
|
34
|
+
/*
|
|
35
|
+
* Resource-facet selections (Kubernetes cluster / host / docker host /
|
|
36
|
+
* podman host) already resolved to their entity keys. One scope per
|
|
37
|
+
* facet: the branches inside a scope OR (a row proves membership either
|
|
38
|
+
* by being primary-keyed on the resource or by carrying its entity key),
|
|
39
|
+
* and the scopes AND with each other so two facets intersect. See
|
|
40
|
+
* ResourceEntityFilter.
|
|
41
|
+
*/
|
|
42
|
+
resourceScopes?: Array<ResourceEntityScope> | undefined;
|
|
30
43
|
severityTexts?: Array<string> | undefined;
|
|
31
44
|
bodySearchText?: string | undefined;
|
|
32
45
|
traceIds?: Array<string> | undefined;
|
|
@@ -49,6 +62,15 @@ export interface FacetRequest {
|
|
|
49
62
|
limit?: number | undefined;
|
|
50
63
|
serviceIds?: Array<ObjectID> | undefined;
|
|
51
64
|
entityKeys?: Array<string> | undefined;
|
|
65
|
+
/*
|
|
66
|
+
* Resource-facet selections (Kubernetes cluster / host / docker host /
|
|
67
|
+
* podman host) already resolved to their entity keys. One scope per
|
|
68
|
+
* facet: the branches inside a scope OR (a row proves membership either
|
|
69
|
+
* by being primary-keyed on the resource or by carrying its entity key),
|
|
70
|
+
* and the scopes AND with each other so two facets intersect. See
|
|
71
|
+
* ResourceEntityFilter.
|
|
72
|
+
*/
|
|
73
|
+
resourceScopes?: Array<ResourceEntityScope> | undefined;
|
|
52
74
|
severityTexts?: Array<string> | undefined;
|
|
53
75
|
bodySearchText?: string | undefined;
|
|
54
76
|
traceIds?: Array<string> | undefined;
|
|
@@ -70,6 +92,15 @@ export interface AnalyticsRequest {
|
|
|
70
92
|
aggregation: AnalyticsAggregation;
|
|
71
93
|
aggregationField?: string | undefined;
|
|
72
94
|
serviceIds?: Array<ObjectID> | undefined;
|
|
95
|
+
/*
|
|
96
|
+
* Resource-facet selections (Kubernetes cluster / host / docker host /
|
|
97
|
+
* podman host) already resolved to their entity keys. One scope per
|
|
98
|
+
* facet: the branches inside a scope OR (a row proves membership either
|
|
99
|
+
* by being primary-keyed on the resource or by carrying its entity key),
|
|
100
|
+
* and the scopes AND with each other so two facets intersect. See
|
|
101
|
+
* ResourceEntityFilter.
|
|
102
|
+
*/
|
|
103
|
+
resourceScopes?: Array<ResourceEntityScope> | undefined;
|
|
73
104
|
severityTexts?: Array<string> | undefined;
|
|
74
105
|
bodySearchText?: string | undefined;
|
|
75
106
|
traceIds?: Array<string> | undefined;
|
|
@@ -251,6 +282,7 @@ export class LogAggregationService {
|
|
|
251
282
|
getQuerySettings({
|
|
252
283
|
maxExecutionTimeInSeconds: 45,
|
|
253
284
|
timeoutOverflowMode: "break",
|
|
285
|
+
boundScanMemory: true,
|
|
254
286
|
additionalSettings: { optimize_use_projections: 1 },
|
|
255
287
|
}),
|
|
256
288
|
);
|
|
@@ -361,6 +393,7 @@ export class LogAggregationService {
|
|
|
361
393
|
getQuerySettings({
|
|
362
394
|
maxExecutionTimeInSeconds: 45,
|
|
363
395
|
timeoutOverflowMode: "break",
|
|
396
|
+
boundScanMemory: true,
|
|
364
397
|
}),
|
|
365
398
|
);
|
|
366
399
|
|
|
@@ -603,6 +636,7 @@ export class LogAggregationService {
|
|
|
603
636
|
getQuerySettings({
|
|
604
637
|
maxExecutionTimeInSeconds: 45,
|
|
605
638
|
timeoutOverflowMode: "break",
|
|
639
|
+
boundScanMemory: true,
|
|
606
640
|
}),
|
|
607
641
|
);
|
|
608
642
|
|
|
@@ -683,6 +717,7 @@ export class LogAggregationService {
|
|
|
683
717
|
getQuerySettings({
|
|
684
718
|
maxExecutionTimeInSeconds: 45,
|
|
685
719
|
timeoutOverflowMode: "break",
|
|
720
|
+
boundScanMemory: true,
|
|
686
721
|
}),
|
|
687
722
|
);
|
|
688
723
|
|
|
@@ -752,6 +787,7 @@ export class LogAggregationService {
|
|
|
752
787
|
getQuerySettings({
|
|
753
788
|
maxExecutionTimeInSeconds: 45,
|
|
754
789
|
timeoutOverflowMode: "break",
|
|
790
|
+
boundScanMemory: true,
|
|
755
791
|
}),
|
|
756
792
|
);
|
|
757
793
|
|
|
@@ -764,6 +800,7 @@ export class LogAggregationService {
|
|
|
764
800
|
HistogramRequest,
|
|
765
801
|
| "serviceIds"
|
|
766
802
|
| "entityKeys"
|
|
803
|
+
| "resourceScopes"
|
|
767
804
|
| "severityTexts"
|
|
768
805
|
| "bodySearchText"
|
|
769
806
|
| "traceIds"
|
|
@@ -794,6 +831,8 @@ export class LogAggregationService {
|
|
|
794
831
|
);
|
|
795
832
|
}
|
|
796
833
|
|
|
834
|
+
appendResourceScopeFilters(statement, request.resourceScopes);
|
|
835
|
+
|
|
797
836
|
if (request.severityTexts && request.severityTexts.length > 0) {
|
|
798
837
|
statement.append(
|
|
799
838
|
SQL` AND severityText IN (${{
|
|
@@ -1,11 +1,32 @@
|
|
|
1
1
|
import ClickhouseDatabase from "../Infrastructure/ClickhouseDatabase";
|
|
2
2
|
import AnalyticsDatabaseService from "./AnalyticsDatabaseService";
|
|
3
3
|
import Log from "../../Models/AnalyticsModels/Log";
|
|
4
|
+
import FindBy from "../Types/AnalyticsDatabase/FindBy";
|
|
5
|
+
import { OnFind } from "../Types/AnalyticsDatabase/Hooks";
|
|
6
|
+
import ResourceEntityFilter from "../Utils/Telemetry/ResourceEntityFilter";
|
|
4
7
|
|
|
5
8
|
export class LogService extends AnalyticsDatabaseService<Log> {
|
|
6
9
|
public constructor(clickhouseDatabase?: ClickhouseDatabase | undefined) {
|
|
7
10
|
super({ modelType: Log, database: clickhouseDatabase });
|
|
8
11
|
}
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* Resolve the logs explorer's resource-facet selections (a Kubernetes
|
|
15
|
+
* cluster, a host, ...) before the query is compiled. They arrive as
|
|
16
|
+
* Postgres ids under `resourceFilters`; matching them needs the
|
|
17
|
+
* resource's entity key, which only Postgres can supply. See
|
|
18
|
+
* ResourceEntityFilter.
|
|
19
|
+
*/
|
|
20
|
+
protected override async onBeforeFind(
|
|
21
|
+
findBy: FindBy<Log>,
|
|
22
|
+
): Promise<OnFind<Log>> {
|
|
23
|
+
await ResourceEntityFilter.rewriteAnalyticsQuery({
|
|
24
|
+
query: findBy.query as unknown as Record<string, unknown>,
|
|
25
|
+
projectId: findBy.props?.tenantId,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
return { findBy, carryForward: null };
|
|
29
|
+
}
|
|
9
30
|
}
|
|
10
31
|
|
|
11
32
|
export default new LogService();
|
|
@@ -849,7 +849,16 @@ export class Service extends DatabaseService<Model> {
|
|
|
849
849
|
select: {
|
|
850
850
|
_id: true,
|
|
851
851
|
currentMonitorStatusId: true,
|
|
852
|
+
/*
|
|
853
|
+
* All four reachability inputs. isReachable is the one that decides
|
|
854
|
+
* up/down; the other three only size the "polling has stopped
|
|
855
|
+
* entirely" backstop. Selecting lastSeenAt alone silently drops the
|
|
856
|
+
* rollup back to the old freshness rule.
|
|
857
|
+
*/
|
|
858
|
+
isReachable: true,
|
|
859
|
+
lastPolledAt: true,
|
|
852
860
|
lastSeenAt: true,
|
|
861
|
+
pollingIntervalInMinutes: true,
|
|
853
862
|
},
|
|
854
863
|
limit: LIMIT_MAX,
|
|
855
864
|
skip: 0,
|
|
@@ -908,7 +917,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
908
917
|
monitorStatusPriority: statusId
|
|
909
918
|
? priorityByStatusId.get(statusId)
|
|
910
919
|
: undefined,
|
|
920
|
+
isReachable: device.isReachable,
|
|
921
|
+
lastPolledAt: device.lastPolledAt,
|
|
911
922
|
lastSeenAt: device.lastSeenAt,
|
|
923
|
+
pollingIntervalInMinutes: device.pollingIntervalInMinutes,
|
|
912
924
|
};
|
|
913
925
|
},
|
|
914
926
|
);
|