@oneuptime/common 12.0.1 → 12.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +14 -0
- package/Models/DatabaseModels/Host.ts +12 -4
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/KubernetesContainer.ts +5 -4
- package/Models/DatabaseModels/KubernetesResource.ts +8 -7
- package/Models/DatabaseModels/LogDropFilter.ts +9 -20
- package/Models/DatabaseModels/PodmanResource.ts +6 -6
- package/Models/DatabaseModels/ServiceLevelObjective.ts +91 -0
- package/Models/DatabaseModels/StatusPage.ts +95 -0
- package/Models/DatabaseModels/StatusPageMonitorRule.ts +911 -0
- package/Models/DatabaseModels/StatusPageResource.ts +73 -0
- package/Models/DatabaseModels/TraceDropFilter.ts +9 -20
- package/Server/API/BaseAPI.ts +13 -2
- package/Server/API/DashboardAPI.ts +39 -0
- package/Server/API/TeamMemberAPI.ts +85 -0
- package/Server/EnvironmentConfig.ts +31 -1
- package/Server/Infrastructure/GlobalCache.ts +115 -0
- package/Server/Infrastructure/Postgres/DataSourceOptions.ts +16 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785900000000-AddSloMonitorLabelRule.ts +84 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785915638551-IncreaseHostIpAddressesLength.ts +40 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785930000000-WidenInventoryResourceNameColumns.ts +131 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785930709405-AddStatusPageReportPeriod.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.ts +123 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Middleware/ProjectAuthorization.ts +66 -4
- package/Server/Services/AlertStateTimelineService.ts +20 -0
- package/Server/Services/BillingService.ts +600 -51
- package/Server/Services/CephClusterService.ts +27 -45
- package/Server/Services/CephResourceService.ts +43 -4
- package/Server/Services/CloudResourceService.ts +24 -42
- package/Server/Services/DatabaseService.ts +198 -6
- package/Server/Services/DockerHostService.ts +20 -38
- package/Server/Services/DockerResourceService.ts +62 -8
- package/Server/Services/DockerSwarmClusterService.ts +28 -46
- package/Server/Services/DockerSwarmResourceService.ts +53 -4
- package/Server/Services/HostService.ts +47 -57
- package/Server/Services/IncidentStateTimelineService.ts +20 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/IoTDeviceService.ts +1 -17
- package/Server/Services/IoTFleetService.ts +20 -38
- package/Server/Services/KubernetesClusterService.ts +18 -36
- package/Server/Services/KubernetesContainerService.ts +50 -9
- package/Server/Services/KubernetesResourceService.ts +53 -7
- package/Server/Services/LabelService.ts +153 -1
- package/Server/Services/MetricTypeService.ts +84 -0
- package/Server/Services/MonitorService.ts +146 -14
- package/Server/Services/MonitorStatusTimelineService.ts +29 -0
- package/Server/Services/MonitorTemplateService.ts +65 -0
- package/Server/Services/PodmanHostService.ts +20 -38
- package/Server/Services/PodmanResourceService.ts +62 -8
- package/Server/Services/ProjectService.ts +165 -35
- package/Server/Services/ProxmoxClusterService.ts +24 -42
- package/Server/Services/ProxmoxResourceService.ts +43 -4
- package/Server/Services/RumApplicationService.ts +20 -38
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +21 -0
- package/Server/Services/ServerlessFunctionService.ts +25 -43
- package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +426 -0
- package/Server/Services/ServiceLevelObjectiveService.ts +39 -0
- package/Server/Services/ServiceService.ts +299 -73
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +752 -0
- package/Server/Services/StatusPageMonitorRuleService.ts +471 -0
- package/Server/Services/StatusPageService.ts +95 -36
- package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +18 -1
- package/Server/Services/StatusPageSubscriberService.ts +3 -0
- package/Server/Services/TelemetryEntityRelationshipService.ts +1 -0
- package/Server/Services/TelemetryEntityService.ts +1 -0
- package/Server/Types/Database/JSONColumnQuery.ts +621 -0
- package/Server/Types/Database/Permissions/PublicPermission.ts +9 -2
- package/Server/Types/Database/QueryHelper.ts +17 -32
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +170 -39
- package/Server/Utils/Database/TruncateColumnValue.ts +84 -0
- package/Server/Utils/Monitor/MonitorResource.ts +63 -36
- package/Server/Utils/Monitor/MonitorStatusTimeline.ts +36 -0
- package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +148 -127
- package/Server/Utils/Monitor/MonitorStepsReferenceExtractor.ts +434 -0
- package/Server/Utils/SingleFlight.ts +83 -0
- package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +46 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +107 -26
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +314 -0
- package/Server/Utils/Telemetry/Telemetry.ts +351 -122
- package/Tests/App/Dashboard/UsersTableGroupsByPerson.test.tsx +448 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
- package/Tests/Models/DatabaseModels/ColumnTransformerInvariants.test.ts +306 -0
- package/Tests/Models/DatabaseModels/NumberColumnDeserialization.test.ts +333 -0
- package/Tests/Models/DatabaseModels/StatusPageMonitorRuleModel.test.ts +190 -0
- package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +704 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +26 -0
- package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +303 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +226 -0
- package/Tests/Server/Infrastructure/PostgresLockTimeoutOptions.test.ts +181 -0
- package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +350 -0
- package/Tests/Server/Middleware/ProjectAuthorizationApiKeyHeader.test.ts +362 -0
- package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +687 -0
- package/Tests/Server/Services/BillingService.test.ts +78 -3
- package/Tests/Server/Services/BillingServiceChangePlanCancel.test.ts +645 -0
- package/Tests/Server/Services/BillingServiceTrialPlanChange.test.ts +1005 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlocked.test.ts +342 -0
- package/Tests/Server/Services/DropFilterSaveValidation.test.ts +245 -0
- package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +503 -0
- package/Tests/Server/Services/HostIpAddressesColumnWidth.test.ts +198 -0
- package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +658 -0
- package/Tests/Server/Services/InventoryResourceNameColumnWidth.test.ts +500 -0
- package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +586 -0
- package/Tests/Server/Services/InventoryUpsertTruncationGuard.test.ts +1242 -0
- package/Tests/Server/Services/MetricTypeAttachServices.test.ts +222 -0
- package/Tests/Server/Services/MissingReferenceWriteGuard.test.ts +614 -0
- package/Tests/Server/Services/MonitorStatusTimelineFastPath.test.ts +23 -0
- package/Tests/Server/Services/ProjectServiceChangePlan.test.ts +650 -0
- package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +1 -0
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +636 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +770 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +130 -0
- package/Tests/Server/Services/ServiceUpdateLastSeenSplitGates.test.ts +705 -0
- package/Tests/Server/Services/SloMonitorLabelRuleHooks.test.ts +352 -0
- package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +1719 -0
- package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +1212 -0
- package/Tests/Server/Services/StatusPageMonitorRuleMonitorCreateHook.test.ts +228 -0
- package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +29 -13
- package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +69 -8
- package/Tests/Server/Types/Database/JSONColumnQuery.test.ts +593 -0
- package/Tests/Server/Types/Database/Permissions/PublicPermission.test.ts +495 -0
- package/Tests/Server/Types/Database/QueryUtil.test.ts +113 -0
- package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +267 -0
- package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +260 -13
- package/Tests/Server/Utils/Database/TruncateColumnValue.test.ts +179 -0
- package/Tests/Server/Utils/EntityRegistryRowFence.test.ts +302 -0
- package/Tests/Server/Utils/MetricTypeIndexConvergence.test.ts +598 -0
- package/Tests/Server/Utils/Monitor/MonitorStatusTimelineUnusableStatus.test.ts +154 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +638 -92
- package/Tests/Server/Utils/Monitor/MonitorStepsReferenceExtractor.test.ts +724 -0
- package/Tests/Server/Utils/SingleFlight.test.ts +221 -0
- package/Tests/Types/Dashboard/NetworkDashboardTemplate.test.ts +793 -0
- package/Tests/Types/Database/BigIntColumnTransformer.test.ts +147 -0
- package/Tests/Types/Database/DatabasePropertyTransformer.test.ts +140 -0
- package/Tests/Types/Database/NumericColumnValue.test.ts +127 -0
- package/Tests/Types/Decimal.test.ts +37 -0
- package/Tests/Types/Events/Recurring.test.ts +157 -0
- package/Tests/Types/Monitor/SnmpVersionParsing.test.ts +152 -0
- package/Tests/Types/Port.test.ts +38 -0
- package/Tests/UI/Components/LogsHistogram.test.tsx +276 -0
- package/Tests/UI/Components/ModelTable/ModelTableGroupsProjectUsers.test.tsx +375 -0
- package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +196 -0
- package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +489 -0
- package/Tests/UI/Components/UseLogsHistogram.test.tsx +500 -0
- package/Tests/UI/Utils/ProjectUsersModelAPI.test.ts +739 -0
- package/Tests/UI/Utils/TeamMembersByUser.test.ts +633 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentsUtil.test.ts +120 -0
- package/Tests/Utils/Dashboard/DashboardNetworkMapComponent.test.ts +327 -0
- package/Tests/Utils/StatusPage/ReportPeriod.test.ts +218 -0
- package/Tests/Utils/Telemetry/HostIpAddresses.test.ts +291 -0
- package/Types/CustomField/CustomFieldDefinition.ts +24 -0
- package/Types/Dashboard/DashboardComponentType.ts +1 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.ts +40 -0
- package/Types/Dashboard/DashboardTemplates.ts +397 -0
- package/Types/Database/BigIntColumnTransformer.ts +74 -0
- package/Types/Database/DatabaseProperty.ts +26 -0
- package/Types/Database/NumericColumnValue.ts +128 -0
- package/Types/Date.ts +112 -0
- package/Types/Decimal.ts +16 -4
- package/Types/Events/Recurring.ts +99 -1
- package/Types/Permission.ts +48 -0
- package/Types/Port.ts +16 -4
- package/Types/StatusPage/StatusPageReport.ts +11 -0
- package/Types/StatusPage/StatusPageReportPeriodType.ts +21 -0
- package/UI/Components/LogsViewer/useLiveLogsRefresh.ts +86 -0
- package/UI/Components/LogsViewer/useLogsHistogram.ts +113 -0
- package/UI/Components/ModelTable/CustomFieldColumns.tsx +2 -6
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +21 -2
- package/UI/Utils/ModelAPI/ProjectUsersModelAPI.ts +305 -0
- package/UI/Utils/TeamMembersByUser.ts +302 -0
- package/Utils/Dashboard/Components/DashboardNetworkMapComponent.ts +136 -0
- package/Utils/Dashboard/Components/Index.ts +7 -0
- package/Utils/StatusPage/ReportPeriod.ts +236 -0
- package/Utils/Telemetry/HostIpAddresses.ts +98 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +12 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Host.js +12 -4
- package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesContainer.js +4 -4
- package/build/dist/Models/DatabaseModels/KubernetesContainer.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesResource.js +7 -7
- package/build/dist/Models/DatabaseModels/KubernetesResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogDropFilter.js +9 -20
- package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanResource.js +6 -6
- package/build/dist/Models/DatabaseModels/PodmanResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +87 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +98 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +925 -0
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/StatusPageResource.js +72 -0
- package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js +9 -20
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +11 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +39 -0
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +57 -2
- package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +27 -1
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/GlobalCache.js +91 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +5 -3
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785900000000-AddSloMonitorLabelRule.js +45 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785900000000-AddSloMonitorLabelRule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785915638551-IncreaseHostIpAddressesLength.js +31 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785915638551-IncreaseHostIpAddressesLength.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785930000000-WidenInventoryResourceNameColumns.js +90 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785930000000-WidenInventoryResourceNameColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785930709405-AddStatusPageReportPeriod.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785930709405-AddStatusPageReportPeriod.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js +48 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +59 -4
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AlertStateTimelineService.js +19 -0
- package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +466 -36
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +26 -39
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CephResourceService.js +28 -3
- package/build/dist/Server/Services/CephResourceService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +23 -36
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +155 -2
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +19 -32
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerResourceService.js +34 -4
- package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +27 -40
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmResourceService.js +28 -3
- package/build/dist/Server/Services/DockerSwarmResourceService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +58 -64
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +19 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTDeviceService.js +1 -8
- package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetService.js +19 -32
- package/build/dist/Server/Services/IoTFleetService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +17 -30
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesContainerService.js +29 -3
- package/build/dist/Server/Services/KubernetesContainerService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesResourceService.js +32 -4
- package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +127 -0
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/MetricTypeService.js +74 -0
- package/build/dist/Server/Services/MetricTypeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +128 -9
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +28 -0
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +60 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +19 -32
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/PodmanResourceService.js +34 -4
- package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +135 -21
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +23 -36
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxResourceService.js +28 -3
- package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationService.js +19 -32
- package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +20 -0
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionService.js +24 -37
- package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +347 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +33 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +236 -61
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +603 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js +401 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -0
- package/build/dist/Server/Services/StatusPageService.js +69 -46
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +17 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +3 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +1 -0
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryEntityService.js +1 -0
- package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
- package/build/dist/Server/Types/Database/JSONColumnQuery.js +402 -0
- package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -0
- package/build/dist/Server/Types/Database/Permissions/PublicPermission.js +9 -2
- package/build/dist/Server/Types/Database/Permissions/PublicPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +17 -27
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +105 -29
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/Database/TruncateColumnValue.js +32 -0
- package/build/dist/Server/Utils/Database/TruncateColumnValue.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +56 -32
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +30 -3
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +110 -98
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js +312 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js.map +1 -0
- package/build/dist/Server/Utils/SingleFlight.js +76 -0
- package/build/dist/Server/Utils/SingleFlight.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +29 -0
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +78 -19
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +160 -0
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +279 -104
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldDefinition.js +2 -0
- package/build/dist/Types/CustomField/CustomFieldDefinition.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +368 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Database/BigIntColumnTransformer.js +66 -0
- package/build/dist/Types/Database/BigIntColumnTransformer.js.map +1 -0
- package/build/dist/Types/Database/DatabaseProperty.js +25 -0
- package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
- package/build/dist/Types/Database/NumericColumnValue.js +97 -0
- package/build/dist/Types/Database/NumericColumnValue.js.map +1 -0
- package/build/dist/Types/Date.js +68 -0
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Decimal.js +14 -3
- package/build/dist/Types/Decimal.js.map +1 -1
- package/build/dist/Types/Events/Recurring.js +63 -0
- package/build/dist/Types/Events/Recurring.js.map +1 -1
- package/build/dist/Types/Permission.js +42 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Port.js +15 -5
- package/build/dist/Types/Port.js.map +1 -1
- package/build/dist/Types/StatusPage/StatusPageReportPeriodType.js +22 -0
- package/build/dist/Types/StatusPage/StatusPageReportPeriodType.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js +44 -0
- package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +75 -0
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +18 -2
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js +213 -0
- package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js.map +1 -0
- package/build/dist/UI/Utils/TeamMembersByUser.js +195 -0
- package/build/dist/UI/Utils/TeamMembersByUser.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js +114 -0
- package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/StatusPage/ReportPeriod.js +131 -0
- package/build/dist/Utils/StatusPage/ReportPeriod.js.map +1 -0
- package/build/dist/Utils/Telemetry/HostIpAddresses.js +82 -0
- package/build/dist/Utils/Telemetry/HostIpAddresses.js.map +1 -0
- package/jest.config.json +2 -0
- package/package.json +1 -1
- package/tsconfig.json +12 -1
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import Monitor from "../../../Models/DatabaseModels/Monitor";
|
|
2
|
+
import MonitorLabelRuleEngineService from "../../../Server/Services/MonitorLabelRuleEngineService";
|
|
3
|
+
import MonitorOwnerRuleEngineService from "../../../Server/Services/MonitorOwnerRuleEngineService";
|
|
4
|
+
import MonitorService from "../../../Server/Services/MonitorService";
|
|
5
|
+
import ServiceLevelObjectiveMonitorRuleEngineService from "../../../Server/Services/ServiceLevelObjectiveMonitorRuleEngineService";
|
|
6
|
+
import StatusPageMonitorRuleEngineService from "../../../Server/Services/StatusPageMonitorRuleEngineService";
|
|
7
|
+
import CreateBy from "../../../Server/Types/Database/CreateBy";
|
|
8
|
+
import { OnCreate } from "../../../Server/Types/Database/Hooks";
|
|
9
|
+
import MonitorType from "../../../Types/Monitor/MonitorType";
|
|
10
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
11
|
+
import { describe, expect, it, beforeEach, afterEach } from "@jest/globals";
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* Contract under test - the create-side half of the status page monitor rule
|
|
15
|
+
* trigger, which is how monitors normally arrive on a status page. A rule that
|
|
16
|
+
* only ever noticed EDITS would leave every newly created monitor off the page
|
|
17
|
+
* until somebody happened to touch it again.
|
|
18
|
+
*
|
|
19
|
+
* MonitorService.onCreateSuccess runs its slow work on a detached promise
|
|
20
|
+
* chain (the create response must not wait for it), so these tests call the
|
|
21
|
+
* hook and then wait for the effect rather than awaiting the hook alone.
|
|
22
|
+
*
|
|
23
|
+
* Ordering matters as much as the call itself: the sync has to run AFTER
|
|
24
|
+
* MonitorLabelRuleEngineService, because a monitor created with no labels of
|
|
25
|
+
* its own can still earn them from a label rule, and those labels are exactly
|
|
26
|
+
* what a status page rule is likely to match on.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
30
|
+
"22222222-2222-4222-8222-222222222222",
|
|
31
|
+
);
|
|
32
|
+
const MONITOR_ID: ObjectID = new ObjectID(
|
|
33
|
+
"aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
|
|
34
|
+
);
|
|
35
|
+
const MONITOR_STATUS_ID: ObjectID = new ObjectID(
|
|
36
|
+
"55555555-5555-4555-8555-555555555555",
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
// Calls a protected hook without widening the service's public surface.
|
|
40
|
+
function callHook(
|
|
41
|
+
service: unknown,
|
|
42
|
+
name: string,
|
|
43
|
+
...args: Array<unknown>
|
|
44
|
+
): Promise<unknown> {
|
|
45
|
+
const hooks: Record<
|
|
46
|
+
string,
|
|
47
|
+
(...hookArgs: Array<unknown>) => Promise<unknown>
|
|
48
|
+
> = service as Record<
|
|
49
|
+
string,
|
|
50
|
+
(...hookArgs: Array<unknown>) => Promise<unknown>
|
|
51
|
+
>;
|
|
52
|
+
|
|
53
|
+
return hooks[name]!.apply(service, args);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function createdMonitor(): Monitor {
|
|
57
|
+
return {
|
|
58
|
+
id: MONITOR_ID,
|
|
59
|
+
_id: MONITOR_ID.toString(),
|
|
60
|
+
projectId: PROJECT_ID,
|
|
61
|
+
name: "Checkout API",
|
|
62
|
+
description: "tier-1",
|
|
63
|
+
// Manual monitors take no probes, which keeps the inline probe step out.
|
|
64
|
+
monitorType: MonitorType.Manual,
|
|
65
|
+
currentMonitorStatusId: MONITOR_STATUS_ID,
|
|
66
|
+
} as unknown as Monitor;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function onCreate(): OnCreate<Monitor> {
|
|
70
|
+
return {
|
|
71
|
+
createBy: {
|
|
72
|
+
data: createdMonitor(),
|
|
73
|
+
props: { isRoot: true, tenantId: PROJECT_ID },
|
|
74
|
+
} as unknown as CreateBy<Monitor>,
|
|
75
|
+
carryForward: null,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* The chain is detached, so poll for the effect instead of awaiting the hook.
|
|
81
|
+
* Returns as soon as the predicate holds, or gives up after ~2s so a genuine
|
|
82
|
+
* regression fails loudly rather than hanging the suite.
|
|
83
|
+
*/
|
|
84
|
+
async function waitFor(predicate: () => boolean): Promise<void> {
|
|
85
|
+
for (let attempt: number = 0; attempt < 200; attempt++) {
|
|
86
|
+
if (predicate()) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
await new Promise<void>((resolve: () => void) => {
|
|
91
|
+
setTimeout(resolve, 10);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
describe("MonitorService.onCreateSuccess - putting a new monitor on the status pages that want it", () => {
|
|
97
|
+
let syncRulesForMonitorSpy: jest.SpyInstance;
|
|
98
|
+
let applyLabelRulesSpy: jest.SpyInstance;
|
|
99
|
+
const callOrder: Array<string> = [];
|
|
100
|
+
|
|
101
|
+
beforeEach(() => {
|
|
102
|
+
callOrder.length = 0;
|
|
103
|
+
|
|
104
|
+
applyLabelRulesSpy = jest
|
|
105
|
+
.spyOn(MonitorLabelRuleEngineService, "applyRulesToMonitor")
|
|
106
|
+
.mockImplementation(async () => {
|
|
107
|
+
callOrder.push("labelRules");
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
syncRulesForMonitorSpy = jest
|
|
111
|
+
.spyOn(StatusPageMonitorRuleEngineService, "syncRulesForMonitor")
|
|
112
|
+
.mockImplementation(async () => {
|
|
113
|
+
callOrder.push("statusPageRules");
|
|
114
|
+
return [];
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
jest
|
|
118
|
+
.spyOn(MonitorOwnerRuleEngineService, "applyRulesToMonitor")
|
|
119
|
+
.mockResolvedValue(undefined);
|
|
120
|
+
jest
|
|
121
|
+
.spyOn(
|
|
122
|
+
ServiceLevelObjectiveMonitorRuleEngineService,
|
|
123
|
+
"syncSlosForMonitor",
|
|
124
|
+
)
|
|
125
|
+
.mockResolvedValue([]);
|
|
126
|
+
jest
|
|
127
|
+
.spyOn(MonitorService, "findOneById")
|
|
128
|
+
.mockResolvedValue(createdMonitor());
|
|
129
|
+
/*
|
|
130
|
+
* Private/protected members of the service under test, spied so the hook
|
|
131
|
+
* never reaches the network or the database. Billing is not stubbed: the
|
|
132
|
+
* step is gated on IsBillingEnabled, which is off in tests.
|
|
133
|
+
*/
|
|
134
|
+
const service: never = MonitorService as never;
|
|
135
|
+
|
|
136
|
+
jest
|
|
137
|
+
.spyOn(service, "handleWorkspaceOperationsAsync" as never)
|
|
138
|
+
.mockResolvedValue(undefined as never);
|
|
139
|
+
jest
|
|
140
|
+
.spyOn(service, "refreshMonitorProbeStatus" as never)
|
|
141
|
+
.mockResolvedValue(undefined as never);
|
|
142
|
+
jest
|
|
143
|
+
.spyOn(service, "changeMonitorStatus" as never)
|
|
144
|
+
.mockResolvedValue(undefined as never);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
afterEach(() => {
|
|
148
|
+
jest.restoreAllMocks();
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it("runs the status page monitor rules for a monitor that was just created", async () => {
|
|
152
|
+
await callHook(
|
|
153
|
+
MonitorService,
|
|
154
|
+
"onCreateSuccess",
|
|
155
|
+
onCreate(),
|
|
156
|
+
createdMonitor(),
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
await waitFor(() => {
|
|
160
|
+
return syncRulesForMonitorSpy.mock.calls.length > 0;
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
expect(syncRulesForMonitorSpy).toHaveBeenCalledWith({
|
|
164
|
+
monitorId: MONITOR_ID,
|
|
165
|
+
projectId: PROJECT_ID,
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
/*
|
|
170
|
+
* A monitor created with no labels can be given some by a MonitorLabelRule.
|
|
171
|
+
* Running the status page rules first would evaluate them against a monitor
|
|
172
|
+
* that has not earned its labels yet, and it would land on no page at all.
|
|
173
|
+
*/
|
|
174
|
+
it("runs them after the label rules, so rule-added labels are visible", async () => {
|
|
175
|
+
await callHook(
|
|
176
|
+
MonitorService,
|
|
177
|
+
"onCreateSuccess",
|
|
178
|
+
onCreate(),
|
|
179
|
+
createdMonitor(),
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
await waitFor(() => {
|
|
183
|
+
return callOrder.includes("statusPageRules");
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
expect(callOrder.indexOf("labelRules")).toBeGreaterThanOrEqual(0);
|
|
187
|
+
expect(callOrder.indexOf("statusPageRules")).toBeGreaterThan(
|
|
188
|
+
callOrder.indexOf("labelRules"),
|
|
189
|
+
);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it("does not fail the monitor create when the sync throws", async () => {
|
|
193
|
+
syncRulesForMonitorSpy.mockRejectedValue(new Error("db down"));
|
|
194
|
+
|
|
195
|
+
await expect(
|
|
196
|
+
callHook(MonitorService, "onCreateSuccess", onCreate(), createdMonitor()),
|
|
197
|
+
).resolves.toBeDefined();
|
|
198
|
+
|
|
199
|
+
await waitFor(() => {
|
|
200
|
+
return syncRulesForMonitorSpy.mock.calls.length > 0;
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
expect(syncRulesForMonitorSpy).toHaveBeenCalled();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
/*
|
|
207
|
+
* The label rule step is wrapped in its own try/catch that returns early on
|
|
208
|
+
* failure. If that early return also skipped the status page sync, a project
|
|
209
|
+
* with a broken label rule would quietly stop putting new monitors on its
|
|
210
|
+
* status pages.
|
|
211
|
+
*/
|
|
212
|
+
it("still runs them when the label rules step fails", async () => {
|
|
213
|
+
applyLabelRulesSpy.mockRejectedValue(new Error("label rules down"));
|
|
214
|
+
|
|
215
|
+
await callHook(
|
|
216
|
+
MonitorService,
|
|
217
|
+
"onCreateSuccess",
|
|
218
|
+
onCreate(),
|
|
219
|
+
createdMonitor(),
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
await waitFor(() => {
|
|
223
|
+
return syncRulesForMonitorSpy.mock.calls.length > 0;
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
expect(syncRulesForMonitorSpy).toHaveBeenCalled();
|
|
227
|
+
});
|
|
228
|
+
});
|
|
@@ -28,6 +28,10 @@ import StatusPageResource from "../../../Models/DatabaseModels/StatusPageResourc
|
|
|
28
28
|
import Dictionary from "../../../Types/Dictionary";
|
|
29
29
|
import ObjectID from "../../../Types/ObjectID";
|
|
30
30
|
import OneUptimeDate from "../../../Types/Date";
|
|
31
|
+
import StatusPageReportPeriodType from "../../../Types/StatusPage/StatusPageReportPeriodType";
|
|
32
|
+
import StatusPageReportPeriodUtil, {
|
|
33
|
+
StatusPageReportPeriod,
|
|
34
|
+
} from "../../../Utils/StatusPage/ReportPeriod";
|
|
31
35
|
import PositiveNumber from "../../../Types/PositiveNumber";
|
|
32
36
|
import { Green, Red } from "../../../Types/BrandColors";
|
|
33
37
|
import {
|
|
@@ -74,6 +78,18 @@ const WEBSITE_MONITOR: ObjectID = new ObjectID(
|
|
|
74
78
|
|
|
75
79
|
const HISTORY_DAYS: number = 14;
|
|
76
80
|
|
|
81
|
+
/*
|
|
82
|
+
* The window under test: the rolling fourteen days the timeline below is built
|
|
83
|
+
* around. Resolved through the same util the worker uses so these tests keep
|
|
84
|
+
* exercising the real string formatting as well as the boundaries.
|
|
85
|
+
*/
|
|
86
|
+
function reportPeriod(): StatusPageReportPeriod {
|
|
87
|
+
return StatusPageReportPeriodUtil.getReportPeriod({
|
|
88
|
+
periodType: StatusPageReportPeriodType.Rolling,
|
|
89
|
+
reportDataInDays: HISTORY_DAYS,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
77
93
|
const OPERATIONAL: MonitorStatus = new MonitorStatus();
|
|
78
94
|
OPERATIONAL.id = new ObjectID("bb000000-0000-4000-8000-000000000001");
|
|
79
95
|
OPERATIONAL.name = "Operational";
|
|
@@ -284,7 +300,7 @@ describe("StatusPageService.getReportByStatusPage", () => {
|
|
|
284
300
|
const report: StatusPageReport =
|
|
285
301
|
await StatusPageService.getReportByStatusPage({
|
|
286
302
|
statusPageId: STATUS_PAGE_ID,
|
|
287
|
-
|
|
303
|
+
reportPeriod: reportPeriod(),
|
|
288
304
|
});
|
|
289
305
|
|
|
290
306
|
expect(report.hasGroups).toBe(true);
|
|
@@ -303,7 +319,7 @@ describe("StatusPageService.getReportByStatusPage", () => {
|
|
|
303
319
|
const report: StatusPageReport =
|
|
304
320
|
await StatusPageService.getReportByStatusPage({
|
|
305
321
|
statusPageId: STATUS_PAGE_ID,
|
|
306
|
-
|
|
322
|
+
reportPeriod: reportPeriod(),
|
|
307
323
|
});
|
|
308
324
|
|
|
309
325
|
expect(rowNames(report.rows)).toEqual([
|
|
@@ -321,7 +337,7 @@ describe("StatusPageService.getReportByStatusPage", () => {
|
|
|
321
337
|
const report: StatusPageReport =
|
|
322
338
|
await StatusPageService.getReportByStatusPage({
|
|
323
339
|
statusPageId: STATUS_PAGE_ID,
|
|
324
|
-
|
|
340
|
+
reportPeriod: reportPeriod(),
|
|
325
341
|
});
|
|
326
342
|
|
|
327
343
|
const unit: StatusPageReportGroup =
|
|
@@ -344,7 +360,7 @@ describe("StatusPageService.getReportByStatusPage", () => {
|
|
|
344
360
|
const report: StatusPageReport =
|
|
345
361
|
await StatusPageService.getReportByStatusPage({
|
|
346
362
|
statusPageId: STATUS_PAGE_ID,
|
|
347
|
-
|
|
363
|
+
reportPeriod: reportPeriod(),
|
|
348
364
|
});
|
|
349
365
|
|
|
350
366
|
const pathByName: Dictionary<string> = {};
|
|
@@ -368,7 +384,7 @@ describe("StatusPageService.getReportByStatusPage", () => {
|
|
|
368
384
|
const report: StatusPageReport =
|
|
369
385
|
await StatusPageService.getReportByStatusPage({
|
|
370
386
|
statusPageId: STATUS_PAGE_ID,
|
|
371
|
-
|
|
387
|
+
reportPeriod: reportPeriod(),
|
|
372
388
|
});
|
|
373
389
|
|
|
374
390
|
const uptimeByName: Dictionary<string> = {};
|
|
@@ -387,7 +403,7 @@ describe("StatusPageService.getReportByStatusPage", () => {
|
|
|
387
403
|
const report: StatusPageReport =
|
|
388
404
|
await StatusPageService.getReportByStatusPage({
|
|
389
405
|
statusPageId: STATUS_PAGE_ID,
|
|
390
|
-
|
|
406
|
+
reportPeriod: reportPeriod(),
|
|
391
407
|
});
|
|
392
408
|
|
|
393
409
|
const corporate: StatusPageReportGroup = report.groups[0]!;
|
|
@@ -405,7 +421,7 @@ describe("StatusPageService.getReportByStatusPage", () => {
|
|
|
405
421
|
const report: StatusPageReport =
|
|
406
422
|
await StatusPageService.getReportByStatusPage({
|
|
407
423
|
statusPageId: STATUS_PAGE_ID,
|
|
408
|
-
|
|
424
|
+
reportPeriod: reportPeriod(),
|
|
409
425
|
});
|
|
410
426
|
|
|
411
427
|
const corporate: StatusPageReportGroup = report.groups[0]!;
|
|
@@ -418,7 +434,7 @@ describe("StatusPageService.getReportByStatusPage", () => {
|
|
|
418
434
|
const report: StatusPageReport =
|
|
419
435
|
await StatusPageService.getReportByStatusPage({
|
|
420
436
|
statusPageId: STATUS_PAGE_ID,
|
|
421
|
-
|
|
437
|
+
reportPeriod: reportPeriod(),
|
|
422
438
|
});
|
|
423
439
|
|
|
424
440
|
const corporate: StatusPageReportGroup = report.groups[0]!;
|
|
@@ -441,7 +457,7 @@ describe("StatusPageService.getReportByStatusPage", () => {
|
|
|
441
457
|
|
|
442
458
|
await StatusPageService.getReportByStatusPage({
|
|
443
459
|
statusPageId: STATUS_PAGE_ID,
|
|
444
|
-
|
|
460
|
+
reportPeriod: reportPeriod(),
|
|
445
461
|
});
|
|
446
462
|
|
|
447
463
|
/*
|
|
@@ -456,7 +472,7 @@ describe("StatusPageService.getReportByStatusPage", () => {
|
|
|
456
472
|
const report: StatusPageReport =
|
|
457
473
|
await StatusPageService.getReportByStatusPage({
|
|
458
474
|
statusPageId: STATUS_PAGE_ID,
|
|
459
|
-
|
|
475
|
+
reportPeriod: reportPeriod(),
|
|
460
476
|
});
|
|
461
477
|
|
|
462
478
|
expect(report.totalResources).toBe(3);
|
|
@@ -471,7 +487,7 @@ describe("StatusPageService.getReportByStatusPage", () => {
|
|
|
471
487
|
const report: StatusPageReport =
|
|
472
488
|
await StatusPageService.getReportByStatusPage({
|
|
473
489
|
statusPageId: STATUS_PAGE_ID,
|
|
474
|
-
|
|
490
|
+
reportPeriod: reportPeriod(),
|
|
475
491
|
});
|
|
476
492
|
|
|
477
493
|
expect(
|
|
@@ -513,7 +529,7 @@ describe("StatusPageService.getReportByStatusPage", () => {
|
|
|
513
529
|
const report: StatusPageReport =
|
|
514
530
|
await StatusPageService.getReportByStatusPage({
|
|
515
531
|
statusPageId: STATUS_PAGE_ID,
|
|
516
|
-
|
|
532
|
+
reportPeriod: reportPeriod(),
|
|
517
533
|
});
|
|
518
534
|
|
|
519
535
|
expect(report.hasGroups).toBe(false);
|
|
@@ -541,7 +557,7 @@ describe("StatusPageService.getReportByStatusPage", () => {
|
|
|
541
557
|
const report: StatusPageReport =
|
|
542
558
|
await StatusPageService.getReportByStatusPage({
|
|
543
559
|
statusPageId: STATUS_PAGE_ID,
|
|
544
|
-
|
|
560
|
+
reportPeriod: reportPeriod(),
|
|
545
561
|
});
|
|
546
562
|
|
|
547
563
|
expect(report.totalResources).toBe(0);
|
|
@@ -61,32 +61,92 @@ const getStripeCustomer: GetStripeCustomerFunction = (
|
|
|
61
61
|
type GetStripeSubscriptionFunction = (options?: {
|
|
62
62
|
id?: string | undefined;
|
|
63
63
|
status?: Stripe.Subscription.Status | undefined;
|
|
64
|
+
|
|
65
|
+
/*
|
|
66
|
+
* The trial Stripe itself reports on the subscription, as a unix timestamp -
|
|
67
|
+
* what a real subscription carries and what changePlan reads to make sure a
|
|
68
|
+
* plan change cannot cut a running trial short. Omitted means no trial.
|
|
69
|
+
*/
|
|
70
|
+
trialEnd?: number | null | undefined;
|
|
71
|
+
customer?: string | undefined;
|
|
72
|
+
|
|
73
|
+
/*
|
|
74
|
+
* The id of the subscription's single item - the handle changePlan swaps the
|
|
75
|
+
* new plan's price onto. An empty array stands for a subscription with no
|
|
76
|
+
* items at all, which has no such handle.
|
|
77
|
+
*/
|
|
78
|
+
itemId?: string | undefined;
|
|
79
|
+
items?: Array<{ id: string }> | undefined;
|
|
64
80
|
}) => Stripe.Subscription;
|
|
65
81
|
|
|
66
82
|
const getStripeSubscription: GetStripeSubscriptionFunction = (options?: {
|
|
67
83
|
id?: string | undefined;
|
|
68
84
|
status?: Stripe.Subscription.Status | undefined;
|
|
85
|
+
trialEnd?: number | null | undefined;
|
|
86
|
+
customer?: string | undefined;
|
|
87
|
+
itemId?: string | undefined;
|
|
88
|
+
items?: Array<{ id: string }> | undefined;
|
|
69
89
|
}): Stripe.Subscription => {
|
|
90
|
+
const items: Array<{ id: string }> = options?.items || [
|
|
91
|
+
{ id: options?.itemId || Faker.generateRandomObjectID().toString() },
|
|
92
|
+
];
|
|
93
|
+
|
|
70
94
|
return {
|
|
71
95
|
id: options?.id || Faker.generateRandomObjectID().toString(),
|
|
72
96
|
items: {
|
|
73
|
-
data:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
97
|
+
data: items.map((item: { id: string }) => {
|
|
98
|
+
// Simplified mock item: only the fields the service actually reads.
|
|
99
|
+
return {
|
|
100
|
+
id: item.id,
|
|
77
101
|
price: {
|
|
78
102
|
id: new BillingService().getMeteredPlanPriceId(
|
|
79
103
|
ProductType.ActiveMonitoring,
|
|
80
104
|
),
|
|
81
105
|
},
|
|
82
|
-
}
|
|
83
|
-
|
|
106
|
+
} as Stripe.SubscriptionItem;
|
|
107
|
+
}),
|
|
84
108
|
},
|
|
85
109
|
status: options?.status || "active",
|
|
86
|
-
|
|
87
|
-
|
|
110
|
+
trial_end: options?.trialEnd ?? null,
|
|
111
|
+
customer: options?.customer || getStripeCustomer(),
|
|
112
|
+
} as Stripe.Subscription;
|
|
88
113
|
};
|
|
89
114
|
|
|
115
|
+
/*
|
|
116
|
+
* A plan with an exact trial period, for the cases where the trial length is
|
|
117
|
+
* the thing under test. getSubscriptionPlanData randomises it between 1 and
|
|
118
|
+
* 100, so it can never produce the 0-trial-day plans (Basic, Scale) that the
|
|
119
|
+
* mid-trial plan change has to keep trialing.
|
|
120
|
+
*/
|
|
121
|
+
type GetSubscriptionPlanWithTrialPeriodFunction = (
|
|
122
|
+
trialPeriodInDays: number,
|
|
123
|
+
options?: {
|
|
124
|
+
name?: string | undefined;
|
|
125
|
+
monthlyPlanId?: string | undefined;
|
|
126
|
+
yearlyPlanId?: string | undefined;
|
|
127
|
+
},
|
|
128
|
+
) => SubscriptionPlan;
|
|
129
|
+
|
|
130
|
+
const getSubscriptionPlanWithTrialPeriod: GetSubscriptionPlanWithTrialPeriodFunction =
|
|
131
|
+
(
|
|
132
|
+
trialPeriodInDays: number,
|
|
133
|
+
options?: {
|
|
134
|
+
name?: string | undefined;
|
|
135
|
+
monthlyPlanId?: string | undefined;
|
|
136
|
+
yearlyPlanId?: string | undefined;
|
|
137
|
+
},
|
|
138
|
+
): SubscriptionPlan => {
|
|
139
|
+
return new SubscriptionPlan(
|
|
140
|
+
options?.monthlyPlanId || "price_monthly_test_plan",
|
|
141
|
+
options?.yearlyPlanId || "price_yearly_test_plan",
|
|
142
|
+
options?.name || "Scale",
|
|
143
|
+
99, // monthlySubscriptionAmountInUSD
|
|
144
|
+
84, // yearlySubscriptionAmountInUSD
|
|
145
|
+
3, // order
|
|
146
|
+
trialPeriodInDays,
|
|
147
|
+
);
|
|
148
|
+
};
|
|
149
|
+
|
|
90
150
|
type GetSubscriptionPlanDataFunction = () => SubscriptionPlan;
|
|
91
151
|
|
|
92
152
|
const getSubscriptionPlanData: GetSubscriptionPlanDataFunction =
|
|
@@ -200,6 +260,7 @@ export {
|
|
|
200
260
|
getStripeCustomer,
|
|
201
261
|
getStripeSubscription,
|
|
202
262
|
getSubscriptionPlanData,
|
|
263
|
+
getSubscriptionPlanWithTrialPeriod,
|
|
203
264
|
getCustomerData,
|
|
204
265
|
getSubscriptionData,
|
|
205
266
|
getMeteredSubscription,
|