@oneuptime/common 13.0.8 → 14.0.1

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 (514) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +23 -15
  2. package/Models/DatabaseModels/GlobalConfig.ts +24 -0
  3. package/Models/DatabaseModels/Index.ts +4 -0
  4. package/Models/DatabaseModels/Monitor.ts +3 -2
  5. package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
  6. package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
  7. package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
  8. package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
  9. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
  10. package/Scripts/generate-service-worker.js +65 -4
  11. package/Server/API/BaseAPI.ts +26 -5
  12. package/Server/API/GlobalConfigAPI.ts +228 -462
  13. package/Server/API/ProjectOIDC.ts +25 -16
  14. package/Server/API/ProjectSSO.ts +24 -16
  15. package/Server/API/StatusPageAPI.ts +100 -42
  16. package/Server/API/TeamMemberAPI.ts +10 -1
  17. package/Server/Enterprise/EnterpriseEdition.ts +649 -0
  18. package/Server/Enterprise/EnterpriseFeature.ts +48 -0
  19. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
  20. package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
  21. package/Server/EnvironmentConfig.ts +147 -2
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  26. package/Server/Middleware/UserAuthorization.ts +38 -16
  27. package/Server/Services/AuditLogService.ts +84 -1079
  28. package/Server/Services/DatabaseService.ts +10 -0
  29. package/Server/Services/EnterpriseLicenseService.ts +38 -0
  30. package/Server/Services/GlobalConfigService.ts +80 -1
  31. package/Server/Services/Index.ts +4 -0
  32. package/Server/Services/MonitorProbeService.ts +116 -20
  33. package/Server/Services/MonitorService.ts +59 -6
  34. package/Server/Services/MonitorStatusTimelineService.ts +284 -0
  35. package/Server/Services/MonitorTemplateService.ts +26 -0
  36. package/Server/Services/ProjectService.ts +284 -0
  37. package/Server/Services/RumSessionPinService.ts +25 -6
  38. package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
  39. package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
  40. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
  41. package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
  42. package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
  43. package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
  44. package/Server/Services/ServiceLevelObjectiveService.ts +28 -0
  45. package/Server/Services/StatusPagePrivateUserService.ts +7 -3
  46. package/Server/Services/StatusPageService.ts +78 -1
  47. package/Server/Services/TeamMemberService.ts +11 -0
  48. package/Server/Services/TeamService.ts +10 -0
  49. package/Server/Services/UserService.ts +10 -17
  50. package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
  51. package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
  52. package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
  53. package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
  54. package/Server/Types/Markdown.ts +41 -0
  55. package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
  56. package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
  57. package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
  58. package/Server/Utils/EditionEnforcement.ts +233 -0
  59. package/Server/Utils/FrontendEnvironment.ts +41 -2
  60. package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
  61. package/Server/Utils/Monitor/AffectedResourceList.ts +148 -0
  62. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
  63. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
  64. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
  65. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +720 -465
  66. package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
  67. package/Server/Utils/Monitor/RootCauseList.ts +139 -0
  68. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
  69. package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
  70. package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
  71. package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
  72. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
  73. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
  74. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
  75. package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
  76. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
  77. package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
  78. package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
  79. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
  80. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
  81. package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
  82. package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
  83. package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
  84. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
  85. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
  86. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +594 -3
  87. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
  88. package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
  89. package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
  90. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
  91. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
  92. package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
  93. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
  94. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
  95. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
  96. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
  97. package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
  98. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
  99. package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
  100. package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
  101. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
  102. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
  103. package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
  104. package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
  105. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
  106. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
  107. package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
  108. package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
  109. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
  110. package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
  111. package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
  112. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  113. package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
  114. package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
  115. package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
  116. package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
  117. package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
  118. package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
  119. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
  120. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
  121. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
  122. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
  123. package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
  124. package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
  125. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
  126. package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
  127. package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
  128. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
  129. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
  130. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  131. package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
  132. package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
  133. package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
  134. package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
  135. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
  136. package/Tests/Server/Services/AuditLogService.test.ts +460 -990
  137. package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
  138. package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
  139. package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
  140. package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
  141. package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
  142. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
  143. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
  144. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
  145. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
  146. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
  147. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -0
  148. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
  149. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1170 -0
  150. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
  151. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
  152. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
  153. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
  154. package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
  155. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +162 -0
  156. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
  157. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
  158. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
  159. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
  160. package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
  161. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
  162. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
  163. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
  164. package/Tests/Server/Types/Markdown.test.ts +183 -1
  165. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
  166. package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
  167. package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
  168. package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
  169. package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
  170. package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
  171. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
  172. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
  173. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
  174. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
  175. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +1339 -96
  176. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1101 -0
  177. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
  178. package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
  179. package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
  180. package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
  181. package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
  182. package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
  183. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
  184. package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
  185. package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
  186. package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
  187. package/Tests/Types/API/Route.test.ts +56 -0
  188. package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
  189. package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
  190. package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
  191. package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
  192. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
  193. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
  194. package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
  195. package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
  196. package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
  197. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
  198. package/Tests/UI/Components/Icon.test.tsx +26 -0
  199. package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
  200. package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
  201. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  202. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
  203. package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
  204. package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
  205. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
  206. package/Tests/Utils/HostAddressUtil.test.ts +138 -0
  207. package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
  208. package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
  209. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
  210. package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
  211. package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
  212. package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
  213. package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
  214. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
  215. package/Types/API/Hostname.ts +63 -16
  216. package/Types/API/Route.ts +19 -2
  217. package/Types/API/URL.ts +26 -2
  218. package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
  219. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
  220. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
  221. package/Types/Database/CanonicalModelInstance.ts +102 -0
  222. package/Types/Database/TableColumn.ts +20 -6
  223. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
  224. package/Types/IP/IPv6.ts +6 -1
  225. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
  226. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
  227. package/Types/Monitor/MonitorStep.ts +6 -1
  228. package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
  229. package/Types/Permission.ts +90 -0
  230. package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
  231. package/Types/Rules/RuleRun.ts +4 -0
  232. package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
  233. package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
  234. package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
  235. package/UI/Components/Feed/FeedOptions.ts +427 -0
  236. package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
  237. package/UI/Components/Feed/useFeedItems.ts +28 -9
  238. package/UI/Components/Feed/useFeedOptions.ts +225 -0
  239. package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
  240. package/UI/Components/Icon/Icon.tsx +1 -1
  241. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  242. package/UI/Components/ModelList/ModelList.tsx +11 -1
  243. package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
  244. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
  245. package/UI/esbuild-enterprise.js +263 -0
  246. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
  247. package/Utils/HostAddressUtil.ts +94 -0
  248. package/Utils/LabelRuleImportExport.ts +27 -9
  249. package/Utils/Monitor/MetricValueFormatter.ts +2 -2
  250. package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
  251. package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
  252. package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
  253. package/Utils/Slo/SloDuration.ts +22 -6
  254. package/Utils/Slo/SloHealth.ts +8 -7
  255. package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
  256. package/Utils/Slo/SloOverviewText.ts +33 -0
  257. package/Utils/Slo/SloProjection.ts +4 -3
  258. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
  259. package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
  260. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  261. package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
  262. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  263. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  264. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  265. package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
  266. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  267. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
  268. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  269. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
  270. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
  271. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
  272. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
  273. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
  274. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
  275. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
  276. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
  277. package/build/dist/Server/API/BaseAPI.js +26 -5
  278. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  279. package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
  280. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  281. package/build/dist/Server/API/ProjectOIDC.js +24 -16
  282. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  283. package/build/dist/Server/API/ProjectSSO.js +24 -16
  284. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  285. package/build/dist/Server/API/StatusPageAPI.js +93 -43
  286. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  287. package/build/dist/Server/API/TeamMemberAPI.js +8 -1
  288. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  289. package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
  290. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
  291. package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
  292. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
  293. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
  294. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
  295. package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
  296. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
  297. package/build/dist/Server/EnvironmentConfig.js +84 -2
  298. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  299. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
  300. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
  301. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
  302. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
  303. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
  304. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
  305. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  306. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  307. package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
  308. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  309. package/build/dist/Server/Services/AuditLogService.js +71 -740
  310. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  311. package/build/dist/Server/Services/DatabaseService.js +7 -0
  312. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  313. package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
  314. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  315. package/build/dist/Server/Services/GlobalConfigService.js +63 -0
  316. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  317. package/build/dist/Server/Services/Index.js +4 -0
  318. package/build/dist/Server/Services/Index.js.map +1 -1
  319. package/build/dist/Server/Services/MonitorProbeService.js +90 -17
  320. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  321. package/build/dist/Server/Services/MonitorService.js +48 -6
  322. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  323. package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
  324. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  325. package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
  326. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  327. package/build/dist/Server/Services/ProjectService.js +214 -0
  328. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  329. package/build/dist/Server/Services/RumSessionPinService.js +24 -6
  330. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  331. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
  332. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
  333. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
  334. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
  335. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
  336. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
  337. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
  338. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
  339. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
  340. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
  341. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
  342. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
  343. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +21 -0
  344. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  345. package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
  346. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  347. package/build/dist/Server/Services/StatusPageService.js +71 -0
  348. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  349. package/build/dist/Server/Services/TeamMemberService.js +10 -0
  350. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  351. package/build/dist/Server/Services/TeamService.js +9 -0
  352. package/build/dist/Server/Services/TeamService.js.map +1 -1
  353. package/build/dist/Server/Services/UserService.js +10 -16
  354. package/build/dist/Server/Services/UserService.js.map +1 -1
  355. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
  356. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  357. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
  358. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  359. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
  360. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  361. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
  362. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  363. package/build/dist/Server/Types/Markdown.js +31 -0
  364. package/build/dist/Server/Types/Markdown.js.map +1 -1
  365. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
  366. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
  367. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
  368. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  369. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
  370. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
  371. package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
  372. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
  373. package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
  374. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
  375. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
  376. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
  377. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +67 -0
  378. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
  379. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
  380. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  381. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  382. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
  383. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +585 -367
  384. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  385. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
  386. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
  387. package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
  388. package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
  389. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
  390. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  391. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
  392. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
  393. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
  394. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  395. package/build/dist/Types/API/Hostname.js +59 -11
  396. package/build/dist/Types/API/Hostname.js.map +1 -1
  397. package/build/dist/Types/API/Route.js +18 -2
  398. package/build/dist/Types/API/Route.js.map +1 -1
  399. package/build/dist/Types/API/URL.js +23 -2
  400. package/build/dist/Types/API/URL.js.map +1 -1
  401. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
  402. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  403. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
  404. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  405. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
  406. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
  407. package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
  408. package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
  409. package/build/dist/Types/Database/TableColumn.js +19 -6
  410. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  411. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
  412. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
  413. package/build/dist/Types/IP/IPv6.js +6 -1
  414. package/build/dist/Types/IP/IPv6.js.map +1 -1
  415. package/build/dist/Types/Monitor/MonitorStep.js +5 -0
  416. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  417. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
  418. package/build/dist/Types/Permission.js +84 -0
  419. package/build/dist/Types/Permission.js.map +1 -1
  420. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
  421. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  422. package/build/dist/Types/Rules/RuleRun.js +4 -0
  423. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  424. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
  425. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
  426. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
  427. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  428. package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
  429. package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
  430. package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
  431. package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
  432. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
  433. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
  434. package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
  435. package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
  436. package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
  437. package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
  438. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
  439. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  440. package/build/dist/UI/Components/Icon/Icon.js +1 -1
  441. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  442. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  443. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  444. package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
  445. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  446. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
  447. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  448. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
  449. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  450. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
  451. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  452. package/build/dist/Utils/HostAddressUtil.js +80 -0
  453. package/build/dist/Utils/HostAddressUtil.js.map +1 -0
  454. package/build/dist/Utils/LabelRuleImportExport.js +22 -6
  455. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  456. package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
  457. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
  458. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
  459. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
  460. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
  461. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
  462. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
  463. package/build/dist/Utils/Slo/SloDuration.js +13 -5
  464. package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
  465. package/build/dist/Utils/Slo/SloHealth.js +8 -7
  466. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  467. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
  468. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
  469. package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
  470. package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
  471. package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
  472. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  473. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
  474. package/jest.config.json +3 -1
  475. package/package.json +1 -1
  476. package/test-setup.sh +103 -34
  477. package/tsconfig.json +13 -0
  478. package/Server/API/EnterpriseLicenseAPI.ts +0 -925
  479. package/Server/API/TeamComplianceAPI.ts +0 -158
  480. package/Server/Middleware/SCIMAuthorization.ts +0 -141
  481. package/Server/Services/TeamComplianceService.ts +0 -733
  482. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
  483. package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
  484. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
  485. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
  486. package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
  487. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
  488. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
  489. package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
  490. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
  491. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
  492. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
  493. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
  494. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
  495. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
  496. package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
  497. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
  498. package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
  499. package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
  500. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
  501. package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
  502. package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
  503. package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
  504. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
  505. package/build/dist/Server/Services/TeamComplianceService.js +0 -537
  506. package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
  507. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
  508. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
  509. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
  510. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
  511. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
  512. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
  513. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
  514. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
