@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
@@ -0,0 +1,190 @@
1
+ import AllModelTypes from "../../../Models/DatabaseModels/Index";
2
+ import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
3
+ import Monitor from "../../../Models/DatabaseModels/Monitor";
4
+ import ProjectSCIM from "../../../Models/DatabaseModels/ProjectSCIM";
5
+ import StatusPage from "../../../Models/DatabaseModels/StatusPage";
6
+ import UserEmail from "../../../Models/DatabaseModels/UserEmail";
7
+ import { ColumnAccessControl } from "../../../Types/BaseDatabase/AccessControl";
8
+ import ColumnBillingAccessControl from "../../../Types/BaseDatabase/ColumnBillingAccessControl";
9
+ import { getColumnAccessControlForAllColumns } from "../../../Types/Database/AccessControl/ColumnAccessControl";
10
+ import { getColumnBillingAccessControlForAllColumns } from "../../../Types/Database/AccessControl/ColumnBillingAccessControl";
11
+ import { getOwnerOnlyColumns } from "../../../Types/Database/AccessControl/OwnerOnlyColumn";
12
+ import Dictionary from "../../../Types/Dictionary";
13
+ import { JSONObject } from "../../../Types/JSON";
14
+ import { describe, expect, test } from "@jest/globals";
15
+ import { getMetadataArgsStorage } from "typeorm";
16
+
17
+ /*
18
+ * WHY THIS FILE EXISTS - do not delete these as "obvious" assertions.
19
+ *
20
+ * Every "which columns does this model have" lookup answers the question by
21
+ * enumerating an INSTANCE's own keys, and caches the answer per CLASS, for the
22
+ * whole process. So the FIRST instance to ask used to define what the class is
23
+ * for everybody after it.
24
+ *
25
+ * BaseAPI.createItem deleted `_id` off the live model instance it handed to
26
+ * the service, and DatabaseService.create asks that instance for its columns
27
+ * (generateDefaultValues) before any permission check runs. One POST - even a
28
+ * POST that was refused - could therefore teach the process that a model has
29
+ * no `_id` column, and DatabaseBaseModel.toJSONObject serializes a row by
30
+ * iterating exactly that cached list, so every response for that model lost
31
+ * its id from then on. To any caller, on any route, including plain reads as
32
+ * root: the row still carried its real `_id` in memory and the SQL projection
33
+ * still selected it. The id was dropped on the way out, and it stayed a 200
34
+ * because `_id` is in ColumnPermissions.getExcludedColumnNames().
35
+ *
36
+ * The tests below do the mutation on purpose. No caller in the tree does it
37
+ * any more, and that is not what is being protected: the invariant is that it
38
+ * CANNOT MATTER who asks first or what they did to their own instance. Each
39
+ * test uses a different model class, because these caches are per class and
40
+ * per process - a class another test has already asked about has a warm cache
41
+ * and would pass vacuously.
42
+ */
43
+
44
+ describe("column metadata does not depend on which instance asked first", () => {
45
+ test("getTableColumns: a mutilated instance asking first cannot strip _id from the class", () => {
46
+ const mutilated: ProjectSCIM = new ProjectSCIM();
47
+
48
+ // exactly what BaseAPI.createItem used to do before calling the service
49
+ delete (mutilated as unknown as Record<string, unknown>)["_id"];
50
+ expect(Object.keys(mutilated)).not.toContain("_id");
51
+
52
+ // the mutilated instance is the FIRST to ask, on a cold cache
53
+ expect(mutilated.getTableColumns().columns).toContain("_id");
54
+
55
+ // ...and a fresh instance of the same class is unharmed
56
+ expect(new ProjectSCIM().getTableColumns().columns).toContain("_id");
57
+ });
58
+
59
+ test("getTableColumns: a row still serializes with its _id after such a create", () => {
60
+ /*
61
+ * The assertion that matches the reported symptom: POST /api/project-scim
62
+ * answered 200 with every column except "_id", and a get-list selecting
63
+ * {_id, name} came back as {name} alone.
64
+ */
65
+ const mutilated: Monitor = new Monitor();
66
+ delete (mutilated as unknown as Record<string, unknown>)["_id"];
67
+ mutilated.getTableColumns();
68
+
69
+ const row: Monitor = new Monitor();
70
+ row._id = "22222222-2222-4222-8222-222222222222";
71
+ row.name = "a monitor";
72
+
73
+ const json: JSONObject = BaseModel.toJSONObject(row, Monitor);
74
+
75
+ expect(json["_id"]).toBe("22222222-2222-4222-8222-222222222222");
76
+ expect(json["name"]).toBe("a monitor");
77
+ });
78
+
79
+ test("getColumnAccessControlForAllColumns is instance-independent", () => {
80
+ const mutilated: StatusPage = new StatusPage();
81
+ delete (mutilated as unknown as Record<string, unknown>)["name"];
82
+
83
+ const fromMutilated: Dictionary<ColumnAccessControl> =
84
+ getColumnAccessControlForAllColumns(mutilated);
85
+
86
+ expect(fromMutilated["name"]).toBeDefined();
87
+ expect(
88
+ getColumnAccessControlForAllColumns(new StatusPage())["name"],
89
+ ).toBeDefined();
90
+ });
91
+
92
+ test("getColumnBillingAccessControlForAllColumns is instance-independent", () => {
93
+ const mutilated: StatusPage = new StatusPage();
94
+ delete (mutilated as unknown as Record<string, unknown>)["customCSS"];
95
+
96
+ const fromMutilated: Dictionary<ColumnBillingAccessControl> =
97
+ getColumnBillingAccessControlForAllColumns(mutilated);
98
+
99
+ expect(fromMutilated["customCSS"]).toBeDefined();
100
+ expect(
101
+ getColumnBillingAccessControlForAllColumns(new StatusPage())["customCSS"],
102
+ ).toBeDefined();
103
+ });
104
+
105
+ test("getOwnerOnlyColumns is instance-independent", () => {
106
+ /*
107
+ * This one is a permission list, not a projection: a marked column that
108
+ * goes unreported is a column OwnerOnlyColumnPermission stops protecting.
109
+ */
110
+ const mutilated: UserEmail = new UserEmail();
111
+ delete (mutilated as unknown as Record<string, unknown>)["email"];
112
+
113
+ expect(getOwnerOnlyColumns(mutilated)).toContain("email");
114
+ expect(getOwnerOnlyColumns(new UserEmail())).toContain("email");
115
+ });
116
+
117
+ test("mutating an instance after the class has been read changes nothing either", () => {
118
+ const first: UserEmail = new UserEmail();
119
+ expect(first.getTableColumns().columns).toContain("_id");
120
+
121
+ delete (first as unknown as Record<string, unknown>)["_id"];
122
+
123
+ expect(first.getTableColumns().columns).toContain("_id");
124
+ expect(new UserEmail().getTableColumns().columns).toContain("_id");
125
+ });
126
+ });
127
+
128
+ /*
129
+ * The premise of the fix: metadata enumeration reads a freshly constructed
130
+ * instance of the caller's class, so every model must be no-arg constructible
131
+ * and must expose every column it declares on a fresh instance (the class
132
+ * bodies do that with `= undefined` initializers). If a model is ever added
133
+ * that breaks either half, it would silently lose columns everywhere -
134
+ * responses, selects, permissions - so assert it for all of them at once.
135
+ */
136
+ describe("every database model supports canonical-instance enumeration", () => {
137
+ test("all models are no-arg constructible and declare no column that a fresh instance lacks", () => {
138
+ const columnsByTarget: Map<unknown, Array<string>> = new Map();
139
+
140
+ const record: (target: unknown, propertyName: string) => void = (
141
+ target: unknown,
142
+ propertyName: string,
143
+ ): void => {
144
+ const list: Array<string> = columnsByTarget.get(target) || [];
145
+ list.push(propertyName);
146
+ columnsByTarget.set(target, list);
147
+ };
148
+
149
+ for (const column of getMetadataArgsStorage().columns) {
150
+ record(column.target, column.propertyName);
151
+ }
152
+
153
+ for (const relation of getMetadataArgsStorage().relations) {
154
+ record(relation.target, relation.propertyName);
155
+ }
156
+
157
+ const constructFailures: Array<string> = [];
158
+ const missingKeys: Array<string> = [];
159
+
160
+ for (const modelType of AllModelTypes) {
161
+ let instance: BaseModel | null = null;
162
+
163
+ try {
164
+ instance = new modelType();
165
+ } catch (err) {
166
+ constructFailures.push(`${modelType.name}: ${(err as Error).message}`);
167
+ continue;
168
+ }
169
+
170
+ const ownKeys: Set<string> = new Set(Object.keys(instance));
171
+
172
+ // inherited columns count too, so walk the constructor chain
173
+ let ctor: unknown = modelType;
174
+
175
+ while (ctor && ctor !== Function.prototype) {
176
+ for (const propertyName of columnsByTarget.get(ctor) || []) {
177
+ if (!ownKeys.has(propertyName)) {
178
+ missingKeys.push(`${modelType.name}.${propertyName}`);
179
+ }
180
+ }
181
+
182
+ ctor = Object.getPrototypeOf(ctor);
183
+ }
184
+ }
185
+
186
+ expect(constructFailures).toEqual([]);
187
+ expect(missingKeys).toEqual([]);
188
+ expect(AllModelTypes.length).toBeGreaterThan(400);
189
+ });
190
+ });
@@ -0,0 +1,104 @@
1
+ /*
2
+ * What the edition dialog must say about an Enterprise license lapse. Shared
3
+ * by the core EditionLabel suite and ee/Tests/UI/License, which renders the
4
+ * same dialog with the Enterprise license manager.
5
+ *
6
+ * When the license lapses (after the trial or the grace period), single
7
+ * sign-on (SAML and OIDC), SCIM provisioning and audit logging stop - the
8
+ * Community Edition's behaviour - and "Require SSO" stops being enforced at
9
+ * the same moment, so nobody is locked out: users sign in with their
10
+ * password. Everything resumes as soon as a license is activated. The trial
11
+ * and grace notices must say so BEFORE it happens, and the lapsed notice must
12
+ * say what is off.
13
+ *
14
+ * The dialog used to promise the opposite ("SSO, SCIM and audit logging never
15
+ * stop"), so the checks reject that copy too. Plain functions over text, with
16
+ * no jest dependency, so a test can prove each check fails on the wrong copy.
17
+ */
18
+
19
+ // Before the lapse: the trial and grace notices, after "Without a valid license (...), ".
20
+ export const LAPSE_WARNING_PHRASES: ReadonlyArray<string> = [
21
+ "single sign-on (SAML and OIDC) stops",
22
+ '"Require SSO" is no longer enforced, so users sign in with their password',
23
+ "SCIM provisioning stops",
24
+ "audit logging stops recording",
25
+ "enterprise configuration becomes read-only",
26
+ "the enterprise admin dashboards are locked",
27
+ "Everything resumes as soon as a license is activated",
28
+ "core monitoring is never affected",
29
+ ];
30
+
31
+ // After the lapse: the license-required notice (expired, missing, invalid).
32
+ export const LAPSED_STATE_PHRASES: ReadonlyArray<string> = [
33
+ "Single sign-on (SAML and OIDC) and SCIM provisioning are off",
34
+ '"Require SSO" is not enforced, so users sign in with their password',
35
+ "SCIM requests are refused",
36
+ "Audit logging is not recording",
37
+ "Enterprise configuration is read-only",
38
+ "Everything resumes, without a restart, as soon as a valid license is added",
39
+ "core monitoring is never affected",
40
+ ];
41
+
42
+ // The soft-enforcement promises the dialog made before. None may come back.
43
+ export const RETIRED_SOFT_ENFORCEMENT_COPY: ReadonlyArray<RegExp> = [
44
+ /never stop/i,
45
+ /already configured keeps working/i,
46
+ /configured stops working/i,
47
+ /keeps? working as configured/i,
48
+ /never (?:silently )?weakens?/i,
49
+ ];
50
+
51
+ // The copy the dialog shipped before the owner's decision, verbatim.
52
+ export const RETIRED_NOTICE_EXAMPLES: ReadonlyArray<string> = [
53
+ "Without a valid license (after the 14-day grace period), enterprise configuration becomes read-only and the enterprise admin dashboards are locked. Everything you already configured keeps working — SSO, SCIM and audit logging never stop — and core monitoring is never affected.",
54
+ "Without a valid license (after the 14-day trial), enterprise configuration becomes read-only and the enterprise admin dashboards are locked. Everything you already configured keeps working — SSO, SCIM and audit logging never stop — and core monitoring is never affected.",
55
+ "The Enterprise license expired and its grace period is over. Enterprise configuration is read-only and the enterprise admin dashboards are locked until a valid license is added. Everything you already configured keeps working — SSO, SCIM and audit logging never stop — and core monitoring is never affected.",
56
+ ];
57
+
58
+ type CopyCheck = (text: string | null | undefined) => Array<string>;
59
+
60
+ // Whitespace-normalized, so a check does not depend on how JSX wraps a line.
61
+ const normalize: (text: string | null | undefined) => string = (
62
+ text: string | null | undefined,
63
+ ): string => {
64
+ return (text || "").replace(/\s+/g, " ").trim();
65
+ };
66
+
67
+ const copyProblems: (
68
+ text: string | null | undefined,
69
+ requiredPhrases: ReadonlyArray<string>,
70
+ ) => Array<string> = (
71
+ text: string | null | undefined,
72
+ requiredPhrases: ReadonlyArray<string>,
73
+ ): Array<string> => {
74
+ const flat: string = normalize(text);
75
+ const problems: Array<string> = [];
76
+
77
+ for (const phrase of requiredPhrases) {
78
+ if (!flat.includes(phrase)) {
79
+ problems.push(`missing: ${phrase}`);
80
+ }
81
+ }
82
+
83
+ for (const retired of RETIRED_SOFT_ENFORCEMENT_COPY) {
84
+ if (retired.test(flat)) {
85
+ problems.push(`retired: ${retired.source}`);
86
+ }
87
+ }
88
+
89
+ return problems;
90
+ };
91
+
92
+ // What is wrong with a trial or grace notice (empty when it is right).
93
+ export const lapseWarningProblems: CopyCheck = (
94
+ text: string | null | undefined,
95
+ ): Array<string> => {
96
+ return copyProblems(text, LAPSE_WARNING_PHRASES);
97
+ };
98
+
99
+ // What is wrong with the notice shown once the license has lapsed.
100
+ export const lapsedStateProblems: CopyCheck = (
101
+ text: string | null | undefined,
102
+ ): Array<string> => {
103
+ return copyProblems(text, LAPSED_STATE_PHRASES);
104
+ };
@@ -0,0 +1,254 @@
1
+ import "@testing-library/jest-dom";
2
+ import {
3
+ afterEach,
4
+ beforeEach,
5
+ describe,
6
+ expect,
7
+ jest,
8
+ test,
9
+ } from "@jest/globals";
10
+ import { act, cleanup, render } from "@testing-library/react";
11
+ import React, { ReactElement } from "react";
12
+ import fs from "fs";
13
+ import path from "path";
14
+
15
+ /*
16
+ * The core Header (Admin Dashboard) and Footer (Dashboard) hand their edition
17
+ * pill the Enterprise plugin's LicenseManager, read from the plugin door
18
+ * inside render. With the Community stub - which is what this jest config
19
+ * resolves the plugin specifiers to - they hand it nothing, and the pill
20
+ * shows the license status only.
21
+ *
22
+ * EditionLabel is replaced with a probe that records the prop, and each door
23
+ * with one that returns whatever the test sets (the real Community stub by
24
+ * default). This is core, and must pass with ee/ deleted.
25
+ */
26
+
27
+ const receivedManagers: Array<unknown> = [];
28
+
29
+ jest.mock("../../../UI/Components/EditionLabel/EditionLabel", () => {
30
+ return {
31
+ __esModule: true,
32
+ default: (props: { licenseManager?: unknown }): ReactElement => {
33
+ receivedManagers.push(props.licenseManager);
34
+
35
+ return <span data-testid="edition-label" />;
36
+ },
37
+ };
38
+ });
39
+
40
+ jest.mock("../../../UI/Images/logos/OneUptimeSVG/3-transparent.svg", () => {
41
+ return "data:image/svg+xml;base64,bG9nbw==";
42
+ });
43
+
44
+ jest.mock("react-i18next", () => {
45
+ return {
46
+ useTranslation: () => {
47
+ return {
48
+ t: (key: string): string => {
49
+ return key;
50
+ },
51
+ };
52
+ },
53
+ };
54
+ });
55
+
56
+ jest.mock("../../../UI/Utils/User", () => {
57
+ return {
58
+ __esModule: true,
59
+ default: {
60
+ isMasterAdmin: (): boolean => {
61
+ return true;
62
+ },
63
+ isLoggedIn: (): boolean => {
64
+ return true;
65
+ },
66
+ },
67
+ };
68
+ });
69
+
70
+ jest.mock(
71
+ "../../../../App/FeatureSet/Dashboard/src/Components/LanguageSwitcher/LanguageSwitcher",
72
+ () => {
73
+ return {
74
+ __esModule: true,
75
+ default: (): ReactElement => {
76
+ return <span data-testid="language-switcher" />;
77
+ },
78
+ };
79
+ },
80
+ );
81
+
82
+ let mockAdminPlugins: Record<string, unknown> = {};
83
+ let mockDashboardPlugins: Record<string, unknown> = {};
84
+ let adminDoorReads: number = 0;
85
+ let dashboardDoorReads: number = 0;
86
+
87
+ jest.mock(
88
+ "../../../../App/FeatureSet/AdminDashboard/src/Enterprise/Plugins",
89
+ () => {
90
+ return {
91
+ getAdminDashboardPlugins: (): Record<string, unknown> => {
92
+ adminDoorReads += 1;
93
+ return mockAdminPlugins;
94
+ },
95
+ };
96
+ },
97
+ );
98
+
99
+ jest.mock("../../../../App/FeatureSet/Dashboard/src/Enterprise/Plugins", () => {
100
+ return {
101
+ getDashboardPlugins: (): Record<string, unknown> => {
102
+ dashboardDoorReads += 1;
103
+ return mockDashboardPlugins;
104
+ },
105
+ };
106
+ });
107
+
108
+ import AdminCommunityPlugins from "../../../../App/FeatureSet/AdminDashboard/src/Enterprise/CommunityPlugins";
109
+ import DashboardCommunityPlugins from "../../../../App/FeatureSet/Dashboard/src/Enterprise/CommunityPlugins";
110
+ import AdminDashboardHeader from "../../../../App/FeatureSet/AdminDashboard/src/Components/Header/Header";
111
+ import DashboardFooter from "../../../../App/FeatureSet/Dashboard/src/Components/Footer/Footer";
112
+ import { ADMIN_DASHBOARD_ENTERPRISE_PLUGIN_KEYS } from "../../../../App/FeatureSet/AdminDashboard/src/Enterprise/EnterprisePlugins";
113
+ import { DASHBOARD_ENTERPRISE_PLUGIN_KEYS } from "../../../../App/FeatureSet/Dashboard/src/Enterprise/EnterprisePlugins";
114
+
115
+ const FakeAdminLicenseManager: () => ReactElement = (): ReactElement => {
116
+ return <span />;
117
+ };
118
+
119
+ const FakeDashboardLicenseManager: () => ReactElement = (): ReactElement => {
120
+ return <span />;
121
+ };
122
+
123
+ const APP_DIR: string = path.resolve(__dirname, "..", "..", "..", "..", "App");
124
+
125
+ interface Caller {
126
+ name: string;
127
+ file: string;
128
+ render: () => void;
129
+ setPlugins: (plugins: Record<string, unknown>) => void;
130
+ communityStub: Record<string, unknown>;
131
+ fake: () => ReactElement;
132
+ doorReads: () => number;
133
+ }
134
+
135
+ const CALLERS: Array<Caller> = [
136
+ {
137
+ name: "the Admin Dashboard header",
138
+ file: path.join(
139
+ APP_DIR,
140
+ "FeatureSet/AdminDashboard/src/Components/Header/Header.tsx",
141
+ ),
142
+ render: (): void => {
143
+ render(<AdminDashboardHeader />);
144
+ },
145
+ setPlugins: (plugins: Record<string, unknown>): void => {
146
+ mockAdminPlugins = plugins;
147
+ },
148
+ communityStub: AdminCommunityPlugins as Record<string, unknown>,
149
+ fake: FakeAdminLicenseManager,
150
+ doorReads: (): number => {
151
+ return adminDoorReads;
152
+ },
153
+ },
154
+ {
155
+ name: "the Dashboard footer",
156
+ file: path.join(
157
+ APP_DIR,
158
+ "FeatureSet/Dashboard/src/Components/Footer/Footer.tsx",
159
+ ),
160
+ render: (): void => {
161
+ render(<DashboardFooter />);
162
+ },
163
+ setPlugins: (plugins: Record<string, unknown>): void => {
164
+ mockDashboardPlugins = plugins;
165
+ },
166
+ communityStub: DashboardCommunityPlugins as Record<string, unknown>,
167
+ fake: FakeDashboardLicenseManager,
168
+ doorReads: (): number => {
169
+ return dashboardDoorReads;
170
+ },
171
+ },
172
+ ];
173
+
174
+ beforeEach(() => {
175
+ receivedManagers.length = 0;
176
+ adminDoorReads = 0;
177
+ dashboardDoorReads = 0;
178
+ mockAdminPlugins = AdminCommunityPlugins as Record<string, unknown>;
179
+ mockDashboardPlugins = DashboardCommunityPlugins as Record<string, unknown>;
180
+ });
181
+
182
+ afterEach(() => {
183
+ cleanup();
184
+ });
185
+
186
+ describe("LicenseManager is a key of both plugin contracts", () => {
187
+ test("the Admin Dashboard's", () => {
188
+ expect(ADMIN_DASHBOARD_ENTERPRISE_PLUGIN_KEYS).toContain("LicenseManager");
189
+ });
190
+
191
+ test("the Dashboard's", () => {
192
+ expect(DASHBOARD_ENTERPRISE_PLUGIN_KEYS).toContain("LicenseManager");
193
+ });
194
+
195
+ test("and neither Community stub provides it", () => {
196
+ expect(
197
+ (AdminCommunityPlugins as Record<string, unknown>)["LicenseManager"],
198
+ ).toBeUndefined();
199
+ expect(
200
+ (DashboardCommunityPlugins as Record<string, unknown>)["LicenseManager"],
201
+ ).toBeUndefined();
202
+ });
203
+ });
204
+
205
+ describe.each(CALLERS)("$name", (caller: Caller) => {
206
+ test("passes the plugin's LicenseManager to the edition pill", async () => {
207
+ caller.setPlugins({ LicenseManager: caller.fake });
208
+
209
+ await act(async () => {
210
+ caller.render();
211
+ });
212
+
213
+ expect(receivedManagers).toContain(caller.fake);
214
+ expect(
215
+ receivedManagers.every((value: unknown): boolean => {
216
+ return value === caller.fake;
217
+ }),
218
+ ).toBe(true);
219
+ });
220
+
221
+ test("passes nothing with the Community stub (negative control)", async () => {
222
+ caller.setPlugins(caller.communityStub);
223
+
224
+ await act(async () => {
225
+ caller.render();
226
+ });
227
+
228
+ expect(receivedManagers.length).toBeGreaterThan(0);
229
+ expect(
230
+ receivedManagers.every((value: unknown): boolean => {
231
+ return value === undefined;
232
+ }),
233
+ ).toBe(true);
234
+ });
235
+
236
+ test("reads the door while rendering, not when the module loads", async () => {
237
+ // The module was imported above; no render has happened yet.
238
+ expect(caller.doorReads()).toBe(0);
239
+
240
+ await act(async () => {
241
+ caller.render();
242
+ });
243
+
244
+ expect(caller.doorReads()).toBeGreaterThan(0);
245
+ });
246
+
247
+ test("names the prop in its source, so the wiring is not a coincidence", () => {
248
+ const source: string = fs.readFileSync(caller.file, "utf8");
249
+
250
+ expect(source).toMatch(
251
+ /licenseManager=\{get(AdminDashboard|Dashboard)Plugins\(\)\.LicenseManager\}/,
252
+ );
253
+ });
254
+ });