@oneuptime/common 12.0.8 → 12.0.9
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/MetricItemAggMV1mByK8sCluster.ts +1 -1
- package/Models/AnalyticsModels/MetricItemAggMV1mByService.ts +1 -1
- package/Models/DatabaseModels/AIConversation.ts +32 -0
- package/Models/DatabaseModels/AIConversationMessage.ts +41 -0
- package/Models/DatabaseModels/AlertEpisodeMember.ts +27 -0
- package/Models/DatabaseModels/IncidentEpisodeMember.ts +28 -0
- package/Models/DatabaseModels/Index.ts +12 -4
- package/Models/DatabaseModels/{TelemetryEntity.ts → InventoryItem.ts} +139 -9
- package/Models/DatabaseModels/InventoryItemCustomField.ts +434 -0
- package/Models/DatabaseModels/{TelemetryEntityRelationship.ts → InventoryItemRelationship.ts} +8 -8
- package/Models/DatabaseModels/NetworkDevice.ts +141 -0
- package/Models/DatabaseModels/NetworkDeviceLink.ts +699 -0
- package/Models/DatabaseModels/NetworkDeviceLinkRule.ts +467 -0
- package/Models/DatabaseModels/NetworkTopologySuppression.ts +429 -0
- package/Models/DatabaseModels/OnCallDutyPolicyFeed.ts +9 -0
- package/Models/DatabaseModels/Project.ts +78 -0
- package/Models/DatabaseModels/UserCall.ts +42 -0
- package/Models/DatabaseModels/UserEmail.ts +44 -0
- package/Models/DatabaseModels/UserNotificationRule.ts +425 -55
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +24 -2
- package/Models/DatabaseModels/UserPush.ts +49 -0
- package/Models/DatabaseModels/UserSMS.ts +43 -0
- package/Models/DatabaseModels/UserTelegram.ts +59 -0
- package/Models/DatabaseModels/UserWebhook.ts +52 -0
- package/Models/DatabaseModels/UserWhatsApp.ts +41 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +12 -0
- package/Server/API/AIChatAPI.ts +315 -1
- package/Server/API/DashboardAPI.ts +217 -1
- package/Server/API/OnCallReadinessAPI.ts +841 -0
- package/Server/API/TeamComplianceAPI.ts +69 -17
- package/Server/API/TelemetryAPI.ts +220 -12
- package/Server/EnvironmentConfig.ts +52 -0
- package/Server/Infrastructure/Postgres/DataSourceOptions.ts +22 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.ts +4 -4
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.ts +5 -5
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.ts +82 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.ts +91 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.ts +255 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.ts +107 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.ts +90 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +20 -0
- package/Server/Infrastructure/Queue.ts +78 -13
- package/Server/Middleware/PublicDashboardRateLimit.ts +593 -0
- package/Server/Services/AIService.ts +7 -0
- package/Server/Services/AlertEpisodeStateTimelineService.ts +29 -0
- package/Server/Services/AlertSeverityService.ts +63 -0
- package/Server/Services/DashboardService.ts +9 -10
- package/Server/Services/DatabaseService.ts +32 -2
- package/Server/Services/IncidentEpisodeStateTimelineService.ts +29 -0
- package/Server/Services/IncidentSeverityService.ts +76 -0
- package/Server/Services/Index.ts +12 -4
- package/Server/Services/InventoryItemCustomFieldService.ts +9 -0
- package/Server/Services/{TelemetryEntityRelationshipService.ts → InventoryItemRelationshipService.ts} +4 -4
- package/Server/Services/{TelemetryEntityService.ts → InventoryItemService.ts} +89 -20
- package/Server/Services/LogAggregationService.ts +45 -8
- package/Server/Services/MetricAggregationService.ts +121 -0
- package/Server/Services/MetricService.ts +7 -7
- package/Server/Services/NetworkDeviceLinkRuleService.ts +10 -0
- package/Server/Services/NetworkDeviceLinkService.ts +84 -0
- package/Server/Services/NetworkDeviceService.ts +140 -0
- package/Server/Services/NetworkSiteService.ts +77 -25
- package/Server/Services/NetworkTopologySuppressionService.ts +84 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +41 -29
- package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +8 -0
- package/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.ts +62 -13
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +61 -1
- package/Server/Services/OnCallNotificationAlertingService.ts +742 -0
- package/Server/Services/OnCallReadinessService.ts +2803 -0
- package/Server/Services/OnCallSetupReminderService.ts +955 -0
- package/Server/Services/ProfileAggregationService.ts +123 -0
- package/Server/Services/StatusPageService.ts +9 -10
- package/Server/Services/TeamComplianceService.ts +429 -252
- package/Server/Services/UserCallService.ts +26 -1
- package/Server/Services/UserEmailService.ts +26 -1
- package/Server/Services/UserNotificationRuleAdminService.ts +1183 -0
- package/Server/Services/UserNotificationRuleService.ts +3812 -333
- package/Server/Services/UserOnCallLogService.ts +561 -48
- package/Server/Services/UserPushService.ts +29 -0
- package/Server/Services/UserService.ts +11 -0
- package/Server/Services/UserSmsService.ts +26 -1
- package/Server/Services/UserTelegramService.ts +24 -1
- package/Server/Services/UserWebhookService.ts +28 -1
- package/Server/Services/UserWhatsAppService.ts +24 -1
- package/Server/Types/Database/Permissions/BasePermission.ts +19 -0
- package/Server/Types/Database/Permissions/CreatePermission.ts +164 -0
- package/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.ts +340 -0
- package/Server/Types/Database/Permissions/QueryPermission.ts +48 -0
- package/Server/Types/Database/Permissions/TenantPermission.ts +8 -1
- package/Server/Types/Workflow/Components/API/Delete.ts +1 -1
- package/Server/Types/Workflow/Components/API/Get.ts +1 -1
- package/Server/Types/Workflow/Components/API/Patch.ts +1 -1
- package/Server/Types/Workflow/Components/API/Post.ts +1 -1
- package/Server/Types/Workflow/Components/API/Put.ts +1 -1
- package/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.ts +29 -5
- package/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.ts +18 -10
- package/Server/Types/Workflow/Components/BaseModel/ModelArguments.ts +55 -0
- package/Server/Types/Workflow/Components/Conditions/IfElse.ts +3 -17
- package/Server/Types/Workflow/Components/Email.ts +25 -7
- package/Server/Types/Workflow/Components/JavaScript.ts +10 -3
- package/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.ts +1 -1
- package/Server/Utils/AI/Chat/ChatAgentRunner.ts +643 -48
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +32 -3
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +20 -6
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +7 -0
- package/Server/Utils/AI/Toolbox/AIActionTools.ts +2 -2
- package/Server/Utils/AI/Toolbox/AIMetaTools.ts +863 -0
- package/Server/Utils/AI/Toolbox/AlertTools.ts +177 -15
- package/Server/Utils/AI/Toolbox/IncidentTools.ts +191 -10
- package/Server/Utils/AI/Toolbox/Index.ts +48 -0
- package/Server/Utils/AI/Toolbox/MonitorTools.ts +298 -11
- package/Server/Utils/AI/Toolbox/NoteWriteTools.ts +295 -0
- package/Server/Utils/AI/Toolbox/OnCallTools.ts +1246 -0
- package/Server/Utils/AI/Toolbox/RunbookTools.ts +424 -0
- package/Server/Utils/AI/Toolbox/SloTools.ts +456 -0
- package/Server/Utils/AI/Toolbox/StatusPageTools.ts +559 -0
- package/Server/Utils/AI/Toolbox/TeamTools.ts +327 -0
- package/Server/Utils/AI/Toolbox/TimelineTools.ts +615 -0
- package/Server/Utils/AI/Toolbox/WorkflowProbeTools.ts +664 -0
- package/Server/Utils/ClientIp.ts +221 -0
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +47 -0
- package/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.ts +163 -0
- package/Server/Utils/Dashboard/PublicDashboardSloWidget.ts +147 -0
- package/Server/Utils/Express.ts +12 -17
- package/Server/Utils/LLM/LLMService.ts +85 -8
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +204 -10
- package/Server/Utils/SSRFProtection.ts +98 -23
- package/Server/Utils/StartServer.ts +12 -3
- package/Server/Utils/Telemetry/EntityRegistry.ts +205 -18
- package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +25 -25
- package/Server/Utils/Telemetry/TelemetryEntity.ts +160 -52
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +7 -3
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +2146 -0
- package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +561 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +2470 -0
- package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +1897 -0
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3606 -0
- package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +784 -0
- package/Tests/App/Dashboard/OnCallRulesTable.test.tsx +1119 -0
- package/Tests/App/Dashboard/SloWidgetFetching.test.tsx +531 -0
- package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +1312 -0
- package/Tests/App/Dashboard/UserSettingsSetupChecklistPage.test.tsx +1390 -0
- package/Tests/Models/InventoryItemModel.test.ts +174 -0
- package/Tests/Models/InventoryItemNaming.test.ts +302 -0
- package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +437 -0
- package/Tests/Server/API/DashboardPublicRateLimit.test.ts +659 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +18 -0
- package/Tests/Server/API/DashboardPublicSloAPI.test.ts +880 -0
- package/Tests/Server/API/Helpers.ts +24 -15
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +2680 -0
- package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +915 -0
- package/Tests/Server/Infrastructure/Postgres/EpisodeMemberNotifyIndexesMigration.test.ts +533 -0
- package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +213 -0
- package/Tests/Server/Infrastructure/Postgres/RenameInventoryItemMigration.test.ts +432 -0
- package/Tests/Server/Infrastructure/Queue.test.ts +293 -0
- package/Tests/Server/Middleware/PublicDashboardRateLimit.test.ts +1645 -0
- package/Tests/Server/Services/AdminRuleEditGuards.test.ts +2848 -0
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1393 -0
- package/Tests/Server/Services/EpisodeRuleSeverityRepair.test.ts +1802 -0
- package/Tests/Server/Services/EpisodeStateTimelineNote.test.ts +304 -0
- package/Tests/Server/Services/InventoryItemDisplayName.test.ts +339 -0
- package/Tests/Server/Services/{TelemetryEntityManualCreate.test.ts → InventoryItemManualCreate.test.ts} +27 -27
- package/Tests/Server/Services/IpAllowlistSpoofing.test.ts +450 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +235 -1
- package/Tests/Server/Services/MetricAggregationService.test.ts +231 -0
- package/Tests/Server/Services/MetricEntityMVKeyParity.test.ts +80 -29
- package/Tests/Server/Services/MetricServiceAggregate.test.ts +30 -30
- package/Tests/Server/Services/NetworkSiteService.test.ts +18 -3
- package/Tests/Server/Services/NotificationChannelEventCoverage.test.ts +1728 -0
- package/Tests/Server/Services/NotificationDeletionImpact.test.ts +2402 -0
- package/Tests/Server/Services/OnCallDutyPolicyExecutionLogTimelineGapFeed.test.ts +394 -0
- package/Tests/Server/Services/OnCallNotificationFallback.test.ts +1744 -0
- package/Tests/Server/Services/OnCallReadinessService.test.ts +4295 -0
- package/Tests/Server/Services/OnCallSetupReminder.test.ts +1272 -0
- package/Tests/Server/Services/OnCallWeeklyReadinessDigest.test.ts +1021 -0
- package/Tests/Server/Services/ProfileAggregationService.test.ts +296 -0
- package/Tests/Server/Services/SeverityCreationRuleBackfill.test.ts +1536 -0
- package/Tests/Server/Services/SeverityRuleBackfill.test.ts +1818 -0
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +1845 -0
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +1394 -0
- package/Tests/Server/Services/UserNotificationRuleDefaultCreation.test.ts +1166 -0
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1468 -0
- package/Tests/Server/Services/UserOnCallLogNoNotificationRules.test.ts +1457 -0
- package/Tests/Server/Types/Database/Permissions/AdminNotificationRuleAccess.test.ts +1546 -0
- package/Tests/Server/Types/Database/Permissions/CreateOwnershipScoping.test.ts +529 -0
- package/Tests/Server/Types/Database/Permissions/OwnerOnlyColumns.test.ts +1219 -0
- package/Tests/Server/Types/Database/Permissions/UserNotificationRuleScoping.test.ts +1089 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +2 -1
- package/Tests/Server/Types/Workflow/Components/BaseModelDatabaseComponents.test.ts +190 -0
- package/Tests/Server/Types/Workflow/Components/ChatWebhookComponents.test.ts +44 -14
- package/Tests/Server/Types/Workflow/Components/Email.test.ts +151 -0
- package/Tests/Server/Types/Workflow/Components/IfElse.test.ts +98 -0
- package/Tests/Server/Types/Workflow/Components/JavaScript.test.ts +51 -0
- package/Tests/Server/Utils/AI/AIMetaTools.test.ts +586 -0
- package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +582 -0
- package/Tests/Server/Utils/AI/ChatAgentRunner.test.ts +726 -0
- package/Tests/Server/Utils/AI/IncidentToolsFilters.test.ts +315 -0
- package/Tests/Server/Utils/AI/LLMServiceStopReason.test.ts +314 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +26 -3
- package/Tests/Server/Utils/AI/NoteWriteTools.test.ts +268 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +169 -0
- package/Tests/Server/Utils/AI/OnCallTools.test.ts +664 -0
- package/Tests/Server/Utils/AI/RunbookTools.test.ts +325 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +306 -0
- package/Tests/Server/Utils/AI/StatusPageTools.test.ts +391 -0
- package/Tests/Server/Utils/AI/TeamTools.test.ts +257 -0
- package/Tests/Server/Utils/AI/TimelineTools.test.ts +472 -0
- package/Tests/Server/Utils/AI/WorkflowProbeTools.test.ts +428 -0
- package/Tests/Server/Utils/ClientIp.test.ts +438 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +171 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.test.ts +383 -0
- package/Tests/Server/Utils/EntityRegistryRowFence.test.ts +23 -25
- package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +6 -0
- package/Tests/Server/Utils/Monitor/Criteria/DnssecMonitorCriteria.test.ts +307 -0
- package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +468 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorTelemetryDeepLinks.test.ts +460 -0
- package/Tests/Server/Utils/ResponseRateLimitStatusCodes.test.ts +137 -0
- package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +40 -8
- package/Tests/Server/Utils/SSRFProtectionUserInfo.test.ts +351 -0
- package/Tests/Server/Utils/Telemetry/EntityRegistryRetirement.test.ts +531 -0
- package/Tests/Server/Utils/Telemetry/InventoryEntityRegistry.test.ts +15 -15
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +356 -39
- package/Tests/Types/IP/IP.test.ts +263 -0
- package/Tests/Types/IP/IPWhitelist.test.ts +197 -0
- package/Tests/Types/IP/IPv6.test.ts +12 -1
- package/Tests/Types/Monitor/SnmpOid.test.ts +64 -0
- package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +110 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilMergeAudit.test.ts +106 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilMergeDifferential.test.ts +511 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageEndToEnd.test.ts +489 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageGapTolerance.test.ts +479 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageState.test.ts +822 -0
- package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +6 -6
- package/Tests/Types/Workflow/BaseModelComponents.test.ts +429 -0
- package/Tests/Types/Workflow/Components/BaseModel.test.ts +225 -0
- package/Tests/Types/Workflow/IntegrationCredentialMetadata.test.ts +100 -0
- package/Tests/Types/Workflow/TemplateSyntax.test.ts +112 -0
- package/Tests/Types/Workflow/Templates.test.ts +916 -101
- package/Tests/UI/Components/ActiveFilterChipsOpenRoute.test.tsx +82 -0
- package/Tests/UI/Components/ComponentsModal.test.tsx +564 -7
- package/Tests/UI/Components/KeyboardShortcut.test.tsx +95 -0
- package/Tests/UI/Components/LogDetailsPanelCrossSignal.test.tsx +448 -0
- package/Tests/UI/Components/LogsTableCrossLinks.test.tsx +263 -0
- package/Tests/UI/Components/PendingProjectInvitations.test.tsx +913 -0
- package/Tests/UI/Components/SimpleLogViewer.test.tsx +228 -0
- package/Tests/UI/Components/TableRowSelectability.test.tsx +312 -0
- package/Tests/UI/Components/Workflow/GraphLint.test.ts +72 -0
- package/Tests/UI/Components/Workflow/GraphLintSummary.test.ts +755 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditor.test.ts +242 -7
- package/Tests/UI/Components/Workflow/ModelColumnEditorServerContract.test.ts +15 -7
- package/Tests/UI/Components/Workflow/ModelSchema.test.ts +242 -28
- package/Tests/UI/Components/Workflow/RunStatusWatcher.test.ts +59 -1
- package/Tests/UI/Components/Workflow/StepTraceViewer.test.tsx +256 -0
- package/Tests/UI/Components/Workflow/UseRunWatch.test.tsx +665 -0
- package/Tests/UI/Components/Workflow/WorkflowIssuesModal.test.tsx +485 -0
- package/Tests/UI/Components/Workflow/WorkflowLogModal.test.tsx +478 -0
- package/Tests/UI/Components/Workflow/WorkflowStatusBar.test.tsx +379 -0
- package/Tests/UI/EsbuildConfig.test.ts +607 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +5 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +11 -4
- package/Tests/UI/Utils/ModelAPICreateMiscData.test.ts +94 -0
- package/Tests/UI/Utils/Platform.test.ts +147 -0
- package/Tests/UI/Utils/ProjectInvitationDisplay.test.ts +357 -0
- package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +198 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +487 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +698 -0
- package/Tests/__mocks__/bullmq.js +55 -0
- package/Types/AI/AIChatMessageStatus.ts +8 -1
- package/Types/AI/AIChatTypes.ts +12 -0
- package/Types/Database/AccessControl/OwnerOnlyColumn.ts +88 -0
- package/Types/Exception/ExceptionCode.ts +2 -0
- package/Types/Exception/ServiceUnavailableException.ts +8 -0
- package/Types/Exception/TooManyRequestsException.ts +8 -0
- package/Types/IP/IP.ts +93 -47
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +49 -3
- package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +55 -0
- package/Types/OnCallDutyPolicy/Layer.ts +203 -149
- package/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.ts +13 -0
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +155 -10
- package/Types/Permission.ts +193 -0
- package/Types/Telemetry/EntityRelationshipType.ts +1 -1
- package/Types/Telemetry/EntitySource.ts +1 -1
- package/Types/Telemetry/EntityType.ts +1 -1
- package/Types/Telemetry/EntityTypeGroups.ts +1 -1
- package/Types/Workflow/Components/BaseModel.ts +75 -29
- package/Types/Workflow/Components/Discord.ts +1 -0
- package/Types/Workflow/Components/Email.ts +12 -3
- package/Types/Workflow/Components/JavaScript.ts +7 -0
- package/Types/Workflow/Components/MicrosoftTeams.ts +3 -2
- package/Types/Workflow/Components/Slack.ts +1 -0
- package/Types/Workflow/Components/Telegram.ts +1 -0
- package/Types/Workflow/TemplateSyntax.ts +44 -0
- package/Types/Workflow/Templates.ts +2097 -45
- package/UI/Components/Calendar/Calendar.css +43 -0
- package/UI/Components/Calendar/Calendar.tsx +8 -0
- package/UI/Components/Card/Card.tsx +2 -2
- package/UI/Components/Checkbox/Checkbox.tsx +16 -0
- package/UI/Components/Dictionary/Dictionary.tsx +48 -9
- package/UI/Components/FormModal/BasicFormModal.tsx +2 -1
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +53 -3
- package/UI/Components/Input/Input.tsx +1 -0
- package/UI/Components/KeyboardShortcut/KeyboardKey.ts +185 -0
- package/UI/Components/KeyboardShortcut/KeyboardShortcut.tsx +87 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +28 -0
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +31 -0
- package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +18 -18
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +363 -14
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +11 -0
- package/UI/Components/LogsViewer/components/LogsTable.tsx +155 -12
- package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +29 -0
- package/UI/Components/LogsViewer/types.ts +23 -0
- package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +9 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +15 -30
- package/UI/Components/ProjectInvitations/PendingProjectInvitations.tsx +442 -0
- package/UI/Components/SimpleLogViewer/SimpleLogViewer.tsx +23 -1
- package/UI/Components/Table/Table.tsx +49 -16
- package/UI/Components/Table/TableBody.tsx +53 -28
- package/UI/Components/Table/TableHeader.tsx +13 -0
- package/UI/Components/Table/TableRow.tsx +58 -26
- package/UI/Components/Workflow/ArgumentsForm.tsx +155 -9
- package/UI/Components/Workflow/ComponentReturnValueViewer.tsx +26 -0
- package/UI/Components/Workflow/ComponentSettingsModal.tsx +10 -1
- package/UI/Components/Workflow/ComponentValuePickerModal.tsx +135 -7
- package/UI/Components/Workflow/ComponentsModal.tsx +116 -22
- package/UI/Components/Workflow/DocumentationViewer.tsx +59 -9
- package/UI/Components/Workflow/GraphLint.ts +42 -5
- package/UI/Components/Workflow/GraphLintSummary.ts +390 -0
- package/UI/Components/Workflow/ModelColumnEditor.tsx +154 -22
- package/UI/Components/Workflow/ModelSchema.ts +115 -33
- package/UI/Components/Workflow/RunStatusWatcher.ts +1 -1
- package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
- package/UI/Components/Workflow/UseRunWatch.ts +212 -0
- package/UI/Components/Workflow/VariableModal.tsx +6 -2
- package/UI/Components/Workflow/Workflow.tsx +49 -3
- package/UI/Components/Workflow/WorkflowIssuesModal.tsx +255 -0
- package/UI/Components/Workflow/WorkflowLogModal.tsx +128 -0
- package/UI/Components/Workflow/WorkflowStatusBar.tsx +224 -0
- package/UI/Utils/AIChatExport/ConversationMarkdown.ts +10 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +7 -1
- package/UI/Utils/Platform.ts +149 -0
- package/UI/Utils/ProjectInvitationDisplay.ts +118 -0
- package/UI/esbuild-config.js +22 -1
- package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +187 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +888 -164
- package/Utils/Telemetry/CrossSignalScope.ts +502 -0
- package/Utils/Telemetry/EntityKey.ts +5 -5
- package/Utils/Telemetry/EntityRelationship.ts +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +1 -1
- package/build/dist/Models/DatabaseModels/AIConversation.js +32 -0
- package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIConversationMessage.js +42 -0
- package/build/dist/Models/DatabaseModels/AIConversationMessage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +28 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +29 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +12 -4
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/{TelemetryEntity.js → InventoryItem.js} +167 -31
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -0
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +454 -0
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -0
- package/build/dist/Models/DatabaseModels/{TelemetryEntityRelationship.js → InventoryItemRelationship.js} +27 -27
- package/build/dist/Models/DatabaseModels/InventoryItemRelationship.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +141 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js +719 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js +475 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkTopologySuppression.js +446 -0
- package/build/dist/Models/DatabaseModels/NetworkTopologySuppression.js.map +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyFeed.js +9 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +80 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserCall.js +46 -2
- package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserEmail.js +48 -2
- package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationRule.js +424 -55
- package/build/dist/Models/DatabaseModels/UserNotificationRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +24 -2
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserPush.js +51 -1
- package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSMS.js +47 -2
- package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTelegram.js +65 -3
- package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebhook.js +56 -2
- package/build/dist/Models/DatabaseModels/UserWebhook.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js +45 -2
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +12 -0
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +237 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +165 -13
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js +599 -0
- package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -0
- package/build/dist/Server/API/TeamComplianceAPI.js +68 -9
- package/build/dist/Server/API/TeamComplianceAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +129 -18
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +45 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js +4 -4
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.js +150 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.js +57 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.js +69 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.js +48 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +72 -13
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Middleware/PublicDashboardRateLimit.js +399 -0
- package/build/dist/Server/Middleware/PublicDashboardRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AIService.js +1 -0
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js +24 -3
- package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/AlertSeverityService.js +54 -0
- package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
- package/build/dist/Server/Services/DashboardService.js +10 -9
- package/build/dist/Server/Services/DashboardService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +24 -2
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +24 -3
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSeverityService.js +67 -0
- package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +12 -4
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemCustomFieldService.js +9 -0
- package/build/dist/Server/Services/InventoryItemCustomFieldService.js.map +1 -0
- package/build/dist/Server/Services/{TelemetryEntityRelationshipService.js → InventoryItemRelationshipService.js} +6 -6
- package/build/dist/Server/Services/InventoryItemRelationshipService.js.map +1 -0
- package/build/dist/Server/Services/{TelemetryEntityService.js → InventoryItemService.js} +68 -23
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -0
- package/build/dist/Server/Services/LogAggregationService.js +27 -8
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +80 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricService.js +6 -6
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLinkRuleService.js +9 -0
- package/build/dist/Server/Services/NetworkDeviceLinkRuleService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceLinkService.js +71 -0
- package/build/dist/Server/Services/NetworkDeviceLinkService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceService.js +113 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +53 -13
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkTopologySuppressionService.js +85 -0
- package/build/dist/Server/Services/NetworkTopologySuppressionService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +48 -32
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +8 -0
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js +51 -12
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +57 -13
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js +548 -0
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -0
- package/build/dist/Server/Services/OnCallReadinessService.js +1961 -0
- package/build/dist/Server/Services/OnCallReadinessService.js.map +1 -0
- package/build/dist/Server/Services/OnCallSetupReminderService.js +738 -0
- package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -0
- package/build/dist/Server/Services/ProfileAggregationService.js +68 -4
- package/build/dist/Server/Services/ProfileAggregationService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +11 -10
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamComplianceService.js +312 -160
- package/build/dist/Server/Services/TeamComplianceService.js.map +1 -1
- package/build/dist/Server/Services/UserCallService.js +24 -1
- package/build/dist/Server/Services/UserCallService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +24 -1
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js +858 -0
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js +2830 -175
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserOnCallLogService.js +488 -43
- package/build/dist/Server/Services/UserOnCallLogService.js.map +1 -1
- package/build/dist/Server/Services/UserPushService.js +26 -0
- package/build/dist/Server/Services/UserPushService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +10 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserSmsService.js +24 -1
- package/build/dist/Server/Services/UserSmsService.js.map +1 -1
- package/build/dist/Server/Services/UserTelegramService.js +22 -1
- package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
- package/build/dist/Server/Services/UserWebhookService.js +25 -1
- package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
- package/build/dist/Server/Services/UserWhatsAppService.js +22 -1
- package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +12 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +126 -0
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.js +254 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.js.map +1 -0
- package/build/dist/Server/Types/Database/Permissions/QueryPermission.js +47 -2
- package/build/dist/Server/Types/Database/Permissions/QueryPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +7 -0
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js +21 -5
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js +14 -10
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js +31 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js +3 -9
- package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Email.js +15 -4
- package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js +7 -2
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +514 -56
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +20 -3
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +19 -6
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +7 -0
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +2 -2
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js +692 -0
- package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +148 -12
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +157 -10
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +37 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js +259 -14
- package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/NoteWriteTools.js +235 -0
- package/build/dist/Server/Utils/AI/Toolbox/NoteWriteTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js +1000 -0
- package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/RunbookTools.js +356 -0
- package/build/dist/Server/Utils/AI/Toolbox/RunbookTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +394 -0
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js +465 -0
- package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/TeamTools.js +280 -0
- package/build/dist/Server/Utils/AI/Toolbox/TeamTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js +527 -0
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js +548 -0
- package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js.map +1 -0
- package/build/dist/Server/Utils/ClientIp.js +137 -0
- package/build/dist/Server/Utils/ClientIp.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +38 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js +89 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js +77 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js.map +1 -0
- package/build/dist/Server/Utils/Express.js +12 -12
- package/build/dist/Server/Utils/Express.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +70 -7
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +121 -11
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +82 -21
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +12 -4
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +165 -18
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +11 -11
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +122 -47
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +7 -3
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/AI/AIChatMessageStatus.js +8 -1
- package/build/dist/Types/AI/AIChatMessageStatus.js.map +1 -1
- package/build/dist/Types/AI/AIChatTypes.js +12 -0
- package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +60 -0
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -0
- package/build/dist/Types/Exception/ExceptionCode.js +2 -0
- package/build/dist/Types/Exception/ExceptionCode.js.map +1 -1
- package/build/dist/Types/Exception/ServiceUnavailableException.js +8 -0
- package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js +8 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -0
- package/build/dist/Types/IP/IP.js +87 -43
- package/build/dist/Types/IP/IP.js.map +1 -1
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +50 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/Layer.js +186 -123
- package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.js +13 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +105 -11
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/Permission.js +174 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityRelationshipType.js +1 -1
- package/build/dist/Types/Telemetry/EntitySource.js +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +1 -1
- package/build/dist/Types/Telemetry/EntityTypeGroups.js +1 -1
- package/build/dist/Types/Telemetry/EntityTypeGroups.js.map +1 -1
- package/build/dist/Types/Workflow/Components/BaseModel.js +66 -28
- package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Discord.js +1 -0
- package/build/dist/Types/Workflow/Components/Discord.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Email.js +12 -3
- package/build/dist/Types/Workflow/Components/Email.js.map +1 -1
- package/build/dist/Types/Workflow/Components/JavaScript.js +7 -0
- package/build/dist/Types/Workflow/Components/JavaScript.js.map +1 -1
- package/build/dist/Types/Workflow/Components/MicrosoftTeams.js +3 -2
- package/build/dist/Types/Workflow/Components/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Slack.js +1 -0
- package/build/dist/Types/Workflow/Components/Slack.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Telegram.js +1 -0
- package/build/dist/Types/Workflow/Components/Telegram.js.map +1 -1
- package/build/dist/Types/Workflow/TemplateSyntax.js +12 -0
- package/build/dist/Types/Workflow/TemplateSyntax.js.map +1 -1
- package/build/dist/Types/Workflow/Templates.js +1931 -38
- package/build/dist/Types/Workflow/Templates.js.map +1 -1
- package/build/dist/UI/Components/Calendar/Calendar.js +1 -1
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- package/build/dist/UI/Components/Checkbox/Checkbox.js +1 -1
- package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
- package/build/dist/UI/Components/Dictionary/Dictionary.js +25 -11
- package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
- package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +27 -4
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +1 -0
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardKey.js +163 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardKey.js.map +1 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcut.js +47 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcut.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +4 -4
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +11 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +10 -8
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +227 -14
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +5 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +69 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +8 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/types.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +9 -2
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +8 -21
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/ProjectInvitations/PendingProjectInvitations.js +251 -0
- package/build/dist/UI/Components/ProjectInvitations/PendingProjectInvitations.js.map +1 -0
- package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js +9 -2
- package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js.map +1 -1
- package/build/dist/UI/Components/Table/Table.js +27 -15
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableBody.js +24 -18
- package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
- package/build/dist/UI/Components/Table/TableHeader.js +9 -1
- package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +29 -21
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js +130 -12
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js +10 -1
- package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +4 -4
- package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js +57 -7
- package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentsModal.js +53 -18
- package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/DocumentationViewer.js +19 -6
- package/build/dist/UI/Components/Workflow/DocumentationViewer.js.map +1 -1
- package/build/dist/UI/Components/Workflow/GraphLint.js +33 -4
- package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -1
- package/build/dist/UI/Components/Workflow/GraphLintSummary.js +231 -0
- package/build/dist/UI/Components/Workflow/GraphLintSummary.js.map +1 -0
- package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +116 -21
- package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ModelSchema.js +72 -34
- package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -1
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js +1 -1
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js.map +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
- package/build/dist/UI/Components/Workflow/UseRunWatch.js +123 -0
- package/build/dist/UI/Components/Workflow/UseRunWatch.js.map +1 -0
- package/build/dist/UI/Components/Workflow/VariableModal.js +3 -2
- package/build/dist/UI/Components/Workflow/VariableModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/Workflow.js +41 -1
- package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
- package/build/dist/UI/Components/Workflow/WorkflowIssuesModal.js +99 -0
- package/build/dist/UI/Components/Workflow/WorkflowIssuesModal.js.map +1 -0
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js +56 -0
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js.map +1 -0
- package/build/dist/UI/Components/Workflow/WorkflowStatusBar.js +92 -0
- package/build/dist/UI/Components/Workflow/WorkflowStatusBar.js.map +1 -0
- package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js +9 -0
- package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Platform.js +118 -0
- package/build/dist/UI/Utils/Platform.js.map +1 -0
- package/build/dist/UI/Utils/ProjectInvitationDisplay.js +106 -0
- package/build/dist/UI/Utils/ProjectInvitationDisplay.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +108 -0
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +642 -136
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +328 -0
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +5 -5
- package/build/dist/Utils/Telemetry/EntityRelationship.js +1 -1
- package/jest.config.json +1 -0
- package/package.json +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +0 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +0 -1
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +0 -1
- package/build/dist/Server/Services/TelemetryEntityService.js.map +0 -1
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
import UserMiddleware from "../Middleware/UserAuthorization";
|
|
2
|
+
import OnCallReadinessService from "../Services/OnCallReadinessService";
|
|
3
|
+
import OnCallDutyPolicyService from "../Services/OnCallDutyPolicyService";
|
|
4
|
+
import OnCallSetupReminderService from "../Services/OnCallSetupReminderService";
|
|
5
|
+
import TeamMemberService from "../Services/TeamMemberService";
|
|
6
|
+
import Express from "../Utils/Express";
|
|
7
|
+
import Response from "../Utils/Response";
|
|
8
|
+
import CommonAPI from "./CommonAPI";
|
|
9
|
+
import DatabaseCommonInteractionPropsUtil, { PermissionType, } from "../../Types/BaseDatabase/DatabaseCommonInteractionPropsUtil";
|
|
10
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
11
|
+
import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
|
|
12
|
+
import ObjectID from "../../Types/ObjectID";
|
|
13
|
+
import Permission from "../../Types/Permission";
|
|
14
|
+
/*
|
|
15
|
+
* "Can this responder actually be paged?" answered over HTTP, for one policy,
|
|
16
|
+
* one project, or one user. Everything the routes below return is computed by
|
|
17
|
+
* OnCallReadinessService; this file is transport and authorisation only, and
|
|
18
|
+
* deliberately holds no readiness logic of its own so the API and any in-process
|
|
19
|
+
* caller (TeamComplianceService, the on-call banner) can never disagree.
|
|
20
|
+
*
|
|
21
|
+
* Why a plain ExpressRouter rather than `extends BaseAPI`:
|
|
22
|
+
*
|
|
23
|
+
* The obvious model for this file, TeamComplianceAPI, does
|
|
24
|
+
* `class TeamComplianceAPI extends BaseAPI<Team, TeamServiceType>` and calls
|
|
25
|
+
* `super(Team, TeamService)` purely to inherit `this.router`. That side effect
|
|
26
|
+
* is not free: the BaseAPI constructor registers the ENTIRE Team CRUD route set
|
|
27
|
+
* (list, get, count, create, update, delete) onto that router. Team is already
|
|
28
|
+
* registered independently at App/FeatureSet/BaseAPI/Index.ts:2884, and Express
|
|
29
|
+
* dispatches to whichever matching handler was `app.use`d first, so the second
|
|
30
|
+
* copy is dead code that exists only to be shadowed - and it would quietly stop
|
|
31
|
+
* being dead the day the mount order changed. Readiness is not a CRUD model at
|
|
32
|
+
* all, so there is nothing to inherit here even in principle. AIReadinessAPI
|
|
33
|
+
* (Common/Server/API/AIReadinessAPI.ts) is the pattern this follows instead: a
|
|
34
|
+
* bare router, exported as the router itself, mounted with
|
|
35
|
+
* `app.use(prefix, OnCallReadinessAPI)`.
|
|
36
|
+
*
|
|
37
|
+
* Authorisation, on every route:
|
|
38
|
+
*
|
|
39
|
+
* These endpoints deliberately disclose ONE USER'S CONFIGURATION TO ANOTHER -
|
|
40
|
+
* which channels they have, which severities they are covered for. That is the
|
|
41
|
+
* whole point (an owner has to be able to see who cannot be reached), but it
|
|
42
|
+
* means the usual "the model's TableAccessControl will catch it" reasoning does
|
|
43
|
+
* not apply: OnCallReadinessService reads with `isRoot: true`, so these handlers
|
|
44
|
+
* are the only gate underneath. UserMiddleware.getUserMiddleware is NOT that
|
|
45
|
+
* gate - it admits anonymous callers as UserType.Public and calls next(), and
|
|
46
|
+
* the tenant id it attaches comes straight off the caller-supplied `tenantid`
|
|
47
|
+
* header before any authorisation runs. So each route asserts, itself:
|
|
48
|
+
*
|
|
49
|
+
* 1. the caller is a logged-in member of the project it named
|
|
50
|
+
* (CommonAPI.assertAuthenticatedProjectMember), and
|
|
51
|
+
* 2. the resource in the path - the policy, or the user - actually belongs to
|
|
52
|
+
* that same project, because otherwise a member of project A reads project
|
|
53
|
+
* B's data simply by sending their own `tenantid` header alongside a
|
|
54
|
+
* borrowed id.
|
|
55
|
+
*
|
|
56
|
+
* OnCallReadinessService guards its own reads too - getReadinessForPolicy
|
|
57
|
+
* rejects a policy from another project, getReadinessForUser rejects a user who
|
|
58
|
+
* is not a member of one - and the checks here deliberately duplicate that.
|
|
59
|
+
* They are not redundant belt-and-braces for its own sake: the service's guards
|
|
60
|
+
* are data-scoping guards that answer with BadDataException (a 400), whereas a
|
|
61
|
+
* member of project A reaching for project B's policy id is an authorisation
|
|
62
|
+
* failure and should be answered as one. More to the point, an endpoint's
|
|
63
|
+
* authorisation should be legible in the endpoint. If the service later relaxes
|
|
64
|
+
* its guard for a legitimate internal caller - a preview for a user not yet
|
|
65
|
+
* added to the project, say - these routes must not quietly become a
|
|
66
|
+
* cross-project probe as a side effect. The cost is one primary-key lookup on a
|
|
67
|
+
* request that is about to do considerably more work than that.
|
|
68
|
+
*
|
|
69
|
+
* Identifiers are masked by the service, before they ever reach this file, and
|
|
70
|
+
* the serialisers below copy `maskedIdentifier` and nothing else. There is no
|
|
71
|
+
* "unmask for self" branch anywhere: the contract carries no raw field to
|
|
72
|
+
* populate, so a future change would have to widen the contract in the open
|
|
73
|
+
* rather than slip a raw phone number through a boolean flag.
|
|
74
|
+
*
|
|
75
|
+
* The two summary routes are PAGED - see READINESS_PAGE_SIZE_DEFAULT below for
|
|
76
|
+
* why, and for the rule that keeps a paged answer from lying about the whole.
|
|
77
|
+
*
|
|
78
|
+
* THE ONE ROUTE THAT IS NOT A READ:
|
|
79
|
+
*
|
|
80
|
+
* /on-call-readiness/send-setup-reminder is a POST that sends branded email to
|
|
81
|
+
* real people, and it therefore carries a HIGHER bar than its read siblings -
|
|
82
|
+
* see SETUP_REMINDER_PERMISSIONS below. Membership was the original bar and it
|
|
83
|
+
* was the wrong one: `assertAuthenticatedProjectMember` proves only that the
|
|
84
|
+
* caller has SOME access entry for the project, which every read-only Viewer
|
|
85
|
+
* has, so anyone who could look at the readiness table could also make the
|
|
86
|
+
* product mail their colleagues in the project's name. Disclosure and action are
|
|
87
|
+
* different questions, and this route is the only one here that answers the
|
|
88
|
+
* second.
|
|
89
|
+
*/
|
|
90
|
+
const router = Express.getRouter();
|
|
91
|
+
/*
|
|
92
|
+
* Paging, and the one rule that makes it safe.
|
|
93
|
+
*
|
|
94
|
+
* A summary carries one UserReadiness per responder, and each of those carries a
|
|
95
|
+
* coverage cell per (rule type, severity) pair: four rule types against, say,
|
|
96
|
+
* eight incident and eight alert severities is 32 cells with a name and two ids
|
|
97
|
+
* apiece. That is a few kilobytes per responder, so a project with a few
|
|
98
|
+
* thousand responders serialises to tens of megabytes of JSON - built in memory,
|
|
99
|
+
* on every page load, by a service that also caches it. Nobody reads a table of
|
|
100
|
+
* five thousand rows in one screen, so the wire format should not pretend
|
|
101
|
+
* otherwise.
|
|
102
|
+
*
|
|
103
|
+
* THE RULE: the response is bounded, but the FACTS ARE NOT. readyCount,
|
|
104
|
+
* partiallyReadyCount and notReachableCount always describe the entire scope,
|
|
105
|
+
* never the page, and `totalCount` states how many responders the scope holds so
|
|
106
|
+
* a client can always see that it is holding part of a list. This is the
|
|
107
|
+
* difference between a paged answer and a truncated one, and it is the whole
|
|
108
|
+
* reason the counts are computed by the service rather than derived by the
|
|
109
|
+
* client from `users.length`: a UI that counted the rows it received would put a
|
|
110
|
+
* reassuring "3 not reachable" under a page that happened to contain three, in a
|
|
111
|
+
* project with forty.
|
|
112
|
+
*
|
|
113
|
+
* Ordering is what makes the FIRST page the useful one: the service sorts
|
|
114
|
+
* most-broken-first (NotReachable, then PartiallyReady, then Ready), so page one
|
|
115
|
+
* of a paged response holds the responders somebody needs to act on, and the
|
|
116
|
+
* rows that fall off the end are the healthy ones.
|
|
117
|
+
*
|
|
118
|
+
* A `limit` above the maximum is REFUSED rather than clamped. Silently returning
|
|
119
|
+
* 500 rows to a caller who asked for 5,000 is precisely the failure this feature
|
|
120
|
+
* exists to prevent - a client cannot tell a short page from a complete list -
|
|
121
|
+
* so the caller is told the ceiling and asked to page.
|
|
122
|
+
*/
|
|
123
|
+
const READINESS_PAGE_SIZE_DEFAULT = 100;
|
|
124
|
+
const READINESS_PAGE_SIZE_MAX = 500;
|
|
125
|
+
/*
|
|
126
|
+
* Digits and nothing else. No sign, no decimal point, no trailing units: a page
|
|
127
|
+
* parameter is a count of rows.
|
|
128
|
+
*/
|
|
129
|
+
const WHOLE_NUMBER = /^\d+$/;
|
|
130
|
+
/*
|
|
131
|
+
* Query parameters are strings from an untrusted caller. parseInt("12abc") is
|
|
132
|
+
* 12 and parseInt("abc") is NaN, and both would otherwise become a page size, so
|
|
133
|
+
* the value is required to be nothing but digits before it is believed.
|
|
134
|
+
*/
|
|
135
|
+
function readPositiveIntegerParam(req, name, fallback) {
|
|
136
|
+
const raw = req.query[name];
|
|
137
|
+
if (raw === undefined || raw === null || raw === "") {
|
|
138
|
+
return fallback;
|
|
139
|
+
}
|
|
140
|
+
if (!WHOLE_NUMBER.test(raw)) {
|
|
141
|
+
throw new BadDataException(`${name} must be a whole number. Received: "${raw}".`);
|
|
142
|
+
}
|
|
143
|
+
return parseInt(raw, 10);
|
|
144
|
+
}
|
|
145
|
+
/*
|
|
146
|
+
* An explicit refresh must actually re-read.
|
|
147
|
+
*
|
|
148
|
+
* The service answers from a 60s in-process cache, which is right for the
|
|
149
|
+
* ordinary case - several surfaces ask the same question on one screen. It is
|
|
150
|
+
* wrong for the one interaction where the user has just CHANGED the answer: a
|
|
151
|
+
* responder verifies a device while an admin watches, the admin presses
|
|
152
|
+
* Recheck, and a cached summary redraws them as still unreachable. The admin
|
|
153
|
+
* concludes the fix did not work.
|
|
154
|
+
*
|
|
155
|
+
* `?refresh=true` drops this replica's cache before recomputing. It is a
|
|
156
|
+
* deliberate, user-initiated cost, and it is bounded by the same authorisation
|
|
157
|
+
* as the read itself, so it cannot be used to force recomputation on a project
|
|
158
|
+
* the caller cannot already read. Each replica clears only its own copy; the
|
|
159
|
+
* TTL remains the only cross-process guarantee.
|
|
160
|
+
*/
|
|
161
|
+
function isRefreshRequested(req) {
|
|
162
|
+
const raw = req.query["refresh"];
|
|
163
|
+
if (raw === undefined || raw === null) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
const normalized = String(raw).trim().toLowerCase();
|
|
167
|
+
return normalized === "true" || normalized === "1";
|
|
168
|
+
}
|
|
169
|
+
function readPageRequest(req) {
|
|
170
|
+
const limit = readPositiveIntegerParam(req, "limit", READINESS_PAGE_SIZE_DEFAULT);
|
|
171
|
+
const skip = readPositiveIntegerParam(req, "skip", 0);
|
|
172
|
+
if (limit < 1 || limit > READINESS_PAGE_SIZE_MAX) {
|
|
173
|
+
throw new BadDataException(`limit must be between 1 and ${READINESS_PAGE_SIZE_MAX}. Ask for the next page with skip instead.`);
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
limit: limit,
|
|
177
|
+
skip: skip,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/*
|
|
181
|
+
* Project membership for the user NAMED IN THE PATH (not the caller). Without
|
|
182
|
+
* this, /on-call-readiness/user/:userId is a cross-project probe: the readiness
|
|
183
|
+
* queries are all projectId-scoped and would come back empty for a stranger,
|
|
184
|
+
* but the summary still carries that stranger's name and login email, read from
|
|
185
|
+
* the User table where no project scoping exists. TeamMember is the membership
|
|
186
|
+
* table for a project - even the creating owner gets a row
|
|
187
|
+
* (ProjectService.ts:1853) - so its absence is a definitive "not in this
|
|
188
|
+
* project".
|
|
189
|
+
*
|
|
190
|
+
* Invitation state is deliberately not part of the query, matching the check
|
|
191
|
+
* OnCallReadinessService.getReadinessForUser makes for the same reason. A user
|
|
192
|
+
* with a pending invitation can already be selected onto an escalation rule, and
|
|
193
|
+
* "is this person reachable?" is exactly the question worth asking about them;
|
|
194
|
+
* requiring hasAcceptedInvitation would refuse the readiness read for the
|
|
195
|
+
* responders most likely to be misconfigured.
|
|
196
|
+
*
|
|
197
|
+
* The rejection reuses assertResourceBelongsToProject's wording verbatim so a
|
|
198
|
+
* caller cannot tell "this user exists but is in another project" apart from
|
|
199
|
+
* "this user does not exist", and therefore cannot enumerate users through it.
|
|
200
|
+
*/
|
|
201
|
+
async function assertUserBelongsToProject(userId, projectId) {
|
|
202
|
+
const memberships = await TeamMemberService.findBy({
|
|
203
|
+
query: {
|
|
204
|
+
userId: userId,
|
|
205
|
+
projectId: projectId,
|
|
206
|
+
},
|
|
207
|
+
select: {
|
|
208
|
+
_id: true,
|
|
209
|
+
},
|
|
210
|
+
limit: 1,
|
|
211
|
+
skip: 0,
|
|
212
|
+
props: {
|
|
213
|
+
isRoot: true,
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
if (memberships.length === 0) {
|
|
217
|
+
throw new NotAuthorizedException("You are not authorized to access this project's data.");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/*
|
|
221
|
+
* Who may make the product send mail in this project's name.
|
|
222
|
+
*
|
|
223
|
+
* The action is "manage on-call", so the granular permission that means exactly
|
|
224
|
+
* that - EditProjectOnCallDutyPolicy, the one that lets somebody change who gets
|
|
225
|
+
* paged - is the permission this asks for. The two project roles and the on-call
|
|
226
|
+
* role are listed ALONGSIDE it rather than being expanded into it because
|
|
227
|
+
* OneUptime's teams hold ROLES, not granular permissions: a project created
|
|
228
|
+
* before this feature existed has an owner whose team carries ProjectOwner and
|
|
229
|
+
* nothing more granular, and a gate that named only the granular permission
|
|
230
|
+
* would lock every existing project's owner out of their own button.
|
|
231
|
+
*
|
|
232
|
+
* Deliberately NOT here:
|
|
233
|
+
*
|
|
234
|
+
* - ProjectMember and Viewer, which is the whole point of the change. Both can
|
|
235
|
+
* read the readiness table, and reading who is unreachable is a different
|
|
236
|
+
* act from mailing them about it under the project's branding.
|
|
237
|
+
* - OnCallMember and OnCallViewer. The on-call tiers below Admin are for
|
|
238
|
+
* people who are ON call, not people who administer it.
|
|
239
|
+
*
|
|
240
|
+
* The read routes keep the membership bar: they disclose configuration to
|
|
241
|
+
* somebody who is already inside the project, which is what the feature is for.
|
|
242
|
+
*/
|
|
243
|
+
const SETUP_REMINDER_PERMISSIONS = [
|
|
244
|
+
Permission.ProjectOwner,
|
|
245
|
+
Permission.ProjectAdmin,
|
|
246
|
+
Permission.OnCallAdmin,
|
|
247
|
+
Permission.EditProjectOnCallDutyPolicy,
|
|
248
|
+
];
|
|
249
|
+
/*
|
|
250
|
+
* The permission check, read the way the rest of the API reads permissions.
|
|
251
|
+
*
|
|
252
|
+
* getUserPermissions(Allow) rather than `userTenantAccessPermission[...]`
|
|
253
|
+
* directly, and that is not a stylistic preference. That dictionary's entries
|
|
254
|
+
* hold GRANTS AND DENIALS in one array, discriminated only by
|
|
255
|
+
* `isBlockPermission`; mapping it raw would count a team's explicit BLOCK of
|
|
256
|
+
* ProjectAdmin as a grant of ProjectAdmin, so the admin action that restricts a
|
|
257
|
+
* team would be the thing that handed it this endpoint. The helper filters by
|
|
258
|
+
* type and scopes to props.tenantId, which is the same project
|
|
259
|
+
* assertAuthenticatedProjectMember just authorised the caller for.
|
|
260
|
+
*
|
|
261
|
+
* The refusal reuses the router's single refusal sentence verbatim, so an
|
|
262
|
+
* under-privileged member cannot tell "you may not do this" apart from "you are
|
|
263
|
+
* not in this project" and use the difference to probe.
|
|
264
|
+
*/
|
|
265
|
+
function assertCanSendSetupReminders(databaseProps) {
|
|
266
|
+
if (databaseProps.isMasterAdmin) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const permissions = DatabaseCommonInteractionPropsUtil.getUserPermissions(databaseProps, PermissionType.Allow).map((userPermission) => {
|
|
270
|
+
return userPermission.permission;
|
|
271
|
+
});
|
|
272
|
+
const isAllowed = permissions.some((permission) => {
|
|
273
|
+
return SETUP_REMINDER_PERMISSIONS.includes(permission);
|
|
274
|
+
});
|
|
275
|
+
if (!isAllowed) {
|
|
276
|
+
throw new NotAuthorizedException("You are not authorized to access this project's data.");
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/*
|
|
280
|
+
* ObjectID's constructor accepts any string, so an unparseable path segment
|
|
281
|
+
* would otherwise travel all the way to a query that matches nothing and read
|
|
282
|
+
* as "this policy has no responders" rather than "you sent nonsense".
|
|
283
|
+
*/
|
|
284
|
+
function readObjectIdParam(req, name) {
|
|
285
|
+
const raw = req.params[name] || "";
|
|
286
|
+
ObjectID.validateUUID(raw);
|
|
287
|
+
return new ObjectID(raw);
|
|
288
|
+
}
|
|
289
|
+
/*
|
|
290
|
+
* The `userIds` array from a POST body, validated before it is believed.
|
|
291
|
+
*
|
|
292
|
+
* A request body is a bag of JSON from an untrusted caller, so every layer of
|
|
293
|
+
* this is checked rather than asserted: that the field is there, that it is an
|
|
294
|
+
* array, that each element is a string, and that each string is a UUID.
|
|
295
|
+
* ObjectID's constructor accepts ANY string, so skipping the last check would
|
|
296
|
+
* push arbitrary caller text into a database query - and, in this case, into the
|
|
297
|
+
* "not a member of this project" branch of a mail-sending service, where it
|
|
298
|
+
* would look exactly like an ordinary stale id rather than like nonsense.
|
|
299
|
+
*
|
|
300
|
+
* The ceiling is enforced in the service rather than here, because the service
|
|
301
|
+
* is what the ceiling protects and it must hold for every caller. This route
|
|
302
|
+
* only has to hand it a well-formed list.
|
|
303
|
+
*/
|
|
304
|
+
function readUserIdsFromBody(req) {
|
|
305
|
+
const body = (req.body || {});
|
|
306
|
+
const raw = body["userIds"];
|
|
307
|
+
if (!Array.isArray(raw)) {
|
|
308
|
+
throw new BadDataException("userIds is required and must be an array of user ids.");
|
|
309
|
+
}
|
|
310
|
+
return raw.map((value) => {
|
|
311
|
+
if (typeof value !== "string") {
|
|
312
|
+
throw new BadDataException("Every entry in userIds must be a user id string.");
|
|
313
|
+
}
|
|
314
|
+
ObjectID.validateUUID(value);
|
|
315
|
+
return new ObjectID(value);
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
/*
|
|
319
|
+
* ObjectID.toJSON() serialises to `{ _type: "ObjectID", value: "..." }`, which
|
|
320
|
+
* is right for model payloads the client parses back through JSONFunctions but
|
|
321
|
+
* wrong for a hand-rolled response body. These serialisers flatten every id to
|
|
322
|
+
* a plain string, the same way TeamComplianceAPI does, so the browser can read
|
|
323
|
+
* `userId` without knowing about ObjectID at all.
|
|
324
|
+
*/
|
|
325
|
+
function serializeMethod(method) {
|
|
326
|
+
return {
|
|
327
|
+
/*
|
|
328
|
+
* The id of the METHOD ROW, flattened like every other id here.
|
|
329
|
+
*
|
|
330
|
+
* It is not sensitive - it is already the foreign key stored on any rule its
|
|
331
|
+
* owner created - and it is the whole reason an administrator can POINT A
|
|
332
|
+
* RULE AT a method without READING that method's row. The seven method
|
|
333
|
+
* models stay scoped to their owner precisely so the raw phone number,
|
|
334
|
+
* webhook url, device token and chat id behind them never leave the server;
|
|
335
|
+
* the dropdown an admin uses is built from this id plus the mask below.
|
|
336
|
+
*
|
|
337
|
+
* Dropping it does not fail loudly. The payload still looks well-formed and
|
|
338
|
+
* the readiness page still renders - only the admin's rule form quietly has
|
|
339
|
+
* nothing to submit. A merge did exactly that, which is why the API test
|
|
340
|
+
* asserts this field's presence and that it is the METHOD row's id rather
|
|
341
|
+
* than the user's or the rule's.
|
|
342
|
+
*/
|
|
343
|
+
methodId: method.methodId.toString(),
|
|
344
|
+
methodType: method.methodType,
|
|
345
|
+
// Masked upstream. Never widened here, for any caller, including self.
|
|
346
|
+
maskedIdentifier: method.maskedIdentifier,
|
|
347
|
+
isVerified: method.isVerified,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
function serializeCoverageCell(cell) {
|
|
351
|
+
return {
|
|
352
|
+
ruleType: cell.ruleType,
|
|
353
|
+
/*
|
|
354
|
+
* Undefined rather than absent for the two go-on-call / go-off-call rule
|
|
355
|
+
* types, which are not per-severity at all. The client renders one row per
|
|
356
|
+
* cell and needs to be able to tell "this cell has no severity" from "the
|
|
357
|
+
* severity failed to load".
|
|
358
|
+
*/
|
|
359
|
+
severityId: cell.severityId ? cell.severityId.toString() : undefined,
|
|
360
|
+
severityName: cell.severityName,
|
|
361
|
+
hasRule: cell.hasRule,
|
|
362
|
+
isOptOut: cell.isOptOut,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
function serializeUserReadiness(readiness) {
|
|
366
|
+
return {
|
|
367
|
+
userId: readiness.userId.toString(),
|
|
368
|
+
userName: readiness.userName,
|
|
369
|
+
userEmail: readiness.userEmail,
|
|
370
|
+
userProfilePictureId: readiness.userProfilePictureId
|
|
371
|
+
? readiness.userProfilePictureId.toString()
|
|
372
|
+
: undefined,
|
|
373
|
+
status: readiness.status,
|
|
374
|
+
methods: readiness.methods.map(serializeMethod),
|
|
375
|
+
coverage: readiness.coverage.map(serializeCoverageCell),
|
|
376
|
+
reasons: readiness.reasons,
|
|
377
|
+
reachedVia: readiness.reachedVia,
|
|
378
|
+
/*
|
|
379
|
+
* The teams that page this responder, ids flattened to strings like every other id
|
|
380
|
+
* here. A team name is already readable by any project member through the team list,
|
|
381
|
+
* so nothing is disclosed by naming it — and naming it is what lets the readiness
|
|
382
|
+
* table offer a team filter whose options a reader can actually recognise.
|
|
383
|
+
*/
|
|
384
|
+
teams: readiness.teams.map((team) => {
|
|
385
|
+
return {
|
|
386
|
+
_id: team._id.toString(),
|
|
387
|
+
name: team.name,
|
|
388
|
+
};
|
|
389
|
+
}),
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
/*
|
|
393
|
+
* One page of a summary. `users` is sliced; nothing else is. See
|
|
394
|
+
* READINESS_PAGE_SIZE_DEFAULT for why the counts stay whole-scope.
|
|
395
|
+
*/
|
|
396
|
+
function serializeSummaryPage(summary, page) {
|
|
397
|
+
const totalCount = summary.users.length;
|
|
398
|
+
const pagedUsers = summary.users.slice(page.skip, page.skip + page.limit);
|
|
399
|
+
const wire = {
|
|
400
|
+
projectId: summary.projectId.toString(),
|
|
401
|
+
onCallDutyPolicyId: summary.onCallDutyPolicyId
|
|
402
|
+
? summary.onCallDutyPolicyId.toString()
|
|
403
|
+
: undefined,
|
|
404
|
+
readyCount: summary.readyCount,
|
|
405
|
+
partiallyReadyCount: summary.partiallyReadyCount,
|
|
406
|
+
notReachableCount: summary.notReachableCount,
|
|
407
|
+
/*
|
|
408
|
+
* Both of these are facts about the SCOPE, so they are copied onto every
|
|
409
|
+
* page of it rather than onto the first. A client that fetched page two
|
|
410
|
+
* would otherwise be told the answer is complete and the fallback is on.
|
|
411
|
+
*/
|
|
412
|
+
isFallbackEnabled: summary.isFallbackEnabled,
|
|
413
|
+
isTruncated: summary.isTruncated,
|
|
414
|
+
totalCount: totalCount,
|
|
415
|
+
limit: page.limit,
|
|
416
|
+
skip: page.skip,
|
|
417
|
+
/*
|
|
418
|
+
* Stated rather than left to be derived. `skip + users.length < totalCount`
|
|
419
|
+
* is the same arithmetic, but a client that gets it slightly wrong stops
|
|
420
|
+
* paging one page early and silently drops responders - which is the exact
|
|
421
|
+
* failure mode paging was introduced to avoid.
|
|
422
|
+
*/
|
|
423
|
+
hasMore: page.skip + pagedUsers.length < totalCount,
|
|
424
|
+
users: pagedUsers.map(serializeUserReadiness),
|
|
425
|
+
};
|
|
426
|
+
return wire;
|
|
427
|
+
}
|
|
428
|
+
/*
|
|
429
|
+
* Per user, always - even when everything worked.
|
|
430
|
+
*
|
|
431
|
+
* The counts alone would be enough to render "5 sent, 2 skipped, 1 failed", and
|
|
432
|
+
* that sentence is already far better than a tick. The array is here for the
|
|
433
|
+
* next question the reader has, which is "which one failed?" - and answering
|
|
434
|
+
* that from the client requires the outcome to be attached to an id it can match
|
|
435
|
+
* against the row the admin ticked.
|
|
436
|
+
*
|
|
437
|
+
* `outcome` is the enum's own string, not a boolean or a status code, because
|
|
438
|
+
* the four ways of not being sent are four different things to do next and a UI
|
|
439
|
+
* that cannot tell them apart ends up saying "3 skipped" with no explanation of
|
|
440
|
+
* why - which reads as a malfunction rather than as a throttle working.
|
|
441
|
+
*
|
|
442
|
+
* No user name or address is echoed back. The client already holds both from the
|
|
443
|
+
* readiness payload it was rendering when the admin made the selection, so
|
|
444
|
+
* repeating them here would widen what this endpoint discloses in exchange for
|
|
445
|
+
* nothing.
|
|
446
|
+
*/
|
|
447
|
+
function serializeSetupReminderUserResult(result) {
|
|
448
|
+
return {
|
|
449
|
+
userId: result.userId.toString(),
|
|
450
|
+
outcome: result.outcome,
|
|
451
|
+
message: result.message,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
function serializeSetupReminderResult(result) {
|
|
455
|
+
const wire = {
|
|
456
|
+
projectId: result.projectId.toString(),
|
|
457
|
+
requestedCount: result.requestedCount,
|
|
458
|
+
sentCount: result.sentCount,
|
|
459
|
+
skippedCount: result.skippedCount,
|
|
460
|
+
failedCount: result.failedCount,
|
|
461
|
+
results: result.results.map(serializeSetupReminderUserResult),
|
|
462
|
+
};
|
|
463
|
+
return wire;
|
|
464
|
+
}
|
|
465
|
+
/*
|
|
466
|
+
* Readiness for one policy's effective responder set - direct users, team
|
|
467
|
+
* members, schedule-layer users and overrides alike. This is what the policy
|
|
468
|
+
* overview card and the coloured dots on the escalation-rule responder chips
|
|
469
|
+
* read.
|
|
470
|
+
*
|
|
471
|
+
* Paged: `?limit=&skip=`. The chips surface asks about specific responders, so a
|
|
472
|
+
* policy with more responders than one page holds must be paged through before
|
|
473
|
+
* every chip can be dotted - a chip whose user is not in the page it has must
|
|
474
|
+
* render as unknown rather than as ready.
|
|
475
|
+
*/
|
|
476
|
+
router.get("/on-call-readiness/policy/:policyId", UserMiddleware.getUserMiddleware, async (req, res, next) => {
|
|
477
|
+
try {
|
|
478
|
+
const databaseProps = await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
479
|
+
const projectId = CommonAPI.assertAuthenticatedProjectMember(databaseProps);
|
|
480
|
+
if (isRefreshRequested(req)) {
|
|
481
|
+
OnCallReadinessService.clearCache();
|
|
482
|
+
}
|
|
483
|
+
const policyId = readObjectIdParam(req, "policyId");
|
|
484
|
+
const page = readPageRequest(req);
|
|
485
|
+
/*
|
|
486
|
+
* The policy id arrives from the caller and the readiness read below runs
|
|
487
|
+
* as root, so the policy's OWN projectId - not the header - is what has to
|
|
488
|
+
* agree with the project the caller was authorised for.
|
|
489
|
+
*/
|
|
490
|
+
const policy = await OnCallDutyPolicyService.findOneById({
|
|
491
|
+
id: policyId,
|
|
492
|
+
select: {
|
|
493
|
+
projectId: true,
|
|
494
|
+
},
|
|
495
|
+
props: {
|
|
496
|
+
isRoot: true,
|
|
497
|
+
},
|
|
498
|
+
});
|
|
499
|
+
CommonAPI.assertResourceBelongsToProject({
|
|
500
|
+
resourceProjectId: policy === null || policy === void 0 ? void 0 : policy.projectId,
|
|
501
|
+
projectId: projectId,
|
|
502
|
+
});
|
|
503
|
+
const summary = await OnCallReadinessService.getReadinessForPolicy(policyId, projectId);
|
|
504
|
+
return Response.sendJsonObjectResponse(req, res, serializeSummaryPage(summary, page));
|
|
505
|
+
}
|
|
506
|
+
catch (err) {
|
|
507
|
+
next(err);
|
|
508
|
+
}
|
|
509
|
+
});
|
|
510
|
+
/*
|
|
511
|
+
* Readiness across every policy in the project. Backs the On-Call > Readiness
|
|
512
|
+
* page and the section banner. The project comes from the `tenantid` header
|
|
513
|
+
* rather than the path, which is why assertAuthenticatedProjectMember - which
|
|
514
|
+
* checks the caller against that very header - is the whole authorisation story
|
|
515
|
+
* for this route.
|
|
516
|
+
*
|
|
517
|
+
* Paged: `?limit=&skip=`. This is the widest scope in the product - every
|
|
518
|
+
* responder on every policy - so it is the route that would otherwise serialise
|
|
519
|
+
* a whole project's coverage grid into one response.
|
|
520
|
+
*/
|
|
521
|
+
router.get("/on-call-readiness/project", UserMiddleware.getUserMiddleware, async (req, res, next) => {
|
|
522
|
+
try {
|
|
523
|
+
const databaseProps = await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
524
|
+
const projectId = CommonAPI.assertAuthenticatedProjectMember(databaseProps);
|
|
525
|
+
if (isRefreshRequested(req)) {
|
|
526
|
+
OnCallReadinessService.clearCache();
|
|
527
|
+
}
|
|
528
|
+
const page = readPageRequest(req);
|
|
529
|
+
const summary = await OnCallReadinessService.getReadinessForProject(projectId);
|
|
530
|
+
return Response.sendJsonObjectResponse(req, res, serializeSummaryPage(summary, page));
|
|
531
|
+
}
|
|
532
|
+
catch (err) {
|
|
533
|
+
next(err);
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
/*
|
|
537
|
+
* Readiness for a single responder. Used by the add-responder modal, which asks
|
|
538
|
+
* about a user the moment they are picked - before they are on any policy, so
|
|
539
|
+
* this route deliberately does not require the user to be on one.
|
|
540
|
+
*/
|
|
541
|
+
router.get("/on-call-readiness/user/:userId", UserMiddleware.getUserMiddleware, async (req, res, next) => {
|
|
542
|
+
try {
|
|
543
|
+
const databaseProps = await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
544
|
+
const projectId = CommonAPI.assertAuthenticatedProjectMember(databaseProps);
|
|
545
|
+
if (isRefreshRequested(req)) {
|
|
546
|
+
OnCallReadinessService.clearCache();
|
|
547
|
+
}
|
|
548
|
+
const userId = readObjectIdParam(req, "userId");
|
|
549
|
+
await assertUserBelongsToProject(userId, projectId);
|
|
550
|
+
const readiness = await OnCallReadinessService.getReadinessForUser(userId, projectId);
|
|
551
|
+
return Response.sendJsonObjectResponse(req, res, serializeUserReadiness(readiness));
|
|
552
|
+
}
|
|
553
|
+
catch (err) {
|
|
554
|
+
next(err);
|
|
555
|
+
}
|
|
556
|
+
});
|
|
557
|
+
/*
|
|
558
|
+
* Ask a set of responders to finish their own notification setup.
|
|
559
|
+
*
|
|
560
|
+
* The only WRITE on this router, and the only thing in the readiness feature
|
|
561
|
+
* that reaches outside the product. It exists because the gaps this feature
|
|
562
|
+
* reports are not gaps an admin can close: a notification method lives on the
|
|
563
|
+
* responder's own account and has to be verified by them, so "tell them" is
|
|
564
|
+
* genuinely the whole of the available fix.
|
|
565
|
+
*
|
|
566
|
+
* Everything about who is mailed, what the mail says and whether it is sent at
|
|
567
|
+
* all belongs to OnCallSetupReminderService - including the re-check that each
|
|
568
|
+
* id is a member of this project, which is duplicated there on purpose so the
|
|
569
|
+
* service is safe for any caller and not only for this route.
|
|
570
|
+
*
|
|
571
|
+
* Two gates, in this order: membership (which project is this, and is the caller
|
|
572
|
+
* in it) and then permission (may they act in it). Both run before the body is
|
|
573
|
+
* read, because a route that validates a payload for a caller it is about to
|
|
574
|
+
* refuse has told that caller something about the payload format.
|
|
575
|
+
*
|
|
576
|
+
* The response is a PER-USER array, never a bare success. A caller that ticked
|
|
577
|
+
* eight responders and got a 200 back has no idea that two were reminded this
|
|
578
|
+
* morning and one has no address on file, and a UI that renders a green tick
|
|
579
|
+
* over that has told its user something false about whether a page will reach
|
|
580
|
+
* somebody. See serializeSetupReminderResult.
|
|
581
|
+
*/
|
|
582
|
+
router.post("/on-call-readiness/send-setup-reminder", UserMiddleware.getUserMiddleware, async (req, res, next) => {
|
|
583
|
+
try {
|
|
584
|
+
const databaseProps = await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
585
|
+
const projectId = CommonAPI.assertAuthenticatedProjectMember(databaseProps);
|
|
586
|
+
assertCanSendSetupReminders(databaseProps);
|
|
587
|
+
const userIds = readUserIdsFromBody(req);
|
|
588
|
+
const result = await OnCallSetupReminderService.sendSetupReminders({
|
|
589
|
+
projectId: projectId,
|
|
590
|
+
userIds: userIds,
|
|
591
|
+
});
|
|
592
|
+
return Response.sendJsonObjectResponse(req, res, serializeSetupReminderResult(result));
|
|
593
|
+
}
|
|
594
|
+
catch (err) {
|
|
595
|
+
next(err);
|
|
596
|
+
}
|
|
597
|
+
});
|
|
598
|
+
export default router;
|
|
599
|
+
//# sourceMappingURL=OnCallReadinessAPI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnCallReadinessAPI.js","sourceRoot":"","sources":["../../../../Server/API/OnCallReadinessAPI.ts"],"names":[],"mappings":"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"}
|