@oneuptime/common 12.0.29 → 12.0.31
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/SecurityEvent.ts +48 -16
- package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
- package/Models/DatabaseModels/AlertSeverity.ts +44 -0
- package/Models/DatabaseModels/DetectionRule.ts +16 -5
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
- package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
- package/Models/DatabaseModels/Index.ts +13 -0
- package/Models/DatabaseModels/NetworkDevice.ts +113 -3
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
- package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +499 -0
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +43 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +662 -0
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +584 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +546 -0
- package/Models/DatabaseModels/UserOnCallShiftReminder.ts +231 -0
- package/Models/DatabaseModels/UserOnCallShiftReminderLog.ts +331 -0
- package/Server/API/GlobalConfigAPI.ts +362 -183
- package/Server/API/OnCallCalendarAPI.ts +2194 -0
- package/Server/API/TelemetryAPI.ts +42 -4
- package/Server/EnvironmentConfig.ts +250 -0
- package/Server/Infrastructure/OnCallCalendarFeedCache.ts +1050 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.ts +253 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/MultipartFormData.ts +118 -32
- package/Server/Middleware/OnCallCalendarFeedRateLimit.ts +487 -0
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertGroupingEngineService.ts +9 -1
- package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertReminderRuleService.ts +9 -1
- package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
- package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/HostLabelRuleEngineService.ts +9 -1
- package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentGroupingEngineService.ts +9 -1
- package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentReminderRuleService.ts +9 -1
- package/Server/Services/IncidentSlaRuleService.ts +9 -1
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/Index.ts +14 -0
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesResourceService.ts +5 -1
- package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
- package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceService.ts +209 -1
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +32 -0
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.ts +260 -0
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleLayerService.ts +70 -3
- package/Server/Services/OnCallDutyPolicyScheduleLayerUserService.ts +138 -3
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +1465 -134
- package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +167 -31
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ProjectOnCallCalendarFeedService.ts +192 -0
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
- package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
- package/Server/Services/TeamMemberService.ts +489 -1
- package/Server/Services/TeamService.ts +50 -0
- package/Server/Services/TelemetrySourceMapService.ts +266 -23
- package/Server/Services/UserNotificationSettingService.ts +44 -1
- package/Server/Services/UserOnCallCalendarFeedService.ts +159 -0
- package/Server/Services/UserOnCallShiftReminderLogService.ts +151 -0
- package/Server/Services/UserOnCallShiftReminderService.ts +112 -0
- package/Server/Services/UserService.ts +27 -0
- package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
- package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
- package/Server/Utils/OnCall/CalendarFeedToken.ts +241 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1488 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedUrls.ts +230 -0
- package/Server/Utils/OnCall/OnCallShiftChangeListeners.ts +227 -0
- package/Server/Utils/OnCall/OnCallShiftMaterializer.ts +1127 -0
- package/Server/Utils/OnCall/OnCallShiftReminderListener.ts +174 -0
- package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +2584 -0
- package/Server/Utils/Response.ts +134 -0
- package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
- package/Server/Utils/StartServer.ts +10 -0
- package/Server/Utils/Telemetry/AppMetrics.ts +51 -0
- package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
- package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
- package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
- package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
- package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
- package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedLinks.test.tsx +229 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +489 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +149 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedUtil.test.ts +855 -0
- package/Tests/App/Dashboard/OnCallPersonalCalendarFeed.test.tsx +1209 -0
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
- package/Tests/App/Dashboard/OnCallSharedCalendarFeedCard.test.tsx +1019 -0
- package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +655 -0
- package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
- package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +73 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
- package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +469 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +642 -0
- package/Tests/Models/OnCallDutyPolicyScheduleCalendarFeed.test.ts +288 -0
- package/Tests/Models/OnCallDutyPolicyScheduleShiftConfigVersion.test.ts +88 -0
- package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
- package/Tests/Models/UserOnCallShiftReminderModels.test.ts +368 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
- package/Tests/Server/API/Helpers.ts +8 -0
- package/Tests/Server/API/OnCallCalendarAPI.test.ts +4461 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
- package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
- package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +357 -0
- package/Tests/Server/Infrastructure/OnCallCalendarFeedCache.test.ts +1589 -0
- package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +394 -0
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
- package/Tests/Server/Middleware/OnCallCalendarFeedRateLimit.test.ts +1365 -0
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +70 -0
- package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
- package/Tests/Server/Services/OnCallCalendarFeedServices.test.ts +1103 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleResolver.test.ts +1037 -0
- package/Tests/Server/Services/OnCallShiftConfigPropagation.test.ts +1270 -0
- package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
- package/Tests/Server/Services/TeamDeleteMemberCleanup.test.ts +156 -0
- package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +755 -0
- package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
- package/Tests/Server/Services/UserNotificationSettingShiftReminderDefaults.test.ts +267 -0
- package/Tests/Server/Services/UserOnCallShiftReminderServices.test.ts +583 -0
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
- package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
- package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +254 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
- package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
- package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
- package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
- package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
- package/Tests/Server/Utils/OnCall/CalendarFeedToken.test.ts +467 -0
- package/Tests/Server/Utils/OnCall/OnCallCalendarFeedRenderer.test.ts +2142 -0
- package/Tests/Server/Utils/OnCall/OnCallCalendarFeedUrls.test.ts +278 -0
- package/Tests/Server/Utils/OnCall/OnCallResolverTestHarness.ts +440 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftChangeListeners.test.ts +314 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftMaterializer.test.ts +1502 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderListener.test.ts +491 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderRunner.test.ts +3088 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderTestHarness.ts +910 -0
- package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
- package/Tests/Server/Utils/ResponseSendCalendarResponse.test.ts +561 -0
- package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
- package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
- package/Tests/Server/Utils/StartServerEncryptionSecretWarning.test.ts +64 -0
- package/Tests/Server/Utils/Telemetry/AppMetrics.test.ts +29 -0
- package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
- package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
- package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
- package/Tests/Types/Calendar/ICalendar.test.ts +488 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
- package/Tests/Types/NotificationSetting/NotificationSettingEventType.test.ts +53 -0
- package/Tests/Types/OnCallDutyPolicy/CalendarFeedTestFixtures.ts +310 -0
- package/Tests/Types/OnCallDutyPolicy/CalendarFeedWindow.test.ts +205 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilLayerMetaAndIterationCap.test.ts +458 -0
- package/Tests/Types/OnCallDutyPolicy/MaterializedShift.test.ts +197 -0
- package/Tests/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.test.ts +1986 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleShiftUtilGroupKey.test.ts +678 -0
- package/Tests/Types/OnCallDutyPolicy/ShiftSeamUtil.test.ts +417 -0
- package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
- package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
- package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
- package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
- package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
- package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
- package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
- package/Tests/UI/Components/XAxis.test.ts +270 -5
- package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
- package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
- package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
- package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
- package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
- package/Types/Calendar/ICalendar.ts +442 -0
- package/Types/Date.ts +39 -0
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
- package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
- package/Types/OnCallDutyPolicy/CalendarFeedWindow.ts +140 -0
- package/Types/OnCallDutyPolicy/Layer.ts +190 -35
- package/Types/OnCallDutyPolicy/MaterializedShift.ts +274 -0
- package/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.ts +1415 -0
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +159 -4
- package/Types/OnCallDutyPolicy/ShiftSeamUtil.ts +106 -0
- package/Types/Permission.ts +96 -0
- package/Types/Rum/SessionReplay.ts +21 -0
- package/Types/Telemetry/SourceMap.ts +8 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +491 -544
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +324 -372
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +487 -540
- package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
- package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
- package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
- package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
- package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
- package/UI/Components/Charts/Utils/XAxis.ts +125 -18
- package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
- package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
- package/UI/Components/Feed/FeedItem.tsx +4 -5
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
- package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
- package/UI/Components/Image/Image.tsx +20 -3
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +150 -24
- package/UI/Components/Table/TableHeader.tsx +64 -48
- package/UI/Components/Table/TableRow.tsx +13 -3
- package/UI/Styles/Theme.css +38 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
- package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
- package/Utils/Rules/RuleEngineLimits.ts +32 -0
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +13 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +115 -3
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +519 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +44 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +699 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +620 -0
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +585 -0
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js +247 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js +355 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js.map +1 -0
- package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallCalendarAPI.js +1371 -0
- package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -0
- package/build/dist/Server/API/TelemetryAPI.js +31 -3
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +185 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js +663 -0
- package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js +103 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js +342 -0
- package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +14 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
- package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +20 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js +219 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js +47 -3
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js +112 -3
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +955 -9
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +93 -6
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js +157 -0
- package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +396 -1
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamService.js +43 -0
- package/build/dist/Server/Services/TeamService.js.map +1 -1
- package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
- package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +26 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserOnCallCalendarFeedService.js +140 -0
- package/build/dist/Server/Services/UserOnCallCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js +116 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js.map +1 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderService.js +92 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderService.js.map +1 -0
- package/build/dist/Server/Services/UserService.js +25 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js +161 -0
- package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js +983 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js +155 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js +145 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js +752 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js +92 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1786 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -0
- package/build/dist/Server/Utils/Response.js +97 -0
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +9 -1
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js +41 -0
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
- package/build/dist/Types/Calendar/ICalendar.js +290 -0
- package/build/dist/Types/Calendar/ICalendar.js.map +1 -0
- package/build/dist/Types/Date.js +27 -0
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +2 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js +97 -0
- package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/Layer.js +113 -19
- package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js +134 -0
- package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js +800 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +97 -3
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js +77 -0
- package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js.map +1 -0
- package/build/dist/Types/Permission.js +86 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +19 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +213 -233
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +139 -152
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +212 -232
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
- package/build/dist/UI/Components/Image/Image.js +6 -1
- package/build/dist/UI/Components/Image/Image.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +104 -23
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Table/TableHeader.js +20 -22
- package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +13 -4
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
- package/jest.config.json +1 -0
- package/package.json +2 -2
|
@@ -40,6 +40,8 @@ import OnCallDutyPolicyScheduleLabelRuleEngineService from "./OnCallDutyPolicySc
|
|
|
40
40
|
import OnCallDutyPolicyScheduleOwnerRuleEngineService from "./OnCallDutyPolicyScheduleOwnerRuleEngineService";
|
|
41
41
|
import PushNotificationUtil from "../Utils/PushNotificationUtil";
|
|
42
42
|
import { createWhatsAppMessageFromTemplate } from "../Utils/WhatsAppTemplateUtil";
|
|
43
|
+
import OnCallCalendarFeedCache from "../Infrastructure/OnCallCalendarFeedCache";
|
|
44
|
+
import OnCallShiftChangeListeners, { OnCallShiftChangeReason, } from "../Utils/OnCall/OnCallShiftChangeListeners";
|
|
43
45
|
export class Service extends DatabaseService {
|
|
44
46
|
constructor() {
|
|
45
47
|
super(OnCallDutyPolicySchedule);
|
|
@@ -89,11 +91,145 @@ export class Service extends DatabaseService {
|
|
|
89
91
|
});
|
|
90
92
|
});
|
|
91
93
|
}
|
|
94
|
+
/*
|
|
95
|
+
* Capture the members of each schedule being deleted. Their layer-user
|
|
96
|
+
* rows cascade away at the database level (no hooks run), so this is the
|
|
97
|
+
* last moment the ids are available; onDeleteSuccess uses them to purge
|
|
98
|
+
* those users' calendar-feed bodies and to tell the shift-change
|
|
99
|
+
* listeners whose shift lists just changed. Best-effort.
|
|
100
|
+
*/
|
|
101
|
+
const deletedSchedules = [];
|
|
102
|
+
try {
|
|
103
|
+
const scheduleIds = callSchedules
|
|
104
|
+
.map((schedule) => {
|
|
105
|
+
return schedule.id;
|
|
106
|
+
})
|
|
107
|
+
.filter((id) => {
|
|
108
|
+
return Boolean(id);
|
|
109
|
+
});
|
|
110
|
+
const layerUsers = scheduleIds.length > 0
|
|
111
|
+
? await OnCallDutyPolicyScheduleLayerUserService.findBy({
|
|
112
|
+
query: {
|
|
113
|
+
onCallDutyPolicyScheduleId: QueryHelper.any(scheduleIds),
|
|
114
|
+
},
|
|
115
|
+
select: {
|
|
116
|
+
userId: true,
|
|
117
|
+
onCallDutyPolicyScheduleId: true,
|
|
118
|
+
},
|
|
119
|
+
limit: LIMIT_PER_PROJECT,
|
|
120
|
+
skip: 0,
|
|
121
|
+
props: {
|
|
122
|
+
isRoot: true,
|
|
123
|
+
},
|
|
124
|
+
})
|
|
125
|
+
: [];
|
|
126
|
+
for (const schedule of callSchedules) {
|
|
127
|
+
if (!schedule.id) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const scheduleIdString = schedule.id.toString();
|
|
131
|
+
deletedSchedules.push({
|
|
132
|
+
scheduleId: schedule.id,
|
|
133
|
+
projectId: schedule.projectId || null,
|
|
134
|
+
userIds: OnCallShiftChangeListeners.dedupe(layerUsers
|
|
135
|
+
.filter((layerUser) => {
|
|
136
|
+
var _a;
|
|
137
|
+
return (((_a = layerUser.onCallDutyPolicyScheduleId) === null || _a === void 0 ? void 0 : _a.toString()) ===
|
|
138
|
+
scheduleIdString);
|
|
139
|
+
})
|
|
140
|
+
.map((layerUser) => {
|
|
141
|
+
return layerUser.userId;
|
|
142
|
+
})
|
|
143
|
+
.filter((id) => {
|
|
144
|
+
return Boolean(id);
|
|
145
|
+
})),
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
logger.error("Error capturing schedule members before delete (best-effort).");
|
|
151
|
+
logger.error(err);
|
|
152
|
+
}
|
|
92
153
|
return {
|
|
93
154
|
deleteBy: deleteBy,
|
|
94
|
-
carryForward: {},
|
|
155
|
+
carryForward: { deletedSchedules },
|
|
95
156
|
};
|
|
96
157
|
}
|
|
158
|
+
/*
|
|
159
|
+
* A deleted schedule takes its shared feed with it (FK cascade) and drops
|
|
160
|
+
* out of its members' personal feeds; purge what was rendered from it and
|
|
161
|
+
* let the shift-change listeners (reminders) re-plan for those users. No
|
|
162
|
+
* version bump — the row is gone.
|
|
163
|
+
*/
|
|
164
|
+
async onDeleteSuccess(onDelete, _itemIdsBeforeDelete) {
|
|
165
|
+
var _a;
|
|
166
|
+
const deletedSchedules = ((_a = onDelete.carryForward) === null || _a === void 0 ? void 0 : _a.deletedSchedules) || [];
|
|
167
|
+
for (const deleted of deletedSchedules) {
|
|
168
|
+
await this.propagateShiftConfigChange({
|
|
169
|
+
scheduleIds: [deleted.scheduleId],
|
|
170
|
+
projectId: deleted.projectId,
|
|
171
|
+
userIds: deleted.userIds,
|
|
172
|
+
reason: OnCallShiftChangeReason.ScheduleDeleted,
|
|
173
|
+
skipVersionBump: true,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return onDelete;
|
|
177
|
+
}
|
|
178
|
+
/*
|
|
179
|
+
* A rename or a timezone change alters every calendar event of the
|
|
180
|
+
* schedule (its title, and for a timezone change the instants themselves),
|
|
181
|
+
* so it must bump the schedule's shiftConfigVersion like any other
|
|
182
|
+
* configuration edit. The roster refresh writes through updateOneById with
|
|
183
|
+
* ignoreHooks, and the version bump itself is a raw statement, so neither
|
|
184
|
+
* re-enters this hook.
|
|
185
|
+
*/
|
|
186
|
+
async onUpdateSuccess(onUpdate, updatedItemIds) {
|
|
187
|
+
var _a, _b;
|
|
188
|
+
const data = (((_a = onUpdate.updateBy) === null || _a === void 0 ? void 0 : _a.data) ||
|
|
189
|
+
{});
|
|
190
|
+
const touchesShiftConfiguration = data["name"] !== undefined || data["timezone"] !== undefined;
|
|
191
|
+
if (!touchesShiftConfiguration || updatedItemIds.length === 0) {
|
|
192
|
+
return onUpdate;
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
const schedules = await this.findBy({
|
|
196
|
+
query: {
|
|
197
|
+
_id: QueryHelper.any(updatedItemIds),
|
|
198
|
+
},
|
|
199
|
+
select: {
|
|
200
|
+
_id: true,
|
|
201
|
+
projectId: true,
|
|
202
|
+
},
|
|
203
|
+
limit: LIMIT_PER_PROJECT,
|
|
204
|
+
skip: 0,
|
|
205
|
+
props: {
|
|
206
|
+
isRoot: true,
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
const byProject = new Map();
|
|
210
|
+
for (const schedule of schedules) {
|
|
211
|
+
if (!schedule.id) {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
const projectKey = ((_b = schedule.projectId) === null || _b === void 0 ? void 0 : _b.toString()) || "";
|
|
215
|
+
const list = byProject.get(projectKey) || [];
|
|
216
|
+
list.push(schedule.id);
|
|
217
|
+
byProject.set(projectKey, list);
|
|
218
|
+
}
|
|
219
|
+
for (const [projectKey, scheduleIds] of byProject) {
|
|
220
|
+
await this.propagateShiftConfigChange({
|
|
221
|
+
scheduleIds,
|
|
222
|
+
projectId: projectKey ? new ObjectID(projectKey) : null,
|
|
223
|
+
reason: OnCallShiftChangeReason.ScheduleChanged,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
logger.error("Error propagating a schedule rename / timezone change to the calendar feeds (best-effort).");
|
|
229
|
+
logger.error(err);
|
|
230
|
+
}
|
|
231
|
+
return onUpdate;
|
|
232
|
+
}
|
|
97
233
|
async getOnCallSchedulesWhereUserIsOnCallDuty(data) {
|
|
98
234
|
const schedules = await this.findBy({
|
|
99
235
|
query: {
|
|
@@ -895,7 +1031,7 @@ export class Service extends DatabaseService {
|
|
|
895
1031
|
}
|
|
896
1032
|
async getScheduleLayerProps(data) {
|
|
897
1033
|
// get schedule layers.
|
|
898
|
-
var _a, _b
|
|
1034
|
+
var _a, _b;
|
|
899
1035
|
const scheduleId = data.scheduleId;
|
|
900
1036
|
const layers = await OnCallDutyPolicyScheduleLayerService.findBy({
|
|
901
1037
|
query: {
|
|
@@ -954,11 +1090,31 @@ export class Service extends DatabaseService {
|
|
|
954
1090
|
},
|
|
955
1091
|
});
|
|
956
1092
|
const scheduleTimezone = ((_a = schedule === null || schedule === void 0 ? void 0 : schedule.timezone) === null || _a === void 0 ? void 0 : _a.toString()) || undefined;
|
|
1093
|
+
const { layerProps, scheduleUserIds } = this.buildLayerPropsFromRows({
|
|
1094
|
+
layers,
|
|
1095
|
+
layerUsers,
|
|
1096
|
+
scheduleTimezone,
|
|
1097
|
+
});
|
|
1098
|
+
const projectId = ((_b = layers[0]) === null || _b === void 0 ? void 0 : _b.projectId) || null;
|
|
1099
|
+
return { layerProps, projectId, scheduleUserIds };
|
|
1100
|
+
}
|
|
1101
|
+
/*
|
|
1102
|
+
* Compose LayerProps from persisted layer + layer-user rows. Shared by the
|
|
1103
|
+
* single-schedule loader the paging/roster path uses and the batched loader
|
|
1104
|
+
* the calendar feeds use, so both feed the engine byte-identical input.
|
|
1105
|
+
* Layers must already be sorted by order; layer users by order.
|
|
1106
|
+
*
|
|
1107
|
+
* Each LayerProps is stamped with the layer's id and name (informational;
|
|
1108
|
+
* the engine copies them onto its events) so consumers can tell which
|
|
1109
|
+
* layer a merged segment came from.
|
|
1110
|
+
*/
|
|
1111
|
+
buildLayerPropsFromRows(data) {
|
|
1112
|
+
var _a, _b;
|
|
957
1113
|
const layerProps = [];
|
|
958
1114
|
const scheduleUserIds = [];
|
|
959
1115
|
const seenUserIds = new Set();
|
|
960
|
-
for (const layer of layers) {
|
|
961
|
-
const usersForLayer = layerUsers
|
|
1116
|
+
for (const layer of data.layers) {
|
|
1117
|
+
const usersForLayer = data.layerUsers
|
|
962
1118
|
.filter((layerUser) => {
|
|
963
1119
|
var _a, _b;
|
|
964
1120
|
return (((_a = layerUser.onCallDutyPolicyScheduleLayerId) === null || _a === void 0 ? void 0 : _a.toString()) ===
|
|
@@ -971,23 +1127,750 @@ export class Service extends DatabaseService {
|
|
|
971
1127
|
return Boolean(user);
|
|
972
1128
|
});
|
|
973
1129
|
for (const user of usersForLayer) {
|
|
974
|
-
const idStr = ((
|
|
1130
|
+
const idStr = ((_a = user.id) === null || _a === void 0 ? void 0 : _a.toString()) || "";
|
|
975
1131
|
if (idStr && !seenUserIds.has(idStr)) {
|
|
976
1132
|
seenUserIds.add(idStr);
|
|
977
1133
|
scheduleUserIds.push(user.id);
|
|
978
1134
|
}
|
|
979
1135
|
}
|
|
980
|
-
|
|
1136
|
+
const props = {
|
|
981
1137
|
users: usersForLayer,
|
|
982
1138
|
startDateTimeOfLayer: layer.startsAt,
|
|
983
1139
|
restrictionTimes: layer.restrictionTimes,
|
|
984
1140
|
rotation: layer.rotation,
|
|
985
1141
|
handOffTime: layer.handOffTime,
|
|
986
|
-
timezone: scheduleTimezone,
|
|
1142
|
+
timezone: data.scheduleTimezone,
|
|
1143
|
+
};
|
|
1144
|
+
const layerId = (_b = layer.id) === null || _b === void 0 ? void 0 : _b.toString();
|
|
1145
|
+
if (layerId) {
|
|
1146
|
+
props.layerId = layerId;
|
|
1147
|
+
}
|
|
1148
|
+
if (typeof layer.name === "string" && layer.name) {
|
|
1149
|
+
props.layerName = layer.name;
|
|
1150
|
+
}
|
|
1151
|
+
layerProps.push(props);
|
|
1152
|
+
}
|
|
1153
|
+
return { layerProps, scheduleUserIds };
|
|
1154
|
+
}
|
|
1155
|
+
/*
|
|
1156
|
+
* ---------------------------------------------------------------------------
|
|
1157
|
+
* Shift resolver — the source of truth for the calendar feeds, /my-shifts
|
|
1158
|
+
* and the shift reminders.
|
|
1159
|
+
* ---------------------------------------------------------------------------
|
|
1160
|
+
*/
|
|
1161
|
+
/**
|
|
1162
|
+
* Resolve every on-call segment of ONE schedule that overlaps
|
|
1163
|
+
* [windowStart, windowEnd), in the exact order the paging and roster paths
|
|
1164
|
+
* use: layers -> engine -> overrides. Returns null when the schedule does
|
|
1165
|
+
* not exist. See getResolvedShiftSegmentsForSchedules for the rules.
|
|
1166
|
+
*/
|
|
1167
|
+
async getResolvedShiftSegments(options) {
|
|
1168
|
+
const resolved = await this.getResolvedShiftSegmentsForSchedules({
|
|
1169
|
+
scheduleIds: [options.scheduleId],
|
|
1170
|
+
windowStart: options.windowStart,
|
|
1171
|
+
windowEnd: options.windowEnd,
|
|
1172
|
+
maxSimulationIterations: options.maxSimulationIterations,
|
|
1173
|
+
});
|
|
1174
|
+
return resolved[0] || null;
|
|
1175
|
+
}
|
|
1176
|
+
/**
|
|
1177
|
+
* Batched resolver: loads the layers, layer users, policy attachments and
|
|
1178
|
+
* overrides of every schedule with a handful of IN queries, then resolves
|
|
1179
|
+
* each schedule in memory.
|
|
1180
|
+
*
|
|
1181
|
+
* Per schedule:
|
|
1182
|
+
* 1. LayerProps exactly as the roster path builds them (plus layer ids).
|
|
1183
|
+
* 2. Expansion window = 2 rotation periods before windowStart .. 2 after
|
|
1184
|
+
* windowEnd, so the segments overlapping the window carry their TRUE
|
|
1185
|
+
* start and end rather than the engine's clamp to the window edge.
|
|
1186
|
+
* 3. ONE multi-layer engine expansion, bounded by maxSimulationIterations
|
|
1187
|
+
* (default: the engine's own caps); `truncated` reports a cap hit.
|
|
1188
|
+
* 4. Overrides in the roster's policy context: the single attached
|
|
1189
|
+
* policy's scoped overrides plus globals when exactly one policy is
|
|
1190
|
+
* attached, globals only otherwise — the same rule as
|
|
1191
|
+
* refreshCurrentUserIdAndHandoffTimeInSchedule (getSingleAttachedPolicyId).
|
|
1192
|
+
* 5. With two or more distinct attached policies AND a policy-scoped
|
|
1193
|
+
* override for a member overlapping the window, the same base events
|
|
1194
|
+
* are re-resolved once per such policy -> policyVariants. The
|
|
1195
|
+
* expensive expansion runs once; the override pass is cheap.
|
|
1196
|
+
* 6. lastModifiedAt = max(updatedAt) over layers, layer users,
|
|
1197
|
+
* participating overrides and attachments — never the schedule row.
|
|
1198
|
+
*
|
|
1199
|
+
* Schedules that no longer exist are skipped; the result is in the order
|
|
1200
|
+
* of the input ids.
|
|
1201
|
+
*/
|
|
1202
|
+
async getResolvedShiftSegmentsForSchedules(options) {
|
|
1203
|
+
var _a;
|
|
1204
|
+
const scheduleIds = OnCallShiftChangeListeners.dedupe(options.scheduleIds);
|
|
1205
|
+
if (scheduleIds.length === 0) {
|
|
1206
|
+
return [];
|
|
1207
|
+
}
|
|
1208
|
+
if (!OneUptimeDate.isBefore(options.windowStart, options.windowEnd) &&
|
|
1209
|
+
options.windowStart.getTime() !== options.windowEnd.getTime()) {
|
|
1210
|
+
throw new BadDataException("windowStart must be before windowEnd");
|
|
1211
|
+
}
|
|
1212
|
+
const inputsById = await this.loadResolutionInputsForSchedules(scheduleIds);
|
|
1213
|
+
const prepared = [];
|
|
1214
|
+
const projectIds = new Set();
|
|
1215
|
+
let earliestStart = null;
|
|
1216
|
+
let latestEnd = null;
|
|
1217
|
+
for (const scheduleId of scheduleIds) {
|
|
1218
|
+
const inputs = inputsById.get(scheduleId.toString());
|
|
1219
|
+
if (!inputs) {
|
|
1220
|
+
continue;
|
|
1221
|
+
}
|
|
1222
|
+
const { layerProps, scheduleUserIds } = this.buildLayerPropsFromRows({
|
|
1223
|
+
layers: inputs.layers,
|
|
1224
|
+
layerUsers: inputs.layerUsers,
|
|
1225
|
+
scheduleTimezone: ((_a = inputs.schedule.timezone) === null || _a === void 0 ? void 0 : _a.toString()) || undefined,
|
|
1226
|
+
});
|
|
1227
|
+
const expansionStart = layerProps.length > 0
|
|
1228
|
+
? this.computeResolutionWindowStart(layerProps, options.windowStart, 2)
|
|
1229
|
+
: options.windowStart;
|
|
1230
|
+
const expansionEnd = layerProps.length > 0
|
|
1231
|
+
? this.computeResolutionWindowEndByPeriods(layerProps, options.windowEnd, 2)
|
|
1232
|
+
: options.windowEnd;
|
|
1233
|
+
if (inputs.schedule.projectId) {
|
|
1234
|
+
projectIds.add(inputs.schedule.projectId.toString());
|
|
1235
|
+
}
|
|
1236
|
+
if (!earliestStart ||
|
|
1237
|
+
OneUptimeDate.isBefore(expansionStart, earliestStart)) {
|
|
1238
|
+
earliestStart = expansionStart;
|
|
1239
|
+
}
|
|
1240
|
+
if (!latestEnd || OneUptimeDate.isAfter(expansionEnd, latestEnd)) {
|
|
1241
|
+
latestEnd = expansionEnd;
|
|
1242
|
+
}
|
|
1243
|
+
prepared.push({
|
|
1244
|
+
inputs,
|
|
1245
|
+
layerProps,
|
|
1246
|
+
scheduleUserIds,
|
|
1247
|
+
expansionStart,
|
|
1248
|
+
expansionEnd,
|
|
987
1249
|
});
|
|
988
1250
|
}
|
|
989
|
-
|
|
990
|
-
|
|
1251
|
+
if (prepared.length === 0) {
|
|
1252
|
+
return [];
|
|
1253
|
+
}
|
|
1254
|
+
const allOverrides = projectIds.size > 0 && earliestStart && latestEnd
|
|
1255
|
+
? await this.loadOverridesForProjects({
|
|
1256
|
+
projectIds: Array.from(projectIds).map((id) => {
|
|
1257
|
+
return new ObjectID(id);
|
|
1258
|
+
}),
|
|
1259
|
+
windowStart: earliestStart,
|
|
1260
|
+
windowEnd: latestEnd,
|
|
1261
|
+
})
|
|
1262
|
+
: [];
|
|
1263
|
+
const results = [];
|
|
1264
|
+
for (const item of prepared) {
|
|
1265
|
+
results.push(this.resolveScheduleInMemory({
|
|
1266
|
+
schedule: item.inputs.schedule,
|
|
1267
|
+
layers: item.inputs.layers,
|
|
1268
|
+
layerUsers: item.inputs.layerUsers,
|
|
1269
|
+
attachments: item.inputs.attachments,
|
|
1270
|
+
layerProps: item.layerProps,
|
|
1271
|
+
scheduleUserIds: item.scheduleUserIds,
|
|
1272
|
+
overrides: allOverrides,
|
|
1273
|
+
expansionStart: item.expansionStart,
|
|
1274
|
+
expansionEnd: item.expansionEnd,
|
|
1275
|
+
windowStart: options.windowStart,
|
|
1276
|
+
windowEnd: options.windowEnd,
|
|
1277
|
+
maxSimulationIterations: options.maxSimulationIterations,
|
|
1278
|
+
}));
|
|
1279
|
+
}
|
|
1280
|
+
return results;
|
|
1281
|
+
}
|
|
1282
|
+
/*
|
|
1283
|
+
* Everything the resolver needs for a batch of schedules, in four queries.
|
|
1284
|
+
* Schedules that do not exist simply have no entry.
|
|
1285
|
+
*/
|
|
1286
|
+
async loadResolutionInputsForSchedules(scheduleIds) {
|
|
1287
|
+
var _a, _b, _c;
|
|
1288
|
+
const schedules = await this.findBy({
|
|
1289
|
+
query: {
|
|
1290
|
+
_id: QueryHelper.any(scheduleIds),
|
|
1291
|
+
},
|
|
1292
|
+
select: {
|
|
1293
|
+
_id: true,
|
|
1294
|
+
name: true,
|
|
1295
|
+
timezone: true,
|
|
1296
|
+
projectId: true,
|
|
1297
|
+
shiftConfigVersion: true,
|
|
1298
|
+
createdAt: true,
|
|
1299
|
+
},
|
|
1300
|
+
limit: LIMIT_PER_PROJECT,
|
|
1301
|
+
skip: 0,
|
|
1302
|
+
props: {
|
|
1303
|
+
isRoot: true,
|
|
1304
|
+
},
|
|
1305
|
+
});
|
|
1306
|
+
const byId = new Map();
|
|
1307
|
+
for (const schedule of schedules) {
|
|
1308
|
+
if (!schedule.id) {
|
|
1309
|
+
continue;
|
|
1310
|
+
}
|
|
1311
|
+
byId.set(schedule.id.toString(), {
|
|
1312
|
+
schedule,
|
|
1313
|
+
layers: [],
|
|
1314
|
+
layerUsers: [],
|
|
1315
|
+
attachments: [],
|
|
1316
|
+
});
|
|
1317
|
+
}
|
|
1318
|
+
if (byId.size === 0) {
|
|
1319
|
+
return byId;
|
|
1320
|
+
}
|
|
1321
|
+
const existingIds = Array.from(byId.keys()).map((id) => {
|
|
1322
|
+
return new ObjectID(id);
|
|
1323
|
+
});
|
|
1324
|
+
const [layers, layerUsers, attachments] = await Promise.all([
|
|
1325
|
+
OnCallDutyPolicyScheduleLayerService.findBy({
|
|
1326
|
+
query: {
|
|
1327
|
+
onCallDutyPolicyScheduleId: QueryHelper.any(existingIds),
|
|
1328
|
+
},
|
|
1329
|
+
select: {
|
|
1330
|
+
_id: true,
|
|
1331
|
+
order: true,
|
|
1332
|
+
name: true,
|
|
1333
|
+
description: true,
|
|
1334
|
+
startsAt: true,
|
|
1335
|
+
restrictionTimes: true,
|
|
1336
|
+
rotation: true,
|
|
1337
|
+
onCallDutyPolicyScheduleId: true,
|
|
1338
|
+
projectId: true,
|
|
1339
|
+
handOffTime: true,
|
|
1340
|
+
updatedAt: true,
|
|
1341
|
+
},
|
|
1342
|
+
sort: {
|
|
1343
|
+
order: SortOrder.Ascending,
|
|
1344
|
+
},
|
|
1345
|
+
limit: LIMIT_PER_PROJECT,
|
|
1346
|
+
skip: 0,
|
|
1347
|
+
props: {
|
|
1348
|
+
isRoot: true,
|
|
1349
|
+
},
|
|
1350
|
+
}),
|
|
1351
|
+
OnCallDutyPolicyScheduleLayerUserService.findBy({
|
|
1352
|
+
query: {
|
|
1353
|
+
onCallDutyPolicyScheduleId: QueryHelper.any(existingIds),
|
|
1354
|
+
},
|
|
1355
|
+
select: {
|
|
1356
|
+
_id: true,
|
|
1357
|
+
user: {
|
|
1358
|
+
_id: true,
|
|
1359
|
+
},
|
|
1360
|
+
userId: true,
|
|
1361
|
+
order: true,
|
|
1362
|
+
onCallDutyPolicyScheduleLayerId: true,
|
|
1363
|
+
onCallDutyPolicyScheduleId: true,
|
|
1364
|
+
updatedAt: true,
|
|
1365
|
+
},
|
|
1366
|
+
sort: {
|
|
1367
|
+
order: SortOrder.Ascending,
|
|
1368
|
+
},
|
|
1369
|
+
limit: LIMIT_PER_PROJECT,
|
|
1370
|
+
skip: 0,
|
|
1371
|
+
props: {
|
|
1372
|
+
isRoot: true,
|
|
1373
|
+
},
|
|
1374
|
+
}),
|
|
1375
|
+
OnCallDutyPolicyEscalationRuleScheduleService.findBy({
|
|
1376
|
+
query: {
|
|
1377
|
+
onCallDutyPolicyScheduleId: QueryHelper.any(existingIds),
|
|
1378
|
+
},
|
|
1379
|
+
select: {
|
|
1380
|
+
_id: true,
|
|
1381
|
+
onCallDutyPolicyScheduleId: true,
|
|
1382
|
+
onCallDutyPolicyId: true,
|
|
1383
|
+
onCallDutyPolicyEscalationRuleId: true,
|
|
1384
|
+
updatedAt: true,
|
|
1385
|
+
onCallDutyPolicy: {
|
|
1386
|
+
name: true,
|
|
1387
|
+
_id: true,
|
|
1388
|
+
},
|
|
1389
|
+
onCallDutyPolicyEscalationRule: {
|
|
1390
|
+
name: true,
|
|
1391
|
+
_id: true,
|
|
1392
|
+
order: true,
|
|
1393
|
+
},
|
|
1394
|
+
},
|
|
1395
|
+
limit: LIMIT_PER_PROJECT,
|
|
1396
|
+
skip: 0,
|
|
1397
|
+
props: {
|
|
1398
|
+
isRoot: true,
|
|
1399
|
+
},
|
|
1400
|
+
}),
|
|
1401
|
+
]);
|
|
1402
|
+
for (const layer of layers) {
|
|
1403
|
+
const entry = byId.get(((_a = layer.onCallDutyPolicyScheduleId) === null || _a === void 0 ? void 0 : _a.toString()) || "");
|
|
1404
|
+
if (entry) {
|
|
1405
|
+
entry.layers.push(layer);
|
|
1406
|
+
}
|
|
1407
|
+
}
|
|
1408
|
+
for (const layerUser of layerUsers) {
|
|
1409
|
+
const entry = byId.get(((_b = layerUser.onCallDutyPolicyScheduleId) === null || _b === void 0 ? void 0 : _b.toString()) || "");
|
|
1410
|
+
if (entry) {
|
|
1411
|
+
entry.layerUsers.push(layerUser);
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
for (const attachment of attachments) {
|
|
1415
|
+
const entry = byId.get(((_c = attachment.onCallDutyPolicyScheduleId) === null || _c === void 0 ? void 0 : _c.toString()) || "");
|
|
1416
|
+
if (entry) {
|
|
1417
|
+
entry.attachments.push(attachment);
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1420
|
+
return byId;
|
|
1421
|
+
}
|
|
1422
|
+
/*
|
|
1423
|
+
* Every override (global AND policy-scoped) of the given projects that
|
|
1424
|
+
* overlaps [windowStart, windowEnd]. The per-schedule policy scoping and
|
|
1425
|
+
* member filtering happen in memory (see selectOverridesForSchedule), which
|
|
1426
|
+
* mirrors fetchOverridesForSchedule's query exactly but for many schedules
|
|
1427
|
+
* at once.
|
|
1428
|
+
*/
|
|
1429
|
+
async loadOverridesForProjects(data) {
|
|
1430
|
+
if (data.projectIds.length === 0) {
|
|
1431
|
+
return [];
|
|
1432
|
+
}
|
|
1433
|
+
return await OnCallDutyPolicyUserOverrideService.findBy({
|
|
1434
|
+
query: {
|
|
1435
|
+
projectId: QueryHelper.any(data.projectIds),
|
|
1436
|
+
startsAt: QueryHelper.lessThanEqualTo(data.windowEnd),
|
|
1437
|
+
endsAt: QueryHelper.greaterThanEqualTo(data.windowStart),
|
|
1438
|
+
},
|
|
1439
|
+
select: {
|
|
1440
|
+
_id: true,
|
|
1441
|
+
projectId: true,
|
|
1442
|
+
startsAt: true,
|
|
1443
|
+
endsAt: true,
|
|
1444
|
+
overrideUserId: true,
|
|
1445
|
+
routeAlertsToUserId: true,
|
|
1446
|
+
onCallDutyPolicyId: true,
|
|
1447
|
+
updatedAt: true,
|
|
1448
|
+
},
|
|
1449
|
+
sort: {
|
|
1450
|
+
startsAt: SortOrder.Ascending,
|
|
1451
|
+
},
|
|
1452
|
+
limit: LIMIT_PER_PROJECT,
|
|
1453
|
+
skip: 0,
|
|
1454
|
+
props: {
|
|
1455
|
+
isRoot: true,
|
|
1456
|
+
},
|
|
1457
|
+
});
|
|
1458
|
+
}
|
|
1459
|
+
/*
|
|
1460
|
+
* The in-memory twin of fetchOverridesForSchedule: the overrides of this
|
|
1461
|
+
* schedule's project that overlap the window, whose overridden user is a
|
|
1462
|
+
* schedule member, scoped to `policyId` (that policy's plus globals) or to
|
|
1463
|
+
* globals only when no policy context is given.
|
|
1464
|
+
*/
|
|
1465
|
+
selectOverridesForSchedule(data) {
|
|
1466
|
+
return data.overrides.filter((override) => {
|
|
1467
|
+
var _a, _b, _c;
|
|
1468
|
+
if (((_a = override.projectId) === null || _a === void 0 ? void 0 : _a.toString()) !== data.projectId) {
|
|
1469
|
+
return false;
|
|
1470
|
+
}
|
|
1471
|
+
if (!override.startsAt || !override.endsAt) {
|
|
1472
|
+
return false;
|
|
1473
|
+
}
|
|
1474
|
+
if (OneUptimeDate.isAfter(override.startsAt, data.windowEnd) ||
|
|
1475
|
+
OneUptimeDate.isBefore(override.endsAt, data.windowStart)) {
|
|
1476
|
+
return false;
|
|
1477
|
+
}
|
|
1478
|
+
if (!data.scheduleUserIds.has(((_b = override.overrideUserId) === null || _b === void 0 ? void 0 : _b.toString()) || "")) {
|
|
1479
|
+
return false;
|
|
1480
|
+
}
|
|
1481
|
+
const overridePolicyId = ((_c = override.onCallDutyPolicyId) === null || _c === void 0 ? void 0 : _c.toString()) || undefined;
|
|
1482
|
+
if (!overridePolicyId) {
|
|
1483
|
+
return true; // global
|
|
1484
|
+
}
|
|
1485
|
+
return Boolean(data.policyId) && overridePolicyId === data.policyId;
|
|
1486
|
+
});
|
|
1487
|
+
}
|
|
1488
|
+
toUserOverrideRecord(override) {
|
|
1489
|
+
var _a, _b, _c;
|
|
1490
|
+
return {
|
|
1491
|
+
overrideUserId: ((_a = override.overrideUserId) === null || _a === void 0 ? void 0 : _a.toString()) || "",
|
|
1492
|
+
routeAlertsToUserId: ((_b = override.routeAlertsToUserId) === null || _b === void 0 ? void 0 : _b.toString()) || "",
|
|
1493
|
+
startsAt: override.startsAt,
|
|
1494
|
+
endsAt: override.endsAt,
|
|
1495
|
+
onCallDutyPolicyId: ((_c = override.onCallDutyPolicyId) === null || _c === void 0 ? void 0 : _c.toString()) || null,
|
|
1496
|
+
};
|
|
1497
|
+
}
|
|
1498
|
+
/*
|
|
1499
|
+
* The pure part of the resolver: given everything already loaded, expand
|
|
1500
|
+
* once and resolve the base context plus any policy variants.
|
|
1501
|
+
*/
|
|
1502
|
+
resolveScheduleInMemory(data) {
|
|
1503
|
+
var _a, _b, _c;
|
|
1504
|
+
const scheduleId = data.schedule.id.toString();
|
|
1505
|
+
const projectId = ((_a = data.schedule.projectId) === null || _a === void 0 ? void 0 : _a.toString()) || "";
|
|
1506
|
+
// Distinct (policy, rule) attachments, stable order.
|
|
1507
|
+
const attachedPolicies = this.toAttachedPolicies(data.attachments);
|
|
1508
|
+
const distinctPolicyIds = [];
|
|
1509
|
+
for (const policy of attachedPolicies) {
|
|
1510
|
+
if (!distinctPolicyIds.includes(policy.policyId)) {
|
|
1511
|
+
distinctPolicyIds.push(policy.policyId);
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1514
|
+
// The roster rule: exactly one attached policy => resolve in its context.
|
|
1515
|
+
const baseContextPolicyId = distinctPolicyIds.length === 1 ? distinctPolicyIds[0] : undefined;
|
|
1516
|
+
// 1 + 2 + 3: one engine expansion over the widened window.
|
|
1517
|
+
let baseEvents = [];
|
|
1518
|
+
let truncated = false;
|
|
1519
|
+
if (data.layerProps.length > 0) {
|
|
1520
|
+
const expansion = this.layerUtil.getMultiLayerEventsWithMeta({
|
|
1521
|
+
layers: data.layerProps,
|
|
1522
|
+
calendarStartDate: data.expansionStart,
|
|
1523
|
+
calendarEndDate: data.expansionEnd,
|
|
1524
|
+
}, data.maxSimulationIterations !== undefined
|
|
1525
|
+
? { maxSimulationIterations: data.maxSimulationIterations }
|
|
1526
|
+
: undefined);
|
|
1527
|
+
baseEvents = expansion.events;
|
|
1528
|
+
truncated = expansion.truncated;
|
|
1529
|
+
}
|
|
1530
|
+
const scheduleUserIdSet = new Set(data.scheduleUserIds.map((id) => {
|
|
1531
|
+
return id.toString();
|
|
1532
|
+
}));
|
|
1533
|
+
// 4: overrides in the base (roster) context.
|
|
1534
|
+
const baseOverrideRows = this.selectOverridesForSchedule({
|
|
1535
|
+
overrides: data.overrides,
|
|
1536
|
+
projectId,
|
|
1537
|
+
scheduleUserIds: scheduleUserIdSet,
|
|
1538
|
+
windowStart: data.expansionStart,
|
|
1539
|
+
windowEnd: data.expansionEnd,
|
|
1540
|
+
policyId: baseContextPolicyId,
|
|
1541
|
+
});
|
|
1542
|
+
const baseOverrides = baseOverrideRows.map((override) => {
|
|
1543
|
+
return this.toUserOverrideRecord(override);
|
|
1544
|
+
});
|
|
1545
|
+
const participatingOverrideRows = [
|
|
1546
|
+
...baseOverrideRows,
|
|
1547
|
+
];
|
|
1548
|
+
const participatingOverrides = [
|
|
1549
|
+
...baseOverrides,
|
|
1550
|
+
];
|
|
1551
|
+
let segments = baseEvents;
|
|
1552
|
+
if (baseOverrides.length > 0 && baseEvents.length > 0) {
|
|
1553
|
+
segments = UserOverrideUtil.applyOverridesToEvents({
|
|
1554
|
+
events: baseEvents,
|
|
1555
|
+
overrides: baseOverrides,
|
|
1556
|
+
currentOnCallDutyPolicyId: baseContextPolicyId,
|
|
1557
|
+
});
|
|
1558
|
+
}
|
|
1559
|
+
segments = this.filterEventsOverlappingWindow(segments, data.windowStart, data.windowEnd);
|
|
1560
|
+
// 5: policy variants.
|
|
1561
|
+
const policyVariants = [];
|
|
1562
|
+
if (distinctPolicyIds.length >= 2 && baseEvents.length > 0) {
|
|
1563
|
+
for (const policyId of distinctPolicyIds) {
|
|
1564
|
+
const scopedRows = this.selectOverridesForSchedule({
|
|
1565
|
+
overrides: data.overrides,
|
|
1566
|
+
projectId,
|
|
1567
|
+
scheduleUserIds: scheduleUserIdSet,
|
|
1568
|
+
windowStart: data.expansionStart,
|
|
1569
|
+
windowEnd: data.expansionEnd,
|
|
1570
|
+
policyId,
|
|
1571
|
+
}).filter((override) => {
|
|
1572
|
+
// Only the policy-scoped ones make this context differ.
|
|
1573
|
+
return Boolean(override.onCallDutyPolicyId);
|
|
1574
|
+
});
|
|
1575
|
+
if (scopedRows.length === 0) {
|
|
1576
|
+
continue;
|
|
1577
|
+
}
|
|
1578
|
+
const variantOverrideRows = [
|
|
1579
|
+
...scopedRows,
|
|
1580
|
+
...baseOverrideRows,
|
|
1581
|
+
];
|
|
1582
|
+
const variantOverrides = variantOverrideRows.map((override) => {
|
|
1583
|
+
return this.toUserOverrideRecord(override);
|
|
1584
|
+
});
|
|
1585
|
+
for (const row of scopedRows) {
|
|
1586
|
+
participatingOverrideRows.push(row);
|
|
1587
|
+
}
|
|
1588
|
+
for (const record of variantOverrides.slice(0, scopedRows.length)) {
|
|
1589
|
+
participatingOverrides.push(record);
|
|
1590
|
+
}
|
|
1591
|
+
const variantSegments = this.filterEventsOverlappingWindow(UserOverrideUtil.applyOverridesToEvents({
|
|
1592
|
+
events: baseEvents,
|
|
1593
|
+
overrides: variantOverrides,
|
|
1594
|
+
currentOnCallDutyPolicyId: policyId,
|
|
1595
|
+
}), data.windowStart, data.windowEnd);
|
|
1596
|
+
const policyName = ((_b = attachedPolicies.find((policy) => {
|
|
1597
|
+
return policy.policyId === policyId;
|
|
1598
|
+
})) === null || _b === void 0 ? void 0 : _b.policyName) || "";
|
|
1599
|
+
policyVariants.push({
|
|
1600
|
+
policyId,
|
|
1601
|
+
policyName,
|
|
1602
|
+
segments: variantSegments,
|
|
1603
|
+
});
|
|
1604
|
+
}
|
|
1605
|
+
}
|
|
1606
|
+
// 6: lastModifiedAt — schedule row excluded.
|
|
1607
|
+
const lastModifiedAt = this.computeLastModifiedAt({
|
|
1608
|
+
schedule: data.schedule,
|
|
1609
|
+
layers: data.layers,
|
|
1610
|
+
layerUsers: data.layerUsers,
|
|
1611
|
+
attachments: data.attachments,
|
|
1612
|
+
overrides: participatingOverrideRows,
|
|
1613
|
+
});
|
|
1614
|
+
const scheduleInfo = {
|
|
1615
|
+
id: scheduleId,
|
|
1616
|
+
name: data.schedule.name || "",
|
|
1617
|
+
projectId,
|
|
1618
|
+
shiftConfigVersion: Service.toVersionNumber(data.schedule.shiftConfigVersion),
|
|
1619
|
+
};
|
|
1620
|
+
const timezone = ((_c = data.schedule.timezone) === null || _c === void 0 ? void 0 : _c.toString()) || undefined;
|
|
1621
|
+
if (timezone) {
|
|
1622
|
+
scheduleInfo.timezone = timezone;
|
|
1623
|
+
}
|
|
1624
|
+
return {
|
|
1625
|
+
schedule: scheduleInfo,
|
|
1626
|
+
segments,
|
|
1627
|
+
policyVariants,
|
|
1628
|
+
attachedPolicies,
|
|
1629
|
+
layerProps: data.layerProps,
|
|
1630
|
+
scheduleUserIds: Array.from(scheduleUserIdSet),
|
|
1631
|
+
overrides: participatingOverrides,
|
|
1632
|
+
lastModifiedAt,
|
|
1633
|
+
truncated,
|
|
1634
|
+
};
|
|
1635
|
+
}
|
|
1636
|
+
toAttachedPolicies(attachments) {
|
|
1637
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
1638
|
+
const seen = new Set();
|
|
1639
|
+
const policies = [];
|
|
1640
|
+
for (const attachment of attachments) {
|
|
1641
|
+
const policyId = ((_a = attachment.onCallDutyPolicyId) === null || _a === void 0 ? void 0 : _a.toString()) ||
|
|
1642
|
+
((_c = (_b = attachment.onCallDutyPolicy) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.toString()) ||
|
|
1643
|
+
"";
|
|
1644
|
+
const ruleId = ((_d = attachment.onCallDutyPolicyEscalationRuleId) === null || _d === void 0 ? void 0 : _d.toString()) ||
|
|
1645
|
+
((_f = (_e = attachment.onCallDutyPolicyEscalationRule) === null || _e === void 0 ? void 0 : _e.id) === null || _f === void 0 ? void 0 : _f.toString()) ||
|
|
1646
|
+
"";
|
|
1647
|
+
if (!policyId) {
|
|
1648
|
+
continue;
|
|
1649
|
+
}
|
|
1650
|
+
const key = `${policyId}:${ruleId}`;
|
|
1651
|
+
if (seen.has(key)) {
|
|
1652
|
+
continue;
|
|
1653
|
+
}
|
|
1654
|
+
seen.add(key);
|
|
1655
|
+
policies.push({
|
|
1656
|
+
policyId,
|
|
1657
|
+
policyName: ((_g = attachment.onCallDutyPolicy) === null || _g === void 0 ? void 0 : _g.name) || "",
|
|
1658
|
+
ruleId,
|
|
1659
|
+
ruleName: ((_h = attachment.onCallDutyPolicyEscalationRule) === null || _h === void 0 ? void 0 : _h.name) || "",
|
|
1660
|
+
ruleOrder: Service.toVersionNumber((_j = attachment.onCallDutyPolicyEscalationRule) === null || _j === void 0 ? void 0 : _j.order),
|
|
1661
|
+
});
|
|
1662
|
+
}
|
|
1663
|
+
policies.sort((a, b) => {
|
|
1664
|
+
if (a.policyName !== b.policyName) {
|
|
1665
|
+
return a.policyName < b.policyName ? -1 : 1;
|
|
1666
|
+
}
|
|
1667
|
+
if (a.policyId !== b.policyId) {
|
|
1668
|
+
return a.policyId < b.policyId ? -1 : 1;
|
|
1669
|
+
}
|
|
1670
|
+
if (a.ruleOrder !== b.ruleOrder) {
|
|
1671
|
+
return a.ruleOrder - b.ruleOrder;
|
|
1672
|
+
}
|
|
1673
|
+
return a.ruleId < b.ruleId ? -1 : a.ruleId > b.ruleId ? 1 : 0;
|
|
1674
|
+
});
|
|
1675
|
+
return policies;
|
|
1676
|
+
}
|
|
1677
|
+
computeLastModifiedAt(data) {
|
|
1678
|
+
let latest = null;
|
|
1679
|
+
const consider = (value) => {
|
|
1680
|
+
if (!value) {
|
|
1681
|
+
return;
|
|
1682
|
+
}
|
|
1683
|
+
const asDate = value instanceof Date ? value : new Date(value);
|
|
1684
|
+
if (Number.isNaN(asDate.getTime())) {
|
|
1685
|
+
return;
|
|
1686
|
+
}
|
|
1687
|
+
if (!latest || asDate.getTime() > latest.getTime()) {
|
|
1688
|
+
latest = asDate;
|
|
1689
|
+
}
|
|
1690
|
+
};
|
|
1691
|
+
for (const rows of [
|
|
1692
|
+
data.layers,
|
|
1693
|
+
data.layerUsers,
|
|
1694
|
+
data.attachments,
|
|
1695
|
+
data.overrides,
|
|
1696
|
+
]) {
|
|
1697
|
+
for (const row of rows) {
|
|
1698
|
+
consider(row.updatedAt);
|
|
1699
|
+
}
|
|
1700
|
+
}
|
|
1701
|
+
if (latest) {
|
|
1702
|
+
return latest;
|
|
1703
|
+
}
|
|
1704
|
+
/*
|
|
1705
|
+
* Nothing configured yet (no layers, no attachments): fall back to when
|
|
1706
|
+
* the schedule was CREATED — stable, unlike its updatedAt — and finally
|
|
1707
|
+
* to the epoch so the value is always a valid instant.
|
|
1708
|
+
*/
|
|
1709
|
+
if (data.schedule.createdAt) {
|
|
1710
|
+
const created = new Date(data.schedule.createdAt);
|
|
1711
|
+
if (!Number.isNaN(created.getTime())) {
|
|
1712
|
+
return created;
|
|
1713
|
+
}
|
|
1714
|
+
}
|
|
1715
|
+
return new Date(0);
|
|
1716
|
+
}
|
|
1717
|
+
filterEventsOverlappingWindow(events, windowStart, windowEnd) {
|
|
1718
|
+
return events.filter((event) => {
|
|
1719
|
+
if (!event || !event.start || !event.end) {
|
|
1720
|
+
return false;
|
|
1721
|
+
}
|
|
1722
|
+
return (event.start.getTime() < windowEnd.getTime() &&
|
|
1723
|
+
event.end.getTime() > windowStart.getTime());
|
|
1724
|
+
});
|
|
1725
|
+
}
|
|
1726
|
+
static toVersionNumber(value) {
|
|
1727
|
+
const parsed = typeof value === "number" ? value : parseInt(String(value !== null && value !== void 0 ? value : ""), 10);
|
|
1728
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0;
|
|
1729
|
+
}
|
|
1730
|
+
/*
|
|
1731
|
+
* ---------------------------------------------------------------------------
|
|
1732
|
+
* Change propagation — shiftConfigVersion, feed caches, listeners.
|
|
1733
|
+
* ---------------------------------------------------------------------------
|
|
1734
|
+
*/
|
|
1735
|
+
/**
|
|
1736
|
+
* Atomically add one to shiftConfigVersion of each schedule, in a single
|
|
1737
|
+
* UPDATE per schedule (`SET col = COALESCE(col, 0) + 1`, no hooks, no
|
|
1738
|
+
* optimistic-lock bump — see atomicAddToColumnsByIdWithoutHooks). Best
|
|
1739
|
+
* effort: a failure is logged and never thrown, because this runs inside
|
|
1740
|
+
* the CRUD hooks of the user's edit and must not fail it.
|
|
1741
|
+
*
|
|
1742
|
+
* NEVER call this from refreshCurrentUserIdAndHandoffTimeInSchedule: the
|
|
1743
|
+
* roster refresh runs every handoff and touches no configuration, and the
|
|
1744
|
+
* version is what calendar clients see as SEQUENCE — bumping it there would
|
|
1745
|
+
* make every feed look edited every rotation period.
|
|
1746
|
+
*/
|
|
1747
|
+
async bumpShiftConfigVersion(scheduleIds) {
|
|
1748
|
+
for (const scheduleId of OnCallShiftChangeListeners.dedupe(scheduleIds)) {
|
|
1749
|
+
try {
|
|
1750
|
+
await this.atomicAddToColumnsByIdWithoutHooks({
|
|
1751
|
+
id: scheduleId,
|
|
1752
|
+
add: { shiftConfigVersion: 1 },
|
|
1753
|
+
});
|
|
1754
|
+
}
|
|
1755
|
+
catch (err) {
|
|
1756
|
+
logger.error(`Error bumping shiftConfigVersion for schedule ${scheduleId.toString()} (best-effort).`);
|
|
1757
|
+
logger.error(err);
|
|
1758
|
+
}
|
|
1759
|
+
}
|
|
1760
|
+
}
|
|
1761
|
+
/**
|
|
1762
|
+
* The schedules in `projectId` whose layers include any of `userIds` —
|
|
1763
|
+
* the query refreshRostersForUserInProject uses, batched. Root read.
|
|
1764
|
+
*/
|
|
1765
|
+
async getScheduleIdsForUsersInProject(data) {
|
|
1766
|
+
const userIds = OnCallShiftChangeListeners.dedupe(data.userIds);
|
|
1767
|
+
if (userIds.length === 0) {
|
|
1768
|
+
return [];
|
|
1769
|
+
}
|
|
1770
|
+
const layerUsers = await OnCallDutyPolicyScheduleLayerUserService.findBy({
|
|
1771
|
+
query: {
|
|
1772
|
+
projectId: data.projectId,
|
|
1773
|
+
userId: QueryHelper.any(userIds),
|
|
1774
|
+
},
|
|
1775
|
+
select: {
|
|
1776
|
+
onCallDutyPolicyScheduleId: true,
|
|
1777
|
+
},
|
|
1778
|
+
limit: LIMIT_PER_PROJECT,
|
|
1779
|
+
skip: 0,
|
|
1780
|
+
props: {
|
|
1781
|
+
isRoot: true,
|
|
1782
|
+
},
|
|
1783
|
+
});
|
|
1784
|
+
return OnCallShiftChangeListeners.dedupe(layerUsers
|
|
1785
|
+
.map((layerUser) => {
|
|
1786
|
+
return layerUser.onCallDutyPolicyScheduleId;
|
|
1787
|
+
})
|
|
1788
|
+
.filter((id) => {
|
|
1789
|
+
return Boolean(id);
|
|
1790
|
+
}));
|
|
1791
|
+
}
|
|
1792
|
+
/**
|
|
1793
|
+
* What every configuration hook calls after the roster refresh:
|
|
1794
|
+
* 1. bump shiftConfigVersion of the affected schedules (SEQUENCE / cache key),
|
|
1795
|
+
* 2. purge the calendar-feed caches of those schedules and of the users
|
|
1796
|
+
* the change names directly,
|
|
1797
|
+
* 3. tell the shift-change listeners (the reminder change pass) which
|
|
1798
|
+
* schedules and users to look at again — delivered in the background,
|
|
1799
|
+
* never awaited, never allowed to fail the edit.
|
|
1800
|
+
* Never throws.
|
|
1801
|
+
*/
|
|
1802
|
+
async propagateShiftConfigChange(change) {
|
|
1803
|
+
try {
|
|
1804
|
+
const scheduleIds = OnCallShiftChangeListeners.dedupe(change.scheduleIds);
|
|
1805
|
+
const explicitUserIds = OnCallShiftChangeListeners.dedupe(change.userIds || []);
|
|
1806
|
+
if (scheduleIds.length > 0 && !change.skipVersionBump) {
|
|
1807
|
+
await this.bumpShiftConfigVersion(scheduleIds);
|
|
1808
|
+
}
|
|
1809
|
+
for (const scheduleId of scheduleIds) {
|
|
1810
|
+
try {
|
|
1811
|
+
await OnCallCalendarFeedCache.purgeForSchedule(scheduleId.toString());
|
|
1812
|
+
}
|
|
1813
|
+
catch (err) {
|
|
1814
|
+
logger.error(err);
|
|
1815
|
+
}
|
|
1816
|
+
}
|
|
1817
|
+
if (change.projectId) {
|
|
1818
|
+
for (const userId of explicitUserIds) {
|
|
1819
|
+
try {
|
|
1820
|
+
await OnCallCalendarFeedCache.purgeForUser(change.projectId.toString(), userId.toString());
|
|
1821
|
+
}
|
|
1822
|
+
catch (err) {
|
|
1823
|
+
logger.error(err);
|
|
1824
|
+
}
|
|
1825
|
+
}
|
|
1826
|
+
}
|
|
1827
|
+
let userIds = explicitUserIds;
|
|
1828
|
+
if (scheduleIds.length > 0) {
|
|
1829
|
+
try {
|
|
1830
|
+
const members = await OnCallDutyPolicyScheduleLayerUserService.findBy({
|
|
1831
|
+
query: {
|
|
1832
|
+
onCallDutyPolicyScheduleId: QueryHelper.any(scheduleIds),
|
|
1833
|
+
},
|
|
1834
|
+
select: {
|
|
1835
|
+
userId: true,
|
|
1836
|
+
},
|
|
1837
|
+
limit: LIMIT_PER_PROJECT,
|
|
1838
|
+
skip: 0,
|
|
1839
|
+
props: {
|
|
1840
|
+
isRoot: true,
|
|
1841
|
+
},
|
|
1842
|
+
});
|
|
1843
|
+
userIds = OnCallShiftChangeListeners.dedupe([
|
|
1844
|
+
...explicitUserIds,
|
|
1845
|
+
...members
|
|
1846
|
+
.map((member) => {
|
|
1847
|
+
return member.userId;
|
|
1848
|
+
})
|
|
1849
|
+
.filter((id) => {
|
|
1850
|
+
return Boolean(id);
|
|
1851
|
+
}),
|
|
1852
|
+
]);
|
|
1853
|
+
}
|
|
1854
|
+
catch (err) {
|
|
1855
|
+
logger.error("Error loading schedule members for the shift-change event (best-effort).");
|
|
1856
|
+
logger.error(err);
|
|
1857
|
+
}
|
|
1858
|
+
}
|
|
1859
|
+
const event = OnCallShiftChangeListeners.buildEvent({
|
|
1860
|
+
projectId: change.projectId,
|
|
1861
|
+
scheduleIds,
|
|
1862
|
+
userIds,
|
|
1863
|
+
reason: change.reason,
|
|
1864
|
+
});
|
|
1865
|
+
// Background delivery; notify never rejects, the catch is belt-and-braces.
|
|
1866
|
+
OnCallShiftChangeListeners.notify(event).catch((err) => {
|
|
1867
|
+
logger.error(err);
|
|
1868
|
+
});
|
|
1869
|
+
}
|
|
1870
|
+
catch (err) {
|
|
1871
|
+
logger.error("Error propagating an on-call configuration change (best-effort).");
|
|
1872
|
+
logger.error(err);
|
|
1873
|
+
}
|
|
991
1874
|
}
|
|
992
1875
|
async fetchOverridesForSchedule(data) {
|
|
993
1876
|
if (data.scheduleUserIds.length === 0) {
|
|
@@ -1148,6 +2031,39 @@ export class Service extends DatabaseService {
|
|
|
1148
2031
|
}
|
|
1149
2032
|
return windowStart;
|
|
1150
2033
|
}
|
|
2034
|
+
/*
|
|
2035
|
+
* Mirror of computeResolutionWindowStart, stepping FORWARDS: the latest of
|
|
2036
|
+
* `from` plus `periodsForward` rotation periods across the layers (at least
|
|
2037
|
+
* a day). The calendar-feed resolver widens its expansion this far past the
|
|
2038
|
+
* requested window so the last overlapping segment carries its true end
|
|
2039
|
+
* instead of the engine's clamp to the window edge.
|
|
2040
|
+
*/
|
|
2041
|
+
computeResolutionWindowEndByPeriods(layerProps, from, periodsForward) {
|
|
2042
|
+
let windowEnd = OneUptimeDate.addRemoveDays(from, 1);
|
|
2043
|
+
for (const layer of layerProps) {
|
|
2044
|
+
if (!layer.rotation) {
|
|
2045
|
+
continue;
|
|
2046
|
+
}
|
|
2047
|
+
let recurring;
|
|
2048
|
+
try {
|
|
2049
|
+
recurring =
|
|
2050
|
+
layer.rotation instanceof Recurring
|
|
2051
|
+
? layer.rotation
|
|
2052
|
+
: Recurring.fromJSON(layer.rotation);
|
|
2053
|
+
}
|
|
2054
|
+
catch (_a) {
|
|
2055
|
+
continue;
|
|
2056
|
+
}
|
|
2057
|
+
let candidate = from;
|
|
2058
|
+
for (let i = 0; i < periodsForward; i++) {
|
|
2059
|
+
candidate = Recurring.getNextDateInterval(candidate, recurring);
|
|
2060
|
+
}
|
|
2061
|
+
if (OneUptimeDate.isAfter(candidate, windowEnd)) {
|
|
2062
|
+
windowEnd = candidate;
|
|
2063
|
+
}
|
|
2064
|
+
}
|
|
2065
|
+
return windowEnd;
|
|
2066
|
+
}
|
|
1151
2067
|
/*
|
|
1152
2068
|
* Recover the TRUE start of the current on-call coverage window for
|
|
1153
2069
|
* `currentUserId`. getEventByIndexInSchedule always expands from `now`, and
|
|
@@ -1314,6 +2230,36 @@ export class Service extends DatabaseService {
|
|
|
1314
2230
|
return new ObjectID(userId);
|
|
1315
2231
|
}
|
|
1316
2232
|
}
|
|
2233
|
+
__decorate([
|
|
2234
|
+
CaptureSpan(),
|
|
2235
|
+
__metadata("design:type", Function),
|
|
2236
|
+
__metadata("design:paramtypes", [Object]),
|
|
2237
|
+
__metadata("design:returntype", Promise)
|
|
2238
|
+
], Service.prototype, "getResolvedShiftSegments", null);
|
|
2239
|
+
__decorate([
|
|
2240
|
+
CaptureSpan(),
|
|
2241
|
+
__metadata("design:type", Function),
|
|
2242
|
+
__metadata("design:paramtypes", [Object]),
|
|
2243
|
+
__metadata("design:returntype", Promise)
|
|
2244
|
+
], Service.prototype, "getResolvedShiftSegmentsForSchedules", null);
|
|
2245
|
+
__decorate([
|
|
2246
|
+
CaptureSpan(),
|
|
2247
|
+
__metadata("design:type", Function),
|
|
2248
|
+
__metadata("design:paramtypes", [Array]),
|
|
2249
|
+
__metadata("design:returntype", Promise)
|
|
2250
|
+
], Service.prototype, "bumpShiftConfigVersion", null);
|
|
2251
|
+
__decorate([
|
|
2252
|
+
CaptureSpan(),
|
|
2253
|
+
__metadata("design:type", Function),
|
|
2254
|
+
__metadata("design:paramtypes", [Object]),
|
|
2255
|
+
__metadata("design:returntype", Promise)
|
|
2256
|
+
], Service.prototype, "getScheduleIdsForUsersInProject", null);
|
|
2257
|
+
__decorate([
|
|
2258
|
+
CaptureSpan(),
|
|
2259
|
+
__metadata("design:type", Function),
|
|
2260
|
+
__metadata("design:paramtypes", [Object]),
|
|
2261
|
+
__metadata("design:returntype", Promise)
|
|
2262
|
+
], Service.prototype, "propagateShiftConfigChange", null);
|
|
1317
2263
|
__decorate([
|
|
1318
2264
|
CaptureSpan(),
|
|
1319
2265
|
__metadata("design:type", Function),
|