@oneuptime/common 13.0.7 → 14.0.0
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/AuditLog.ts +23 -15
- package/Models/DatabaseModels/GlobalConfig.ts +24 -0
- package/Models/DatabaseModels/Monitor.ts +3 -2
- package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +1 -1
- package/Scripts/generate-service-worker.js +65 -4
- package/Server/API/AIBillingAPI.ts +1 -0
- package/Server/API/AIInsightAPI.ts +1 -4
- package/Server/API/AIInvestigationAPI.ts +1 -4
- package/Server/API/AIReadinessAPI.ts +4 -5
- package/Server/API/AlertAPI.ts +1 -0
- package/Server/API/AutoRemediationAPI.ts +1 -4
- package/Server/API/BaseAPI.ts +34 -0
- package/Server/API/BaseAnalyticsAPI.ts +80 -9
- package/Server/API/BillingAPI.ts +2 -0
- package/Server/API/BillingInvoiceAPI.ts +1 -0
- package/Server/API/BillingPaymentMethodAPI.ts +2 -0
- package/Server/API/CodeFixRunAPI.ts +1 -3
- package/Server/API/CommonAPI.ts +68 -4
- package/Server/API/DashboardAPI.ts +12 -12
- package/Server/API/GlobalConfigAPI.ts +243 -460
- package/Server/API/IncidentAPI.ts +2 -0
- package/Server/API/IncidentEpisodeAPI.ts +1 -0
- package/Server/API/NotificationAPI.ts +1 -0
- package/Server/API/OnCallCalendarAPI.ts +4 -5
- package/Server/API/OnCallDutyPolicyAPI.ts +7 -0
- package/Server/API/OnCallReadinessAPI.ts +4 -1
- package/Server/API/OnCallScheduleTimelineAPI.ts +731 -0
- package/Server/API/ProjectAPI.ts +1 -0
- package/Server/API/ProjectOIDC.ts +25 -16
- package/Server/API/ProjectSSO.ts +24 -16
- package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
- package/Server/API/StatusPageAPI.ts +261 -74
- package/Server/API/TeamMemberAPI.ts +13 -1
- package/Server/API/UserCallAPI.ts +2 -0
- package/Server/API/UserEmailAPI.ts +2 -0
- package/Server/API/UserIncomingCallNumberAPI.ts +2 -0
- package/Server/API/UserMicrosoftTeamsAPI.ts +1 -0
- package/Server/API/UserSlackAPI.ts +1 -0
- package/Server/API/UserSmsAPI.ts +2 -0
- package/Server/API/UserTotpAuthAPI.ts +1 -0
- package/Server/API/UserWebAuthnAPI.ts +2 -0
- package/Server/API/UserWebhookAPI.ts +1 -0
- package/Server/API/UserWhatsAppAPI.ts +2 -0
- package/Server/Enterprise/EnterpriseEdition.ts +649 -0
- package/Server/Enterprise/EnterpriseFeature.ts +48 -0
- package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
- package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
- package/Server/EnvironmentConfig.ts +147 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +13 -2
- package/Server/Middleware/UserAuthorization.ts +117 -21
- package/Server/Services/ApiKeyPermissionService.ts +101 -4
- package/Server/Services/AuditLogService.ts +84 -1079
- package/Server/Services/DatabaseService.ts +245 -0
- package/Server/Services/DetectionRuleService.ts +5 -4
- package/Server/Services/EnterpriseLicenseService.ts +38 -0
- package/Server/Services/GlobalConfigService.ts +80 -1
- package/Server/Services/MonitorProbeService.ts +116 -20
- package/Server/Services/MonitorService.ts +56 -4
- package/Server/Services/MonitorStatusTimelineService.ts +284 -0
- package/Server/Services/MonitorTemplateService.ts +26 -0
- package/Server/Services/OnCallDutyPolicyChildService.ts +261 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -2
- package/Server/Services/PayAsYouGoBillingService.ts +23 -28
- package/Server/Services/ProjectService.ts +302 -0
- package/Server/Services/RumSessionPinService.ts +293 -22
- package/Server/Services/StatusPagePrivateUserService.ts +7 -3
- package/Server/Services/StatusPageService.ts +78 -1
- package/Server/Services/TeamMemberService.ts +11 -0
- package/Server/Services/TeamPermissionService.ts +120 -26
- package/Server/Services/TeamService.ts +10 -0
- package/Server/Services/ThreatIntelFeedService.ts +6 -3
- package/Server/Services/UserService.ts +10 -17
- package/Server/Types/Database/Permissions/BasePermission.ts +9 -7
- package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
- package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
- package/Server/Types/Database/Permissions/Index.ts +75 -11
- package/Server/Types/Database/Permissions/TablePermission.ts +34 -31
- package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
- package/Server/Types/Markdown.ts +41 -0
- package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
- package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -0
- package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
- package/Server/Utils/EditionEnforcement.ts +233 -0
- package/Server/Utils/FrontendEnvironment.ts +41 -2
- package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
- package/Server/Utils/MasterAdminPageAccess.ts +61 -0
- package/Server/Utils/Monitor/AffectedResourceList.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +543 -333
- package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
- package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1 -1
- package/Server/Utils/Realtime.ts +163 -45
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +11 -28
- package/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.ts +170 -0
- package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +1 -1
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +6 -2
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +10 -9
- package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
- package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
- package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
- package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
- package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
- package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
- package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +1059 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +376 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +757 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +307 -0
- package/Tests/App/Dashboard/ArgumentsFormGroupByUnlistedAttributes.test.tsx +131 -0
- package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +1 -1
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +9 -1
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +24 -0
- package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +162 -8
- package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
- package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
- package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +105 -6
- package/Tests/App/Dashboard/EntityFilterDropdownUnlistedSelection.test.tsx +434 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +276 -1
- package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +9 -1
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
- package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +58 -42
- package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +42 -5
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +34 -23
- package/Tests/App/Dashboard/ScheduleTimeline.test.tsx +1580 -0
- package/Tests/App/Dashboard/ScheduleTimelineAPI.test.ts +280 -0
- package/Tests/App/Dashboard/ScheduleTimelineModel.test.ts +673 -0
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +133 -70
- package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
- package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
- package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -58
- package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
- package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
- package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
- package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
- package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
- package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
- package/Tests/App/Dashboard/SloOverviewHero.test.tsx +171 -36
- package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +215 -0
- package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +40 -3
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
- package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
- package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
- package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
- package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
- package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +138 -5
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +187 -0
- package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +51 -3
- package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +55 -2
- package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
- package/Tests/Server/API/BaseAnalyticsAPIAggregateCache.test.ts +729 -0
- package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +93 -7
- package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +36 -3
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +1003 -24
- package/Tests/Server/API/DashboardPublicRateLimit.test.ts +6 -3
- package/Tests/Server/API/ExpiredSessionAIRoutes.test.ts +708 -0
- package/Tests/Server/API/ExpiredSessionCustomRoutes.test.ts +928 -0
- package/Tests/Server/API/ExpiredSessionMonitorTemplate.test.ts +319 -0
- package/Tests/Server/API/ExpiredSessionOnCallDutyPolicy.test.ts +336 -0
- package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +820 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +766 -381
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +115 -12
- package/Tests/Server/API/OnCallCalendarAPI.test.ts +375 -8
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +196 -912
- package/Tests/Server/API/OnCallScheduleTimelineAPI.test.ts +1513 -0
- package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +119 -7
- package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +111 -4
- package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +615 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +89 -2
- package/Tests/Server/API/SessionReplayAPI.test.ts +121 -0
- package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
- package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +4 -2
- package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +441 -0
- package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +664 -0
- package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
- package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +7 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +6 -0
- package/Tests/Server/API/UserNotificationSettingAPI.test.ts +65 -4
- package/Tests/Server/API/UserProjectsAPI.test.ts +63 -3
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +48 -2
- package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +11 -2
- package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +46 -3
- package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +18 -2
- package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +24 -7
- package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
- package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
- package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
- package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
- package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
- package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
- package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
- package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
- package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
- package/Tests/Server/Middleware/ExpiredSessionUserMiddleware.test.ts +563 -0
- package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +299 -19
- package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +453 -0
- package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +24 -0
- package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +2 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +3 -3
- package/Tests/Server/Services/AuditLogService.test.ts +460 -990
- package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
- package/Tests/Server/Services/DatabaseServiceCreateSuppliedId.test.ts +147 -0
- package/Tests/Server/Services/DatabaseServiceLoginBeforeHooks.test.ts +1078 -0
- package/Tests/Server/Services/DatabaseServiceTenantRelationGuard.test.ts +259 -0
- package/Tests/Server/Services/DatabaseServiceWriteOperatorValues.test.ts +147 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
- package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
- package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
- package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
- package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
- package/Tests/Server/Services/OnCallChildCreateAuthorizationPostgres.test.ts +711 -0
- package/Tests/Server/Services/OnCallDutyPolicyChildService.test.ts +733 -0
- package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +190 -140
- package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +4 -9
- package/Tests/Server/Services/PermissionBlockDeletion.test.ts +780 -0
- package/Tests/Server/Services/PermissionBlockDeletionPostgres.test.ts +628 -0
- package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
- package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -0
- package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
- package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
- package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
- package/Tests/Server/Services/TeamMemberMultiTenantReadPostgres.test.ts +394 -0
- package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +6 -0
- package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +131 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
- package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
- package/Tests/Server/Types/Database/Permissions/ModelPermissionAnonymousRefusal.test.ts +518 -0
- package/Tests/Server/Types/Database/Permissions/MultiTenantPermissions.test.ts +350 -0
- package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +282 -25
- package/Tests/Server/Types/Database/Permissions/TableLevelBlockPermission.test.ts +459 -0
- package/Tests/Server/Types/Markdown.test.ts +181 -0
- package/Tests/Server/Utils/AI/AIRunPrivacyFilter.test.ts +101 -9
- package/Tests/Server/Utils/AI/ChatAgentHelpers.test.ts +88 -4
- package/Tests/Server/Utils/AI/Toolbox/ExceptionTools.test.ts +459 -0
- package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +794 -0
- package/Tests/Server/Utils/AI/Toolbox/RecentChangesTools.test.ts +574 -0
- package/Tests/Server/Utils/AI/Toolbox/SecurityEventTools.test.ts +596 -0
- package/Tests/Server/Utils/CaptchaRequestAndLogging.test.ts +395 -0
- package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
- package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
- package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
- package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -0
- package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
- package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +616 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +934 -96
- package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
- package/Tests/Server/Utils/Realtime.test.ts +502 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorSeverity.test.ts +216 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +142 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.test.ts +140 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepairClickhouseIntegration.test.ts +542 -0
- package/Tests/Server/Utils/Telemetry/ChangeEventRow.test.ts +743 -0
- package/Tests/Server/Utils/Telemetry/RuntimeMetrics.test.ts +465 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Alert.test.ts +202 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/ScheduledMaintenance.test.ts +231 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Alert.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/AlertEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/ScheduledMaintenance.test.ts +247 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
- package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
- package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
- package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
- package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
- package/Tests/Types/Call/CallProvider.test.ts +528 -0
- package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
- package/Tests/Types/Kubernetes/KubernetesCostIngest.test.ts +236 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimeline.test.ts +736 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimelineLayout.test.ts +996 -0
- package/Tests/Types/SecurityEvent/SigmaRule.test.ts +142 -0
- package/Tests/Types/Workflow/Components/JSON.test.ts +182 -0
- package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +116 -1
- package/Tests/UI/Components/Dropdown/DropdownAsyncOptions.test.tsx +81 -0
- package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
- package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +165 -171
- package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
- package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
- package/Tests/UI/Components/EventAttachmentList.test.tsx +174 -0
- package/Tests/UI/Components/Forms/BasicFormBurnRateTemplateDefaults.test.tsx +395 -0
- package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +286 -0
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +128 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
- package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
- package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableQueryChange.test.tsx +365 -0
- package/Tests/UI/Components/OpenAuthenticatedUrl.test.ts +358 -0
- package/Tests/UI/Components/SessionAwareImage.test.tsx +496 -0
- package/Tests/UI/Components/TelemetryHistogramZeroBuckets.test.tsx +190 -0
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
- package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
- package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +1 -1
- package/Tests/UI/Monitor/EvaluationLogListTimestamps.test.tsx +367 -0
- package/Tests/UI/Utils/API/BaseAPIRefreshSession.test.ts +1087 -0
- package/Tests/UI/Utils/API/DashboardHost.ts +12 -0
- package/Tests/UI/Utils/API/FakeAxiosServer.ts +183 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/UI/Utils/Cookie.test.ts +440 -0
- package/Tests/UI/Utils/ModelAPIRequestClient.test.ts +278 -0
- package/Tests/UI/Utils/Navigation.test.ts +33 -0
- package/Tests/UI/Utils/PricingPlan.test.ts +295 -0
- package/Tests/UI/Utils/Realtime.test.ts +759 -0
- package/Tests/UI/Utils/Telemetry/Telemetry.test.ts +500 -0
- package/Tests/Utils/APIInstanceDispatch.test.ts +311 -0
- package/Tests/Utils/HostAddressUtil.test.ts +138 -0
- package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
- package/Types/API/Hostname.ts +63 -16
- package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
- package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
- package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
- package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
- package/Types/Database/CanonicalModelInstance.ts +102 -0
- package/Types/Database/TableColumn.ts +20 -6
- package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
- package/Types/IP/IPv6.ts +6 -1
- package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
- package/Types/Monitor/MonitorStep.ts +6 -1
- package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
- package/Types/OnCallDutyPolicy/ScheduleTimeline.ts +507 -0
- package/Types/OnCallDutyPolicy/ScheduleTimelineLayout.ts +589 -0
- package/Types/Realtime/EventName.ts +11 -0
- package/Types/SecurityEvent/DetectionFindingConstants.ts +14 -0
- package/Types/SecurityEvent/OcsfSeverity.ts +31 -26
- package/Types/SecurityEvent/SigmaRule.ts +51 -0
- package/Types/SecurityEvent/ThreatIntelConstants.ts +18 -0
- package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
- package/UI/Components/AttachmentList/EventAttachmentList.tsx +30 -2
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +12 -2
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/EditionLabel/EditionLabel.tsx +808 -1195
- package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
- package/UI/Components/EventItem/EventItem.tsx +12 -1
- package/UI/Components/Forms/BasicForm.tsx +151 -126
- package/UI/Components/Forms/CollapsibleFormSection.tsx +63 -0
- package/UI/Components/Forms/Fields/FormField.tsx +10 -4
- package/UI/Components/Forms/FormSummary.tsx +7 -0
- package/UI/Components/Forms/Types/Field.ts +10 -0
- package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
- package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
- package/UI/Components/ModelList/ModelList.tsx +11 -1
- package/UI/Components/ModelTable/BaseModelTable.tsx +34 -5
- package/UI/Components/ModelTable/TableView.tsx +1 -1
- package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +8 -1
- package/UI/Components/Tooltip/Tooltip.tsx +8 -1
- package/UI/Utils/API/API.ts +173 -12
- package/UI/Utils/API/RequestOptions.ts +11 -0
- package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +31 -7
- package/UI/Utils/ModelAPI/ModelAPI.ts +30 -9
- package/UI/Utils/Navigation.ts +9 -0
- package/UI/Utils/OpenAuthenticatedUrl.ts +154 -0
- package/UI/Utils/Realtime.ts +176 -30
- package/UI/esbuild-enterprise.js +263 -0
- package/Utils/API.ts +14 -5
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
- package/Utils/HostAddressUtil.ts +94 -0
- package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
- package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
- package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
- package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
- package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
- package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -1
- package/build/dist/Server/API/AIBillingAPI.js +1 -1
- package/build/dist/Server/API/AIBillingAPI.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +1 -4
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +1 -4
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AIReadinessAPI.js +1 -3
- package/build/dist/Server/API/AIReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +1 -1
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +1 -4
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +33 -0
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js +55 -10
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +2 -2
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
- package/build/dist/Server/API/BillingPaymentMethodAPI.js +2 -2
- package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
- package/build/dist/Server/API/CodeFixRunAPI.js +1 -3
- package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +50 -5
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +12 -12
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +158 -342
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +2 -2
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/NotificationAPI.js +1 -1
- package/build/dist/Server/API/NotificationAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallCalendarAPI.js +1 -4
- package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js +6 -0
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js +4 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +494 -0
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -0
- package/build/dist/Server/API/ProjectAPI.js +1 -1
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectOIDC.js +24 -16
- package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
- package/build/dist/Server/API/ProjectSSO.js +24 -16
- package/build/dist/Server/API/ProjectSSO.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +218 -76
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +11 -4
- package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +2 -2
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +2 -2
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +2 -2
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/UserSlackAPI.js +1 -1
- package/build/dist/Server/API/UserSlackAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +2 -2
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js +2 -2
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +2 -2
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
- package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +84 -2
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -2
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +94 -15
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +80 -4
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/AuditLogService.js +71 -740
- package/build/dist/Server/Services/AuditLogService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +171 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DetectionRuleService.js +4 -4
- package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +63 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +90 -17
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +45 -4
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyChildService.js +170 -0
- package/build/dist/Server/Services/OnCallDutyPolicyChildService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
- package/build/dist/Server/Services/PayAsYouGoBillingService.js +20 -27
- package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +231 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +198 -16
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +71 -0
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +10 -0
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamPermissionService.js +89 -27
- package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
- package/build/dist/Server/Services/TeamService.js +9 -0
- package/build/dist/Server/Services/TeamService.js.map +1 -1
- package/build/dist/Server/Services/ThreatIntelFeedService.js +5 -4
- package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +10 -16
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +9 -6
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/Index.js +60 -6
- package/build/dist/Server/Types/Database/Permissions/Index.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +24 -16
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +31 -0
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
- package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
- package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
- package/build/dist/Server/Utils/MasterAdminPageAccess.js +39 -0
- package/build/dist/Server/Utils/MasterAdminPageAccess.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +96 -0
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +449 -261
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
- package/build/dist/Server/Utils/Realtime.js +126 -37
- package/build/dist/Server/Utils/Realtime.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +7 -25
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js +127 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +3 -2
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +4 -8
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Types/API/Hostname.js +59 -11
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +31 -1
- package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
- package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
- package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js +19 -6
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
- package/build/dist/Types/IP/IPv6.js +6 -1
- package/build/dist/Types/IP/IPv6.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +5 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js +321 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js +372 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js.map +1 -0
- package/build/dist/Types/Realtime/EventName.js +10 -0
- package/build/dist/Types/Realtime/EventName.js.map +1 -1
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +11 -0
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js +30 -25
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -1
- package/build/dist/Types/SecurityEvent/SigmaRule.js +47 -0
- package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -1
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +14 -0
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -1
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js +9 -4
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js.map +1 -1
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +10 -2
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +425 -585
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
- package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
- package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +70 -64
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +27 -0
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -0
- package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -7
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/FormSummary.js +7 -0
- package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.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/Markdown.tsx/MarkdownViewer.js +2 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js +84 -0
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js.map +1 -0
- package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +14 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +2 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/API/API.js +143 -19
- package/build/dist/UI/Utils/API/API.js.map +1 -1
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +21 -7
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +26 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +8 -0
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js +92 -0
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js.map +1 -0
- package/build/dist/UI/Utils/Realtime.js +120 -15
- package/build/dist/UI/Utils/Realtime.js.map +1 -1
- package/build/dist/Utils/API.js +13 -5
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/HostAddressUtil.js +80 -0
- package/build/dist/Utils/HostAddressUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +123 -6
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +4 -18
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -1
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js +2 -2
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
- package/jest.config.json +3 -1
- package/package.json +1 -1
- package/test-setup.sh +103 -34
- package/tsconfig.json +13 -0
- package/Server/API/EnterpriseLicenseAPI.ts +0 -925
- package/Server/API/TeamComplianceAPI.ts +0 -158
- package/Server/Middleware/SCIMAuthorization.ts +0 -141
- package/Server/Services/TeamComplianceService.ts +0 -733
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
- package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
- package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
- package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
- package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
- package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
- package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
- package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
- package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
- package/build/dist/Server/Services/TeamComplianceService.js +0 -537
- package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import BaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
2
|
+
import getCanonicalModelInstance from "./CanonicalModelInstance";
|
|
2
3
|
import Dictionary from "../Dictionary";
|
|
3
4
|
import { JSONObject } from "../JSON";
|
|
4
5
|
import { ReflectionMetadataType } from "../Reflection";
|
|
@@ -99,9 +100,12 @@ type GetTableColumnsFunction = <T extends BaseModel>(
|
|
|
99
100
|
) => Dictionary<TableColumnMetadata>;
|
|
100
101
|
|
|
101
102
|
/*
|
|
102
|
-
* Per-class cache
|
|
103
|
-
*
|
|
104
|
-
*
|
|
103
|
+
* Per-class cache, keyed on the constructor and built from a canonical
|
|
104
|
+
* instance of that class - never from the instance that happened to ask
|
|
105
|
+
* first. A caller that had deleted a column off its own instance (BaseAPI's
|
|
106
|
+
* create path used to delete `_id`) would otherwise define the class's column
|
|
107
|
+
* list without that column for the whole process, and every response for that
|
|
108
|
+
* model would lose it. See CanonicalModelInstance.ts.
|
|
105
109
|
*/
|
|
106
110
|
const tableColumnsCache: WeakMap<
|
|
107
111
|
{ new (): BaseModel },
|
|
@@ -118,13 +122,15 @@ export const getTableColumns: GetTableColumnsFunction = <T extends BaseModel>(
|
|
|
118
122
|
tableColumnsCache.get(modelClass);
|
|
119
123
|
|
|
120
124
|
if (!cached) {
|
|
125
|
+
const canonical: T | null = getCanonicalModelInstance(target);
|
|
126
|
+
const metadataSource: T = canonical || target;
|
|
121
127
|
const dictonary: Dictionary<TableColumnMetadata> = {};
|
|
122
|
-
const keys: Array<string> = Object.keys(
|
|
128
|
+
const keys: Array<string> = Object.keys(metadataSource);
|
|
123
129
|
|
|
124
130
|
for (const key of keys) {
|
|
125
131
|
const metadata: TableColumnMetadata | undefined = Reflect.getMetadata(
|
|
126
132
|
tableColumn,
|
|
127
|
-
|
|
133
|
+
metadataSource,
|
|
128
134
|
key,
|
|
129
135
|
) as TableColumnMetadata | undefined;
|
|
130
136
|
if (metadata) {
|
|
@@ -133,7 +139,15 @@ export const getTableColumns: GetTableColumnsFunction = <T extends BaseModel>(
|
|
|
133
139
|
}
|
|
134
140
|
|
|
135
141
|
cached = dictonary;
|
|
136
|
-
|
|
142
|
+
|
|
143
|
+
/*
|
|
144
|
+
* No canonical instance (see CanonicalModelInstance): answer from the
|
|
145
|
+
* instance we were handed, but do NOT cache it for the class - that
|
|
146
|
+
* instance may be a mutilated one, and a cached answer outlives it.
|
|
147
|
+
*/
|
|
148
|
+
if (canonical) {
|
|
149
|
+
tableColumnsCache.set(modelClass, cached);
|
|
150
|
+
}
|
|
137
151
|
}
|
|
138
152
|
|
|
139
153
|
/*
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The two periods a self-hosted Enterprise Edition install runs without a
|
|
3
|
+
* current license. They are different periods with different lengths, and
|
|
4
|
+
* the product must never call one by the other's name:
|
|
5
|
+
*
|
|
6
|
+
* trial an Enterprise install that has never had a license, counted from
|
|
7
|
+
* GlobalConfig.enterpriseEditionFirstSeenAt
|
|
8
|
+
* grace a license that expired (a verified license's signed expiry, or an
|
|
9
|
+
* unverified legacy license's stored expiry column), counted from
|
|
10
|
+
* its expiry
|
|
11
|
+
*
|
|
12
|
+
* Until either ends nothing changes; after it, enterprise configuration
|
|
13
|
+
* becomes read-only and SSO, SCIM and audit logging stop
|
|
14
|
+
* (EnterpriseEdition.isFeatureActive) until a license is activated.
|
|
15
|
+
*
|
|
16
|
+
* They live here, with no server dependency, so the copy that states them in
|
|
17
|
+
* the browser (the edition dialog, the enterprise banners) derives the
|
|
18
|
+
* numbers from the same place the license classifier does. Server code reads
|
|
19
|
+
* them through Common/Server/Enterprise/EnterpriseLicenseSnapshot.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
// How long an expired license keeps working, counted from its expiry.
|
|
23
|
+
export const ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS: number = 30;
|
|
24
|
+
|
|
25
|
+
/*
|
|
26
|
+
* How long an Enterprise install with no license at all is on trial, counted
|
|
27
|
+
* from GlobalConfig.enterpriseEditionFirstSeenAt.
|
|
28
|
+
*/
|
|
29
|
+
export const ENTERPRISE_LICENSE_TRIAL_PERIOD_IN_DAYS: number = 14;
|
package/Types/IP/IPv6.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import BadDataException from "../Exception/BadDataException";
|
|
2
2
|
import IP from "./IP";
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
/*
|
|
5
|
+
* The class used to be declared `class IPv4 extends IP` here — a copy-paste
|
|
6
|
+
* that the default export hid from every import site, while leaving
|
|
7
|
+
* IPv6.name === "IPv4" in error messages, serialized output and API docs.
|
|
8
|
+
*/
|
|
9
|
+
export default class IPv6 extends IP {
|
|
5
10
|
public constructor(ip: string) {
|
|
6
11
|
super(ip);
|
|
7
12
|
|
|
@@ -45,9 +45,12 @@ export interface MonitorEvaluationEvent {
|
|
|
45
45
|
relatedIncidentId?: string | undefined;
|
|
46
46
|
relatedIncidentNumber?: number | undefined;
|
|
47
47
|
relatedIncidentNumberWithPrefix?: string | undefined;
|
|
48
|
+
relatedIncidentCreatedAt?: Date | undefined;
|
|
48
49
|
relatedAlertId?: string | undefined;
|
|
49
50
|
relatedAlertNumber?: number | undefined;
|
|
50
51
|
relatedAlertNumberWithPrefix?: string | undefined;
|
|
52
|
+
relatedAlertCreatedAt?: Date | undefined;
|
|
53
|
+
// When this action occurred, distinct from an already-active entity's creation.
|
|
51
54
|
at?: Date | undefined;
|
|
52
55
|
}
|
|
53
56
|
|
|
@@ -497,8 +497,13 @@ export default class MonitorStep extends DatabaseProperty {
|
|
|
497
497
|
return this;
|
|
498
498
|
}
|
|
499
499
|
|
|
500
|
+
/*
|
|
501
|
+
* `undefined` clears it. The form needs that: a destination that no longer
|
|
502
|
+
* parses must not leave the previously parsed one sitting in the step,
|
|
503
|
+
* where it would be saved as if the operator had meant it.
|
|
504
|
+
*/
|
|
500
505
|
public setMonitorDestination(
|
|
501
|
-
monitorDestination: URL | IP | Hostname,
|
|
506
|
+
monitorDestination: URL | IP | Hostname | undefined,
|
|
502
507
|
): MonitorStep {
|
|
503
508
|
this.data!.monitorDestination = monitorDestination;
|
|
504
509
|
return this;
|
|
@@ -897,7 +897,7 @@ const guestNotBackedUpTemplate: ProxmoxAlertTemplate = {
|
|
|
897
897
|
/*
|
|
898
898
|
* Cluster-level gauge from the backup-info collector — one
|
|
899
899
|
* series, no `id` label, so no groupBy: one incident per
|
|
900
|
-
* cluster. Per-guest naming belongs to the
|
|
900
|
+
* cluster. Per-guest naming belongs to the Affected Resources list
|
|
901
901
|
* (pve_not_backed_up_info grouped by `id`), not the alert.
|
|
902
902
|
*/
|
|
903
903
|
metricName: "pve_not_backed_up_total",
|
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
import OneUptimeDate from "../Date";
|
|
2
|
+
import BadDataException from "../Exception/BadDataException";
|
|
3
|
+
import { MaterializedShift } from "./MaterializedShift";
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* The wire contract of the schedule timeline: every on-call schedule a caller
|
|
7
|
+
* can read, side by side over one week or one month, with who is on call on
|
|
8
|
+
* each (the "who is on call across my team / my whole org" view).
|
|
9
|
+
*
|
|
10
|
+
* The shifts come from the same pipeline as the calendar feeds, /my-shifts
|
|
11
|
+
* and the shift reminders (OnCallShiftMaterializer through the schedule-level
|
|
12
|
+
* cache), so the timeline can never disagree with the person who actually
|
|
13
|
+
* gets paged. This file holds what both ends need: the route, the window
|
|
14
|
+
* rules, the JSON shapes, the server-side projection of a MaterializedShift
|
|
15
|
+
* and a defensive client-side parser.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export const SCHEDULE_TIMELINE_ROUTE: string = "/on-call-schedule-timeline";
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
* How far back and ahead the timeline may look, in days. Past shifts are
|
|
22
|
+
* recomputed from the CURRENT configuration (the engine does not keep
|
|
23
|
+
* history), so looking back is useful for "who had last weekend" and not for
|
|
24
|
+
* audits; the on-call time logs are the record of what actually happened.
|
|
25
|
+
* Ahead is bounded because every distinct window is a fresh expansion of
|
|
26
|
+
* every layer of every schedule.
|
|
27
|
+
*/
|
|
28
|
+
export const TIMELINE_MAX_PAST_DAYS: number = 180;
|
|
29
|
+
export const TIMELINE_MAX_FUTURE_DAYS: number = 365;
|
|
30
|
+
|
|
31
|
+
/*
|
|
32
|
+
* The widest single request. A month view in any timezone spans at most 31
|
|
33
|
+
* days plus a day of zone offset on each side; anything wider is a client
|
|
34
|
+
* asking for more than it can draw.
|
|
35
|
+
*/
|
|
36
|
+
export const TIMELINE_MAX_SPAN_DAYS: number = 45;
|
|
37
|
+
|
|
38
|
+
// Span used when `to` is absent.
|
|
39
|
+
export const TIMELINE_DEFAULT_SPAN_DAYS: number = 7;
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* The most schedules one response carries. Past this the response says how
|
|
43
|
+
* many there were so the page can ask the reader to narrow by team.
|
|
44
|
+
*/
|
|
45
|
+
export const TIMELINE_MAX_SCHEDULES: number = 250;
|
|
46
|
+
|
|
47
|
+
const MILLISECONDS_PER_DAY: number = 24 * 60 * 60 * 1000;
|
|
48
|
+
|
|
49
|
+
export interface ScheduleTimelineOverrideJson {
|
|
50
|
+
// The person whose shift this was before the override.
|
|
51
|
+
originalUserId: string;
|
|
52
|
+
originalUserName: string;
|
|
53
|
+
overrideStartsAt: string;
|
|
54
|
+
overrideEndsAt: string;
|
|
55
|
+
// Set when the override is scoped to one on-call policy; null when global.
|
|
56
|
+
onCallDutyPolicyId: string | null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface ScheduleTimelineShiftJson {
|
|
60
|
+
shiftKey: string;
|
|
61
|
+
userId: string;
|
|
62
|
+
userName: string;
|
|
63
|
+
// ISO strings; `end` is exclusive.
|
|
64
|
+
start: string;
|
|
65
|
+
end: string;
|
|
66
|
+
layerId: string | null;
|
|
67
|
+
layerName: string | null;
|
|
68
|
+
override: ScheduleTimelineOverrideJson | null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface ScheduleTimelineScheduleJson {
|
|
72
|
+
scheduleId: string;
|
|
73
|
+
scheduleName: string;
|
|
74
|
+
// The zone the schedule's rotations are authored in; null for legacy rows.
|
|
75
|
+
scheduleTimezone: string | null;
|
|
76
|
+
// Teams listed as owners of the schedule, for grouping and filtering.
|
|
77
|
+
ownerTeamIds: Array<string>;
|
|
78
|
+
// The caller is assigned to at least one of the schedule's layers.
|
|
79
|
+
isCurrentUserOnRoster: boolean;
|
|
80
|
+
// The rotation engine hit its iteration cap: shifts may be missing.
|
|
81
|
+
truncated: boolean;
|
|
82
|
+
shifts: Array<ScheduleTimelineShiftJson>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export interface ScheduleTimelineTeamJson {
|
|
86
|
+
teamId: string;
|
|
87
|
+
teamName: string;
|
|
88
|
+
isCurrentUserMember: boolean;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface ScheduleTimelineResponse {
|
|
92
|
+
// The window actually served, after clamping. ISO strings.
|
|
93
|
+
from: string;
|
|
94
|
+
to: string;
|
|
95
|
+
generatedAt: string;
|
|
96
|
+
// Any schedule's expansion hit the iteration cap.
|
|
97
|
+
truncated: boolean;
|
|
98
|
+
// How many schedules matched before TIMELINE_MAX_SCHEDULES was applied.
|
|
99
|
+
totalScheduleCount: number;
|
|
100
|
+
schedulesTruncated: boolean;
|
|
101
|
+
schedules: Array<ScheduleTimelineScheduleJson>;
|
|
102
|
+
// Every team that owns at least one of the schedules above, by name.
|
|
103
|
+
teams: Array<ScheduleTimelineTeamJson>;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface TimelineWindow {
|
|
107
|
+
from: Date;
|
|
108
|
+
to: Date;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export default class ScheduleTimelineUtil {
|
|
112
|
+
/*
|
|
113
|
+
* The range a timeline request may address at `now`:
|
|
114
|
+
* [now - TIMELINE_MAX_PAST_DAYS, now + TIMELINE_MAX_FUTURE_DAYS]. The
|
|
115
|
+
* dashboard uses the same numbers to stop the reader navigating somewhere
|
|
116
|
+
* the server would refuse to draw.
|
|
117
|
+
*/
|
|
118
|
+
public static getAddressableRange(now: Date): TimelineWindow {
|
|
119
|
+
return {
|
|
120
|
+
from: OneUptimeDate.addRemoveDays(now, -TIMELINE_MAX_PAST_DAYS),
|
|
121
|
+
to: OneUptimeDate.addRemoveDays(now, TIMELINE_MAX_FUTURE_DAYS),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/*
|
|
126
|
+
* Validate and clamp a requested window. Garbage is refused (400); a window
|
|
127
|
+
* that is merely too wide or too far away is pulled back in rather than
|
|
128
|
+
* refused, so a client that is a release ahead still gets an answer.
|
|
129
|
+
*
|
|
130
|
+
* - `from` is required; `to` defaults to from + TIMELINE_DEFAULT_SPAN_DAYS.
|
|
131
|
+
* - `to` must be after `from`.
|
|
132
|
+
* - the span is capped at TIMELINE_MAX_SPAN_DAYS by moving `to` in;
|
|
133
|
+
* - both edges are clamped into the addressable range. A window that lies
|
|
134
|
+
* wholly outside it collapses onto the nearest edge day, never to an
|
|
135
|
+
* empty or inverted window.
|
|
136
|
+
*/
|
|
137
|
+
public static clampWindow(data: {
|
|
138
|
+
from: unknown;
|
|
139
|
+
to: unknown;
|
|
140
|
+
now: Date;
|
|
141
|
+
}): TimelineWindow {
|
|
142
|
+
const from: Date = ScheduleTimelineUtil.readDate(data.from, "from", true)!;
|
|
143
|
+
|
|
144
|
+
let to: Date =
|
|
145
|
+
ScheduleTimelineUtil.readDate(data.to, "to", false) ||
|
|
146
|
+
OneUptimeDate.addRemoveDays(from, TIMELINE_DEFAULT_SPAN_DAYS);
|
|
147
|
+
|
|
148
|
+
if (to.getTime() <= from.getTime()) {
|
|
149
|
+
throw new BadDataException("to must be after from.");
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const spanCap: Date = OneUptimeDate.addRemoveDays(
|
|
153
|
+
from,
|
|
154
|
+
TIMELINE_MAX_SPAN_DAYS,
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
if (to.getTime() > spanCap.getTime()) {
|
|
158
|
+
to = spanCap;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const addressable: TimelineWindow =
|
|
162
|
+
ScheduleTimelineUtil.getAddressableRange(data.now);
|
|
163
|
+
|
|
164
|
+
let clampedFrom: Date = from;
|
|
165
|
+
let clampedTo: Date = to;
|
|
166
|
+
|
|
167
|
+
if (clampedFrom.getTime() < addressable.from.getTime()) {
|
|
168
|
+
clampedFrom = addressable.from;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (clampedTo.getTime() > addressable.to.getTime()) {
|
|
172
|
+
clampedTo = addressable.to;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/*
|
|
176
|
+
* Entirely before the addressable range, or entirely after it: serve the
|
|
177
|
+
* one day at that edge. The page shades everything outside the served
|
|
178
|
+
* window, so the reader sees WHY there is nothing there.
|
|
179
|
+
*/
|
|
180
|
+
if (clampedTo.getTime() <= clampedFrom.getTime()) {
|
|
181
|
+
if (to.getTime() <= addressable.from.getTime()) {
|
|
182
|
+
clampedFrom = addressable.from;
|
|
183
|
+
clampedTo = OneUptimeDate.addRemoveDays(addressable.from, 1);
|
|
184
|
+
} else {
|
|
185
|
+
clampedTo = addressable.to;
|
|
186
|
+
clampedFrom = OneUptimeDate.addRemoveDays(addressable.to, -1);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return { from: clampedFrom, to: clampedTo };
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/*
|
|
194
|
+
* The window handed to the schedule-level cache: widened to whole UTC days,
|
|
195
|
+
* exactly like /my-shifts does, so a timeline and a feed that cover the
|
|
196
|
+
* same days share one expansion per schedule.
|
|
197
|
+
*/
|
|
198
|
+
public static getCacheWindow(window: TimelineWindow): {
|
|
199
|
+
windowStart: Date;
|
|
200
|
+
windowEnd: Date;
|
|
201
|
+
} {
|
|
202
|
+
const windowStart: Date = new Date(
|
|
203
|
+
ScheduleTimelineUtil.startOfUtcDay(window.from),
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
const endDayStart: number = ScheduleTimelineUtil.startOfUtcDay(window.to);
|
|
207
|
+
|
|
208
|
+
const windowEnd: Date = new Date(
|
|
209
|
+
window.to.getTime() > endDayStart
|
|
210
|
+
? endDayStart + MILLISECONDS_PER_DAY
|
|
211
|
+
: endDayStart,
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
return { windowStart, windowEnd };
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/*
|
|
218
|
+
* Project one materialized shift onto the timeline's wire shape, or null
|
|
219
|
+
* when it does not belong on the timeline:
|
|
220
|
+
*
|
|
221
|
+
* - policy-variant shifts are dropped. They exist only for one
|
|
222
|
+
* escalation policy's view of a schedule attached to several, and they
|
|
223
|
+
* overlap the base shift for the same interval; a row can only show one
|
|
224
|
+
* person at a time, and the base resolution is the one the schedule's
|
|
225
|
+
* own roster (and its page) shows.
|
|
226
|
+
* - shifts that do not overlap the served window are dropped (the cache
|
|
227
|
+
* window is day-aligned and therefore a little wider).
|
|
228
|
+
*/
|
|
229
|
+
public static toTimelineShift(
|
|
230
|
+
shift: MaterializedShift,
|
|
231
|
+
window: TimelineWindow,
|
|
232
|
+
): ScheduleTimelineShiftJson | null {
|
|
233
|
+
if (shift.policyVariantOf) {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if (
|
|
238
|
+
shift.end.getTime() <= window.from.getTime() ||
|
|
239
|
+
shift.start.getTime() >= window.to.getTime()
|
|
240
|
+
) {
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return {
|
|
245
|
+
shiftKey: shift.shiftKey,
|
|
246
|
+
userId: shift.userId,
|
|
247
|
+
userName: shift.userName,
|
|
248
|
+
start: shift.start.toISOString(),
|
|
249
|
+
end: shift.end.toISOString(),
|
|
250
|
+
layerId: shift.layerId ?? null,
|
|
251
|
+
layerName: shift.layerName ?? null,
|
|
252
|
+
override: shift.override
|
|
253
|
+
? {
|
|
254
|
+
originalUserId: shift.override.originalUserId,
|
|
255
|
+
originalUserName: shift.override.originalUserName,
|
|
256
|
+
overrideStartsAt: shift.override.overrideStartsAt.toISOString(),
|
|
257
|
+
overrideEndsAt: shift.override.overrideEndsAt.toISOString(),
|
|
258
|
+
onCallDutyPolicyId: shift.override.onCallDutyPolicyId ?? null,
|
|
259
|
+
}
|
|
260
|
+
: null,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/*
|
|
265
|
+
* Parse a response on the dashboard. DEFENSIVE by design, like the other
|
|
266
|
+
* on-call wire parsers: the dashboard is routinely a release ahead of or
|
|
267
|
+
* behind the API during a rolling upgrade, so a missing field reads as its
|
|
268
|
+
* empty value, a malformed shift is skipped (never thrown on), and only a
|
|
269
|
+
* body that is not an object at all is an error.
|
|
270
|
+
*/
|
|
271
|
+
public static parseResponse(value: unknown): ScheduleTimelineResponse {
|
|
272
|
+
if (!ScheduleTimelineUtil.isObject(value)) {
|
|
273
|
+
throw new BadDataException("Invalid schedule timeline response.");
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const schedules: Array<ScheduleTimelineScheduleJson> = [];
|
|
277
|
+
|
|
278
|
+
for (const item of ScheduleTimelineUtil.readArray(value["schedules"])) {
|
|
279
|
+
const schedule: ScheduleTimelineScheduleJson | null =
|
|
280
|
+
ScheduleTimelineUtil.parseSchedule(item);
|
|
281
|
+
|
|
282
|
+
if (schedule) {
|
|
283
|
+
schedules.push(schedule);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const teams: Array<ScheduleTimelineTeamJson> = [];
|
|
288
|
+
|
|
289
|
+
for (const item of ScheduleTimelineUtil.readArray(value["teams"])) {
|
|
290
|
+
if (!ScheduleTimelineUtil.isObject(item)) {
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const teamId: string | null = ScheduleTimelineUtil.readString(
|
|
295
|
+
item["teamId"],
|
|
296
|
+
);
|
|
297
|
+
|
|
298
|
+
if (!teamId) {
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
teams.push({
|
|
303
|
+
teamId,
|
|
304
|
+
teamName:
|
|
305
|
+
ScheduleTimelineUtil.readString(item["teamName"]) || "Unnamed team",
|
|
306
|
+
isCurrentUserMember: item["isCurrentUserMember"] === true,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const totalScheduleCount: number =
|
|
311
|
+
typeof value["totalScheduleCount"] === "number" &&
|
|
312
|
+
Number.isFinite(value["totalScheduleCount"])
|
|
313
|
+
? (value["totalScheduleCount"] as number)
|
|
314
|
+
: schedules.length;
|
|
315
|
+
|
|
316
|
+
return {
|
|
317
|
+
from: ScheduleTimelineUtil.readString(value["from"]) || "",
|
|
318
|
+
to: ScheduleTimelineUtil.readString(value["to"]) || "",
|
|
319
|
+
generatedAt: ScheduleTimelineUtil.readString(value["generatedAt"]) || "",
|
|
320
|
+
truncated: value["truncated"] === true,
|
|
321
|
+
totalScheduleCount,
|
|
322
|
+
schedulesTruncated: value["schedulesTruncated"] === true,
|
|
323
|
+
schedules,
|
|
324
|
+
teams,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// -- Internals ----------------------------------------------------------
|
|
329
|
+
|
|
330
|
+
private static parseSchedule(
|
|
331
|
+
value: unknown,
|
|
332
|
+
): ScheduleTimelineScheduleJson | null {
|
|
333
|
+
if (!ScheduleTimelineUtil.isObject(value)) {
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
const scheduleId: string | null = ScheduleTimelineUtil.readString(
|
|
338
|
+
value["scheduleId"],
|
|
339
|
+
);
|
|
340
|
+
|
|
341
|
+
if (!scheduleId) {
|
|
342
|
+
return null;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
const shifts: Array<ScheduleTimelineShiftJson> = [];
|
|
346
|
+
|
|
347
|
+
for (const item of ScheduleTimelineUtil.readArray(value["shifts"])) {
|
|
348
|
+
const shift: ScheduleTimelineShiftJson | null =
|
|
349
|
+
ScheduleTimelineUtil.parseShift(item);
|
|
350
|
+
|
|
351
|
+
if (shift) {
|
|
352
|
+
shifts.push(shift);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
shifts.sort(
|
|
357
|
+
(a: ScheduleTimelineShiftJson, b: ScheduleTimelineShiftJson): number => {
|
|
358
|
+
return Date.parse(a.start) - Date.parse(b.start);
|
|
359
|
+
},
|
|
360
|
+
);
|
|
361
|
+
|
|
362
|
+
return {
|
|
363
|
+
scheduleId,
|
|
364
|
+
scheduleName:
|
|
365
|
+
ScheduleTimelineUtil.readString(value["scheduleName"]) ||
|
|
366
|
+
"Unnamed schedule",
|
|
367
|
+
scheduleTimezone: ScheduleTimelineUtil.readString(
|
|
368
|
+
value["scheduleTimezone"],
|
|
369
|
+
),
|
|
370
|
+
ownerTeamIds: ScheduleTimelineUtil.readArray(value["ownerTeamIds"])
|
|
371
|
+
.map((id: unknown) => {
|
|
372
|
+
return ScheduleTimelineUtil.readString(id);
|
|
373
|
+
})
|
|
374
|
+
.filter((id: string | null): id is string => {
|
|
375
|
+
return Boolean(id);
|
|
376
|
+
}),
|
|
377
|
+
isCurrentUserOnRoster: value["isCurrentUserOnRoster"] === true,
|
|
378
|
+
truncated: value["truncated"] === true,
|
|
379
|
+
shifts,
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
private static parseShift(value: unknown): ScheduleTimelineShiftJson | null {
|
|
384
|
+
if (!ScheduleTimelineUtil.isObject(value)) {
|
|
385
|
+
return null;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
const userId: string | null = ScheduleTimelineUtil.readString(
|
|
389
|
+
value["userId"],
|
|
390
|
+
);
|
|
391
|
+
const start: string | null = ScheduleTimelineUtil.readString(
|
|
392
|
+
value["start"],
|
|
393
|
+
);
|
|
394
|
+
const end: string | null = ScheduleTimelineUtil.readString(value["end"]);
|
|
395
|
+
|
|
396
|
+
if (!userId || !start || !end) {
|
|
397
|
+
return null;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
const startMs: number = Date.parse(start);
|
|
401
|
+
const endMs: number = Date.parse(end);
|
|
402
|
+
|
|
403
|
+
// An unparseable or empty interval cannot be drawn.
|
|
404
|
+
if (!Number.isFinite(startMs) || !Number.isFinite(endMs)) {
|
|
405
|
+
return null;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
if (endMs <= startMs) {
|
|
409
|
+
return null;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
let override: ScheduleTimelineOverrideJson | null = null;
|
|
413
|
+
|
|
414
|
+
if (ScheduleTimelineUtil.isObject(value["override"])) {
|
|
415
|
+
const raw: Record<string, unknown> = value["override"];
|
|
416
|
+
const originalUserId: string | null = ScheduleTimelineUtil.readString(
|
|
417
|
+
raw["originalUserId"],
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
if (originalUserId) {
|
|
421
|
+
override = {
|
|
422
|
+
originalUserId,
|
|
423
|
+
originalUserName:
|
|
424
|
+
ScheduleTimelineUtil.readString(raw["originalUserName"]) ||
|
|
425
|
+
"Unknown user",
|
|
426
|
+
overrideStartsAt:
|
|
427
|
+
ScheduleTimelineUtil.readString(raw["overrideStartsAt"]) || start,
|
|
428
|
+
overrideEndsAt:
|
|
429
|
+
ScheduleTimelineUtil.readString(raw["overrideEndsAt"]) || end,
|
|
430
|
+
onCallDutyPolicyId: ScheduleTimelineUtil.readString(
|
|
431
|
+
raw["onCallDutyPolicyId"],
|
|
432
|
+
),
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
return {
|
|
438
|
+
shiftKey:
|
|
439
|
+
ScheduleTimelineUtil.readString(value["shiftKey"]) ||
|
|
440
|
+
`${userId}:${start}`,
|
|
441
|
+
userId,
|
|
442
|
+
userName:
|
|
443
|
+
ScheduleTimelineUtil.readString(value["userName"]) || "Unknown user",
|
|
444
|
+
start,
|
|
445
|
+
end,
|
|
446
|
+
layerId: ScheduleTimelineUtil.readString(value["layerId"]),
|
|
447
|
+
layerName: ScheduleTimelineUtil.readString(value["layerName"]),
|
|
448
|
+
override,
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
private static readDate(
|
|
453
|
+
value: unknown,
|
|
454
|
+
name: string,
|
|
455
|
+
required: boolean,
|
|
456
|
+
): Date | null {
|
|
457
|
+
if (value === undefined || value === null || value === "") {
|
|
458
|
+
if (required) {
|
|
459
|
+
throw new BadDataException(`${name} is required.`);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
return null;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
466
|
+
throw new BadDataException(`${name} must be an ISO 8601 date.`);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
const trimmed: string = value.trim();
|
|
470
|
+
|
|
471
|
+
if (!OneUptimeDate.isValidDateString(trimmed)) {
|
|
472
|
+
throw new BadDataException(`${name} must be an ISO 8601 date.`);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
const date: Date = OneUptimeDate.fromString(trimmed);
|
|
476
|
+
|
|
477
|
+
if (Number.isNaN(date.getTime())) {
|
|
478
|
+
throw new BadDataException(`${name} must be an ISO 8601 date.`);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
return date;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
private static startOfUtcDay(date: Date): number {
|
|
485
|
+
return Date.UTC(
|
|
486
|
+
date.getUTCFullYear(),
|
|
487
|
+
date.getUTCMonth(),
|
|
488
|
+
date.getUTCDate(),
|
|
489
|
+
);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
private static isObject(value: unknown): value is Record<string, unknown> {
|
|
493
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
private static readArray(value: unknown): Array<unknown> {
|
|
497
|
+
return Array.isArray(value) ? value : [];
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
private static readString(value: unknown): string | null {
|
|
501
|
+
if (typeof value === "string" && value.length > 0) {
|
|
502
|
+
return value;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
return null;
|
|
506
|
+
}
|
|
507
|
+
}
|