@oneuptime/common 10.4.17 → 10.5.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 (318) hide show
  1. package/Models/AnalyticsModels/ExceptionInstance.ts +24 -0
  2. package/Models/AnalyticsModels/Log.ts +16 -0
  3. package/Models/AnalyticsModels/Metric.ts +31 -0
  4. package/Models/AnalyticsModels/MonitorLog.ts +5 -0
  5. package/Models/AnalyticsModels/Profile.ts +25 -0
  6. package/Models/AnalyticsModels/ProfileSample.ts +20 -0
  7. package/Models/AnalyticsModels/Span.ts +23 -0
  8. package/Models/DatabaseModels/AlertEpisodeMember.ts +2 -0
  9. package/Models/DatabaseModels/AlertGroupingRule.ts +0 -38
  10. package/Models/DatabaseModels/AlertLabelRule.ts +152 -0
  11. package/Models/DatabaseModels/AlertOwnerRule.ts +114 -0
  12. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +7 -0
  13. package/Models/DatabaseModels/IncidentEpisodeMember.ts +2 -0
  14. package/Models/DatabaseModels/IncidentGroupingRule.ts +0 -38
  15. package/Models/DatabaseModels/IncidentLabelRule.ts +114 -0
  16. package/Models/DatabaseModels/IncidentMember.ts +2 -0
  17. package/Models/DatabaseModels/IncidentOwnerRule.ts +114 -0
  18. package/Models/DatabaseModels/IncidentSla.ts +2 -0
  19. package/Models/DatabaseModels/IncidentTemplate.ts +224 -0
  20. package/Models/DatabaseModels/Index.ts +2 -2
  21. package/Models/DatabaseModels/MetricPipelineRule.ts +2 -0
  22. package/Models/DatabaseModels/MonitorProbe.ts +2 -0
  23. package/Models/DatabaseModels/MonitorTest.ts +2 -0
  24. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.ts +2 -0
  25. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.ts +2 -0
  26. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.ts +2 -0
  27. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.ts +2 -0
  28. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +2 -0
  29. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.ts +2 -0
  30. package/Models/DatabaseModels/OnCallDutyPolicyTimeLog.ts +2 -0
  31. package/Models/DatabaseModels/OnCallDutyPolicyUserOverride.ts +2 -0
  32. package/Models/DatabaseModels/ProjectOidc.ts +4 -0
  33. package/Models/DatabaseModels/ProjectSCIM.ts +4 -0
  34. package/Models/DatabaseModels/ProjectSso.ts +4 -0
  35. package/Models/DatabaseModels/ScheduledMaintenance.ts +220 -0
  36. package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +152 -0
  37. package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +152 -0
  38. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +224 -0
  39. package/Models/DatabaseModels/StatusPageOidc.ts +6 -0
  40. package/Models/DatabaseModels/StatusPageSCIM.ts +4 -0
  41. package/Models/DatabaseModels/StatusPageSCIMLog.ts +2 -0
  42. package/Models/DatabaseModels/StatusPageSso.ts +6 -0
  43. package/Models/DatabaseModels/Team.ts +41 -0
  44. package/Models/DatabaseModels/TeamComplianceSetting.ts +4 -0
  45. package/Models/DatabaseModels/{ServiceMonitor.ts → TeamCustomField.ts} +95 -200
  46. package/Models/DatabaseModels/TelemetryException.ts +2 -0
  47. package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
  48. package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
  49. package/Models/DatabaseModels/WorkflowLog.ts +2 -0
  50. package/Models/DatabaseModels/WorkflowVariable.ts +2 -0
  51. package/Server/EnvironmentConfig.ts +3 -0
  52. package/Server/Infrastructure/Postgres/SchemaMigrations/1779392865146-AddAgentVersionToKubernetesDockerHost.ts +1 -1
  53. package/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.ts +160 -0
  54. package/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.ts +197 -0
  55. package/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.ts +36 -0
  56. package/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.ts +128 -0
  57. package/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.ts +53 -0
  58. package/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.ts +73 -0
  59. package/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.ts +62 -0
  60. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  61. package/Server/Middleware/TelemetryIngestionDisabled.ts +32 -0
  62. package/Server/Services/AlertGroupingEngineService.ts +0 -29
  63. package/Server/Services/AlertLabelRuleEngineService.ts +129 -0
  64. package/Server/Services/AlertOwnerRuleEngineService.ts +205 -1
  65. package/Server/Services/IncidentGroupingEngineService.ts +0 -37
  66. package/Server/Services/IncidentLabelRuleEngineService.ts +83 -0
  67. package/Server/Services/IncidentOwnerRuleEngineService.ts +208 -10
  68. package/Server/Services/IncidentService.ts +139 -1
  69. package/Server/Services/Index.ts +0 -2
  70. package/Server/Services/MonitorProbeService.ts +56 -0
  71. package/Server/Services/MonitorService.ts +55 -0
  72. package/Server/Services/ProjectService.ts +17 -8
  73. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +129 -0
  74. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +289 -7
  75. package/Server/Services/StatusPageService.ts +30 -0
  76. package/Server/Services/TeamCustomFieldService.ts +9 -0
  77. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +226 -28
  78. package/Server/Types/Database/Permissions/EditionPermission.ts +46 -0
  79. package/Server/Types/Database/Permissions/TablePermission.ts +8 -1
  80. package/Server/Utils/Monitor/MonitorAlert.ts +35 -0
  81. package/Server/Utils/Monitor/MonitorIncident.ts +244 -34
  82. package/Tests/Server/Middleware/UserAuthorization.test.ts +11 -19
  83. package/Tests/Types/Permission.test.ts +129 -1
  84. package/Types/Accounts/AccountsLanguage.ts +10 -1
  85. package/Types/AdminDashboard/AdminDashboardLanguage.ts +10 -1
  86. package/Types/BaseDatabase/TableEditionAccessControl.ts +3 -0
  87. package/Types/Dashboard/DashboardLanguage.ts +10 -1
  88. package/Types/Database/AccessControl/TableEditionAccessControl.ts +8 -0
  89. package/Types/Date.ts +1 -1
  90. package/Types/Docs/DocsLanguage.ts +10 -1
  91. package/Types/Permission.ts +87 -54
  92. package/Types/StatusPage/StatusPageLanguage.ts +10 -1
  93. package/UI/Components/Charts/Area/AreaChart.tsx +1 -1
  94. package/UI/Components/Charts/Bar/BarChart.tsx +1 -1
  95. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +5 -1
  96. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +1 -1
  97. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +11 -1
  98. package/UI/Components/Charts/Line/LineChart.tsx +1 -1
  99. package/UI/Components/Charts/Utils/XAxis.ts +21 -48
  100. package/UI/Components/EntityDropdown/EntityDropdown.tsx +1808 -0
  101. package/UI/Components/Forms/Fields/FormField.tsx +69 -29
  102. package/UI/Components/Link/Link.tsx +13 -1
  103. package/UI/Components/ModelDetail/ModelDetail.tsx +20 -19
  104. package/UI/Components/ModelTable/BaseModelTable.tsx +5 -0
  105. package/UI/Utils/User.ts +16 -0
  106. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +39 -2
  107. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
  108. package/build/dist/Models/AnalyticsModels/Log.js +16 -0
  109. package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
  110. package/build/dist/Models/AnalyticsModels/Metric.js +31 -0
  111. package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
  112. package/build/dist/Models/AnalyticsModels/MonitorLog.js +5 -0
  113. package/build/dist/Models/AnalyticsModels/MonitorLog.js.map +1 -1
  114. package/build/dist/Models/AnalyticsModels/Profile.js +40 -2
  115. package/build/dist/Models/AnalyticsModels/Profile.js.map +1 -1
  116. package/build/dist/Models/AnalyticsModels/ProfileSample.js +35 -2
  117. package/build/dist/Models/AnalyticsModels/ProfileSample.js.map +1 -1
  118. package/build/dist/Models/AnalyticsModels/Span.js +23 -0
  119. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  120. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +2 -0
  121. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
  122. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +0 -39
  123. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
  124. package/build/dist/Models/DatabaseModels/AlertLabelRule.js +156 -0
  125. package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
  126. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +117 -0
  127. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
  128. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  129. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +2 -0
  130. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
  131. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +0 -39
  132. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
  133. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +117 -0
  134. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
  135. package/build/dist/Models/DatabaseModels/IncidentMember.js +2 -0
  136. package/build/dist/Models/DatabaseModels/IncidentMember.js.map +1 -1
  137. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +117 -0
  138. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
  139. package/build/dist/Models/DatabaseModels/IncidentSla.js +2 -0
  140. package/build/dist/Models/DatabaseModels/IncidentSla.js.map +1 -1
  141. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +216 -0
  142. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  143. package/build/dist/Models/DatabaseModels/Index.js +2 -2
  144. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  145. package/build/dist/Models/DatabaseModels/MetricPipelineRule.js +2 -0
  146. package/build/dist/Models/DatabaseModels/MetricPipelineRule.js.map +1 -1
  147. package/build/dist/Models/DatabaseModels/MonitorProbe.js +2 -0
  148. package/build/dist/Models/DatabaseModels/MonitorProbe.js.map +1 -1
  149. package/build/dist/Models/DatabaseModels/MonitorTest.js +2 -0
  150. package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
  151. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.js +2 -0
  152. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.js.map +1 -1
  153. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js +2 -0
  154. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js.map +1 -1
  155. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js +2 -0
  156. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js.map +1 -1
  157. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js +2 -0
  158. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js.map +1 -1
  159. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +2 -0
  160. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
  161. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js +2 -0
  162. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js.map +1 -1
  163. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js +2 -0
  164. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js.map +1 -1
  165. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js +2 -0
  166. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js.map +1 -1
  167. package/build/dist/Models/DatabaseModels/ProjectOidc.js +4 -0
  168. package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
  169. package/build/dist/Models/DatabaseModels/ProjectSCIM.js +4 -0
  170. package/build/dist/Models/DatabaseModels/ProjectSCIM.js.map +1 -1
  171. package/build/dist/Models/DatabaseModels/ProjectSso.js +4 -0
  172. package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
  173. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +216 -0
  174. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  175. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +156 -0
  176. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
  177. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +156 -0
  178. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
  179. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +216 -0
  180. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  181. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +6 -0
  182. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  183. package/build/dist/Models/DatabaseModels/StatusPageSCIM.js +4 -0
  184. package/build/dist/Models/DatabaseModels/StatusPageSCIM.js.map +1 -1
  185. package/build/dist/Models/DatabaseModels/StatusPageSCIMLog.js +2 -0
  186. package/build/dist/Models/DatabaseModels/StatusPageSCIMLog.js.map +1 -1
  187. package/build/dist/Models/DatabaseModels/StatusPageSso.js +6 -0
  188. package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
  189. package/build/dist/Models/DatabaseModels/Team.js +42 -0
  190. package/build/dist/Models/DatabaseModels/Team.js.map +1 -1
  191. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +4 -0
  192. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  193. package/build/dist/Models/DatabaseModels/{ServiceMonitor.js → TeamCustomField.js} +108 -209
  194. package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -0
  195. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  196. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  197. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
  198. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  199. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
  200. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
  201. package/build/dist/Models/DatabaseModels/WorkflowLog.js +2 -0
  202. package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
  203. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +2 -0
  204. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  205. package/build/dist/Server/EnvironmentConfig.js +1 -0
  206. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  207. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779392865146-AddAgentVersionToKubernetesDockerHost.js.map +1 -1
  208. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.js +60 -0
  209. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.js.map +1 -0
  210. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.js +74 -0
  211. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.js.map +1 -0
  212. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.js +19 -0
  213. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.js.map +1 -0
  214. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.js +50 -0
  215. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.js.map +1 -0
  216. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.js +26 -0
  217. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.js.map +1 -0
  218. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.js +30 -0
  219. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.js.map +1 -0
  220. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.js +50 -0
  221. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.js.map +1 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  224. package/build/dist/Server/Middleware/TelemetryIngestionDisabled.js +22 -0
  225. package/build/dist/Server/Middleware/TelemetryIngestionDisabled.js.map +1 -0
  226. package/build/dist/Server/Services/AlertGroupingEngineService.js +0 -25
  227. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  228. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +117 -3
  229. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  230. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +175 -5
  231. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  232. package/build/dist/Server/Services/IncidentGroupingEngineService.js +0 -31
  233. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  234. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +76 -3
  235. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  236. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +176 -14
  237. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  238. package/build/dist/Server/Services/IncidentService.js +104 -1
  239. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  240. package/build/dist/Server/Services/Index.js +0 -2
  241. package/build/dist/Server/Services/Index.js.map +1 -1
  242. package/build/dist/Server/Services/MonitorProbeService.js +46 -0
  243. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  244. package/build/dist/Server/Services/MonitorService.js +40 -0
  245. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  246. package/build/dist/Server/Services/ProjectService.js +17 -8
  247. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  248. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +117 -3
  249. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  250. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +245 -10
  251. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  252. package/build/dist/Server/Services/StatusPageService.js +24 -0
  253. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  254. package/build/dist/Server/Services/TeamCustomFieldService.js +9 -0
  255. package/build/dist/Server/Services/TeamCustomFieldService.js.map +1 -0
  256. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +166 -26
  257. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  258. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +45 -0
  259. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -0
  260. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +7 -1
  261. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  262. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -0
  263. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  264. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +200 -31
  265. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  266. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +8 -15
  267. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +1 -1
  268. package/build/dist/Tests/Types/Permission.test.js +90 -1
  269. package/build/dist/Tests/Types/Permission.test.js.map +1 -1
  270. package/build/dist/Types/Accounts/AccountsLanguage.js +10 -1
  271. package/build/dist/Types/Accounts/AccountsLanguage.js.map +1 -1
  272. package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +10 -1
  273. package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -1
  274. package/build/dist/Types/BaseDatabase/TableEditionAccessControl.js +2 -0
  275. package/build/dist/Types/BaseDatabase/TableEditionAccessControl.js.map +1 -0
  276. package/build/dist/Types/Dashboard/DashboardLanguage.js +10 -1
  277. package/build/dist/Types/Dashboard/DashboardLanguage.js.map +1 -1
  278. package/build/dist/Types/Database/AccessControl/TableEditionAccessControl.js +6 -0
  279. package/build/dist/Types/Database/AccessControl/TableEditionAccessControl.js.map +1 -0
  280. package/build/dist/Types/Date.js +1 -1
  281. package/build/dist/Types/Date.js.map +1 -1
  282. package/build/dist/Types/Docs/DocsLanguage.js +10 -1
  283. package/build/dist/Types/Docs/DocsLanguage.js.map +1 -1
  284. package/build/dist/Types/Permission.js +80 -44
  285. package/build/dist/Types/Permission.js.map +1 -1
  286. package/build/dist/Types/StatusPage/StatusPageLanguage.js +10 -1
  287. package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -1
  288. package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
  289. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  290. package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
  291. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  292. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +5 -1
  293. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  294. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +1 -1
  295. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  296. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +11 -1
  297. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  298. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  299. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  300. package/build/dist/UI/Components/Charts/Utils/XAxis.js +21 -47
  301. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  302. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +1125 -0
  303. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -0
  304. package/build/dist/UI/Components/Forms/Fields/FormField.js +28 -10
  305. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  306. package/build/dist/UI/Components/Link/Link.js +11 -2
  307. package/build/dist/UI/Components/Link/Link.js.map +1 -1
  308. package/build/dist/UI/Components/ModelDetail/ModelDetail.js +20 -18
  309. package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
  310. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -0
  311. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  312. package/build/dist/UI/Utils/User.js +13 -0
  313. package/build/dist/UI/Utils/User.js.map +1 -1
  314. package/package.json +1 -1
  315. package/Server/Services/ServiceMonitorService.ts +0 -57
  316. package/build/dist/Models/DatabaseModels/ServiceMonitor.js.map +0 -1
  317. package/build/dist/Server/Services/ServiceMonitorService.js +0 -56
  318. package/build/dist/Server/Services/ServiceMonitorService.js.map +0 -1
