@oneuptime/common 11.7.2 → 11.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/AnalyticsModels/KubernetesCostAllocation.ts +103 -0
- package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/AlertStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
- package/Models/DatabaseModels/Index.ts +5 -0
- package/Models/DatabaseModels/LogDropFilter.ts +89 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +13 -3
- package/Models/DatabaseModels/RecommendationDismissal.ts +463 -0
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
- package/Models/DatabaseModels/StatusPageGroup.ts +95 -0
- package/Models/DatabaseModels/TableView.ts +40 -0
- package/Models/DatabaseModels/TraceDropFilter.ts +89 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +5 -1
- package/Server/API/AlertAPI.ts +32 -17
- package/Server/API/BaseAPI.ts +31 -2
- package/Server/API/BaseAnalyticsAPI.ts +36 -2
- package/Server/API/CommonAPI.ts +57 -0
- package/Server/API/IncidentAPI.ts +60 -33
- package/Server/API/IncidentEpisodeAPI.ts +31 -16
- package/Server/API/MonitorAPI.ts +30 -0
- package/Server/API/MonitorTemplateAPI.ts +8 -0
- package/Server/API/ProbeAPI.ts +196 -15
- package/Server/API/ProjectAPI.ts +79 -1
- package/Server/API/ScheduledMaintenanceAPI.ts +33 -18
- package/Server/API/StatusPageAPI.ts +74 -37
- package/Server/API/WorkspaceNotificationRuleAPI.ts +34 -4
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.ts +13 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.ts +527 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.ts +53 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Services/AlertEpisodeService.ts +47 -0
- package/Server/Services/AlertService.ts +125 -0
- package/Server/Services/BillingService.ts +98 -0
- package/Server/Services/DatabaseService.ts +184 -20
- package/Server/Services/IncidentEpisodeService.ts +47 -0
- package/Server/Services/IncidentService.ts +123 -0
- package/Server/Services/IncidentTemplateService.ts +123 -1
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/LogDropFilterService.ts +133 -0
- package/Server/Services/MonitorProbeService.ts +94 -4
- package/Server/Services/MonitorService.ts +48 -43
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +70 -0
- package/Server/Services/ProbeService.ts +66 -0
- package/Server/Services/ProjectService.ts +131 -7
- package/Server/Services/RecommendationDismissalService.ts +52 -0
- package/Server/Services/RunbookAgentJobService.ts +68 -7
- package/Server/Services/ScheduledMaintenanceService.ts +103 -0
- package/Server/Services/ScheduledMaintenanceTemplateService.ts +90 -0
- package/Server/Services/StatusPageGroupService.ts +186 -0
- package/Server/Services/TraceDropFilterService.ts +133 -0
- package/Server/Types/Workflow/Components/API/Delete.ts +12 -0
- package/Server/Types/Workflow/Components/API/Get.ts +12 -0
- package/Server/Types/Workflow/Components/API/Patch.ts +12 -0
- package/Server/Types/Workflow/Components/API/Post.ts +12 -0
- package/Server/Types/Workflow/Components/API/Put.ts +13 -0
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +212 -0
- package/Server/Utils/DropFilterValidation.ts +127 -0
- package/Server/Utils/Errors.ts +5 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +31 -2
- package/Server/Utils/Telemetry/AppMetrics.ts +31 -0
- package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +16 -0
- package/Tests/Models/DatabaseModels/MonitorProbeColumnAccessControl.test.ts +196 -0
- package/Tests/Models/RecommendationDismissalModel.test.ts +269 -0
- package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +320 -0
- package/Tests/Server/API/BaseAnalyticsAPIUpdatePayloadValidation.test.ts +293 -0
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +164 -0
- package/Tests/Server/API/ProbeAPI.test.ts +422 -53
- package/Tests/Server/API/ProjectAPI.test.ts +180 -0
- package/Tests/Server/API/ProjectAPIExtendTrialBillingDisabled.test.ts +138 -0
- package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +458 -0
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +359 -0
- package/Tests/Server/Infrastructure/ProcessSignalDelivery.test.ts +427 -0
- package/Tests/Server/Services/BillingServiceExtendTrial.test.ts +439 -0
- package/Tests/Server/Services/CrossProjectReferenceWriteGuard.test.ts +810 -0
- package/Tests/Server/Services/DatabaseServiceAtomicAddToColumns.test.ts +269 -0
- package/Tests/Server/Services/DatabaseServiceEmptyUpdate.test.ts +277 -0
- package/Tests/Server/Services/DatabaseServiceSortColumnSelect.test.ts +201 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +81 -23
- package/Tests/Server/Services/DropFilterSaveValidation.test.ts +398 -0
- package/Tests/Server/Services/MonitorProbeDeleteHooks.test.ts +280 -0
- package/Tests/Server/Services/MonitorProbeServiceProbeTenancy.test.ts +304 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +262 -0
- package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +614 -0
- package/Tests/Server/Services/RecommendationDismissalService.test.ts +306 -0
- package/Tests/Server/Services/RepairCrossProjectIncidentReferencesMigration.test.ts +528 -0
- package/Tests/Server/Services/StatusPageGroupNesting.test.ts +395 -0
- package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +26 -21
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +227 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +285 -0
- package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +463 -0
- package/Tests/Server/Utils/DropFilterValidation.test.ts +269 -0
- package/Tests/Server/Utils/Telemetry/SpanUtil.test.ts +94 -0
- package/Tests/Types/DateUserTimezone.test.ts +52 -0
- package/Tests/Types/JSONFunctions.test.ts +103 -1
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +177 -9
- package/Tests/Types/Monitor/MonitorStepDnsMonitor.test.ts +105 -0
- package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +131 -0
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +60 -0
- package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +82 -0
- package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +268 -0
- package/Tests/Types/Monitor/MonitorStepMetricMonitor.test.ts +386 -0
- package/Tests/Types/Monitor/MonitorStepProfileMonitor.test.ts +185 -0
- package/Tests/Types/Monitor/MonitorStepSnmpMonitor.test.ts +156 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +371 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +901 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +607 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +754 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +960 -0
- package/Tests/Types/RollingTime/RollingTimeUtil.test.ts +186 -0
- package/Tests/Types/Runbook/RunbookStepTimeout.test.ts +410 -0
- package/Tests/Types/Telemetry/DropFilterSampling.test.ts +241 -0
- package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +353 -0
- package/Tests/Types/Workspace/NotificationRuleUtil.test.ts +566 -0
- package/Tests/UI/Components/CodeEditor.test.tsx +174 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +555 -24
- package/Tests/UI/Components/InfoCard.test.tsx +358 -0
- package/Tests/UI/Components/LogTimeRangePicker.test.tsx +138 -0
- package/Tests/UI/Components/Modal.test.tsx +43 -5
- package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +679 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +397 -0
- package/Tests/UI/Components/ModelTable/ColumnCustomizationModal.test.tsx +999 -0
- package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +1678 -0
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1094 -0
- package/Tests/UI/Components/Runbook/StepTimeoutInput.test.tsx +386 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +671 -0
- package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +404 -0
- package/Tests/UI/Utils/DropdownAlignment.test.ts +306 -0
- package/Tests/UI/Utils/TableFilterUrlState.test.ts +292 -0
- package/Tests/Utils/Monitor/MonitorSummaryProbeUtil.test.ts +263 -0
- package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +583 -0
- package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +1072 -0
- package/Tests/Utils/StatusPage/GroupTree.test.ts +583 -0
- package/Tests/Utils/StatusPage/ResourceUptime.test.ts +411 -0
- package/Tests/Utils/UserPreferences.test.ts +563 -0
- package/Types/Date.ts +15 -6
- package/Types/JSONFunctions.ts +7 -2
- package/Types/Kubernetes/KubernetesCostIngest.ts +37 -1
- package/Types/Monitor/KubernetesAlertTemplates.ts +205 -0
- package/Types/Monitor/MonitorStep.ts +10 -1
- package/Types/Monitor/MonitorStepMetricMonitor.ts +46 -1
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +413 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +168 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +175 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +743 -0
- package/Types/Permission.ts +45 -0
- package/Types/Recommendation/RecommendationType.ts +20 -0
- package/Types/Runbook/RunbookExecutionDeadline.ts +129 -0
- package/Types/Runbook/RunbookStepTimeout.ts +202 -0
- package/Types/Telemetry/DropFilterSampling.ts +92 -0
- package/UI/Components/AI/GenerateFromAIModal.tsx +0 -2
- package/UI/Components/Accordion/Accordion.tsx +10 -2
- package/UI/Components/BulkUpdate/BulkLabelActions.tsx +0 -1
- package/UI/Components/CodeEditor/CodeEditor.tsx +34 -20
- package/UI/Components/Date/RangeStartAndEndDateView.tsx +0 -1
- package/UI/Components/EditionLabel/EditionLabel.tsx +1 -27
- package/UI/Components/Error/PageError.tsx +0 -4
- package/UI/Components/ErrorBoundary.tsx +252 -15
- package/UI/Components/InfoCard/InfoCard.tsx +58 -1
- package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +34 -1
- package/UI/Components/MasterPage/MasterPage.tsx +65 -0
- package/UI/Components/Modal/Modal.tsx +16 -60
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +0 -8
- package/UI/Components/ModelTable/BaseModelTable.tsx +503 -71
- package/UI/Components/ModelTable/Column.ts +17 -0
- package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +523 -0
- package/UI/Components/ModelTable/ColumnPreference.ts +482 -0
- package/UI/Components/ModelTable/CustomFieldColumns.tsx +326 -0
- package/UI/Components/ModelTable/TableView.tsx +24 -2
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +150 -0
- package/UI/Components/Runbook/StepTimeoutInput.tsx +173 -0
- package/UI/Components/SideMenu/SideMenu.tsx +24 -4
- package/UI/Components/StatusPage/ResourceGroupSection.tsx +231 -0
- package/UI/Components/Table/Table.tsx +14 -1
- package/UI/Components/Table/TableRow.tsx +180 -175
- package/UI/Components/Table/Types/Column.ts +2 -0
- package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +34 -1
- package/UI/Utils/DropdownAlignment.ts +162 -0
- package/UI/Utils/TableFilterUrlState.ts +59 -20
- package/Utils/API.ts +106 -2
- package/Utils/Monitor/MonitorSummaryProbeUtil.ts +130 -0
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +434 -0
- package/Utils/StatusPage/GroupNestingLayout.ts +343 -0
- package/Utils/StatusPage/GroupTree.ts +307 -0
- package/Utils/StatusPage/ResourceUptime.ts +90 -17
- package/Utils/UserPreferences.ts +53 -0
- package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +86 -0
- package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogDropFilter.js +91 -0
- package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +14 -4
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RecommendationDismissal.js +484 -0
- package/build/dist/Models/DatabaseModels/RecommendationDismissal.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageGroup.js +94 -0
- package/build/dist/Models/DatabaseModels/StatusPageGroup.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TableView.js +40 -0
- package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js +91 -0
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +5 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +22 -13
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +22 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js +24 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +42 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +43 -26
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +21 -12
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorAPI.js +23 -0
- package/build/dist/Server/API/MonitorAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorTemplateAPI.js +4 -0
- package/build/dist/Server/API/MonitorTemplateAPI.js.map +1 -1
- package/build/dist/Server/API/ProbeAPI.js +131 -15
- package/build/dist/Server/API/ProbeAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectAPI.js +62 -3
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +23 -14
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +61 -33
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js +26 -2
- package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js +397 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.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/Services/AlertEpisodeService.js +39 -0
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +95 -0
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +71 -0
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +140 -17
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +39 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +100 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +97 -0
- package/build/dist/Server/Services/IncidentTemplateService.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/LogDropFilterService.js +93 -0
- package/build/dist/Server/Services/LogDropFilterService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +73 -5
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +34 -39
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +71 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +64 -0
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +103 -7
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RecommendationDismissalService.js +50 -0
- package/build/dist/Server/Services/RecommendationDismissalService.js.map +1 -0
- package/build/dist/Server/Services/RunbookAgentJobService.js +63 -5
- package/build/dist/Server/Services/RunbookAgentJobService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +83 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +65 -0
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageGroupService.js +136 -0
- package/build/dist/Server/Services/StatusPageGroupService.js.map +1 -1
- package/build/dist/Server/Services/TraceDropFilterService.js +93 -0
- package/build/dist/Server/Services/TraceDropFilterService.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js +12 -0
- package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +132 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/DropFilterValidation.js +80 -0
- package/build/dist/Server/Utils/DropFilterValidation.js.map +1 -0
- package/build/dist/Server/Utils/Errors.js +3 -0
- package/build/dist/Server/Utils/Errors.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -12
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +38 -18
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js +26 -0
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
- package/build/dist/Types/Date.js +14 -4
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +8 -3
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +192 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +6 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +32 -1
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +294 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +110 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +58 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +451 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -0
- package/build/dist/Types/Permission.js +40 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Recommendation/RecommendationType.js +21 -0
- package/build/dist/Types/Recommendation/RecommendationType.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookExecutionDeadline.js +93 -0
- package/build/dist/Types/Runbook/RunbookExecutionDeadline.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookStepTimeout.js +142 -0
- package/build/dist/Types/Runbook/RunbookStepTimeout.js.map +1 -0
- package/build/dist/Types/Telemetry/DropFilterSampling.js +75 -0
- package/build/dist/Types/Telemetry/DropFilterSampling.js.map +1 -0
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -2
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
- package/build/dist/UI/Components/Accordion/Accordion.js +9 -2
- package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +27 -14
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js +1 -1
- package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +2 -20
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Error/PageError.js +1 -3
- package/build/dist/UI/Components/Error/PageError.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +145 -11
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js +28 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +13 -2
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/MasterPage/MasterPage.js +50 -1
- package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +4 -32
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +308 -40
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +230 -0
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js +258 -0
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +168 -0
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/TableView.js +13 -2
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +84 -0
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -0
- package/build/dist/UI/Components/Runbook/StepTimeoutInput.js +101 -0
- package/build/dist/UI/Components/Runbook/StepTimeoutInput.js.map +1 -0
- package/build/dist/UI/Components/SideMenu/SideMenu.js +15 -5
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +73 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +15 -2
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +11 -6
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +13 -2
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Utils/DropdownAlignment.js +98 -0
- package/build/dist/UI/Utils/DropdownAlignment.js.map +1 -0
- package/build/dist/UI/Utils/TableFilterUrlState.js +48 -15
- package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
- package/build/dist/Utils/API.js +39 -2
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js +97 -0
- package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +330 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -0
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js +280 -0
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -0
- package/build/dist/Utils/StatusPage/GroupTree.js +214 -0
- package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js +60 -16
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/UserPreferences.js +33 -0
- package/build/dist/Utils/UserPreferences.js.map +1 -1
- package/package.json +1 -1
|
@@ -298,7 +298,11 @@ export default class WorkflowVariable extends BaseModel {
|
|
|
298
298
|
Permission.CreateWorkflowVariable,
|
|
299
299
|
],
|
|
300
300
|
read: [],
|
|
301
|
-
update: [
|
|
301
|
+
update: [
|
|
302
|
+
Permission.ProjectOwner,
|
|
303
|
+
Permission.ProjectAdmin,
|
|
304
|
+
Permission.EditWorkflowVariable,
|
|
305
|
+
],
|
|
302
306
|
})
|
|
303
307
|
@TableColumn({
|
|
304
308
|
required: true,
|
package/Server/API/AlertAPI.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import Alert from "../../Models/DatabaseModels/Alert";
|
|
2
2
|
import NotFoundException from "../../Types/Exception/NotFoundException";
|
|
3
3
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
4
|
+
import DatabaseCommonInteractionPropsUtil, {
|
|
5
|
+
PermissionType,
|
|
6
|
+
} from "../../Types/BaseDatabase/DatabaseCommonInteractionPropsUtil";
|
|
4
7
|
import ObjectID from "../../Types/ObjectID";
|
|
5
8
|
import AlertService, {
|
|
6
9
|
Service as AlertServiceType,
|
|
@@ -21,7 +24,7 @@ import AlertAIContextBuilder, {
|
|
|
21
24
|
AlertContextData,
|
|
22
25
|
} from "../Utils/AI/AlertAIContextBuilder";
|
|
23
26
|
import JSONFunctions from "../../Types/JSONFunctions";
|
|
24
|
-
import Permission from "../../Types/Permission";
|
|
27
|
+
import Permission, { UserPermission } from "../../Types/Permission";
|
|
25
28
|
|
|
26
29
|
export default class AlertAPI extends BaseAPI<Alert, AlertServiceType> {
|
|
27
30
|
public constructor() {
|
|
@@ -62,22 +65,34 @@ export default class AlertAPI extends BaseAPI<Alert, AlertServiceType> {
|
|
|
62
65
|
const props: DatabaseCommonInteractionProps =
|
|
63
66
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
64
67
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
68
|
+
CommonAPI.assertTenantScoped(props);
|
|
69
|
+
|
|
70
|
+
/*
|
|
71
|
+
* Read through getUserPermissions(Allow) rather than off
|
|
72
|
+
* userTenantAccessPermission directly. That dictionary is keyed by project
|
|
73
|
+
* id and its entries hold GRANTS AND DENIALS together, discriminated only
|
|
74
|
+
* by isBlockPermission, so the previous
|
|
75
|
+
* `userTenantAccessPermission["permissions"]` read was always undefined
|
|
76
|
+
* and denied every caller who was not a master admin. Mapping the array
|
|
77
|
+
* raw would swing the other way and count a team's explicit block
|
|
78
|
+
* entry for one of these permissions as a grant of it.
|
|
79
|
+
*/
|
|
80
|
+
const permissions: Array<Permission> =
|
|
81
|
+
DatabaseCommonInteractionPropsUtil.getUserPermissions(
|
|
82
|
+
props,
|
|
83
|
+
PermissionType.Allow,
|
|
84
|
+
).map((userPermission: UserPermission) => {
|
|
85
|
+
return userPermission.permission;
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
const hasPermission: boolean = permissions.some((p: Permission) => {
|
|
89
|
+
return (
|
|
90
|
+
p === Permission.ProjectOwner ||
|
|
91
|
+
p === Permission.ProjectAdmin ||
|
|
92
|
+
p === Permission.EditAlert ||
|
|
93
|
+
p === Permission.CreateAlertInternalNote
|
|
94
|
+
);
|
|
95
|
+
});
|
|
81
96
|
|
|
82
97
|
if (!hasPermission && !props.isMasterAdmin) {
|
|
83
98
|
throw new BadDataException(
|
package/Server/API/BaseAPI.ts
CHANGED
|
@@ -22,9 +22,10 @@ import {
|
|
|
22
22
|
LIMIT_PER_PROJECT,
|
|
23
23
|
} from "../../Types/Database/LimitMax";
|
|
24
24
|
import PartialEntity from "../../Types/Database/PartialEntity";
|
|
25
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
25
26
|
import BadRequestException from "../../Types/Exception/BadRequestException";
|
|
26
27
|
import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
|
|
27
|
-
import { JSONObject } from "../../Types/JSON";
|
|
28
|
+
import { JSONObject, JSONValue } from "../../Types/JSON";
|
|
28
29
|
import JSONFunctions from "../../Types/JSONFunctions";
|
|
29
30
|
import ObjectID from "../../Types/ObjectID";
|
|
30
31
|
import { UserPermission } from "../../Types/Permission";
|
|
@@ -398,15 +399,43 @@ export default class BaseAPI<
|
|
|
398
399
|
const objectId: ObjectID = new ObjectID(idParam);
|
|
399
400
|
const objectIdString: string = objectId.toString();
|
|
400
401
|
const body: JSONObject = req.body;
|
|
402
|
+
const dataInBody: JSONValue | undefined = body["data"];
|
|
403
|
+
|
|
404
|
+
/*
|
|
405
|
+
* The update payload has to be wrapped as { "data": { ...columns... } }.
|
|
406
|
+
* A flat body has no "data" key, and deserializing that undefined handed
|
|
407
|
+
* back an empty object: the update then matched the row, wrote no columns
|
|
408
|
+
* at all, and still answered 200. Callers were told the write succeeded
|
|
409
|
+
* while their fields were dropped on the floor.
|
|
410
|
+
*/
|
|
411
|
+
if (
|
|
412
|
+
!dataInBody ||
|
|
413
|
+
typeof dataInBody !== "object" ||
|
|
414
|
+
Array.isArray(dataInBody)
|
|
415
|
+
) {
|
|
416
|
+
throw new BadDataException(
|
|
417
|
+
'Invalid request body. The update payload should be an object of the form { "data": { ...fields to update... } }.',
|
|
418
|
+
);
|
|
419
|
+
}
|
|
401
420
|
|
|
402
421
|
const item: PartialEntity<TBaseModel> = JSONFunctions.deserialize(
|
|
403
|
-
|
|
422
|
+
dataInBody as JSONObject,
|
|
404
423
|
) as PartialEntity<TBaseModel>;
|
|
405
424
|
|
|
406
425
|
delete (item as any)["_id"];
|
|
407
426
|
delete (item as any)["createdAt"];
|
|
408
427
|
delete (item as any)["updatedAt"];
|
|
409
428
|
|
|
429
|
+
/*
|
|
430
|
+
* An update that carries no columns writes nothing. Saying 200 to that is
|
|
431
|
+
* the same lie in a different shape, so ask for at least one field.
|
|
432
|
+
*/
|
|
433
|
+
if (Object.keys(item).length === 0) {
|
|
434
|
+
throw new BadDataException(
|
|
435
|
+
'No fields to update. Please include at least one field to update in the "data" object of the request body.',
|
|
436
|
+
);
|
|
437
|
+
}
|
|
438
|
+
|
|
410
439
|
const numberOfDocsAffected: number = await this.service.updateOneById({
|
|
411
440
|
id: new ObjectID(objectIdString),
|
|
412
441
|
data: item,
|
|
@@ -21,8 +21,9 @@ import {
|
|
|
21
21
|
DEFAULT_LIMIT,
|
|
22
22
|
LIMIT_PER_PROJECT,
|
|
23
23
|
} from "../../Types/Database/LimitMax";
|
|
24
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
24
25
|
import BadRequestException from "../../Types/Exception/BadRequestException";
|
|
25
|
-
import { JSONObject } from "../../Types/JSON";
|
|
26
|
+
import { JSONObject, JSONValue } from "../../Types/JSON";
|
|
26
27
|
import JSONFunctions from "../../Types/JSONFunctions";
|
|
27
28
|
import ObjectID from "../../Types/ObjectID";
|
|
28
29
|
import { UserPermission } from "../../Types/Permission";
|
|
@@ -542,10 +543,43 @@ export default class BaseAnalyticsAPI<
|
|
|
542
543
|
const objectId: ObjectID = new ObjectID(req.params["id"] as string);
|
|
543
544
|
const objectIdString: string = objectId.toString();
|
|
544
545
|
const body: JSONObject = req.body;
|
|
546
|
+
const dataInBody: JSONValue | undefined = body["data"];
|
|
547
|
+
|
|
548
|
+
/*
|
|
549
|
+
* Same contract as BaseAPI.updateItem: the payload has to be wrapped as
|
|
550
|
+
* { "data": { ...columns... } }. Reject anything else here rather than
|
|
551
|
+
* letting an empty model reach the service.
|
|
552
|
+
*/
|
|
553
|
+
if (
|
|
554
|
+
!dataInBody ||
|
|
555
|
+
typeof dataInBody !== "object" ||
|
|
556
|
+
Array.isArray(dataInBody)
|
|
557
|
+
) {
|
|
558
|
+
throw new BadDataException(
|
|
559
|
+
'Invalid request body. The update payload should be an object of the form { "data": { ...fields to update... } }.',
|
|
560
|
+
);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/*
|
|
564
|
+
* Count the fields on the raw payload, not on the model: an analytics
|
|
565
|
+
* model instance always carries its own internal properties, so
|
|
566
|
+
* Object.keys() on it is never empty.
|
|
567
|
+
*/
|
|
568
|
+
const fieldsToUpdate: Array<string> = Object.keys(
|
|
569
|
+
dataInBody as JSONObject,
|
|
570
|
+
).filter((key: string) => {
|
|
571
|
+
return key !== "_id" && key !== "createdAt" && key !== "updatedAt";
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
if (fieldsToUpdate.length === 0) {
|
|
575
|
+
throw new BadDataException(
|
|
576
|
+
'No fields to update. Please include at least one field to update in the "data" object of the request body.',
|
|
577
|
+
);
|
|
578
|
+
}
|
|
545
579
|
|
|
546
580
|
const item: TAnalyticsDataModel =
|
|
547
581
|
AnalyticsDataModel.fromJSON<TAnalyticsDataModel>(
|
|
548
|
-
|
|
582
|
+
dataInBody as JSONObject,
|
|
549
583
|
this.entityType,
|
|
550
584
|
) as TAnalyticsDataModel;
|
|
551
585
|
|
package/Server/API/CommonAPI.ts
CHANGED
|
@@ -11,6 +11,37 @@ import BadDataException from "../../Types/Exception/BadDataException";
|
|
|
11
11
|
import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
|
|
12
12
|
|
|
13
13
|
export default class CommonAPI {
|
|
14
|
+
/*
|
|
15
|
+
* Custom (non-CRUD) endpoints whose path carries only a resource id give
|
|
16
|
+
* getUserMiddleware no way to learn the project except the `tenantid`
|
|
17
|
+
* header. ModelAPI attaches that header to every request it makes, but a
|
|
18
|
+
* custom route reached with a raw API.post/API.get gets none unless the call
|
|
19
|
+
* site adds ModelAPI.getCommonHeaders() itself. When a caller forgets it,
|
|
20
|
+
* the request still reaches the handler — just with no tenant permissions —
|
|
21
|
+
* and the eventual tenant-scoped read fails as "You do not have permissions
|
|
22
|
+
* to read <model>", which reads like a missing role when it is really a
|
|
23
|
+
* missing header. Assert the scope up front so the caller gets the real
|
|
24
|
+
* cause.
|
|
25
|
+
*
|
|
26
|
+
* This deliberately checks the tenant only, not the user: API-key callers
|
|
27
|
+
* are authenticated by ProjectMiddleware and carry tenant permissions
|
|
28
|
+
* without ever setting `userId`. Use assertAuthenticatedProjectMember when
|
|
29
|
+
* an endpoint must additionally be a logged-in human member.
|
|
30
|
+
*/
|
|
31
|
+
public static assertTenantScoped(
|
|
32
|
+
databaseProps: DatabaseCommonInteractionProps,
|
|
33
|
+
): ObjectID {
|
|
34
|
+
const projectId: ObjectID | undefined = databaseProps.tenantId;
|
|
35
|
+
|
|
36
|
+
if (!projectId) {
|
|
37
|
+
throw new BadDataException(
|
|
38
|
+
"Project ID is required. Please pass the project ID in the 'tenantid' header.",
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return projectId;
|
|
43
|
+
}
|
|
44
|
+
|
|
14
45
|
/*
|
|
15
46
|
* getUserMiddleware lets unauthenticated requests through as "public" and
|
|
16
47
|
* takes the tenant id from a caller-supplied header — custom endpoints
|
|
@@ -40,6 +71,32 @@ export default class CommonAPI {
|
|
|
40
71
|
return projectId;
|
|
41
72
|
}
|
|
42
73
|
|
|
74
|
+
/*
|
|
75
|
+
* assertAuthenticatedProjectMember only proves the caller belongs to the
|
|
76
|
+
* project it *claimed* in the `tenantid` header — it never looks at the
|
|
77
|
+
* resource the path names. A custom route that then reads or mutates that
|
|
78
|
+
* resource as root must also confirm the resource's own projectId is the
|
|
79
|
+
* project the caller was authorized for, otherwise a member of project A
|
|
80
|
+
* reaches project B's resource id just by sending their own header.
|
|
81
|
+
*
|
|
82
|
+
* A resource that does not exist (or carries no projectId) is rejected the
|
|
83
|
+
* same way, so the endpoint cannot be used to confirm which ids exist in
|
|
84
|
+
* other projects.
|
|
85
|
+
*/
|
|
86
|
+
public static assertResourceBelongsToProject(data: {
|
|
87
|
+
resourceProjectId: ObjectID | undefined | null;
|
|
88
|
+
projectId: ObjectID;
|
|
89
|
+
}): void {
|
|
90
|
+
if (
|
|
91
|
+
!data.resourceProjectId ||
|
|
92
|
+
data.resourceProjectId.toString() !== data.projectId.toString()
|
|
93
|
+
) {
|
|
94
|
+
throw new NotAuthorizedException(
|
|
95
|
+
"You are not authorized to access this project's data.",
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
43
100
|
@CaptureSpan()
|
|
44
101
|
public static async getDatabaseCommonInteractionProps(
|
|
45
102
|
req: ExpressRequest,
|
|
@@ -2,6 +2,9 @@ import Incident from "../../Models/DatabaseModels/Incident";
|
|
|
2
2
|
import File from "../../Models/DatabaseModels/File";
|
|
3
3
|
import NotFoundException from "../../Types/Exception/NotFoundException";
|
|
4
4
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
5
|
+
import DatabaseCommonInteractionPropsUtil, {
|
|
6
|
+
PermissionType,
|
|
7
|
+
} from "../../Types/BaseDatabase/DatabaseCommonInteractionPropsUtil";
|
|
5
8
|
import ObjectID from "../../Types/ObjectID";
|
|
6
9
|
import IncidentService, {
|
|
7
10
|
Service as IncidentServiceType,
|
|
@@ -22,7 +25,7 @@ import IncidentAIContextBuilder, {
|
|
|
22
25
|
IncidentContextData,
|
|
23
26
|
} from "../Utils/AI/IncidentAIContextBuilder";
|
|
24
27
|
import JSONFunctions from "../../Types/JSONFunctions";
|
|
25
|
-
import Permission from "../../Types/Permission";
|
|
28
|
+
import Permission, { UserPermission } from "../../Types/Permission";
|
|
26
29
|
|
|
27
30
|
export default class IncidentAPI extends BaseAPI<
|
|
28
31
|
Incident,
|
|
@@ -163,21 +166,33 @@ export default class IncidentAPI extends BaseAPI<
|
|
|
163
166
|
const props: DatabaseCommonInteractionProps =
|
|
164
167
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
165
168
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
169
|
+
CommonAPI.assertTenantScoped(props);
|
|
170
|
+
|
|
171
|
+
/*
|
|
172
|
+
* Read through getUserPermissions(Allow) rather than off
|
|
173
|
+
* userTenantAccessPermission directly. That dictionary is keyed by project
|
|
174
|
+
* id and its entries hold GRANTS AND DENIALS together, discriminated only
|
|
175
|
+
* by isBlockPermission, so the previous
|
|
176
|
+
* `userTenantAccessPermission["permissions"]` read was always undefined
|
|
177
|
+
* and denied every caller who was not a master admin. Mapping the array
|
|
178
|
+
* raw would swing the other way and count a team's explicit block
|
|
179
|
+
* entry for one of these permissions as a grant of it.
|
|
180
|
+
*/
|
|
181
|
+
const permissions: Array<Permission> =
|
|
182
|
+
DatabaseCommonInteractionPropsUtil.getUserPermissions(
|
|
183
|
+
props,
|
|
184
|
+
PermissionType.Allow,
|
|
185
|
+
).map((userPermission: UserPermission) => {
|
|
186
|
+
return userPermission.permission;
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
const hasPermission: boolean = permissions.some((p: Permission) => {
|
|
190
|
+
return (
|
|
191
|
+
p === Permission.ProjectOwner ||
|
|
192
|
+
p === Permission.ProjectAdmin ||
|
|
193
|
+
p === Permission.EditProjectIncident
|
|
194
|
+
);
|
|
195
|
+
});
|
|
181
196
|
|
|
182
197
|
if (!hasPermission && !props.isMasterAdmin) {
|
|
183
198
|
throw new BadDataException(
|
|
@@ -271,23 +286,35 @@ export default class IncidentAPI extends BaseAPI<
|
|
|
271
286
|
const props: DatabaseCommonInteractionProps =
|
|
272
287
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
273
288
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
:
|
|
289
|
+
CommonAPI.assertTenantScoped(props);
|
|
290
|
+
|
|
291
|
+
/*
|
|
292
|
+
* Read through getUserPermissions(Allow) rather than off
|
|
293
|
+
* userTenantAccessPermission directly. That dictionary is keyed by project
|
|
294
|
+
* id and its entries hold GRANTS AND DENIALS together, discriminated only
|
|
295
|
+
* by isBlockPermission, so the previous
|
|
296
|
+
* `userTenantAccessPermission["permissions"]` read was always undefined
|
|
297
|
+
* and denied every caller who was not a master admin. Mapping the array
|
|
298
|
+
* raw would swing the other way and count a team's explicit block
|
|
299
|
+
* entry for one of these permissions as a grant of it.
|
|
300
|
+
*/
|
|
301
|
+
const permissions: Array<Permission> =
|
|
302
|
+
DatabaseCommonInteractionPropsUtil.getUserPermissions(
|
|
303
|
+
props,
|
|
304
|
+
PermissionType.Allow,
|
|
305
|
+
).map((userPermission: UserPermission) => {
|
|
306
|
+
return userPermission.permission;
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
const hasPermission: boolean = permissions.some((p: Permission) => {
|
|
310
|
+
return (
|
|
311
|
+
p === Permission.ProjectOwner ||
|
|
312
|
+
p === Permission.ProjectAdmin ||
|
|
313
|
+
p === Permission.EditProjectIncident ||
|
|
314
|
+
p === Permission.CreateIncidentInternalNote ||
|
|
315
|
+
p === Permission.CreateIncidentPublicNote
|
|
316
|
+
);
|
|
317
|
+
});
|
|
291
318
|
|
|
292
319
|
if (!hasPermission && !props.isMasterAdmin) {
|
|
293
320
|
throw new BadDataException(
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import IncidentEpisode from "../../Models/DatabaseModels/IncidentEpisode";
|
|
2
2
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
3
3
|
import NotFoundException from "../../Types/Exception/NotFoundException";
|
|
4
|
+
import DatabaseCommonInteractionPropsUtil, {
|
|
5
|
+
PermissionType,
|
|
6
|
+
} from "../../Types/BaseDatabase/DatabaseCommonInteractionPropsUtil";
|
|
4
7
|
import ObjectID from "../../Types/ObjectID";
|
|
5
8
|
import IncidentEpisodeService, {
|
|
6
9
|
Service as IncidentEpisodeServiceType,
|
|
@@ -21,7 +24,7 @@ import IncidentEpisodeAIContextBuilder, {
|
|
|
21
24
|
} from "../Utils/AI/IncidentEpisodeAIContextBuilder";
|
|
22
25
|
import { AIGenerationContext } from "../Utils/AI/IncidentAIContextBuilder";
|
|
23
26
|
import JSONFunctions from "../../Types/JSONFunctions";
|
|
24
|
-
import Permission from "../../Types/Permission";
|
|
27
|
+
import Permission, { UserPermission } from "../../Types/Permission";
|
|
25
28
|
|
|
26
29
|
export default class IncidentEpisodeAPI extends BaseAPI<
|
|
27
30
|
IncidentEpisode,
|
|
@@ -67,21 +70,33 @@ export default class IncidentEpisodeAPI extends BaseAPI<
|
|
|
67
70
|
const props: DatabaseCommonInteractionProps =
|
|
68
71
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
69
72
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
73
|
+
CommonAPI.assertTenantScoped(props);
|
|
74
|
+
|
|
75
|
+
/*
|
|
76
|
+
* Read through getUserPermissions(Allow) rather than off
|
|
77
|
+
* userTenantAccessPermission directly. That dictionary is keyed by project
|
|
78
|
+
* id and its entries hold GRANTS AND DENIALS together, discriminated only
|
|
79
|
+
* by isBlockPermission, so the previous
|
|
80
|
+
* `userTenantAccessPermission["permissions"]` read was always undefined
|
|
81
|
+
* and denied every caller who was not a master admin. Mapping the array
|
|
82
|
+
* raw would swing the other way and count a team's explicit block
|
|
83
|
+
* entry for one of these permissions as a grant of it.
|
|
84
|
+
*/
|
|
85
|
+
const permissions: Array<Permission> =
|
|
86
|
+
DatabaseCommonInteractionPropsUtil.getUserPermissions(
|
|
87
|
+
props,
|
|
88
|
+
PermissionType.Allow,
|
|
89
|
+
).map((userPermission: UserPermission) => {
|
|
90
|
+
return userPermission.permission;
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const hasPermission: boolean = permissions.some((p: Permission) => {
|
|
94
|
+
return (
|
|
95
|
+
p === Permission.ProjectOwner ||
|
|
96
|
+
p === Permission.ProjectAdmin ||
|
|
97
|
+
p === Permission.EditIncidentEpisode
|
|
98
|
+
);
|
|
99
|
+
});
|
|
85
100
|
|
|
86
101
|
if (!hasPermission && !props.isMasterAdmin) {
|
|
87
102
|
throw new BadDataException(
|
package/Server/API/MonitorAPI.ts
CHANGED
|
@@ -9,6 +9,8 @@ import {
|
|
|
9
9
|
} from "../Utils/Express";
|
|
10
10
|
import Response from "../Utils/Response";
|
|
11
11
|
import BaseAPI from "./BaseAPI";
|
|
12
|
+
import CommonAPI from "./CommonAPI";
|
|
13
|
+
import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
12
14
|
import Monitor from "../../Models/DatabaseModels/Monitor";
|
|
13
15
|
import ObjectID from "../../Types/ObjectID";
|
|
14
16
|
|
|
@@ -21,10 +23,38 @@ export default class MonitorAPI extends BaseAPI<Monitor, MonitorServiceType> {
|
|
|
21
23
|
UserMiddleware.getUserMiddleware,
|
|
22
24
|
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
23
25
|
try {
|
|
26
|
+
const databaseProps: DatabaseCommonInteractionProps =
|
|
27
|
+
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
28
|
+
|
|
29
|
+
/*
|
|
30
|
+
* getUserMiddleware lets unauthenticated requests through as
|
|
31
|
+
* "public", and refreshMonitorCurrentStatus reads and writes the
|
|
32
|
+
* monitor as root. Require an authenticated member of the
|
|
33
|
+
* monitor's own project — the caller-supplied tenant says nothing
|
|
34
|
+
* about which project the monitor id in the path belongs to.
|
|
35
|
+
*/
|
|
36
|
+
const projectId: ObjectID =
|
|
37
|
+
CommonAPI.assertAuthenticatedProjectMember(databaseProps);
|
|
38
|
+
|
|
24
39
|
const monitorId: ObjectID = new ObjectID(
|
|
25
40
|
req.params["monitorId"] as string,
|
|
26
41
|
);
|
|
27
42
|
|
|
43
|
+
const monitor: Monitor | null = await MonitorService.findOneById({
|
|
44
|
+
id: monitorId,
|
|
45
|
+
select: {
|
|
46
|
+
projectId: true,
|
|
47
|
+
},
|
|
48
|
+
props: {
|
|
49
|
+
isRoot: true,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
CommonAPI.assertResourceBelongsToProject({
|
|
54
|
+
resourceProjectId: monitor?.projectId,
|
|
55
|
+
projectId: projectId,
|
|
56
|
+
});
|
|
57
|
+
|
|
28
58
|
await MonitorService.refreshMonitorCurrentStatus(monitorId);
|
|
29
59
|
return Response.sendEmptySuccessResponse(req, res);
|
|
30
60
|
} catch (e) {
|
|
@@ -61,6 +61,8 @@ export default class MonitorTemplateAPI extends BaseAPI<
|
|
|
61
61
|
const props: DatabaseCommonInteractionProps =
|
|
62
62
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
63
63
|
|
|
64
|
+
CommonAPI.assertTenantScoped(props);
|
|
65
|
+
|
|
64
66
|
const fields: Array<string> | undefined = readSyncFields(req);
|
|
65
67
|
|
|
66
68
|
const result: SyncLinkedMonitorsResult =
|
|
@@ -98,6 +100,8 @@ export default class MonitorTemplateAPI extends BaseAPI<
|
|
|
98
100
|
const props: DatabaseCommonInteractionProps =
|
|
99
101
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
100
102
|
|
|
103
|
+
CommonAPI.assertTenantScoped(props);
|
|
104
|
+
|
|
101
105
|
const fields: Array<string> | undefined = readSyncFields(req);
|
|
102
106
|
|
|
103
107
|
await MonitorTemplateService.syncToMonitor({
|
|
@@ -133,6 +137,8 @@ export default class MonitorTemplateAPI extends BaseAPI<
|
|
|
133
137
|
const props: DatabaseCommonInteractionProps =
|
|
134
138
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
135
139
|
|
|
140
|
+
CommonAPI.assertTenantScoped(props);
|
|
141
|
+
|
|
136
142
|
await MonitorTemplateService.linkMonitor({
|
|
137
143
|
monitorTemplateId,
|
|
138
144
|
monitorId,
|
|
@@ -165,6 +171,8 @@ export default class MonitorTemplateAPI extends BaseAPI<
|
|
|
165
171
|
const props: DatabaseCommonInteractionProps =
|
|
166
172
|
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
167
173
|
|
|
174
|
+
CommonAPI.assertTenantScoped(props);
|
|
175
|
+
|
|
168
176
|
await MonitorTemplateService.unlinkMonitor({
|
|
169
177
|
monitorTemplateId,
|
|
170
178
|
monitorId,
|