@@ -1,646 +0,0 @@
1
- import EnterpriseLicense from "../../Models/DatabaseModels/EnterpriseLicense";
2
- import EnterpriseLicenseInstance from "../../Models/DatabaseModels/EnterpriseLicenseInstance";
3
- import BadDataException from "../../Types/Exception/BadDataException";
4
- import EnterpriseLicenseUserCountSource from "../../Types/EnterpriseLicense/EnterpriseLicenseUserCountSource";
5
- import EnterpriseLicenseUsageUtil from "../../Utils/EnterpriseLicense/EnterpriseLicenseUsage";
6
- import VersionUtil from "../../Utils/VersionUtil";
7
- import LIMIT_MAX from "../../Types/Database/LimitMax";
8
- import ObjectID from "../../Types/ObjectID";
9
- import SortOrder from "../../Types/BaseDatabase/SortOrder";
10
- import EnterpriseLicenseService from "../Services/EnterpriseLicenseService";
11
- import EnterpriseLicenseInstanceService from "../Services/EnterpriseLicenseInstanceService";
12
- import UserMiddleware from "../Middleware/UserAuthorization";
13
- import JSONWebToken from "../Utils/JsonWebToken";
14
- import OneUptimeDate from "../../Types/Date";
15
- import Response from "../Utils/Response";
16
- import BaseAPI from "./BaseAPI";
17
- import MasterAdminAuthorization from "../Middleware/MasterAdminAuthorization";
18
- /*
19
- * Bounds how many instance rows one license key can register. Real customers
20
- * run a handful of instances; this stops a leaked key from being used to
21
- * fill the table with junk rows.
22
- */
23
- const MAX_INSTANCES_PER_LICENSE = 100;
24
- export default class EnterpriseLicenseAPI extends BaseAPI {
25
- constructor() {
26
- var _a, _b, _c;
27
- super(EnterpriseLicense, EnterpriseLicenseService);
28
- /*
29
- * The dashboard needs a count and instance statuses from one cutoff
30
- * instant. Calculate both on the server so the per-user hashes used for
31
- * cross-instance deduplication never have to be sent to the browser.
32
- */
33
- this.router.get(`${(_a = new this.entityType().getCrudApiPath()) === null || _a === void 0 ? void 0 : _a.toString()}/:enterpriseLicenseId/active-usage`, MasterAdminAuthorization.isAuthorizedMasterAdminMiddleware, async (req, res, next) => {
34
- try {
35
- const licenseId = new ObjectID(req.params["enterpriseLicenseId"]);
36
- const snapshot = await EnterpriseLicenseService.runWithUsageAggregationLock({
37
- licenseId,
38
- fn: async () => {
39
- /*
40
- * A report updates its instance row and then the license-wide
41
- * timestamp. Read both under the same lock so the dashboard
42
- * can never combine the new instance state with the previous
43
- * license state (or vice versa).
44
- */
45
- const license = await EnterpriseLicenseService.findOneById({
46
- id: licenseId,
47
- select: {
48
- _id: true,
49
- currentUserCount: true,
50
- userCountUpdatedAt: true,
51
- userCountSource: true,
52
- legacyUserCount: true,
53
- legacyUserCountUpdatedAt: true,
54
- },
55
- props: {
56
- isRoot: true,
57
- },
58
- });
59
- if (!license) {
60
- throw new BadDataException("Enterprise license not found");
61
- }
62
- const instances = await this.findLicenseInstances(licenseId);
63
- const calculatedAt = OneUptimeDate.getCurrentDate();
64
- const activeInstances = instances.filter((instance) => {
65
- return EnterpriseLicenseUsageUtil.isInstanceCountedTowardsUsage(instance, calculatedAt);
66
- });
67
- const currentUserCount = EnterpriseLicenseUsageUtil.getEffectiveUserCount({
68
- instances,
69
- storedUserCount: license.currentUserCount,
70
- storedUserCountUpdatedAt: license.userCountUpdatedAt,
71
- storedUserCountSource: license.userCountSource,
72
- legacyUserCount: license.legacyUserCount,
73
- legacyUserCountUpdatedAt: license.legacyUserCountUpdatedAt,
74
- now: calculatedAt,
75
- });
76
- const masterAdminEmailSet = new Set();
77
- for (const instance of instances) {
78
- for (const email of instance.masterAdminEmails || []) {
79
- const normalizedEmail = email.trim().toLowerCase();
80
- if (normalizedEmail) {
81
- masterAdminEmailSet.add(normalizedEmail);
82
- }
83
- }
84
- }
85
- const masterAdminEmails = Array.from(masterAdminEmailSet).sort();
86
- const nextInstanceStatusChangeAt = activeInstances.reduce((earliestChange, instance) => {
87
- const lastCommunicatedAt = EnterpriseLicenseUsageUtil.getInstanceLastCommunicatedAt(instance);
88
- if (!lastCommunicatedAt) {
89
- return earliestChange;
90
- }
91
- const inactiveAt = new Date(lastCommunicatedAt.getTime() +
92
- EnterpriseLicenseUsageUtil.InstanceUsageFreshnessInDays *
93
- 24 *
94
- 60 *
95
- 60 *
96
- 1000);
97
- return !earliestChange || inactiveAt < earliestChange
98
- ? inactiveAt
99
- : earliestChange;
100
- }, null);
101
- const usesActiveModernUsage = EnterpriseLicenseUsageUtil.hasActiveReportedInstanceUsage(instances, calculatedAt);
102
- let activeLegacyUsageUpdatedAt;
103
- if (!usesActiveModernUsage) {
104
- if (EnterpriseLicenseUsageUtil.isTimestampWithinUsageWindow(license.legacyUserCountUpdatedAt, calculatedAt)) {
105
- activeLegacyUsageUpdatedAt =
106
- license.legacyUserCountUpdatedAt;
107
- }
108
- else if (!license.legacyUserCountUpdatedAt &&
109
- license.userCountSource !==
110
- EnterpriseLicenseUserCountSource.Instance &&
111
- (license.userCountSource ===
112
- EnterpriseLicenseUserCountSource.Legacy ||
113
- !EnterpriseLicenseUsageUtil.hasReportedInstanceUsage(instances)) &&
114
- EnterpriseLicenseUsageUtil.isTimestampWithinUsageWindow(license.userCountUpdatedAt, calculatedAt)) {
115
- /*
116
- * Compatibility for rows written before the dedicated
117
- * legacy heartbeat columns were introduced.
118
- */
119
- activeLegacyUsageUpdatedAt = license.userCountUpdatedAt;
120
- }
121
- }
122
- const legacyUsageChangeAt = activeLegacyUsageUpdatedAt
123
- ? new Date(activeLegacyUsageUpdatedAt.getTime() +
124
- EnterpriseLicenseUsageUtil.InstanceUsageFreshnessInDays *
125
- 24 *
126
- 60 *
127
- 60 *
128
- 1000)
129
- : null;
130
- let nextUsageChangeAt = nextInstanceStatusChangeAt;
131
- if (legacyUsageChangeAt &&
132
- (!nextUsageChangeAt ||
133
- legacyUsageChangeAt < nextUsageChangeAt)) {
134
- nextUsageChangeAt = legacyUsageChangeAt;
135
- }
136
- const usageReportTimestamps = [
137
- license.userCountUpdatedAt,
138
- license.legacyUserCountUpdatedAt,
139
- ...instances.map((instance) => {
140
- return instance.lastReportedAt;
141
- }),
142
- ].filter((timestamp) => {
143
- return Boolean(timestamp);
144
- });
145
- const lastUsageReportedAt = usageReportTimestamps.reduce((latest, timestamp) => {
146
- return !latest || timestamp > latest ? timestamp : latest;
147
- }, null);
148
- return {
149
- currentUserCount,
150
- activeInstanceIds: activeInstances.map((instance) => {
151
- return instance.id.toString();
152
- }),
153
- masterAdminEmails,
154
- calculatedAt: calculatedAt.toISOString(),
155
- lastUsageReportedAt: (lastUsageReportedAt === null || lastUsageReportedAt === void 0 ? void 0 : lastUsageReportedAt.toISOString()) || null,
156
- nextInstanceStatusChangeAt: (nextUsageChangeAt === null || nextUsageChangeAt === void 0 ? void 0 : nextUsageChangeAt.toISOString()) || null,
157
- };
158
- },
159
- });
160
- return Response.sendJsonObjectResponse(req, res, snapshot);
161
- }
162
- catch (err) {
163
- next(err);
164
- }
165
- });
166
- this.router.post(`${(_b = new this.entityType().getCrudApiPath()) === null || _b === void 0 ? void 0 : _b.toString()}/validate`, UserMiddleware.getUserMiddleware, async (req, res, next) => {
167
- try {
168
- const licenseKey = req.body["licenseKey"];
169
- if (!licenseKey) {
170
- throw new BadDataException("License key is required");
171
- }
172
- //const serverHost: string = Host.toString();
173
- /*
174
- * if (!serverHost.includes("oneuptime.com")) {
175
- * throw new BadDataException(
176
- * "Enterprise license validation is only available on oneuptime.com",
177
- * );
178
- * }
179
- */
180
- const license = await EnterpriseLicenseService.findOneBy({
181
- query: {
182
- licenseKey: licenseKey,
183
- },
184
- select: {
185
- _id: true,
186
- companyName: true,
187
- expiresAt: true,
188
- licenseKey: true,
189
- userLimit: true,
190
- currentUserCount: true,
191
- userCountUpdatedAt: true,
192
- isEvaluationLicense: true,
193
- },
194
- props: {
195
- isRoot: true,
196
- },
197
- });
198
- if (!license) {
199
- throw new BadDataException("License key is invalid");
200
- }
201
- if (!license.expiresAt) {
202
- throw new BadDataException("License expiration is not set");
203
- }
204
- const now = Date.now();
205
- const expiresAtMs = license.expiresAt.getTime();
206
- const secondsUntilExpiry = Math.floor((expiresAtMs - now) / 1000);
207
- if (secondsUntilExpiry <= 0) {
208
- throw new BadDataException("License key has expired");
209
- }
210
- /*
211
- * The validating instance sends its instanceId and host so it
212
- * shows up in the instance list right away (usage is reported
213
- * later by the daily job on the instance).
214
- */
215
- const instanceId = this.parseShortText(req.body["instanceId"]);
216
- const instanceHost = this.parseShortText(req.body["host"]);
217
- const instanceVersion = this.parseVersion(req.body["version"]);
218
- const validationResult = await EnterpriseLicenseService.runWithUsageAggregationLock({
219
- licenseId: license.id,
220
- fn: async () => {
221
- /*
222
- * Registration is the instance's first communication and can
223
- * keep an upgrade-era count in its grace window. Serialize it
224
- * with reporting and reconciliation so a sweep cannot read the
225
- * old rows, then overwrite the count after this row appears.
226
- */
227
- if (instanceId) {
228
- await this.upsertLicenseInstance({
229
- licenseId: license.id,
230
- instanceId: instanceId,
231
- host: instanceHost || undefined,
232
- oneuptimeVersion: instanceVersion,
233
- });
234
- }
235
- const instances = await this.findLicenseInstances(license.id);
236
- const currentLicense = await EnterpriseLicenseService.findOneById({
237
- id: license.id,
238
- select: {
239
- currentUserCount: true,
240
- userCountUpdatedAt: true,
241
- userCountSource: true,
242
- legacyUserCount: true,
243
- legacyUserCountUpdatedAt: true,
244
- },
245
- props: {
246
- isRoot: true,
247
- },
248
- });
249
- if (!currentLicense) {
250
- throw new BadDataException("License key is invalid");
251
- }
252
- const calculatedAt = OneUptimeDate.getCurrentDate();
253
- const currentUserCount = EnterpriseLicenseUsageUtil.getEffectiveUserCount({
254
- instances,
255
- storedUserCount: currentLicense.currentUserCount,
256
- storedUserCountUpdatedAt: currentLicense.userCountUpdatedAt,
257
- storedUserCountSource: currentLicense.userCountSource,
258
- legacyUserCount: currentLicense.legacyUserCount,
259
- legacyUserCountUpdatedAt: currentLicense.legacyUserCountUpdatedAt,
260
- now: calculatedAt,
261
- });
262
- return {
263
- instances,
264
- currentUserCount,
265
- userCountUpdatedAt: currentLicense.userCountUpdatedAt || null,
266
- calculatedAt,
267
- };
268
- },
269
- });
270
- const terms = this.getLicenseTerms(license);
271
- const token = this.signLicenseToken(license);
272
- return Response.sendJsonObjectResponse(req, res, {
273
- companyName: terms.companyName,
274
- expiresAt: terms.expiresAt,
275
- licenseKey: terms.licenseKey,
276
- userLimit: terms.userLimit,
277
- currentUserCount: validationResult.currentUserCount,
278
- userCountUpdatedAt: validationResult.userCountUpdatedAt
279
- ? validationResult.userCountUpdatedAt.toISOString()
280
- : null,
281
- isEvaluationLicense: Boolean(license.isEvaluationLicense),
282
- instances: this.getInstanceSummaries(validationResult.instances, validationResult.calculatedAt),
283
- token,
284
- });
285
- }
286
- catch (err) {
287
- next(err);
288
- }
289
- });
290
- this.router.post(`${(_c = new this.entityType().getCrudApiPath()) === null || _c === void 0 ? void 0 : _c.toString()}/report-user-count`, async (req, res, next) => {
291
- var _a;
292
- try {
293
- const licenseKey = (_a = req.body["licenseKey"]) === null || _a === void 0 ? void 0 : _a.trim();
294
- const rawUserCount = req.body["userCount"];
295
- if (!licenseKey) {
296
- throw new BadDataException("License key is required");
297
- }
298
- const userCount = Number(rawUserCount);
299
- if (!Number.isFinite(userCount) ||
300
- userCount < 0 ||
301
- !Number.isInteger(userCount)) {
302
- throw new BadDataException("userCount must be a non-negative integer");
303
- }
304
- const license = await EnterpriseLicenseService.findOneBy({
305
- query: {
306
- licenseKey: licenseKey,
307
- },
308
- /*
309
- * The full set of terms, not just the usage columns: this
310
- * response is what a self-hosted installation mirrors into its
311
- * own GlobalConfig every day, so anything it is missing here is
312
- * a field the customer keeps the stale value of until somebody
313
- * re-types the license key by hand. Same indexed lookup either
314
- * way.
315
- */
316
- select: {
317
- _id: true,
318
- companyName: true,
319
- expiresAt: true,
320
- licenseKey: true,
321
- userLimit: true,
322
- isEvaluationLicense: true,
323
- },
324
- props: {
325
- isRoot: true,
326
- },
327
- });
328
- if (!license) {
329
- throw new BadDataException("License key is invalid");
330
- }
331
- const instanceId = this.parseShortText(req.body["instanceId"]);
332
- const instanceHost = this.parseShortText(req.body["host"]);
333
- const instanceVersion = this.parseVersion(req.body["version"]);
334
- const userEmailHashes = EnterpriseLicenseUsageUtil.sanitizeUserEmailHashes(req.body["userEmailHashes"]);
335
- const masterAdminEmails = EnterpriseLicenseUsageUtil.sanitizeMasterAdminEmails(req.body["masterAdminEmails"]);
336
- const usageReport = await EnterpriseLicenseService.runWithUsageAggregationLock({
337
- licenseId: license.id,
338
- fn: async () => {
339
- /*
340
- * Capture this after acquiring the lock. Waiting reports can
341
- * never complete later with an earlier timestamp, and the
342
- * upsert/read/aggregate/write sequence is one serialized
343
- * critical section across every API replica.
344
- */
345
- const reportedAt = OneUptimeDate.getCurrentDate();
346
- if (instanceId) {
347
- /*
348
- * Multi-instance report: track usage per instance and count
349
- * users uniquely across all instances of this license.
350
- */
351
- await this.upsertLicenseInstance({
352
- licenseId: license.id,
353
- instanceId: instanceId,
354
- host: instanceHost || undefined,
355
- oneuptimeVersion: instanceVersion,
356
- userCount: userCount,
357
- userEmailHashes: userEmailHashes,
358
- masterAdminEmails: masterAdminEmails,
359
- lastReportedAt: reportedAt,
360
- });
361
- }
362
- const instances = await this.findLicenseInstances(license.id);
363
- const hasActiveReportedInstanceUsage = EnterpriseLicenseUsageUtil.hasActiveReportedInstanceUsage(instances, reportedAt);
364
- const currentUserCount = hasActiveReportedInstanceUsage
365
- ? EnterpriseLicenseUsageUtil.getUniqueUserCount(instances, reportedAt)
366
- : userCount;
367
- const usageUpdate = {};
368
- /*
369
- * Legacy reports (no instanceId) drive the license-wide count
370
- * only while no modern instance is active. Their separate
371
- * heartbeat is always retained, though, so a legacy reporter
372
- * can take over immediately when the last modern report ages
373
- * out instead of disappearing until its next daily call.
374
- */
375
- if (!instanceId) {
376
- usageUpdate.legacyUserCount = userCount;
377
- usageUpdate.legacyUserCountUpdatedAt = reportedAt;
378
- }
379
- if (instanceId || !hasActiveReportedInstanceUsage) {
380
- usageUpdate.currentUserCount = currentUserCount;
381
- usageUpdate.userCountUpdatedAt = reportedAt;
382
- usageUpdate.userCountSource = instanceId
383
- ? EnterpriseLicenseUserCountSource.Instance
384
- : EnterpriseLicenseUserCountSource.Legacy;
385
- }
386
- if (Object.keys(usageUpdate).length > 0) {
387
- await EnterpriseLicenseService.updateOneById({
388
- id: license.id,
389
- data: usageUpdate,
390
- props: {
391
- isRoot: true,
392
- ignoreHooks: true,
393
- },
394
- });
395
- }
396
- return {
397
- reportedAt,
398
- instances,
399
- currentUserCount,
400
- };
401
- },
402
- });
403
- const { reportedAt, instances, currentUserCount } = usageReport;
404
- const terms = this.getLicenseTerms(license);
405
- return Response.sendJsonObjectResponse(req, res, {
406
- companyName: terms.companyName,
407
- expiresAt: terms.expiresAt,
408
- licenseKey: terms.licenseKey,
409
- userLimit: terms.userLimit,
410
- currentUserCount: currentUserCount,
411
- userCountUpdatedAt: reportedAt.toISOString(),
412
- isEvaluationLicense: Boolean(license.isEvaluationLicense),
413
- instances: this.getInstanceSummaries(instances, reportedAt),
414
- /*
415
- * Null once the license has expired. Unlike /validate this route
416
- * does not reject an expired license - the instance is still
417
- * expected to report, and the expiry notification emails are built
418
- * from what it reports - but it must not keep being handed a fresh
419
- * token, and the expiresAt above is what tells it the truth.
420
- */
421
- token: this.signLicenseToken(license),
422
- });
423
- }
424
- catch (err) {
425
- next(err);
426
- }
427
- });
428
- }
429
- /*
430
- * The license terms a self-hosted installation mirrors locally. Built in one
431
- * place so /validate and /report-user-count cannot drift: the seat limit was
432
- * missing from what an instance could refresh for exactly as long as the two
433
- * responses were written out by hand, separately.
434
- */
435
- getLicenseTerms(license) {
436
- return {
437
- companyName: license.companyName || "",
438
- expiresAt: license.expiresAt ? license.expiresAt.toISOString() : null,
439
- licenseKey: license.licenseKey || "",
440
- userLimit: typeof license.userLimit === "number" ? license.userLimit : null,
441
- };
442
- }
443
- /*
444
- * Signed with the license server's own secret, so it is opaque to the
445
- * installation holding it - it is the proof that oneuptime.com recognized
446
- * the key, and the instance only checks that it exists. An expired license
447
- * gets none, which is why this returns null rather than a short-lived token.
448
- */
449
- signLicenseToken(license) {
450
- if (!license.expiresAt) {
451
- return null;
452
- }
453
- const secondsUntilExpiry = Math.floor((license.expiresAt.getTime() - Date.now()) / 1000);
454
- if (secondsUntilExpiry <= 0) {
455
- return null;
456
- }
457
- const terms = this.getLicenseTerms(license);
458
- return JSONWebToken.signJsonPayload({
459
- companyName: terms.companyName,
460
- expiresAt: terms.expiresAt,
461
- licenseKey: terms.licenseKey,
462
- userLimit: terms.userLimit,
463
- }, Math.max(secondsUntilExpiry, 1));
464
- }
465
- parseShortText(value) {
466
- if (typeof value !== "string") {
467
- return "";
468
- }
469
- return value.trim().substring(0, 100);
470
- }
471
- /*
472
- * report-user-count is unauthenticated, so the reported version is only
473
- * stored when it is a version we could actually compare against a release —
474
- * garbage never reaches the admin dashboard or the customer's modal.
475
- *
476
- * Three outcomes, and the callers depend on the distinction:
477
- * undefined — the instance sent no version at all (it predates this
478
- * field). Leave whatever is stored alone.
479
- * null — it sent something, but not a version. Clear the stored
480
- * value, so an instance rolled back to a build with no
481
- * APP_VERSION stops advertising the version it used to run.
482
- * string — a valid, canonical version to store.
483
- */
484
- parseVersion(value) {
485
- if (value === undefined || value === null) {
486
- return undefined;
487
- }
488
- /*
489
- * Canonicalized rather than passed through, so the stored string is never
490
- * something the UIs would render with a doubled "v".
491
- */
492
- return VersionUtil.canonicalize(value);
493
- }
494
- async findLicenseInstances(licenseId) {
495
- return EnterpriseLicenseInstanceService.findBy({
496
- query: {
497
- enterpriseLicenseId: licenseId,
498
- },
499
- select: {
500
- _id: true,
501
- createdAt: true,
502
- instanceId: true,
503
- host: true,
504
- userCount: true,
505
- userEmailHashes: true,
506
- masterAdminEmails: true,
507
- lastReportedAt: true,
508
- oneuptimeVersion: true,
509
- },
510
- sort: {
511
- createdAt: SortOrder.Ascending,
512
- },
513
- skip: 0,
514
- limit: LIMIT_MAX,
515
- props: {
516
- isRoot: true,
517
- },
518
- });
519
- }
520
- getInstanceSummaries(instances, calculatedAt) {
521
- return instances.map((instance) => {
522
- return {
523
- instanceId: instance.instanceId || "",
524
- host: instance.host || null,
525
- userCount: typeof instance.userCount === "number" ? instance.userCount : null,
526
- isCountedTowardsUsage: EnterpriseLicenseUsageUtil.isInstanceCountedTowardsUsage(instance, calculatedAt),
527
- lastReportedAt: instance.lastReportedAt
528
- ? instance.lastReportedAt.toISOString()
529
- : null,
530
- version: instance.oneuptimeVersion || null,
531
- };
532
- });
533
- }
534
- async upsertLicenseInstance(data) {
535
- const updated = await this.updateLicenseInstanceIfExists(data);
536
- if (updated) {
537
- return;
538
- }
539
- const instanceCount = await EnterpriseLicenseInstanceService.countBy({
540
- query: {
541
- enterpriseLicenseId: data.licenseId,
542
- },
543
- props: {
544
- isRoot: true,
545
- },
546
- });
547
- if (instanceCount.toNumber() >= MAX_INSTANCES_PER_LICENSE) {
548
- throw new BadDataException("Too many instances are registered for this license. Please contact support@oneuptime.com.");
549
- }
550
- const newInstance = new EnterpriseLicenseInstance();
551
- newInstance.enterpriseLicenseId = data.licenseId;
552
- newInstance.instanceId = data.instanceId;
553
- if (data.host !== undefined) {
554
- newInstance.host = data.host;
555
- }
556
- // Null means "reported something that is not a version" — nothing to store.
557
- if (data.oneuptimeVersion) {
558
- newInstance.oneuptimeVersion = data.oneuptimeVersion;
559
- }
560
- if (data.userCount !== undefined) {
561
- newInstance.userCount = data.userCount;
562
- }
563
- if (data.userEmailHashes !== undefined) {
564
- newInstance.userEmailHashes = data.userEmailHashes;
565
- }
566
- if (data.masterAdminEmails !== undefined) {
567
- newInstance.masterAdminEmails = data.masterAdminEmails;
568
- }
569
- if (data.lastReportedAt !== undefined) {
570
- newInstance.lastReportedAt = data.lastReportedAt;
571
- }
572
- try {
573
- await EnterpriseLicenseInstanceService.create({
574
- data: newInstance,
575
- props: {
576
- isRoot: true,
577
- },
578
- });
579
- }
580
- catch (err) {
581
- /*
582
- * A concurrent request created the row between our check and this
583
- * insert — the unique index on (enterpriseLicenseId, instanceId)
584
- * rejected the duplicate. Apply the report as an update instead.
585
- */
586
- const retried = await this.updateLicenseInstanceIfExists(data);
587
- if (!retried) {
588
- throw err;
589
- }
590
- }
591
- }
592
- async updateLicenseInstanceIfExists(data) {
593
- const existingInstance = await EnterpriseLicenseInstanceService.findOneBy({
594
- query: {
595
- enterpriseLicenseId: data.licenseId,
596
- instanceId: data.instanceId,
597
- },
598
- select: {
599
- _id: true,
600
- },
601
- props: {
602
- isRoot: true,
603
- },
604
- });
605
- if (!existingInstance) {
606
- return false;
607
- }
608
- const updateData = {};
609
- if (data.host !== undefined) {
610
- updateData.host = data.host;
611
- }
612
- /*
613
- * Null clears the column: an instance rebuilt onto a build with no
614
- * APP_VERSION must stop advertising the version it used to run, because
615
- * lastReportedAt is refreshed on the same request and would otherwise
616
- * read as "confirmed running v11.5.13 as of today".
617
- */
618
- if (data.oneuptimeVersion !== undefined) {
619
- updateData.oneuptimeVersion = data.oneuptimeVersion;
620
- }
621
- if (data.userCount !== undefined) {
622
- updateData.userCount = data.userCount;
623
- }
624
- if (data.userEmailHashes !== undefined) {
625
- updateData.userEmailHashes = data.userEmailHashes;
626
- }
627
- if (data.masterAdminEmails !== undefined) {
628
- updateData.masterAdminEmails = data.masterAdminEmails;
629
- }
630
- if (data.lastReportedAt !== undefined) {
631
- updateData.lastReportedAt = data.lastReportedAt;
632
- }
633
- if (Object.keys(updateData).length > 0) {
634
- await EnterpriseLicenseInstanceService.updateOneById({
635
- id: existingInstance.id,
636
- data: updateData,
637
- props: {
638
- isRoot: true,
639
- ignoreHooks: true,
640
- },
641
- });
642
- }
643
- return true;
644
- }
645
- }
646
- //# sourceMappingURL=EnterpriseLicenseAPI.js.map