@@ -37,6 +37,41 @@ export interface CheckReadPermissionType<TBaseModel extends BaseModel> {
37
37
  select: Select<TBaseModel> | null;
38
38
  }
39
39
 
40
+ /*
41
+ * Per-request cache for scope resolution. Keyed by the `props` object —
42
+ * one HTTP request reuses the same `props` for every analytics query it
43
+ * issues (a dashboard with 20 panels = up to 80 Postgres lookups without
44
+ * this; ~4 with it). The WeakMap entry is released automatically when
45
+ * `props` goes out of scope at request end, so there's no stale data
46
+ * between requests.
47
+ *
48
+ * Caches two things:
49
+ * - `ownedIds`: Service IDs the user owns (one set per request — the
50
+ * inputs are userId + teamIds + tenantId, all stable for one props).
51
+ * - `labeledIds`: a map keyed by the sorted-label-IDs string, since
52
+ * different model permission rows may carry different label sets.
53
+ */
54
+ interface ScopeResolveCacheEntry {
55
+ ownedIds?: Set<string>;
56
+ labeledIds: Map<string, Set<string>>;
57
+ }
58
+
59
+ const scopeResolveCache: WeakMap<
60
+ DatabaseCommonInteractionProps,
61
+ ScopeResolveCacheEntry
62
+ > = new WeakMap();
63
+
64
+ function getScopeCacheBucket(
65
+ props: DatabaseCommonInteractionProps,
66
+ ): ScopeResolveCacheEntry {
67
+ let bucket: ScopeResolveCacheEntry | undefined = scopeResolveCache.get(props);
68
+ if (!bucket) {
69
+ bucket = { labeledIds: new Map() };
70
+ scopeResolveCache.set(props, bucket);
71
+ }
72
+ return bucket;
73
+ }
74
+
40
75
  export default class ModelPermission {
41
76
  @CaptureSpan()
42
77
  public static async checkDeletePermission<TBaseModel extends BaseModel>(
@@ -645,12 +680,21 @@ export default class ModelPermission {
645
680
  }
646
681
 
647
682
  /*
648
- * `Owned` scope filter for analytics models (Log, Span, Metric). Resolves
649
- * the user's accessible Service IDs via the Postgres ServiceOwner* tables
650
- * once and injects `serviceId IN (...)` into the ClickHouse query. The
651
- * operational per-row owner-join from the Postgres path doesn't scale to
652
- * telemetry volume; one Postgres roundtrip + one indexed predicate does.
653
- * See Internal/Docs/PermissionsSimplification.md §Telemetry & Analytics.
683
+ * Scope filter for analytics models (Log, Span, Metric, ...). For each
684
+ * applicable user permission row we resolve allowed parent resource IDs
685
+ * based on its scope (`Owned` ServiceOwner* tables; `Labels` → parent
686
+ * resources matching the user's labels), union them, and inject
687
+ * `serviceId IN (...)` into the ClickHouse query.
688
+ *
689
+ * Telemetry's serviceId is polymorphic — comment in Metric.ts says it
690
+ * "can be the monitor id or the telemetry service id" — so Labels-scope
691
+ * resolution walks both Service.labels (ServiceLabel join) and
692
+ * Monitor.labels (MonitorLabel join). Owned-scope keeps the original
693
+ * single-source ServiceOwner* lookup since that's what's wired today.
694
+ *
695
+ * The operational per-row owner-join from the Postgres path doesn't
696
+ * scale to telemetry volume; one Postgres roundtrip + one indexed
697
+ * predicate does. See Internal/Docs/PermissionsSimplification.md.
654
698
  */
655
699
  private static async addOwnedScopeToQuery<TBaseModel extends BaseModel>(
656
700
  modelType: { new (): TBaseModel },
@@ -701,23 +745,100 @@ export default class ModelPermission {
701
745
  }
702
746
 
703
747
  /*
704
- * If any applicable row is non-Owned scope, that broader grant wins
705
- * and the Owned filter doesn't apply.
748
+ * If any applicable row grants unrestricted access (scope=All, or the
749
+ * legacy Labels/unset scope with no labelIds), the broader grant wins
750
+ * and no filter is applied. Owned and label-restricted rows narrow
751
+ * access; an unrestricted row coexisting with them widens it back to
752
+ * full access.
706
753
  */
707
- const hasNonOwnedGrant: boolean = applicableRows.some(
754
+ const hasUnrestrictedGrant: boolean = applicableRows.some(
708
755
  (p: UserPermission) => {
709
- return p.scope !== PermissionScope.Owned;
756
+ if (p.scope === PermissionScope.All) {
757
+ return true;
758
+ }
759
+ if (p.scope === PermissionScope.Owned) {
760
+ return false;
761
+ }
762
+ // scope === Labels or undefined (legacy default)
763
+ return !p.labelIds || p.labelIds.length === 0;
710
764
  },
711
765
  );
712
- if (hasNonOwnedGrant) {
766
+ if (hasUnrestrictedGrant) {
713
767
  return query;
714
768
  }
715
769
 
716
- /*
717
- * Resolve allowed service IDs via the Postgres ServiceOwner* tables.
718
- * Lazy require to avoid circular deps with services that extend
719
- * DatabaseService.
720
- */
770
+ const allowedResourceIds: Set<string> = new Set<string>();
771
+
772
+ const hasOwnedGrant: boolean = applicableRows.some((p: UserPermission) => {
773
+ return p.scope === PermissionScope.Owned;
774
+ });
775
+ if (hasOwnedGrant) {
776
+ const ownedIds: Set<string> = await this.resolveOwnedParentIds(props);
777
+ for (const id of ownedIds) {
778
+ allowedResourceIds.add(id);
779
+ }
780
+ }
781
+
782
+ const labelScopedRows: Array<UserPermission> = applicableRows.filter(
783
+ (p: UserPermission) => {
784
+ const isLabelsScope: boolean =
785
+ p.scope === PermissionScope.Labels || p.scope === undefined;
786
+ return isLabelsScope && Boolean(p.labelIds && p.labelIds.length > 0);
787
+ },
788
+ );
789
+ if (labelScopedRows.length > 0) {
790
+ const labelIdSet: Set<string> = new Set<string>();
791
+ for (const row of labelScopedRows) {
792
+ for (const labelId of row.labelIds) {
793
+ labelIdSet.add(labelId.toString());
794
+ }
795
+ }
796
+ const labelIds: Array<ObjectID> = Array.from(labelIdSet).map(
797
+ (id: string) => {
798
+ return new ObjectID(id);
799
+ },
800
+ );
801
+ const labeledIds: Set<string> = await this.resolveLabeledParentIds(
802
+ labelIds,
803
+ props,
804
+ );
805
+ for (const id of labeledIds) {
806
+ allowedResourceIds.add(id);
807
+ }
808
+ }
809
+
810
+ const fkColumn: string = model.ownedThrough.fkColumn;
811
+ const idList: Array<string> =
812
+ allowedResourceIds.size > 0
813
+ ? Array.from(allowedResourceIds)
814
+ : [ObjectID.getZeroObjectID().toString()]; // sentinel: match nothing
815
+
816
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
817
+ (query as any)[fkColumn] = new Includes(idList);
818
+
819
+ return query;
820
+ }
821
+
822
+ /*
823
+ * Resolves Service IDs the user owns via ServiceOwnerUser /
824
+ * ServiceOwnerTeam in Postgres. Lazy-required to avoid circular deps
825
+ * with services that extend DatabaseService. Returns string IDs to
826
+ * make set-union with other resolvers straightforward.
827
+ *
828
+ * Cached per request via the WeakMap on `props` — the inputs (userId,
829
+ * teamIds, tenantId) are stable for the lifetime of one props object,
830
+ * so repeated calls within the same request reuse the first result.
831
+ */
832
+ private static async resolveOwnedParentIds(
833
+ props: DatabaseCommonInteractionProps,
834
+ ): Promise<Set<string>> {
835
+ const cache: ScopeResolveCacheEntry = getScopeCacheBucket(props);
836
+ if (cache.ownedIds) {
837
+ return cache.ownedIds;
838
+ }
839
+
840
+ const result: Set<string> = new Set<string>();
841
+
721
842
  const ownerTableRegistry: Map<
722
843
  string,
723
844
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -736,11 +857,10 @@ export default class ModelPermission {
736
857
  }
737
858
  | undefined = ownerTableRegistry.get("Service");
738
859
  if (!serviceEntry) {
739
- return query;
860
+ cache.ownedIds = result;
861
+ return result;
740
862
  }
741
863
 
742
- const allowedServiceIds: Set<string> = new Set<string>();
743
-
744
864
  if (props.userId) {
745
865
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
746
866
  const userOwnedRows: Array<any> =
@@ -757,7 +877,7 @@ export default class ModelPermission {
757
877
  for (const row of userOwnedRows) {
758
878
  const id: ObjectID | undefined = row.serviceId;
759
879
  if (id) {
760
- allowedServiceIds.add(id.toString());
880
+ result.add(id.toString());
761
881
  }
762
882
  }
763
883
  }
@@ -778,21 +898,99 @@ export default class ModelPermission {
778
898
  for (const row of teamOwnedRows) {
779
899
  const id: ObjectID | undefined = row.serviceId;
780
900
  if (id) {
781
- allowedServiceIds.add(id.toString());
901
+ result.add(id.toString());
782
902
  }
783
903
  }
784
904
  }
785
905
 
786
- const fkColumn: string = model.ownedThrough.fkColumn;
787
- const idList: Array<string> =
788
- allowedServiceIds.size > 0
789
- ? Array.from(allowedServiceIds)
790
- : [ObjectID.getZeroObjectID().toString()]; // sentinel: match nothing
906
+ cache.ownedIds = result;
907
+ return result;
908
+ }
909
+
910
+ /*
911
+ * Resolves parent IDs whose labels intersect the given labelIds. Walks
912
+ * both TelemetryService (`ServiceLabel`) and Monitor (`MonitorLabel`)
913
+ * because telemetry's serviceId is polymorphic between the two. The
914
+ * Postgres findBy passes labels through QueryUtil, which turns the
915
+ * EntityArray filter into a many-to-many subquery against the join
916
+ * table — see QueryUtil.ts ~line 528.
917
+ *
918
+ * Cached per request via the WeakMap on `props`, keyed by the sorted
919
+ * label IDs joined into a string. Different model permission rows can
920
+ * carry different label sets, so we key by the actual labelIds rather
921
+ * than a single per-request slot.
922
+ */
923
+ private static async resolveLabeledParentIds(
924
+ labelIds: Array<ObjectID>,
925
+ props: DatabaseCommonInteractionProps,
926
+ ): Promise<Set<string>> {
927
+ const result: Set<string> = new Set<string>();
928
+
929
+ if (labelIds.length === 0) {
930
+ return result;
931
+ }
932
+
933
+ const cacheKey: string = labelIds
934
+ .map((id: ObjectID) => {
935
+ return id.toString();
936
+ })
937
+ .sort()
938
+ .join(",");
939
+ const cache: ScopeResolveCacheEntry = getScopeCacheBucket(props);
940
+ const cached: Set<string> | undefined = cache.labeledIds.get(cacheKey);
941
+ if (cached) {
942
+ return cached;
943
+ }
944
+
945
+ const ServiceService: any =
946
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
947
+ require("../../Services/ServiceService").default;
948
+ const MonitorService: any =
949
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
950
+ require("../../Services/MonitorService").default;
951
+
952
+ const tenantFilter: Record<string, ObjectID> = props.tenantId
953
+ ? { projectId: props.tenantId }
954
+ : {};
791
955
 
792
956
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
793
- (query as any)[fkColumn] = new Includes(idList);
957
+ const serviceRows: Array<any> = await ServiceService.findBy({
958
+ query: {
959
+ labels: labelIds,
960
+ ...tenantFilter,
961
+ },
962
+ select: { _id: true },
963
+ props: { isRoot: true },
964
+ skip: 0,
965
+ limit: LIMIT_MAX,
966
+ });
967
+ for (const row of serviceRows) {
968
+ const id: ObjectID | string | undefined = row._id;
969
+ if (id) {
970
+ result.add(id.toString());
971
+ }
972
+ }
794
973
 
795
- return query;
974
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
975
+ const monitorRows: Array<any> = await MonitorService.findBy({
976
+ query: {
977
+ labels: labelIds,
978
+ ...tenantFilter,
979
+ },
980
+ select: { _id: true },
981
+ props: { isRoot: true },
982
+ skip: 0,
983
+ limit: LIMIT_MAX,
984
+ });
985
+ for (const row of monitorRows) {
986
+ const id: ObjectID | string | undefined = row._id;
987
+ if (id) {
988
+ result.add(id.toString());
989
+ }
990
+ }
991
+
992
+ cache.labeledIds.set(cacheKey, result);
993
+ return result;
796
994
  }
797
995
 
798
996
  private static isPublicPermissionAllowed(
@@ -0,0 +1,46 @@
1
+ import {
2
+ IsBillingEnabled,
3
+ IsEnterpriseEdition,
4
+ } from "../../../../Server/EnvironmentConfig";
5
+ import BaseModel, {
6
+ DatabaseBaseModelType,
7
+ } from "../../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
8
+ import DatabaseCommonInteractionProps from "../../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
9
+ import PaymentRequiredException from "../../../../Types/Exception/PaymentRequiredException";
10
+ import CaptureSpan from "../../../Utils/Telemetry/CaptureSpan";
11
+
12
+ export default class EditionPermissions {
13
+ /*
14
+ * Gates models marked with @TableEditionAccessControl({ requiresEnterprise: true }).
15
+ *
16
+ * On self-hosted builds (billing disabled) the model is only accessible when
17
+ * the binary was built as the Enterprise Edition (IS_ENTERPRISE_EDITION=true).
18
+ *
19
+ * On the cloud / billing-enabled deployment we leave enforcement to
20
+ * BillingPermission — it already gates these models via the model's
21
+ * @TableBillingAccessControl plan tier, so a second check would be redundant.
22
+ */
23
+ @CaptureSpan()
24
+ public static checkEditionPermissions(
25
+ modelType: DatabaseBaseModelType,
26
+ _props: DatabaseCommonInteractionProps,
27
+ ): void {
28
+ if (IsBillingEnabled) {
29
+ return;
30
+ }
31
+
32
+ const model: BaseModel = new modelType();
33
+
34
+ if (!model.requiresEnterprise) {
35
+ return;
36
+ }
37
+
38
+ if (!IsEnterpriseEdition) {
39
+ throw new PaymentRequiredException(
40
+ `${model.singularName || "This feature"} is only available on the OneUptime Enterprise Edition. ` +
41
+ `Please switch to the Enterprise Edition build to enable this feature. ` +
42
+ `See https://oneuptime.com/enterprise/overview for details.`,
43
+ );
44
+ }
45
+ }
46
+ }
@@ -1,5 +1,6 @@
1
1
  import DatabaseRequestType from "../../BaseDatabase/DatabaseRequestType";
2
2
  import BillingPermissions from "./BillingPermission";
3
+ import EditionPermissions from "./EditionPermission";
3
4
  import PublicPermission from "./PublicPermission";
4
5
  import BaseModel, {
5
6
  DatabaseBaseModelType,
@@ -55,7 +56,13 @@ export default class TablePermission {
55
56
  // 2nd CHECK: Is user project in active state?
56
57
  BillingPermissions.checkBillingPermissions(modelType, props, type);
57
58
 
58
- // 2nd CHECK: Does user have access to CRUD data on this model.
59
+ /*
60
+ * 3rd CHECK: Is this an enterprise-only feature being accessed on the
61
+ * community self-hosted build?
62
+ */
63
+ EditionPermissions.checkEditionPermissions(modelType, props);
64
+
65
+ // 4th CHECK: Does user have access to CRUD data on this model.
59
66
  const userPermissions: Array<UserPermission> =
60
67
  DatabaseCommonInteractionPropsUtil.getUserPermissions(
61
68
  props,
@@ -5,6 +5,7 @@ import Host from "../../../Models/DatabaseModels/Host";
5
5
  import Label from "../../../Models/DatabaseModels/Label";
6
6
  import Monitor from "../../../Models/DatabaseModels/Monitor";
7
7
  import OnCallDutyPolicy from "../../../Models/DatabaseModels/OnCallDutyPolicy";
8
+ import Service from "../../../Models/DatabaseModels/Service";
8
9
  import SortOrder from "../../../Types/BaseDatabase/SortOrder";
9
10
  import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
10
11
  import Dictionary from "../../../Types/Dictionary";
@@ -19,6 +20,7 @@ import AlertService from "../../Services/AlertService";
19
20
  import AlertSeverityService from "../../Services/AlertSeverityService";
20
21
  import AlertStateTimelineService from "../../Services/AlertStateTimelineService";
21
22
  import HostService from "../../Services/HostService";
23
+ import ServiceService from "../../Services/ServiceService";
22
24
  import logger, { LogAttributes } from "../Logger";
23
25
  import CaptureSpan from "../Telemetry/CaptureSpan";
24
26
  import DataToProcess from "./DataToProcess";
@@ -305,6 +307,39 @@ export default class MonitorAlert {
305
307
  alert.hosts = [host];
306
308
  }
307
309
  }
310
+
311
+ /*
312
+ * Same idea for Service — OTel ingest stamps `service.name` and
313
+ * auto-creates a Service row keyed by that name (see
314
+ * OpenTelemetryIngestService.telemetryServiceFromName). When the
315
+ * breaching series carries that attribute, link the alert to the
316
+ * emitting service so the on-call/labels pipeline can fan out.
317
+ */
318
+ const serviceName: string | undefined =
319
+ typeof seriesLabels["resource.service.name"] === "string"
320
+ ? (seriesLabels["resource.service.name"] as string)
321
+ : typeof seriesLabels["service.name"] === "string"
322
+ ? (seriesLabels["service.name"] as string)
323
+ : undefined;
324
+
325
+ if (serviceName) {
326
+ const service: Service | null = await ServiceService.findOneBy({
327
+ query: {
328
+ projectId: input.monitor.projectId!,
329
+ name: serviceName,
330
+ },
331
+ select: {
332
+ _id: true,
333
+ },
334
+ props: {
335
+ isRoot: true,
336
+ },
337
+ });
338
+
339
+ if (service) {
340
+ alert.services = [service];
341
+ }
342
+ }
308
343
  }
309
344
 
310
345
  alert.onCallDutyPolicies =