@oneuptime/common 12.0.6 → 12.0.7
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/AIInsight.ts +1 -1
- package/Models/DatabaseModels/DatabaseBaseModel/FileModel.ts +2 -3
- package/Models/DatabaseModels/DeletedProject.ts +595 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/Monitor.ts +111 -0
- package/Models/DatabaseModels/Project.ts +3 -3
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -1
- package/Server/API/FileAPI.ts +15 -2
- package/Server/API/MicrosoftTeamsAPI.ts +6 -1
- package/Server/API/ProjectAPI.ts +214 -0
- package/Server/API/StatusPageAPI.ts +39 -6
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.ts +50 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.ts +67 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Services/AIAgentService.ts +20 -0
- package/Server/Services/DashboardDomainService.ts +73 -28
- package/Server/Services/DatabaseService.ts +1 -0
- package/Server/Services/DeletedProjectService.ts +138 -0
- package/Server/Services/FileService.ts +61 -0
- package/Server/Services/IncidentEpisodePublicNoteService.ts +18 -0
- package/Server/Services/IncidentPublicNoteService.ts +18 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/MonitorService.ts +311 -0
- package/Server/Services/ProbeService.ts +20 -0
- package/Server/Services/ProjectService.ts +297 -1
- package/Server/Services/PushNotificationService.ts +71 -0
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +18 -0
- package/Server/Services/StatusPageAnnouncementService.ts +53 -0
- package/Server/Services/StatusPageDomainService.ts +73 -28
- package/Server/Services/TeamMemberService.ts +117 -12
- package/Server/Services/TelemetryIngestionKeyService.ts +1 -0
- package/Server/Services/UserWebhookService.ts +34 -109
- package/Server/Services/WorkspaceNotificationRuleService.ts +69 -0
- package/Server/Services/WorkspaceProjectAuthTokenService.ts +37 -1
- package/Server/Types/Database/DeleteById.ts +2 -0
- package/Server/Types/Database/DeleteOneBy.ts +6 -0
- package/Server/Types/Domain.ts +41 -0
- package/Server/Types/Workflow/Components/API/Delete.ts +2 -1
- package/Server/Types/Workflow/Components/API/Get.ts +2 -1
- package/Server/Types/Workflow/Components/API/Patch.ts +2 -1
- package/Server/Types/Workflow/Components/API/Post.ts +2 -1
- package/Server/Types/Workflow/Components/API/Put.ts +2 -1
- package/Server/Types/Workflow/Components/API/Utils.ts +41 -2
- package/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.ts +25 -19
- package/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.ts +6 -5
- package/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.ts +32 -14
- package/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.ts +31 -13
- package/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.ts +29 -20
- package/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.ts +28 -21
- package/Server/Types/Workflow/Components/BaseModel/LogComponentError.ts +89 -0
- package/Server/Types/Workflow/Components/BaseModel/ModelArguments.ts +208 -0
- package/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.ts +11 -0
- package/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.ts +41 -18
- package/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.ts +45 -19
- package/Server/Types/Workflow/Components/Discord/SendMessageToChannel.ts +16 -9
- package/Server/Types/Workflow/Components/IncomingWebhookUtils.ts +66 -0
- package/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.ts +15 -9
- package/Server/Types/Workflow/Components/Slack/SendMessageToChannel.ts +17 -0
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
- package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +171 -0
- package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +3 -3
- package/Server/Utils/AI/SRE/Insights/FixRouting.ts +3 -2
- package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +1 -1
- package/Server/Utils/AI/Toolbox/CodeWriteTools.ts +6 -6
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +43 -5
- package/Server/Utils/DataSource/EgressGuard.ts +176 -16
- package/Server/Utils/DataSource/HttpFetch.ts +6 -45
- package/Server/Utils/Execute.ts +8 -0
- package/Server/Utils/InlineImageAccessTokenSync.ts +23 -0
- package/Server/Utils/LLM/LLMService.ts +57 -12
- package/Server/Utils/Monitor/MonitorAlert.ts +40 -0
- package/Server/Utils/Monitor/MonitorDependencySuppression.ts +192 -0
- package/Server/Utils/Monitor/MonitorIncident.ts +40 -0
- package/Server/Utils/Monitor/MonitorResource.ts +36 -0
- package/Server/Utils/Response.ts +142 -6
- package/Server/Utils/SSRFProtection.ts +273 -60
- package/Server/Utils/StartServer.ts +8 -0
- package/Server/Utils/VM/VMRunner.ts +88 -1
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +555 -49
- package/Server/Utils/Workspace/Slack/Slack.ts +25 -2
- package/Server/Utils/Workspace/WorkspaceBase.ts +6 -0
- package/Tests/App/Dashboard/DangerZone.test.tsx +334 -0
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +539 -0
- package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +678 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +706 -0
- package/Tests/App/Dashboard/DashboardVariablesModal.test.tsx +508 -0
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +470 -0
- package/Tests/App/StatusPage/StatusPageDetailPagesNotFound.test.tsx +308 -0
- package/Tests/Models/DatabaseModels/DeletedProjectModel.test.ts +251 -0
- package/Tests/Models/DatabaseModels/SavedViewJSONColumnTuples.test.ts +115 -0
- package/Tests/Server/API/FileAPIAccessControl.test.ts +316 -0
- package/Tests/Server/API/ProjectAPI.test.ts +299 -1
- package/Tests/Server/API/ProjectAPIAdjustBalance.test.ts +459 -0
- package/Tests/Server/API/ProjectAPIAdjustBalanceBillingDisabled.test.ts +177 -0
- package/Tests/Server/Services/DatabaseServiceDeletionReason.test.ts +123 -0
- package/Tests/Server/Services/DeletedProjectService.test.ts +415 -0
- package/Tests/Server/Services/DeletedProjectServiceSelfHosted.test.ts +70 -0
- package/Tests/Server/Services/DomainSubdomainHooks.test.ts +94 -0
- package/Tests/Server/Services/FileIsPublicBooleanMigration.test.ts +244 -0
- package/Tests/Server/Services/FileServiceMimeType.test.ts +89 -0
- package/Tests/Server/Services/MonitorServiceDependencyValidation.test.ts +702 -0
- package/Tests/Server/Services/ProjectServiceAdjustBalance.test.ts +615 -0
- package/Tests/Server/Services/ProjectServiceDeleteAudit.test.ts +406 -0
- package/Tests/Server/Services/PublishTimeImageVisibility.test.ts +450 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +669 -0
- package/Tests/Server/Services/UserWebhookSSRF.test.ts +174 -0
- package/Tests/Server/Services/WebPushEndpointAllowlist.test.ts +133 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenRepoint.test.ts +618 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +26 -1
- package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +215 -0
- package/Tests/Server/Types/Workflow/Components/BaseModelDatabaseComponents.test.ts +742 -0
- package/Tests/Server/Types/Workflow/Components/ChatWebhookComponents.test.ts +256 -0
- package/Tests/Server/Types/Workflow/Components/ModelArguments.test.ts +371 -0
- package/Tests/Server/Utils/AI/CodeAgentCommandGuard.test.ts +204 -0
- package/Tests/Server/Utils/AI/CodeAgentWriteLimits.test.ts +213 -0
- package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +52 -5
- package/Tests/Server/Utils/AI/LLMServiceBaseUrl.test.ts +3 -0
- package/Tests/Server/Utils/AI/LLMServiceEgressGuard.test.ts +315 -0
- package/Tests/Server/Utils/AI/LLMServiceModelCompatibility.test.ts +3 -0
- package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +17 -5
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +14 -1
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +35 -0
- package/Tests/Server/Utils/AI/StubLLMEgressGuard.ts +25 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +62 -7
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +69 -0
- package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +330 -0
- package/Tests/Server/Utils/GitHubCreatePullRequestWithToken.test.ts +393 -0
- package/Tests/Server/Utils/InlineImageAccessTokenSync.test.ts +202 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppression.test.ts +811 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +604 -0
- package/Tests/Server/Utils/ResponseSendFileResponse.test.ts +192 -0
- package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +406 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +1169 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelsList.test.ts +2 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +1605 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTenantResolution.test.ts +1218 -0
- package/Tests/Types/AI/AIChatMessageStatus.test.ts +79 -0
- package/Tests/Types/AI/AIInsightStatus.test.ts +40 -0
- package/Tests/Types/API/HostnameAuthorityParsing.test.ts +157 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +27 -0
- package/Tests/Types/DataSource/DataSourceLimits.test.ts +71 -0
- package/Tests/Types/DataSource/DataSourceType.test.ts +181 -0
- package/Tests/Types/DomainSubdomainValidation.test.ts +90 -0
- package/Tests/Types/JSONFunctions.test.ts +252 -1
- package/Tests/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.test.ts +61 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.test.ts +62 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.test.ts +68 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpVersion.test.ts +51 -0
- package/Tests/UI/Components/404.test.tsx +1 -1
- package/Tests/UI/Components/Alert.test.tsx +1 -1
- package/Tests/UI/Components/Badge.test.tsx +1 -1
- package/Tests/UI/Components/BasicForm.test.tsx +39 -10
- package/Tests/UI/Components/Button.test.tsx +1 -1
- package/Tests/UI/Components/Card.test.tsx +1 -1
- package/Tests/UI/Components/Charts/AxisTickColor.test.tsx +1 -1
- package/Tests/UI/Components/ColorViewer.test.tsx +1 -1
- package/Tests/UI/Components/ComponentsModal.test.tsx +7 -1
- package/Tests/UI/Components/DictionaryOfStrings.test.tsx +1 -1
- package/Tests/UI/Components/Dropdown.test.tsx +1 -1
- package/Tests/UI/Components/FilePicker.test.tsx +1 -1
- package/Tests/UI/Components/HiddenText.test.tsx +1 -1
- package/Tests/UI/Components/Input.test.tsx +1 -1
- package/Tests/UI/Components/Loader.test.tsx +1 -1
- package/Tests/UI/Components/LogTimeRangePicker.test.tsx +1 -1
- package/Tests/UI/Components/MasterPage.test.tsx +1 -1
- package/Tests/UI/Components/ModalPortalDismissal.test.tsx +489 -0
- package/Tests/UI/Components/ModelDelete.test.tsx +214 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkSelectAll.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1 -1
- package/Tests/UI/Components/NavBar.test.tsx +1 -1
- package/Tests/UI/Components/OperatorSelectorKeyboard.test.tsx +1 -1
- package/Tests/UI/Components/Pagination.test.tsx +1 -1
- package/Tests/UI/Components/Pill.test.tsx +1 -1
- package/Tests/UI/Components/Probe.test.tsx +1 -1
- package/Tests/UI/Components/ProgressBar.test.tsx +1 -1
- package/Tests/UI/Components/RadioButtons.test.tsx +1 -1
- package/Tests/UI/Components/SideMenuItem.test.tsx +1 -1
- package/Tests/UI/Components/SideOver.test.tsx +500 -6
- package/Tests/UI/Components/Tabs.test.tsx +1 -1
- package/Tests/UI/Components/TelemetrySearchBar.test.tsx +1 -1
- package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +1 -1
- package/Tests/UI/Components/TextArea.test.tsx +1 -1
- package/Tests/UI/Components/Toast.test.tsx +1 -1
- package/Tests/UI/Components/Toggle.test.tsx +1 -1
- package/Tests/UI/Components/TopSection.test.tsx +1 -1
- package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +1 -1
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +1 -1
- package/Tests/UI/Rum/ReplayStage.test.tsx +1 -1
- package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +1 -1
- package/Tests/UI/Utils/LocalStorageArrayRoundTrip.test.ts +72 -0
- package/Tests/Utils/Dashboard/HtmlWidgetDocument.test.ts +19 -2
- package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +44 -0
- package/Tests/Utils/Dashboard/VariableInterpolation.test.ts +288 -5
- package/Tests/Utils/Dashboard/VariableUrlState.test.ts +42 -0
- package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +27 -0
- package/Tests/Utils/LegacySerializedArray.test.ts +139 -0
- package/Tests/Utils/Monitor/MonitorDependencyRule.test.ts +190 -0
- package/Tests/Utils/Realtime.test.ts +78 -0
- package/Tests/Utils/Telemetry/SavedViewFilters.test.ts +246 -0
- package/Tests/__mocks__/i18next-browser-languagedetector.js +21 -0
- package/Types/AI/FixPullRequestCiStatus.ts +1 -1
- package/Types/AI/FixVerificationStatus.ts +2 -2
- package/Types/API/Hostname.ts +92 -4
- package/Types/API/URL.ts +43 -25
- package/Types/Billing/BalanceAdjustmentType.ts +14 -0
- package/Types/Billing/ProjectBalanceType.ts +13 -0
- package/Types/Domain.ts +26 -0
- package/Types/File/MimeType.ts +11 -0
- package/Types/JSONFunctions.ts +15 -0
- package/Types/Telemetry/TelemetrySavedViewState.ts +9 -1
- package/Types/Workflow/Components/BaseModel.ts +92 -28
- package/Typings/Index.d.ts +12 -0
- package/UI/Components/GanttChart/ChartContainer.tsx +4 -3
- package/UI/Components/Modal/ConfirmModal.tsx +10 -5
- package/UI/Components/Modal/Modal.tsx +27 -47
- package/UI/Components/ModelDelete/ModelDelete.tsx +23 -6
- package/UI/Components/SideOver/SideOver.tsx +195 -68
- package/UI/Utils/PageScrollLock.ts +66 -0
- package/Utils/Dashboard/HtmlWidgetDocument.ts +4 -2
- package/Utils/Dashboard/VariableInterpolation.ts +19 -1
- package/Utils/LegacySerializedArray.ts +60 -0
- package/Utils/Monitor/MonitorDependencyRule.ts +88 -0
- package/Utils/Telemetry/SavedViewFilters.ts +88 -0
- package/build/dist/Models/DatabaseModels/AIInsight.js +1 -1
- package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js +2 -3
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DeletedProject.js +640 -0
- package/build/dist/Models/DatabaseModels/DeletedProject.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +106 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +3 -3
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/FileAPI.js +14 -2
- package/build/dist/Server/API/FileAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +6 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectAPI.js +157 -4
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +27 -3
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AIAgentService.js +17 -0
- package/build/dist/Server/Services/AIAgentService.js.map +1 -1
- package/build/dist/Server/Services/DashboardDomainService.js +55 -18
- package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +1 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DeletedProjectService.js +124 -0
- package/build/dist/Server/Services/DeletedProjectService.js.map +1 -0
- package/build/dist/Server/Services/FileService.js +52 -0
- package/build/dist/Server/Services/FileService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +10 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +10 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +232 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +17 -0
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +228 -6
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/PushNotificationService.js +56 -0
- package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +10 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageAnnouncementService.js +54 -0
- package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageDomainService.js +55 -18
- package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +97 -6
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +1 -0
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/UserWebhookService.js +31 -87
- package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +65 -0
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +23 -0
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
- package/build/dist/Server/Types/Domain.js +37 -0
- package/build/dist/Server/Types/Domain.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js +35 -2
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js +15 -11
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js +2 -3
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js +21 -10
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js +21 -10
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js +18 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js +18 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js +43 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js +116 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js +7 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js +24 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js +27 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js +14 -6
- package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js +42 -0
- package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js +15 -6
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js +10 -2
- package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +141 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js +6 -6
- package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +39 -5
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +94 -10
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +1 -19
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/Execute.js +2 -2
- package/build/dist/Server/Utils/Execute.js.map +1 -1
- package/build/dist/Server/Utils/InlineImageAccessTokenSync.js +13 -0
- package/build/dist/Server/Utils/InlineImageAccessTokenSync.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +43 -12
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +44 -24
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js +158 -0
- package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +50 -30
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +112 -5
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +219 -53
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +7 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +73 -1
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +445 -43
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +18 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
- package/build/dist/Types/AI/FixPullRequestCiStatus.js +1 -1
- package/build/dist/Types/AI/FixVerificationStatus.js +2 -2
- package/build/dist/Types/API/Hostname.js +73 -4
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/API/URL.js +42 -24
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/Billing/BalanceAdjustmentType.js +15 -0
- package/build/dist/Types/Billing/BalanceAdjustmentType.js.map +1 -0
- package/build/dist/Types/Billing/ProjectBalanceType.js +14 -0
- package/build/dist/Types/Billing/ProjectBalanceType.js.map +1 -0
- package/build/dist/Types/Domain.js +22 -0
- package/build/dist/Types/Domain.js.map +1 -1
- package/build/dist/Types/File/MimeType.js +11 -0
- package/build/dist/Types/File/MimeType.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +14 -0
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/Workflow/Components/BaseModel.js +83 -28
- package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
- package/build/dist/UI/Components/GanttChart/ChartContainer.js +4 -3
- package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js +3 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +24 -34
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js +11 -6
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +105 -30
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Utils/PageScrollLock.js +52 -0
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -0
- package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js +4 -2
- package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js.map +1 -1
- package/build/dist/Utils/Dashboard/VariableInterpolation.js +19 -1
- package/build/dist/Utils/Dashboard/VariableInterpolation.js.map +1 -1
- package/build/dist/Utils/LegacySerializedArray.js +51 -0
- package/build/dist/Utils/LegacySerializedArray.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorDependencyRule.js +47 -0
- package/build/dist/Utils/Monitor/MonitorDependencyRule.js.map +1 -0
- package/build/dist/Utils/Telemetry/SavedViewFilters.js +52 -0
- package/build/dist/Utils/Telemetry/SavedViewFilters.js.map +1 -0
- package/jest.config.json +3 -0
- package/package.json +1 -1
- package/tsconfig.json +3 -1
|
@@ -464,9 +464,307 @@ export class Service extends DatabaseService<Model> {
|
|
|
464
464
|
}
|
|
465
465
|
}
|
|
466
466
|
|
|
467
|
+
if (
|
|
468
|
+
updateBy.data.dependsOnMonitors !== undefined ||
|
|
469
|
+
updateBy.data.suppressAlertsWhenParentMonitorStatuses !== undefined
|
|
470
|
+
) {
|
|
471
|
+
/*
|
|
472
|
+
* The matched monitors' own ids (self/cycle checks) and projects
|
|
473
|
+
* (parent scoping) are needed; root/API updates do not always carry
|
|
474
|
+
* a tenantId. Validation itself is hoisted: the proposed lists are
|
|
475
|
+
* identical for every matched monitor, so existence/project checks
|
|
476
|
+
* run once per distinct project and the cycle walk runs once for
|
|
477
|
+
* all targets — not once per monitor (a bulk update could match
|
|
478
|
+
* thousands).
|
|
479
|
+
*/
|
|
480
|
+
const monitorsToValidate: Array<Model> = await this.findBy({
|
|
481
|
+
query: updateBy.query,
|
|
482
|
+
select: {
|
|
483
|
+
_id: true,
|
|
484
|
+
projectId: true,
|
|
485
|
+
},
|
|
486
|
+
limit: LIMIT_MAX,
|
|
487
|
+
skip: 0,
|
|
488
|
+
props: {
|
|
489
|
+
isRoot: true,
|
|
490
|
+
ignoreHooks: true,
|
|
491
|
+
},
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
await this.validateDependencyConfiguration({
|
|
495
|
+
targets: monitorsToValidate.map((monitor: Model) => {
|
|
496
|
+
return {
|
|
497
|
+
monitorId: monitor.id || null,
|
|
498
|
+
projectId: updateBy.props.tenantId || monitor.projectId || null,
|
|
499
|
+
};
|
|
500
|
+
}),
|
|
501
|
+
proposedParents: updateBy.data.dependsOnMonitors,
|
|
502
|
+
proposedSuppressionStatuses:
|
|
503
|
+
updateBy.data.suppressAlertsWhenParentMonitorStatuses,
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
|
|
467
507
|
return { updateBy, carryForward: null };
|
|
468
508
|
}
|
|
469
509
|
|
|
510
|
+
/*
|
|
511
|
+
* Guards for the alert-dependency configuration. `undefined` means "not
|
|
512
|
+
* part of this write" and validates nothing; null or an empty array
|
|
513
|
+
* (clearing the config) is always valid. The proposed lists arrive in
|
|
514
|
+
* whatever shape the API produced — relation objects, ObjectIDs, or
|
|
515
|
+
* bare uuid strings (which DatabaseService.sanitizeCreateOrUpdate only
|
|
516
|
+
* converts to entities AFTER this hook has run) — so extraction goes
|
|
517
|
+
* through resolveReferenceId, and every id comparison is normalized to
|
|
518
|
+
* lower case because Postgres matches uuids case-insensitively while
|
|
519
|
+
* ObjectID preserves the caller's casing.
|
|
520
|
+
*/
|
|
521
|
+
public async validateDependencyConfiguration(input: {
|
|
522
|
+
/**
|
|
523
|
+
* The monitors this write applies to. monitorId is null on create —
|
|
524
|
+
* a new monitor cannot be part of a cycle yet.
|
|
525
|
+
*/
|
|
526
|
+
targets: Array<{
|
|
527
|
+
monitorId: ObjectID | null;
|
|
528
|
+
projectId: ObjectID | null;
|
|
529
|
+
}>;
|
|
530
|
+
proposedParents: unknown;
|
|
531
|
+
proposedSuppressionStatuses: unknown;
|
|
532
|
+
}): Promise<void> {
|
|
533
|
+
const distinctProjectIds: Array<ObjectID> = [];
|
|
534
|
+
const seenProjectIds: Set<string> = new Set<string>();
|
|
535
|
+
|
|
536
|
+
for (const target of input.targets) {
|
|
537
|
+
const key: string | undefined = target.projectId
|
|
538
|
+
?.toString()
|
|
539
|
+
.trim()
|
|
540
|
+
.toLowerCase();
|
|
541
|
+
|
|
542
|
+
if (key && !seenProjectIds.has(key)) {
|
|
543
|
+
seenProjectIds.add(key);
|
|
544
|
+
distinctProjectIds.push(target.projectId!);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
if (input.proposedParents !== undefined) {
|
|
549
|
+
const parentIds: Array<ObjectID> = this.extractRelationIds(
|
|
550
|
+
input.proposedParents,
|
|
551
|
+
);
|
|
552
|
+
|
|
553
|
+
if (parentIds.length > 0) {
|
|
554
|
+
const parentIdSet: Set<string> = new Set<string>(
|
|
555
|
+
parentIds.map((id: ObjectID) => {
|
|
556
|
+
return id.toString();
|
|
557
|
+
}),
|
|
558
|
+
);
|
|
559
|
+
|
|
560
|
+
for (const target of input.targets) {
|
|
561
|
+
const targetKey: string | undefined = target.monitorId
|
|
562
|
+
?.toString()
|
|
563
|
+
.trim()
|
|
564
|
+
.toLowerCase();
|
|
565
|
+
|
|
566
|
+
if (targetKey && parentIdSet.has(targetKey)) {
|
|
567
|
+
throw new BadDataException("A monitor cannot depend on itself.");
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
/*
|
|
572
|
+
* Existence + same-project via the house validator (which owns
|
|
573
|
+
* the case normalization and message wording). Once per distinct
|
|
574
|
+
* project: parents must belong to every matched monitor's
|
|
575
|
+
* project, so a cross-project bulk update correctly fails.
|
|
576
|
+
*/
|
|
577
|
+
for (const projectId of distinctProjectIds) {
|
|
578
|
+
await ProjectScopedReferenceValidator.validateReferencesBelongToProject(
|
|
579
|
+
{
|
|
580
|
+
projectId: projectId,
|
|
581
|
+
subject: "monitor",
|
|
582
|
+
references: parentIds.map((parentId: ObjectID) => {
|
|
583
|
+
return {
|
|
584
|
+
modelName: "Monitor",
|
|
585
|
+
id: parentId,
|
|
586
|
+
service: this,
|
|
587
|
+
};
|
|
588
|
+
}),
|
|
589
|
+
},
|
|
590
|
+
);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
const targetMonitorIds: Array<ObjectID> = input.targets
|
|
594
|
+
.map((target: { monitorId: ObjectID | null }) => {
|
|
595
|
+
return target.monitorId;
|
|
596
|
+
})
|
|
597
|
+
.filter((monitorId: ObjectID | null): monitorId is ObjectID => {
|
|
598
|
+
return Boolean(monitorId);
|
|
599
|
+
});
|
|
600
|
+
|
|
601
|
+
if (targetMonitorIds.length > 0) {
|
|
602
|
+
await this.throwIfDependencyCycle({
|
|
603
|
+
targetMonitorIds,
|
|
604
|
+
proposedParentIds: parentIds,
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
if (input.proposedSuppressionStatuses !== undefined) {
|
|
611
|
+
const statusIds: Array<ObjectID> = this.extractRelationIds(
|
|
612
|
+
input.proposedSuppressionStatuses,
|
|
613
|
+
);
|
|
614
|
+
|
|
615
|
+
if (statusIds.length > 0) {
|
|
616
|
+
for (const projectId of distinctProjectIds) {
|
|
617
|
+
await ProjectScopedReferenceValidator.validateReferencesBelongToProject(
|
|
618
|
+
{
|
|
619
|
+
projectId: projectId,
|
|
620
|
+
subject: "monitor",
|
|
621
|
+
references: statusIds.map((statusId: ObjectID) => {
|
|
622
|
+
return {
|
|
623
|
+
modelName: "Monitor Status",
|
|
624
|
+
id: statusId,
|
|
625
|
+
service: MonitorStatusService,
|
|
626
|
+
};
|
|
627
|
+
}),
|
|
628
|
+
},
|
|
629
|
+
);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/*
|
|
636
|
+
* Walk the dependency graph upward from the proposed parents; reaching
|
|
637
|
+
* any monitor being updated means the write would close a cycle, which
|
|
638
|
+
* would make suppression self-referential (A suppressed because of B,
|
|
639
|
+
* B suppressed because of A) and must be rejected. One BFS covers every
|
|
640
|
+
* target of a bulk update. The visited set bounds the walk even if a
|
|
641
|
+
* cycle already exists among ancestors, and the depth cap keeps the
|
|
642
|
+
* check cheap on degenerate graphs.
|
|
643
|
+
*
|
|
644
|
+
* This validates committed state, so two updates racing each other can
|
|
645
|
+
* still jointly commit a cycle this walk could not see; the runtime
|
|
646
|
+
* mutual-cycle guard in MonitorDependencySuppression fails open (pages
|
|
647
|
+
* instead of suppressing) if that ever happens.
|
|
648
|
+
*/
|
|
649
|
+
private async throwIfDependencyCycle(input: {
|
|
650
|
+
targetMonitorIds: Array<ObjectID>;
|
|
651
|
+
proposedParentIds: Array<ObjectID>;
|
|
652
|
+
}): Promise<void> {
|
|
653
|
+
const maxDepth: number = 32;
|
|
654
|
+
|
|
655
|
+
const targetIdSet: Set<string> = new Set<string>(
|
|
656
|
+
input.targetMonitorIds.map((monitorId: ObjectID) => {
|
|
657
|
+
return monitorId.toString().trim().toLowerCase();
|
|
658
|
+
}),
|
|
659
|
+
);
|
|
660
|
+
|
|
661
|
+
const visited: Set<string> = new Set<string>();
|
|
662
|
+
let frontier: Array<ObjectID> = [...input.proposedParentIds];
|
|
663
|
+
|
|
664
|
+
for (let depth: number = 0; depth < maxDepth; depth++) {
|
|
665
|
+
if (frontier.length === 0) {
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
if (
|
|
670
|
+
frontier.some((id: ObjectID) => {
|
|
671
|
+
return targetIdSet.has(id.toString().trim().toLowerCase());
|
|
672
|
+
})
|
|
673
|
+
) {
|
|
674
|
+
throw new BadDataException(
|
|
675
|
+
"This dependency would create a cycle: one of the selected monitors (or a monitor it depends on) already depends on this monitor.",
|
|
676
|
+
);
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
for (const id of frontier) {
|
|
680
|
+
visited.add(id.toString().trim().toLowerCase());
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
const rows: Array<Model> = await this.findBy({
|
|
684
|
+
query: {
|
|
685
|
+
_id: QueryHelper.any(frontier),
|
|
686
|
+
},
|
|
687
|
+
select: {
|
|
688
|
+
_id: true,
|
|
689
|
+
dependsOnMonitors: {
|
|
690
|
+
_id: true,
|
|
691
|
+
},
|
|
692
|
+
},
|
|
693
|
+
limit: LIMIT_PER_PROJECT,
|
|
694
|
+
skip: 0,
|
|
695
|
+
props: {
|
|
696
|
+
isRoot: true,
|
|
697
|
+
},
|
|
698
|
+
});
|
|
699
|
+
|
|
700
|
+
/*
|
|
701
|
+
* Fail CLOSED on truncation: a frontier level wider than the query
|
|
702
|
+
* limit means ancestors were dropped and a real cycle routed
|
|
703
|
+
* through the remainder would be admitted. Refuse instead — the
|
|
704
|
+
* sibling existence check fails closed the same way.
|
|
705
|
+
*/
|
|
706
|
+
if (rows.length >= LIMIT_PER_PROJECT) {
|
|
707
|
+
throw new BadDataException(
|
|
708
|
+
"This dependency graph is too large to verify for cycles. Please reduce the number of monitors sharing one dependency level.",
|
|
709
|
+
);
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
const next: Array<ObjectID> = [];
|
|
713
|
+
|
|
714
|
+
for (const row of rows) {
|
|
715
|
+
for (const grandParentId of this.extractRelationIds(
|
|
716
|
+
row.dependsOnMonitors || [],
|
|
717
|
+
)) {
|
|
718
|
+
if (!visited.has(grandParentId.toString())) {
|
|
719
|
+
next.push(grandParentId);
|
|
720
|
+
visited.add(grandParentId.toString());
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
frontier = next;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
if (frontier.length > 0) {
|
|
729
|
+
throw new BadDataException(
|
|
730
|
+
`Monitor dependency chains deeper than ${maxDepth} levels are not supported.`,
|
|
731
|
+
);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
/*
|
|
736
|
+
* Ids arrive as relation objects ({_id}), ObjectIDs, or bare uuid
|
|
737
|
+
* strings depending on which API path produced the payload —
|
|
738
|
+
* resolveReferenceId handles all three (reading only ._id/.id here
|
|
739
|
+
* silently missed the bare-string shape, which DatabaseService
|
|
740
|
+
* persists). Returned ids are normalized to lower case so every
|
|
741
|
+
* comparison downstream matches the way Postgres matches uuids. null /
|
|
742
|
+
* non-array input (explicit null is TypeORM's clear-all for relation
|
|
743
|
+
* columns) yields an empty list: nothing to validate.
|
|
744
|
+
*/
|
|
745
|
+
private extractRelationIds(relationArray: unknown): Array<ObjectID> {
|
|
746
|
+
if (!Array.isArray(relationArray)) {
|
|
747
|
+
return [];
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
const ids: Array<ObjectID> = [];
|
|
751
|
+
const seen: Set<string> = new Set<string>();
|
|
752
|
+
|
|
753
|
+
for (const item of relationArray) {
|
|
754
|
+
const rawId: string | undefined = resolveReferenceId(item)
|
|
755
|
+
?.toString()
|
|
756
|
+
.trim()
|
|
757
|
+
.toLowerCase();
|
|
758
|
+
|
|
759
|
+
if (rawId && !seen.has(rawId)) {
|
|
760
|
+
seen.add(rawId);
|
|
761
|
+
ids.push(new ObjectID(rawId));
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
return ids;
|
|
766
|
+
}
|
|
767
|
+
|
|
470
768
|
private async getProjectIdsForUpdateQuery(
|
|
471
769
|
updateBy: UpdateBy<Model>,
|
|
472
770
|
): Promise<Array<ObjectID>> {
|
|
@@ -781,6 +1079,19 @@ export class Service extends DatabaseService<Model> {
|
|
|
781
1079
|
projectId: createBy.props.tenantId,
|
|
782
1080
|
});
|
|
783
1081
|
|
|
1082
|
+
await this.validateDependencyConfiguration({
|
|
1083
|
+
// A new monitor cannot be part of a cycle yet, hence monitorId null.
|
|
1084
|
+
targets: [
|
|
1085
|
+
{
|
|
1086
|
+
monitorId: null,
|
|
1087
|
+
projectId: createBy.props.tenantId,
|
|
1088
|
+
},
|
|
1089
|
+
],
|
|
1090
|
+
proposedParents: createBy.data.dependsOnMonitors,
|
|
1091
|
+
proposedSuppressionStatuses:
|
|
1092
|
+
createBy.data.suppressAlertsWhenParentMonitorStatuses,
|
|
1093
|
+
});
|
|
1094
|
+
|
|
784
1095
|
/*
|
|
785
1096
|
* A new monitor starts in the project's operational status. A project can
|
|
786
1097
|
* hold MORE than one operational state (a user - or an E2E fixture - can
|
|
@@ -29,6 +29,7 @@ import DatabaseConfig from "../DatabaseConfig";
|
|
|
29
29
|
import URL from "../../Types/API/URL";
|
|
30
30
|
import UpdateBy from "../Types/Database/UpdateBy";
|
|
31
31
|
import MonitorService from "./MonitorService";
|
|
32
|
+
import FileService from "./FileService";
|
|
32
33
|
import PushNotificationMessage from "../../Types/PushNotification/PushNotificationMessage";
|
|
33
34
|
import PushNotificationUtil from "../Utils/PushNotificationUtil";
|
|
34
35
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
@@ -435,6 +436,21 @@ export class Service extends DatabaseService<Model> {
|
|
|
435
436
|
return { createBy: createBy, carryForward: [] };
|
|
436
437
|
}
|
|
437
438
|
|
|
439
|
+
/*
|
|
440
|
+
* A probe icon is rendered by the id-based image route, which serves
|
|
441
|
+
* only public files. The file picker uploads it private, so attaching
|
|
442
|
+
* it to a probe is the point at which it becomes public.
|
|
443
|
+
*/
|
|
444
|
+
@CaptureSpan()
|
|
445
|
+
protected override async onCreateSuccess(
|
|
446
|
+
_onCreate: OnCreate<Model>,
|
|
447
|
+
createdItem: Model,
|
|
448
|
+
): Promise<Model> {
|
|
449
|
+
await FileService.makeFilePublic(createdItem.iconFileId);
|
|
450
|
+
|
|
451
|
+
return createdItem;
|
|
452
|
+
}
|
|
453
|
+
|
|
438
454
|
/*
|
|
439
455
|
* Only global probes and probes belonging to this project may be attached to
|
|
440
456
|
* that project's monitors. Probe ids reach the server from the browser - the
|
|
@@ -626,6 +642,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
626
642
|
await this.invalidateProbeAuthCache(updatedItemIds);
|
|
627
643
|
}
|
|
628
644
|
|
|
645
|
+
await FileService.makeFilePublic(
|
|
646
|
+
onUpdate.updateBy.data.iconFileId as ObjectID | undefined,
|
|
647
|
+
);
|
|
648
|
+
|
|
629
649
|
if (
|
|
630
650
|
onUpdate.carryForward &&
|
|
631
651
|
onUpdate.carryForward.probesToNotifyOwners.length > 0
|