@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.
Files changed (385) hide show
  1. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +14 -0
  2. package/Models/DatabaseModels/Host.ts +12 -4
  3. package/Models/DatabaseModels/Index.ts +2 -0
  4. package/Models/DatabaseModels/KubernetesContainer.ts +5 -4
  5. package/Models/DatabaseModels/KubernetesResource.ts +8 -7
  6. package/Models/DatabaseModels/LogDropFilter.ts +9 -20
  7. package/Models/DatabaseModels/PodmanResource.ts +6 -6
  8. package/Models/DatabaseModels/ServiceLevelObjective.ts +91 -0
  9. package/Models/DatabaseModels/StatusPage.ts +95 -0
  10. package/Models/DatabaseModels/StatusPageMonitorRule.ts +911 -0
  11. package/Models/DatabaseModels/StatusPageResource.ts +73 -0
  12. package/Models/DatabaseModels/TraceDropFilter.ts +9 -20
  13. package/Server/API/BaseAPI.ts +13 -2
  14. package/Server/API/DashboardAPI.ts +39 -0
  15. package/Server/API/TeamMemberAPI.ts +85 -0
  16. package/Server/EnvironmentConfig.ts +31 -1
  17. package/Server/Infrastructure/GlobalCache.ts +115 -0
  18. package/Server/Infrastructure/Postgres/DataSourceOptions.ts +16 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1785900000000-AddSloMonitorLabelRule.ts +84 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1785915638551-IncreaseHostIpAddressesLength.ts +40 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1785930000000-WidenInventoryResourceNameColumns.ts +131 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1785930709405-AddStatusPageReportPeriod.ts +25 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.ts +123 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  25. package/Server/Middleware/ProjectAuthorization.ts +66 -4
  26. package/Server/Services/AlertStateTimelineService.ts +20 -0
  27. package/Server/Services/BillingService.ts +600 -51
  28. package/Server/Services/CephClusterService.ts +27 -45
  29. package/Server/Services/CephResourceService.ts +43 -4
  30. package/Server/Services/CloudResourceService.ts +24 -42
  31. package/Server/Services/DatabaseService.ts +198 -6
  32. package/Server/Services/DockerHostService.ts +20 -38
  33. package/Server/Services/DockerResourceService.ts +62 -8
  34. package/Server/Services/DockerSwarmClusterService.ts +28 -46
  35. package/Server/Services/DockerSwarmResourceService.ts +53 -4
  36. package/Server/Services/HostService.ts +47 -57
  37. package/Server/Services/IncidentStateTimelineService.ts +20 -0
  38. package/Server/Services/Index.ts +2 -0
  39. package/Server/Services/IoTDeviceService.ts +1 -17
  40. package/Server/Services/IoTFleetService.ts +20 -38
  41. package/Server/Services/KubernetesClusterService.ts +18 -36
  42. package/Server/Services/KubernetesContainerService.ts +50 -9
  43. package/Server/Services/KubernetesResourceService.ts +53 -7
  44. package/Server/Services/LabelService.ts +153 -1
  45. package/Server/Services/MetricTypeService.ts +84 -0
  46. package/Server/Services/MonitorService.ts +146 -14
  47. package/Server/Services/MonitorStatusTimelineService.ts +29 -0
  48. package/Server/Services/MonitorTemplateService.ts +65 -0
  49. package/Server/Services/PodmanHostService.ts +20 -38
  50. package/Server/Services/PodmanResourceService.ts +62 -8
  51. package/Server/Services/ProjectService.ts +165 -35
  52. package/Server/Services/ProxmoxClusterService.ts +24 -42
  53. package/Server/Services/ProxmoxResourceService.ts +43 -4
  54. package/Server/Services/RumApplicationService.ts +20 -38
  55. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +21 -0
  56. package/Server/Services/ServerlessFunctionService.ts +25 -43
  57. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +426 -0
  58. package/Server/Services/ServiceLevelObjectiveService.ts +39 -0
  59. package/Server/Services/ServiceService.ts +299 -73
  60. package/Server/Services/StatusPageMonitorRuleEngineService.ts +752 -0
  61. package/Server/Services/StatusPageMonitorRuleService.ts +471 -0
  62. package/Server/Services/StatusPageService.ts +95 -36
  63. package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +18 -1
  64. package/Server/Services/StatusPageSubscriberService.ts +3 -0
  65. package/Server/Services/TelemetryEntityRelationshipService.ts +1 -0
  66. package/Server/Services/TelemetryEntityService.ts +1 -0
  67. package/Server/Types/Database/JSONColumnQuery.ts +621 -0
  68. package/Server/Types/Database/Permissions/PublicPermission.ts +9 -2
  69. package/Server/Types/Database/QueryHelper.ts +17 -32
  70. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +170 -39
  71. package/Server/Utils/Database/TruncateColumnValue.ts +84 -0
  72. package/Server/Utils/Monitor/MonitorResource.ts +63 -36
  73. package/Server/Utils/Monitor/MonitorStatusTimeline.ts +36 -0
  74. package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +148 -127
  75. package/Server/Utils/Monitor/MonitorStepsReferenceExtractor.ts +434 -0
  76. package/Server/Utils/SingleFlight.ts +83 -0
  77. package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +46 -0
  78. package/Server/Utils/Telemetry/EntityRegistry.ts +107 -26
  79. package/Server/Utils/Telemetry/ResourceHeartbeat.ts +314 -0
  80. package/Server/Utils/Telemetry/Telemetry.ts +351 -122
  81. package/Tests/App/Dashboard/UsersTableGroupsByPerson.test.tsx +448 -0
  82. package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
  83. package/Tests/Models/DatabaseModels/ColumnTransformerInvariants.test.ts +306 -0
  84. package/Tests/Models/DatabaseModels/NumberColumnDeserialization.test.ts +333 -0
  85. package/Tests/Models/DatabaseModels/StatusPageMonitorRuleModel.test.ts +190 -0
  86. package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +704 -0
  87. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +26 -0
  88. package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +303 -0
  89. package/Tests/Server/Infrastructure/GlobalCache.test.ts +226 -0
  90. package/Tests/Server/Infrastructure/PostgresLockTimeoutOptions.test.ts +181 -0
  91. package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +350 -0
  92. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyHeader.test.ts +362 -0
  93. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +687 -0
  94. package/Tests/Server/Services/BillingService.test.ts +78 -3
  95. package/Tests/Server/Services/BillingServiceChangePlanCancel.test.ts +645 -0
  96. package/Tests/Server/Services/BillingServiceTrialPlanChange.test.ts +1005 -0
  97. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlocked.test.ts +342 -0
  98. package/Tests/Server/Services/DropFilterSaveValidation.test.ts +245 -0
  99. package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +503 -0
  100. package/Tests/Server/Services/HostIpAddressesColumnWidth.test.ts +198 -0
  101. package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +658 -0
  102. package/Tests/Server/Services/InventoryResourceNameColumnWidth.test.ts +500 -0
  103. package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +586 -0
  104. package/Tests/Server/Services/InventoryUpsertTruncationGuard.test.ts +1242 -0
  105. package/Tests/Server/Services/MetricTypeAttachServices.test.ts +222 -0
  106. package/Tests/Server/Services/MissingReferenceWriteGuard.test.ts +614 -0
  107. package/Tests/Server/Services/MonitorStatusTimelineFastPath.test.ts +23 -0
  108. package/Tests/Server/Services/ProjectServiceChangePlan.test.ts +650 -0
  109. package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +1 -0
  110. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +636 -0
  111. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +770 -0
  112. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +130 -0
  113. package/Tests/Server/Services/ServiceUpdateLastSeenSplitGates.test.ts +705 -0
  114. package/Tests/Server/Services/SloMonitorLabelRuleHooks.test.ts +352 -0
  115. package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +1719 -0
  116. package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +1212 -0
  117. package/Tests/Server/Services/StatusPageMonitorRuleMonitorCreateHook.test.ts +228 -0
  118. package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +29 -13
  119. package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +69 -8
  120. package/Tests/Server/Types/Database/JSONColumnQuery.test.ts +593 -0
  121. package/Tests/Server/Types/Database/Permissions/PublicPermission.test.ts +495 -0
  122. package/Tests/Server/Types/Database/QueryUtil.test.ts +113 -0
  123. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +267 -0
  124. package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +260 -13
  125. package/Tests/Server/Utils/Database/TruncateColumnValue.test.ts +179 -0
  126. package/Tests/Server/Utils/EntityRegistryRowFence.test.ts +302 -0
  127. package/Tests/Server/Utils/MetricTypeIndexConvergence.test.ts +598 -0
  128. package/Tests/Server/Utils/Monitor/MonitorStatusTimelineUnusableStatus.test.ts +154 -0
  129. package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +638 -92
  130. package/Tests/Server/Utils/Monitor/MonitorStepsReferenceExtractor.test.ts +724 -0
  131. package/Tests/Server/Utils/SingleFlight.test.ts +221 -0
  132. package/Tests/Types/Dashboard/NetworkDashboardTemplate.test.ts +793 -0
  133. package/Tests/Types/Database/BigIntColumnTransformer.test.ts +147 -0
  134. package/Tests/Types/Database/DatabasePropertyTransformer.test.ts +140 -0
  135. package/Tests/Types/Database/NumericColumnValue.test.ts +127 -0
  136. package/Tests/Types/Decimal.test.ts +37 -0
  137. package/Tests/Types/Events/Recurring.test.ts +157 -0
  138. package/Tests/Types/Monitor/SnmpVersionParsing.test.ts +152 -0
  139. package/Tests/Types/Port.test.ts +38 -0
  140. package/Tests/UI/Components/LogsHistogram.test.tsx +276 -0
  141. package/Tests/UI/Components/ModelTable/ModelTableGroupsProjectUsers.test.tsx +375 -0
  142. package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +196 -0
  143. package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +489 -0
  144. package/Tests/UI/Components/UseLogsHistogram.test.tsx +500 -0
  145. package/Tests/UI/Utils/ProjectUsersModelAPI.test.ts +739 -0
  146. package/Tests/UI/Utils/TeamMembersByUser.test.ts +633 -0
  147. package/Tests/Utils/Dashboard/Components/DashboardComponentsUtil.test.ts +120 -0
  148. package/Tests/Utils/Dashboard/DashboardNetworkMapComponent.test.ts +327 -0
  149. package/Tests/Utils/StatusPage/ReportPeriod.test.ts +218 -0
  150. package/Tests/Utils/Telemetry/HostIpAddresses.test.ts +291 -0
  151. package/Types/CustomField/CustomFieldDefinition.ts +24 -0
  152. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  153. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  154. package/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.ts +40 -0
  155. package/Types/Dashboard/DashboardTemplates.ts +397 -0
  156. package/Types/Database/BigIntColumnTransformer.ts +74 -0
  157. package/Types/Database/DatabaseProperty.ts +26 -0
  158. package/Types/Database/NumericColumnValue.ts +128 -0
  159. package/Types/Date.ts +112 -0
  160. package/Types/Decimal.ts +16 -4
  161. package/Types/Events/Recurring.ts +99 -1
  162. package/Types/Permission.ts +48 -0
  163. package/Types/Port.ts +16 -4
  164. package/Types/StatusPage/StatusPageReport.ts +11 -0
  165. package/Types/StatusPage/StatusPageReportPeriodType.ts +21 -0
  166. package/UI/Components/LogsViewer/useLiveLogsRefresh.ts +86 -0
  167. package/UI/Components/LogsViewer/useLogsHistogram.ts +113 -0
  168. package/UI/Components/ModelTable/CustomFieldColumns.tsx +2 -6
  169. package/UI/Components/ModelTable/useCustomFieldColumns.ts +21 -2
  170. package/UI/Utils/ModelAPI/ProjectUsersModelAPI.ts +305 -0
  171. package/UI/Utils/TeamMembersByUser.ts +302 -0
  172. package/Utils/Dashboard/Components/DashboardNetworkMapComponent.ts +136 -0
  173. package/Utils/Dashboard/Components/Index.ts +7 -0
  174. package/Utils/StatusPage/ReportPeriod.ts +236 -0
  175. package/Utils/Telemetry/HostIpAddresses.ts +98 -0
  176. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +12 -0
  177. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  178. package/build/dist/Models/DatabaseModels/Host.js +12 -4
  179. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  180. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  181. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  182. package/build/dist/Models/DatabaseModels/KubernetesContainer.js +4 -4
  183. package/build/dist/Models/DatabaseModels/KubernetesContainer.js.map +1 -1
  184. package/build/dist/Models/DatabaseModels/KubernetesResource.js +7 -7
  185. package/build/dist/Models/DatabaseModels/KubernetesResource.js.map +1 -1
  186. package/build/dist/Models/DatabaseModels/LogDropFilter.js +9 -20
  187. package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
  188. package/build/dist/Models/DatabaseModels/PodmanResource.js +6 -6
  189. package/build/dist/Models/DatabaseModels/PodmanResource.js.map +1 -1
  190. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +87 -0
  191. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/StatusPage.js +98 -0
  193. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  194. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +925 -0
  195. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -0
  196. package/build/dist/Models/DatabaseModels/StatusPageResource.js +72 -0
  197. package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
  198. package/build/dist/Models/DatabaseModels/TraceDropFilter.js +9 -20
  199. package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
  200. package/build/dist/Server/API/BaseAPI.js +11 -1
  201. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  202. package/build/dist/Server/API/DashboardAPI.js +39 -0
  203. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  204. package/build/dist/Server/API/TeamMemberAPI.js +57 -2
  205. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  206. package/build/dist/Server/EnvironmentConfig.js +27 -1
  207. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  208. package/build/dist/Server/Infrastructure/GlobalCache.js +91 -0
  209. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  210. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +5 -3
  211. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
  212. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785900000000-AddSloMonitorLabelRule.js +45 -0
  213. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785900000000-AddSloMonitorLabelRule.js.map +1 -0
  214. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785915638551-IncreaseHostIpAddressesLength.js +31 -0
  215. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785915638551-IncreaseHostIpAddressesLength.js.map +1 -0
  216. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785930000000-WidenInventoryResourceNameColumns.js +90 -0
  217. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785930000000-WidenInventoryResourceNameColumns.js.map +1 -0
  218. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785930709405-AddStatusPageReportPeriod.js +14 -0
  219. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785930709405-AddStatusPageReportPeriod.js.map +1 -0
  220. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js +48 -0
  221. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js.map +1 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  224. package/build/dist/Server/Middleware/ProjectAuthorization.js +59 -4
  225. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  226. package/build/dist/Server/Services/AlertStateTimelineService.js +19 -0
  227. package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
  228. package/build/dist/Server/Services/BillingService.js +466 -36
  229. package/build/dist/Server/Services/BillingService.js.map +1 -1
  230. package/build/dist/Server/Services/CephClusterService.js +26 -39
  231. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  232. package/build/dist/Server/Services/CephResourceService.js +28 -3
  233. package/build/dist/Server/Services/CephResourceService.js.map +1 -1
  234. package/build/dist/Server/Services/CloudResourceService.js +23 -36
  235. package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
  236. package/build/dist/Server/Services/DatabaseService.js +155 -2
  237. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  238. package/build/dist/Server/Services/DockerHostService.js +19 -32
  239. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  240. package/build/dist/Server/Services/DockerResourceService.js +34 -4
  241. package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
  242. package/build/dist/Server/Services/DockerSwarmClusterService.js +27 -40
  243. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  244. package/build/dist/Server/Services/DockerSwarmResourceService.js +28 -3
  245. package/build/dist/Server/Services/DockerSwarmResourceService.js.map +1 -1
  246. package/build/dist/Server/Services/HostService.js +58 -64
  247. package/build/dist/Server/Services/HostService.js.map +1 -1
  248. package/build/dist/Server/Services/IncidentStateTimelineService.js +19 -0
  249. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  250. package/build/dist/Server/Services/Index.js +2 -0
  251. package/build/dist/Server/Services/Index.js.map +1 -1
  252. package/build/dist/Server/Services/IoTDeviceService.js +1 -8
  253. package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
  254. package/build/dist/Server/Services/IoTFleetService.js +19 -32
  255. package/build/dist/Server/Services/IoTFleetService.js.map +1 -1
  256. package/build/dist/Server/Services/KubernetesClusterService.js +17 -30
  257. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  258. package/build/dist/Server/Services/KubernetesContainerService.js +29 -3
  259. package/build/dist/Server/Services/KubernetesContainerService.js.map +1 -1
  260. package/build/dist/Server/Services/KubernetesResourceService.js +32 -4
  261. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
  262. package/build/dist/Server/Services/LabelService.js +127 -0
  263. package/build/dist/Server/Services/LabelService.js.map +1 -1
  264. package/build/dist/Server/Services/MetricTypeService.js +74 -0
  265. package/build/dist/Server/Services/MetricTypeService.js.map +1 -1
  266. package/build/dist/Server/Services/MonitorService.js +128 -9
  267. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  268. package/build/dist/Server/Services/MonitorStatusTimelineService.js +28 -0
  269. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  270. package/build/dist/Server/Services/MonitorTemplateService.js +60 -0
  271. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  272. package/build/dist/Server/Services/PodmanHostService.js +19 -32
  273. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  274. package/build/dist/Server/Services/PodmanResourceService.js +34 -4
  275. package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
  276. package/build/dist/Server/Services/ProjectService.js +135 -21
  277. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  278. package/build/dist/Server/Services/ProxmoxClusterService.js +23 -36
  279. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  280. package/build/dist/Server/Services/ProxmoxResourceService.js +28 -3
  281. package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -1
  282. package/build/dist/Server/Services/RumApplicationService.js +19 -32
  283. package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
  284. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +20 -0
  285. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  286. package/build/dist/Server/Services/ServerlessFunctionService.js +24 -37
  287. package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
  288. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +347 -0
  289. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -0
  290. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +33 -1
  291. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  292. package/build/dist/Server/Services/ServiceService.js +236 -61
  293. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  294. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +603 -0
  295. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -0
  296. package/build/dist/Server/Services/StatusPageMonitorRuleService.js +401 -0
  297. package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -0
  298. package/build/dist/Server/Services/StatusPageService.js +69 -46
  299. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  300. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +17 -1
  301. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
  302. package/build/dist/Server/Services/StatusPageSubscriberService.js +3 -0
  303. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  304. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +1 -0
  305. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
  306. package/build/dist/Server/Services/TelemetryEntityService.js +1 -0
  307. package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
  308. package/build/dist/Server/Types/Database/JSONColumnQuery.js +402 -0
  309. package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -0
  310. package/build/dist/Server/Types/Database/Permissions/PublicPermission.js +9 -2
  311. package/build/dist/Server/Types/Database/Permissions/PublicPermission.js.map +1 -1
  312. package/build/dist/Server/Types/Database/QueryHelper.js +17 -27
  313. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  314. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +105 -29
  315. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  316. package/build/dist/Server/Utils/Database/TruncateColumnValue.js +32 -0
  317. package/build/dist/Server/Utils/Database/TruncateColumnValue.js.map +1 -0
  318. package/build/dist/Server/Utils/Monitor/MonitorResource.js +56 -32
  319. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  320. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +30 -3
  321. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
  322. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +110 -98
  323. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
  324. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js +312 -0
  325. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js.map +1 -0
  326. package/build/dist/Server/Utils/SingleFlight.js +76 -0
  327. package/build/dist/Server/Utils/SingleFlight.js.map +1 -0
  328. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +29 -0
  329. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -0
  330. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +78 -19
  331. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  332. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +160 -0
  333. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -0
  334. package/build/dist/Server/Utils/Telemetry/Telemetry.js +279 -104
  335. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  336. package/build/dist/Types/CustomField/CustomFieldDefinition.js +2 -0
  337. package/build/dist/Types/CustomField/CustomFieldDefinition.js.map +1 -0
  338. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  339. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  340. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  341. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  342. package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js +2 -0
  343. package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js.map +1 -0
  344. package/build/dist/Types/Dashboard/DashboardTemplates.js +368 -0
  345. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  346. package/build/dist/Types/Database/BigIntColumnTransformer.js +66 -0
  347. package/build/dist/Types/Database/BigIntColumnTransformer.js.map +1 -0
  348. package/build/dist/Types/Database/DatabaseProperty.js +25 -0
  349. package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
  350. package/build/dist/Types/Database/NumericColumnValue.js +97 -0
  351. package/build/dist/Types/Database/NumericColumnValue.js.map +1 -0
  352. package/build/dist/Types/Date.js +68 -0
  353. package/build/dist/Types/Date.js.map +1 -1
  354. package/build/dist/Types/Decimal.js +14 -3
  355. package/build/dist/Types/Decimal.js.map +1 -1
  356. package/build/dist/Types/Events/Recurring.js +63 -0
  357. package/build/dist/Types/Events/Recurring.js.map +1 -1
  358. package/build/dist/Types/Permission.js +42 -0
  359. package/build/dist/Types/Permission.js.map +1 -1
  360. package/build/dist/Types/Port.js +15 -5
  361. package/build/dist/Types/Port.js.map +1 -1
  362. package/build/dist/Types/StatusPage/StatusPageReportPeriodType.js +22 -0
  363. package/build/dist/Types/StatusPage/StatusPageReportPeriodType.js.map +1 -0
  364. package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js +44 -0
  365. package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js.map +1 -0
  366. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +75 -0
  367. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -0
  368. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
  369. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +18 -2
  370. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
  371. package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js +213 -0
  372. package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js.map +1 -0
  373. package/build/dist/UI/Utils/TeamMembersByUser.js +195 -0
  374. package/build/dist/UI/Utils/TeamMembersByUser.js.map +1 -0
  375. package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js +114 -0
  376. package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js.map +1 -0
  377. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  378. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  379. package/build/dist/Utils/StatusPage/ReportPeriod.js +131 -0
  380. package/build/dist/Utils/StatusPage/ReportPeriod.js.map +1 -0
  381. package/build/dist/Utils/Telemetry/HostIpAddresses.js +82 -0
  382. package/build/dist/Utils/Telemetry/HostIpAddresses.js.map +1 -0
  383. package/jest.config.json +2 -0
  384. package/package.json +1 -1
  385. 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
- historyDays: HISTORY_DAYS,
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
- historyDays: HISTORY_DAYS,
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
- historyDays: HISTORY_DAYS,
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
- historyDays: HISTORY_DAYS,
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
- historyDays: HISTORY_DAYS,
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
- historyDays: HISTORY_DAYS,
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
- historyDays: HISTORY_DAYS,
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
- historyDays: HISTORY_DAYS,
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
- historyDays: HISTORY_DAYS,
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
- historyDays: HISTORY_DAYS,
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
- historyDays: HISTORY_DAYS,
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
- historyDays: HISTORY_DAYS,
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
- historyDays: HISTORY_DAYS,
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
- id: Faker.generateRandomObjectID().toString(),
76
- // @ts-expect-error - Simplified mock price object for testing without all required Stripe Price properties
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
- customer: getStripeCustomer(),
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,