@oneuptime/common 13.0.8 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +23 -15
  2. package/Models/DatabaseModels/GlobalConfig.ts +24 -0
  3. package/Models/DatabaseModels/Monitor.ts +3 -2
  4. package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
  5. package/Scripts/generate-service-worker.js +65 -4
  6. package/Server/API/BaseAPI.ts +26 -5
  7. package/Server/API/GlobalConfigAPI.ts +228 -462
  8. package/Server/API/ProjectOIDC.ts +25 -16
  9. package/Server/API/ProjectSSO.ts +24 -16
  10. package/Server/API/StatusPageAPI.ts +100 -42
  11. package/Server/API/TeamMemberAPI.ts +10 -1
  12. package/Server/Enterprise/EnterpriseEdition.ts +649 -0
  13. package/Server/Enterprise/EnterpriseFeature.ts +48 -0
  14. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
  15. package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
  16. package/Server/EnvironmentConfig.ts +147 -2
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  19. package/Server/Middleware/UserAuthorization.ts +38 -16
  20. package/Server/Services/AuditLogService.ts +84 -1079
  21. package/Server/Services/EnterpriseLicenseService.ts +38 -0
  22. package/Server/Services/GlobalConfigService.ts +80 -1
  23. package/Server/Services/MonitorProbeService.ts +116 -20
  24. package/Server/Services/MonitorService.ts +56 -4
  25. package/Server/Services/MonitorStatusTimelineService.ts +284 -0
  26. package/Server/Services/MonitorTemplateService.ts +26 -0
  27. package/Server/Services/ProjectService.ts +284 -0
  28. package/Server/Services/RumSessionPinService.ts +25 -6
  29. package/Server/Services/StatusPagePrivateUserService.ts +7 -3
  30. package/Server/Services/StatusPageService.ts +78 -1
  31. package/Server/Services/TeamMemberService.ts +11 -0
  32. package/Server/Services/TeamService.ts +10 -0
  33. package/Server/Services/UserService.ts +10 -17
  34. package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
  35. package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
  36. package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
  37. package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
  38. package/Server/Types/Markdown.ts +41 -0
  39. package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
  40. package/Server/Utils/EditionEnforcement.ts +233 -0
  41. package/Server/Utils/FrontendEnvironment.ts +41 -2
  42. package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
  43. package/Server/Utils/Monitor/AffectedResourceList.ts +190 -0
  44. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
  45. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +543 -333
  46. package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
  47. package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
  48. package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
  49. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
  50. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
  51. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
  52. package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
  53. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
  54. package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
  55. package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
  56. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
  57. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
  58. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
  59. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
  60. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
  61. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
  62. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
  63. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
  64. package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
  65. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
  66. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
  67. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
  68. package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
  69. package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
  70. package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
  71. package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
  72. package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
  73. package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
  74. package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
  75. package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
  76. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
  77. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
  78. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
  79. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
  80. package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
  81. package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
  82. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
  83. package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
  84. package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
  85. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
  86. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
  87. package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
  88. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
  89. package/Tests/Server/Services/AuditLogService.test.ts +460 -990
  90. package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
  91. package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
  92. package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
  93. package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
  94. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
  95. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
  96. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
  97. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
  98. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
  99. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
  100. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
  101. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
  102. package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
  103. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
  104. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
  105. package/Tests/Server/Types/Markdown.test.ts +181 -0
  106. package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
  107. package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
  108. package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
  109. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
  110. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
  111. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
  112. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +934 -96
  113. package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
  114. package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
  115. package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
  116. package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
  117. package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
  118. package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
  119. package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
  120. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
  121. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
  122. package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
  123. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
  124. package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
  125. package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
  126. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
  127. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
  128. package/Tests/Utils/HostAddressUtil.test.ts +138 -0
  129. package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
  130. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
  131. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
  132. package/Types/API/Hostname.ts +63 -16
  133. package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
  134. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
  135. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
  136. package/Types/Database/CanonicalModelInstance.ts +102 -0
  137. package/Types/Database/TableColumn.ts +20 -6
  138. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
  139. package/Types/IP/IPv6.ts +6 -1
  140. package/Types/Monitor/MonitorStep.ts +6 -1
  141. package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
  142. package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
  143. package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
  144. package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
  145. package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
  146. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  147. package/UI/Components/ModelList/ModelList.tsx +11 -1
  148. package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
  149. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
  150. package/UI/esbuild-enterprise.js +263 -0
  151. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
  152. package/Utils/HostAddressUtil.ts +94 -0
  153. package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
  154. package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
  155. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
  156. package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
  157. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  158. package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
  159. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  160. package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
  161. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  162. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
  163. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  164. package/build/dist/Server/API/BaseAPI.js +26 -5
  165. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  166. package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
  167. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  168. package/build/dist/Server/API/ProjectOIDC.js +24 -16
  169. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  170. package/build/dist/Server/API/ProjectSSO.js +24 -16
  171. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  172. package/build/dist/Server/API/StatusPageAPI.js +93 -43
  173. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  174. package/build/dist/Server/API/TeamMemberAPI.js +8 -1
  175. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  176. package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
  177. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
  178. package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
  179. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
  180. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
  181. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
  182. package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
  183. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
  184. package/build/dist/Server/EnvironmentConfig.js +84 -2
  185. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  186. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
  187. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
  188. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  189. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  190. package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
  191. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  192. package/build/dist/Server/Services/AuditLogService.js +71 -740
  193. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  194. package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
  195. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  196. package/build/dist/Server/Services/GlobalConfigService.js +63 -0
  197. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  198. package/build/dist/Server/Services/MonitorProbeService.js +90 -17
  199. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  200. package/build/dist/Server/Services/MonitorService.js +45 -4
  201. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  202. package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
  203. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  204. package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
  205. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  206. package/build/dist/Server/Services/ProjectService.js +214 -0
  207. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  208. package/build/dist/Server/Services/RumSessionPinService.js +24 -6
  209. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  210. package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
  211. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  212. package/build/dist/Server/Services/StatusPageService.js +71 -0
  213. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  214. package/build/dist/Server/Services/TeamMemberService.js +10 -0
  215. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  216. package/build/dist/Server/Services/TeamService.js +9 -0
  217. package/build/dist/Server/Services/TeamService.js.map +1 -1
  218. package/build/dist/Server/Services/UserService.js +10 -16
  219. package/build/dist/Server/Services/UserService.js.map +1 -1
  220. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
  221. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  222. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
  223. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  224. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
  225. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  226. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
  227. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  228. package/build/dist/Server/Types/Markdown.js +31 -0
  229. package/build/dist/Server/Types/Markdown.js.map +1 -1
  230. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
  231. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
  232. package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
  233. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
  234. package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
  235. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
  236. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
  237. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
  238. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +96 -0
  239. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
  240. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  241. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  242. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +449 -261
  243. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  244. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
  245. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
  246. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
  247. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  248. package/build/dist/Types/API/Hostname.js +59 -11
  249. package/build/dist/Types/API/Hostname.js.map +1 -1
  250. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
  251. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  252. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
  253. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  254. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
  255. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
  256. package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
  257. package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
  258. package/build/dist/Types/Database/TableColumn.js +19 -6
  259. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  260. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
  261. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
  262. package/build/dist/Types/IP/IPv6.js +6 -1
  263. package/build/dist/Types/IP/IPv6.js.map +1 -1
  264. package/build/dist/Types/Monitor/MonitorStep.js +5 -0
  265. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  266. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
  267. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
  268. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
  269. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
  270. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  271. package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
  272. package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
  273. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
  274. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  275. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  276. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  277. package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
  278. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  279. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
  280. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  281. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
  282. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  283. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
  284. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  285. package/build/dist/Utils/HostAddressUtil.js +80 -0
  286. package/build/dist/Utils/HostAddressUtil.js.map +1 -0
  287. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
  288. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
  289. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
  290. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
  291. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  292. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
  293. package/jest.config.json +3 -1
  294. package/package.json +1 -1
  295. package/test-setup.sh +103 -34
  296. package/tsconfig.json +13 -0
  297. package/Server/API/EnterpriseLicenseAPI.ts +0 -925
  298. package/Server/API/TeamComplianceAPI.ts +0 -158
  299. package/Server/Middleware/SCIMAuthorization.ts +0 -141
  300. package/Server/Services/TeamComplianceService.ts +0 -733
  301. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
  302. package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
  303. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
  304. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
  305. package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
  306. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
  307. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
  308. package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
  309. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
  310. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
  311. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
  312. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
  313. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
  314. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
  315. package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
  316. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
  317. package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
  318. package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
  319. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
  320. package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
  321. package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
  322. package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
  323. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
  324. package/build/dist/Server/Services/TeamComplianceService.js +0 -537
  325. package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
  326. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
  327. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
  328. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
  329. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
  330. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
  331. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
  332. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
  333. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
@@ -1,495 +0,0 @@
1
- import GlobalConfig from "../../../../Models/DatabaseModels/GlobalConfig";
2
- import GlobalConfigService from "../../../../Server/Services/GlobalConfigService";
3
- import EnterpriseLicenseSeatUtil from "../../../../Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil";
4
- import BadDataException from "../../../../Types/Exception/BadDataException";
5
- import ObjectID from "../../../../Types/ObjectID";
6
- import { SeatUsage } from "../../../../Utils/EnterpriseLicense/EnterpriseLicenseSeats";
7
- import {
8
- beforeEach,
9
- afterEach,
10
- describe,
11
- expect,
12
- it,
13
- jest,
14
- } from "@jest/globals";
15
-
16
- /*
17
- * The half of seat enforcement that decides whether this installation
18
- * enforces at all, and reads the license state it enforces against.
19
- *
20
- * Three things have to hold, and each of them is a way the feature could be
21
- * quietly wrong rather than loudly broken:
22
- *
23
- * 1. It runs on self-hosted Enterprise and nowhere else. oneuptime.com bounds
24
- * seats through subscriptions, and Community Edition has no license — a
25
- * second, different answer on either of those would be a regression that
26
- * nobody notices until a customer cannot sign up.
27
- * 2. It never counts the User table when there is no limit to compare it
28
- * against. That query runs on the create path of every user on the
29
- * installation.
30
- * 3. It does not exempt root. Team invitations create the invited user with
31
- * isRoot: true, so an isRoot exemption would exempt invitations — the one
32
- * path this was asked for.
33
- */
34
-
35
- let mockBillingEnabled: boolean = false;
36
- let mockEnterpriseEdition: boolean = true;
37
-
38
- /*
39
- * Live accessors rather than plain values: the util reads these when it runs,
40
- * and object spread would flatten them to whatever they were at import time.
41
- */
42
- jest.mock("../../../../Server/EnvironmentConfig", () => {
43
- const actual: Record<string, unknown> = jest.requireActual(
44
- "../../../../Server/EnvironmentConfig",
45
- ) as Record<string, unknown>;
46
-
47
- const mocked: Record<string, unknown> = {
48
- ...actual,
49
- __esModule: true,
50
- };
51
-
52
- Object.defineProperty(mocked, "IsBillingEnabled", {
53
- get: (): boolean => {
54
- return mockBillingEnabled;
55
- },
56
- });
57
-
58
- Object.defineProperty(mocked, "IsEnterpriseEdition", {
59
- get: (): boolean => {
60
- return mockEnterpriseEdition;
61
- },
62
- });
63
-
64
- return mocked;
65
- });
66
-
67
- jest.mock("../../../../Server/Services/GlobalConfigService", () => {
68
- return {
69
- __esModule: true,
70
- default: {
71
- findOneById: jest.fn(),
72
- },
73
- };
74
- });
75
-
76
- /*
77
- * Both @types/jest and @jest/globals are installed, and their Mock types are
78
- * not assignable to each other. Taking the type from jest.fn keeps fresh mocks
79
- * on whichever one is actually in scope.
80
- */
81
- type MockFunction = ReturnType<typeof jest.fn>;
82
-
83
- const INSTANCE_ID: ObjectID = ObjectID.generate();
84
-
85
- type MakeConfigFunction = (overrides?: Record<string, unknown>) => GlobalConfig;
86
-
87
- const makeConfig: MakeConfigFunction = (
88
- overrides?: Record<string, unknown>,
89
- ): GlobalConfig => {
90
- const config: GlobalConfig = new GlobalConfig();
91
- config.instanceId = INSTANCE_ID;
92
- config.enterpriseLicenseUserLimit = 10;
93
- config.enterpriseLicenseCurrentUserCount = 4;
94
- config.enterpriseLicenseInstances = [];
95
-
96
- return Object.assign(config, overrides || {});
97
- };
98
-
99
- type SetStoredConfigFunction = (config: GlobalConfig | null) => void;
100
-
101
- const setStoredConfig: SetStoredConfigFunction = (
102
- config: GlobalConfig | null,
103
- ): void => {
104
- (GlobalConfigService.findOneById as unknown as jest.Mock).mockResolvedValue(
105
- config as never,
106
- );
107
- };
108
-
109
- describe("EnterpriseLicenseSeatUtil - which installations enforce", () => {
110
- beforeEach(() => {
111
- jest.clearAllMocks();
112
- mockBillingEnabled = false;
113
- mockEnterpriseEdition = true;
114
- setStoredConfig(makeConfig());
115
- });
116
-
117
- afterEach(() => {
118
- jest.restoreAllMocks();
119
- });
120
-
121
- it("enforces on a self-hosted enterprise installation", () => {
122
- expect(EnterpriseLicenseSeatUtil.isSeatLimitEnforceable()).toBe(true);
123
- });
124
-
125
- it("does not enforce on Community Edition", () => {
126
- mockEnterpriseEdition = false;
127
-
128
- expect(EnterpriseLicenseSeatUtil.isSeatLimitEnforceable()).toBe(false);
129
- });
130
-
131
- /*
132
- * oneuptime.com runs with billing on and bounds seats per project through
133
- * subscriptions (TeamMemberService.onBeforeCreate). Enforcing an enterprise
134
- * license limit there as well would be a second answer to the same question.
135
- */
136
- it("does not enforce where billing is doing the bounding", () => {
137
- mockBillingEnabled = true;
138
-
139
- expect(EnterpriseLicenseSeatUtil.isSeatLimitEnforceable()).toBe(false);
140
- });
141
-
142
- it.each([
143
- ["Community Edition", false, false],
144
- ["billing enabled", true, true],
145
- ])(
146
- "returns no seat usage at all on %s, and never reads the config",
147
- async (
148
- _label: string,
149
- billingEnabled: boolean,
150
- enterpriseEdition: boolean,
151
- ) => {
152
- mockBillingEnabled = billingEnabled;
153
- mockEnterpriseEdition = enterpriseEdition;
154
-
155
- const getLocalUserCount: MockFunction = jest.fn();
156
-
157
- const usage: SeatUsage | null =
158
- await EnterpriseLicenseSeatUtil.getSeatUsage({
159
- getLocalUserCount:
160
- getLocalUserCount as unknown as () => Promise<number>,
161
- });
162
-
163
- expect(usage).toBeNull();
164
- expect(GlobalConfigService.findOneById).not.toHaveBeenCalled();
165
- expect(getLocalUserCount).not.toHaveBeenCalled();
166
- },
167
- );
168
- });
169
-
170
- describe("EnterpriseLicenseSeatUtil - reading the licence", () => {
171
- let getLocalUserCount: MockFunction;
172
-
173
- beforeEach(() => {
174
- jest.clearAllMocks();
175
- mockBillingEnabled = false;
176
- mockEnterpriseEdition = true;
177
- getLocalUserCount = jest.fn(async (): Promise<number> => {
178
- return 4;
179
- }) as unknown as MockFunction;
180
- setStoredConfig(makeConfig());
181
- });
182
-
183
- afterEach(() => {
184
- jest.restoreAllMocks();
185
- });
186
-
187
- type UsageFunction = () => Promise<SeatUsage | null>;
188
-
189
- const usage: UsageFunction = (): Promise<SeatUsage | null> => {
190
- return EnterpriseLicenseSeatUtil.getSeatUsage({
191
- getLocalUserCount: getLocalUserCount as unknown as () => Promise<number>,
192
- });
193
- };
194
-
195
- it("reads the licence columns it needs off the singleton config row", async () => {
196
- await usage();
197
-
198
- const call: Record<string, unknown> = (
199
- GlobalConfigService.findOneById as unknown as jest.Mock
200
- ).mock.calls[0]![0] as Record<string, unknown>;
201
-
202
- expect((call["id"] as ObjectID).toString()).toBe(
203
- ObjectID.getZeroObjectID().toString(),
204
- );
205
- expect(
206
- Object.keys(call["select"] as Record<string, unknown>).sort(),
207
- ).toEqual([
208
- "enterpriseLicenseCurrentUserCount",
209
- "enterpriseLicenseInstances",
210
- "enterpriseLicenseUserLimit",
211
- "instanceId",
212
- ]);
213
- expect((call["props"] as Record<string, unknown>)["isRoot"]).toBe(true);
214
- });
215
-
216
- it("combines the stored licence with the live user count", async () => {
217
- getLocalUserCount = jest.fn(async (): Promise<number> => {
218
- return 9;
219
- }) as unknown as MockFunction;
220
-
221
- const seatUsage: SeatUsage | null = await usage();
222
-
223
- expect(seatUsage?.isEnforced).toBe(true);
224
- expect(seatUsage?.userLimit).toBe(10);
225
- expect(seatUsage?.seatsInUse).toBe(9);
226
- expect(seatUsage?.hasSeatForNewUser).toBe(true);
227
- });
228
-
229
- /*
230
- * Counting the User table on a licence that has no limit would be a query
231
- * per user creation bought for nothing — and an unlimited licence is exactly
232
- * the kind a large installation holds.
233
- */
234
- it("does not count users when the licence has no seat limit", async () => {
235
- setStoredConfig(
236
- makeConfig({ enterpriseLicenseUserLimit: undefined } as Record<
237
- string,
238
- unknown
239
- >),
240
- );
241
-
242
- const seatUsage: SeatUsage | null = await usage();
243
-
244
- expect(seatUsage?.isEnforced).toBe(false);
245
- expect(seatUsage?.hasSeatForNewUser).toBe(true);
246
- expect(getLocalUserCount).not.toHaveBeenCalled();
247
- });
248
-
249
- it("counts users exactly once when the licence does have a limit", async () => {
250
- await usage();
251
-
252
- expect(getLocalUserCount).toHaveBeenCalledTimes(1);
253
- });
254
-
255
- /*
256
- * A fresh installation whose GlobalConfig row has not been seeded yet. There
257
- * is no licence, so there is no limit — and certainly no reason to refuse the
258
- * very first user.
259
- */
260
- it("enforces nothing when there is no config row at all", async () => {
261
- setStoredConfig(null);
262
-
263
- const seatUsage: SeatUsage | null = await usage();
264
-
265
- expect(seatUsage?.isEnforced).toBe(false);
266
- expect(seatUsage?.hasSeatForNewUser).toBe(true);
267
- expect(getLocalUserCount).not.toHaveBeenCalled();
268
- });
269
-
270
- it("attributes the licence-wide overflow to the customer's other instances", async () => {
271
- setStoredConfig(
272
- makeConfig({
273
- enterpriseLicenseUserLimit: 100,
274
- enterpriseLicenseCurrentUserCount: 80,
275
- enterpriseLicenseInstances: [
276
- {
277
- instanceId: INSTANCE_ID.toString(),
278
- host: "prod.acme.internal",
279
- userCount: 60,
280
- lastReportedAt: "2026-01-01T00:00:00.000Z",
281
- version: "12.0.30",
282
- },
283
- {
284
- instanceId: "another-instance",
285
- host: "staging.acme.internal",
286
- userCount: 30,
287
- lastReportedAt: "2026-01-01T00:00:00.000Z",
288
- version: "12.0.30",
289
- },
290
- ],
291
- }),
292
- );
293
-
294
- getLocalUserCount = jest.fn(async (): Promise<number> => {
295
- return 60;
296
- }) as unknown as MockFunction;
297
-
298
- const seatUsage: SeatUsage | null = await usage();
299
-
300
- expect(seatUsage?.seatsUsedByOtherInstances).toBe(20);
301
- expect(seatUsage?.seatsInUse).toBe(80);
302
- });
303
-
304
- it("survives an instance list stored as something other than an array", async () => {
305
- setStoredConfig(
306
- makeConfig({
307
- enterpriseLicenseInstances: "not-an-array",
308
- } as unknown as Record<string, unknown>),
309
- );
310
-
311
- const seatUsage: SeatUsage | null = await usage();
312
-
313
- expect(seatUsage?.seatsUsedByOtherInstances).toBe(0);
314
- expect(seatUsage?.isEnforced).toBe(true);
315
- });
316
- });
317
-
318
- describe("EnterpriseLicenseSeatUtil - refusing a new user", () => {
319
- let localUserCount: number;
320
-
321
- type AssertFunction = () => Promise<void>;
322
-
323
- const assertSeat: AssertFunction = (): Promise<void> => {
324
- return EnterpriseLicenseSeatUtil.assertSeatAvailableForNewUser({
325
- getLocalUserCount: async (): Promise<number> => {
326
- return localUserCount;
327
- },
328
- });
329
- };
330
-
331
- beforeEach(() => {
332
- jest.clearAllMocks();
333
- mockBillingEnabled = false;
334
- mockEnterpriseEdition = true;
335
- localUserCount = 4;
336
- setStoredConfig(makeConfig());
337
- });
338
-
339
- afterEach(() => {
340
- jest.restoreAllMocks();
341
- });
342
-
343
- it("allows a user while seats are free", async () => {
344
- localUserCount = 9;
345
-
346
- await expect(assertSeat()).resolves.toBeUndefined();
347
- });
348
-
349
- it("refuses the user that would step past the limit", async () => {
350
- localUserCount = 10;
351
-
352
- await expect(assertSeat()).rejects.toBeInstanceOf(BadDataException);
353
- });
354
-
355
- it("explains the refusal in terms the administrator can act on", async () => {
356
- localUserCount = 10;
357
-
358
- let message: string = "";
359
-
360
- try {
361
- await assertSeat();
362
- } catch (err) {
363
- message = (err as BadDataException).message;
364
- }
365
-
366
- expect(message).toContain("10");
367
- expect(message).toContain("enterprise license");
368
- expect(message).toContain("sales@oneuptime.com");
369
- });
370
-
371
- it("keeps refusing once the installation is already over the limit", async () => {
372
- localUserCount = 40;
373
-
374
- await expect(assertSeat()).rejects.toBeInstanceOf(BadDataException);
375
- });
376
-
377
- it("allows everything on a licence with no seat limit", async () => {
378
- setStoredConfig(
379
- makeConfig({ enterpriseLicenseUserLimit: undefined } as Record<
380
- string,
381
- unknown
382
- >),
383
- );
384
- localUserCount = 100_000;
385
-
386
- await expect(assertSeat()).resolves.toBeUndefined();
387
- });
388
-
389
- it("allows everything on Community Edition", async () => {
390
- mockEnterpriseEdition = false;
391
- localUserCount = 100_000;
392
-
393
- await expect(assertSeat()).resolves.toBeUndefined();
394
- });
395
-
396
- it("allows everything where billing does the bounding", async () => {
397
- mockBillingEnabled = true;
398
- localUserCount = 100_000;
399
-
400
- await expect(assertSeat()).resolves.toBeUndefined();
401
- });
402
-
403
- /*
404
- * The seats already spoken for on the customer's other instances count
405
- * against this one. Otherwise two instances on a 10-seat licence would each
406
- * happily fill up to 10.
407
- */
408
- it("refuses when the licence is full because of another instance", async () => {
409
- setStoredConfig(
410
- makeConfig({
411
- enterpriseLicenseUserLimit: 10,
412
- enterpriseLicenseCurrentUserCount: 10,
413
- enterpriseLicenseInstances: [
414
- {
415
- instanceId: INSTANCE_ID.toString(),
416
- host: "prod.acme.internal",
417
- userCount: 2,
418
- lastReportedAt: "2026-01-01T00:00:00.000Z",
419
- version: "12.0.30",
420
- },
421
- {
422
- instanceId: "another-instance",
423
- host: "staging.acme.internal",
424
- userCount: 8,
425
- lastReportedAt: "2026-01-01T00:00:00.000Z",
426
- version: "12.0.30",
427
- },
428
- ],
429
- }),
430
- );
431
-
432
- localUserCount = 2;
433
-
434
- await expect(assertSeat()).rejects.toBeInstanceOf(BadDataException);
435
- });
436
- });
437
-
438
- describe("EnterpriseLicenseSeatUtil - usage from an already-loaded config", () => {
439
- beforeEach(() => {
440
- jest.clearAllMocks();
441
- mockBillingEnabled = false;
442
- mockEnterpriseEdition = true;
443
- });
444
-
445
- afterEach(() => {
446
- jest.restoreAllMocks();
447
- });
448
-
449
- /*
450
- * The license endpoint has just read GlobalConfig to build its response.
451
- * Reading it a second time to answer the same question would be silly, so
452
- * there is an entry point that takes the row — and it has to agree exactly
453
- * with the one that loads it.
454
- */
455
- it("does not go back to the database for a config it was handed", async () => {
456
- const seatUsage: SeatUsage | null =
457
- await EnterpriseLicenseSeatUtil.getSeatUsageForLoadedGlobalConfig({
458
- config: makeConfig({ enterpriseLicenseUserLimit: 10 }),
459
- getLocalUserCount: async (): Promise<number> => {
460
- return 10;
461
- },
462
- });
463
-
464
- expect(GlobalConfigService.findOneById).not.toHaveBeenCalled();
465
- expect(seatUsage?.hasSeatForNewUser).toBe(false);
466
- expect(seatUsage?.seatsRemaining).toBe(0);
467
- });
468
-
469
- it("returns null on an installation that does not enforce", async () => {
470
- mockEnterpriseEdition = false;
471
-
472
- const seatUsage: SeatUsage | null =
473
- await EnterpriseLicenseSeatUtil.getSeatUsageForLoadedGlobalConfig({
474
- config: makeConfig(),
475
- getLocalUserCount: async (): Promise<number> => {
476
- return 10;
477
- },
478
- });
479
-
480
- expect(seatUsage).toBeNull();
481
- });
482
-
483
- it("handles a null config the same way as a licence with no limit", async () => {
484
- const seatUsage: SeatUsage | null =
485
- await EnterpriseLicenseSeatUtil.getSeatUsageForLoadedGlobalConfig({
486
- config: null,
487
- getLocalUserCount: async (): Promise<number> => {
488
- return 10;
489
- },
490
- });
491
-
492
- expect(seatUsage?.isEnforced).toBe(false);
493
- expect(seatUsage?.hasSeatForNewUser).toBe(true);
494
- });
495
- });