@oneuptime/common 10.4.17 → 10.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -1,11 +1,15 @@
1
+ import DockerHost from "../../../Models/DatabaseModels/DockerHost";
1
2
  import Host from "../../../Models/DatabaseModels/Host";
2
3
  import Incident from "../../../Models/DatabaseModels/Incident";
3
4
  import IncidentSeverity from "../../../Models/DatabaseModels/IncidentSeverity";
4
5
  import IncidentStateTimeline from "../../../Models/DatabaseModels/IncidentStateTimeline";
5
6
  import IncidentMember from "../../../Models/DatabaseModels/IncidentMember";
7
+ import KubernetesCluster from "../../../Models/DatabaseModels/KubernetesCluster";
6
8
  import Label from "../../../Models/DatabaseModels/Label";
7
9
  import Monitor from "../../../Models/DatabaseModels/Monitor";
8
10
  import OnCallDutyPolicy from "../../../Models/DatabaseModels/OnCallDutyPolicy";
11
+ import Service from "../../../Models/DatabaseModels/Service";
12
+ import Includes from "../../../Types/BaseDatabase/Includes";
9
13
  import SortOrder from "../../../Types/BaseDatabase/SortOrder";
10
14
  import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
11
15
  import Dictionary from "../../../Types/Dictionary";
@@ -16,8 +20,11 @@ import ObjectID from "../../../Types/ObjectID";
16
20
  import ProbeMonitorResponse from "../../../Types/Probe/ProbeMonitorResponse";
17
21
  import { TelemetryQuery } from "../../../Types/Telemetry/TelemetryQuery";
18
22
  import { DisableAutomaticIncidentCreation } from "../../EnvironmentConfig";
23
+ import DockerHostService from "../../Services/DockerHostService";
19
24
  import HostService from "../../Services/HostService";
20
25
  import IncidentService from "../../Services/IncidentService";
26
+ import KubernetesClusterService from "../../Services/KubernetesClusterService";
27
+ import ServiceService from "../../Services/ServiceService";
21
28
  import IncidentSeverityService from "../../Services/IncidentSeverityService";
22
29
  import IncidentStateTimelineService from "../../Services/IncidentStateTimelineService";
23
30
  import IncidentMemberService from "../../Services/IncidentMemberService";
@@ -316,40 +323,11 @@ export default class MonitorIncident {
316
323
  if (seriesLabels && Object.keys(seriesLabels).length > 0) {
317
324
  incident.seriesLabels = seriesLabels;
318
325
 
319
- /*
320
- * Link the incident to the Host that emitted this series, if
321
- * the metric carried a `host.name` resource attribute. The
322
- * Host record was auto-discovered during OTel ingestion.
323
- * Metric attributes are stored with the `resource.` prefix in
324
- * ClickHouse, so the group-by dropdown surfaces
325
- * `resource.host.name` — but accept the bare `host.name` too
326
- * for any non-OTel ingest paths.
327
- */
328
- const hostName: string | undefined =
329
- typeof seriesLabels["resource.host.name"] === "string"
330
- ? (seriesLabels["resource.host.name"] as string)
331
- : typeof seriesLabels["host.name"] === "string"
332
- ? (seriesLabels["host.name"] as string)
333
- : undefined;
334
-
335
- if (hostName) {
336
- const host: Host | null = await HostService.findOneBy({
337
- query: {
338
- projectId: input.monitor.projectId!,
339
- hostIdentifier: hostName,
340
- },
341
- select: {
342
- _id: true,
343
- },
344
- props: {
345
- isRoot: true,
346
- },
347
- });
348
-
349
- if (host) {
350
- incident.hosts = [host];
351
- }
352
- }
326
+ await this.linkResourceContextFromSeries({
327
+ incident,
328
+ seriesLabels,
329
+ projectId: input.monitor.projectId!,
330
+ });
353
331
  }
354
332
 
355
333
  incident.onCallDutyPolicies =
@@ -494,6 +472,238 @@ export default class MonitorIncident {
494
472
  }
495
473
  }
496
474
 
475
+ /*
476
+ * Pull every host / docker-host / k8s-cluster identifier out of the
477
+ * series labels and attach the matching project-scoped records to
478
+ * the incident. Series labels carry both raw OTel resource
479
+ * attributes (`host.name`, `k8s.cluster.name`) and the OneUptime
480
+ * stamps added at ingest (`oneuptime.host.id`,
481
+ * `oneuptime.docker.host.id`, `oneuptime.kubernetes.cluster.id` and
482
+ * their `.name` twins). OTel resource attributes are stored under
483
+ * the `resource.` prefix in ClickHouse, so prefixed and unprefixed
484
+ * forms are both accepted — whichever the group-by query surfaced,
485
+ * we'll find it. Multi-value labels are flattened, so a series that
486
+ * groups by a multi-valued attribute attaches every matching
487
+ * record. Lookups are always project-scoped so a stale or hostile
488
+ * stamp can't pull in a record from another tenant.
489
+ *
490
+ * For Docker hosts we deliberately ignore raw `host.name`/
491
+ * `oneuptime.host.name`: those are the Host's territory, and the
492
+ * ingest pipeline stamps `oneuptime.docker.host.*` independently
493
+ * when the source is a docker host.
494
+ */
495
+ private static async linkResourceContextFromSeries(input: {
496
+ incident: Incident;
497
+ seriesLabels: JSONObject;
498
+ projectId: ObjectID;
499
+ }): Promise<void> {
500
+ const collect: (keys: ReadonlyArray<string>) => Array<string> = (
501
+ keys: ReadonlyArray<string>,
502
+ ): Array<string> => {
503
+ const found: Set<string> = new Set<string>();
504
+ for (const key of keys) {
505
+ const value: unknown = input.seriesLabels[key];
506
+ if (typeof value === "string" && value.length > 0) {
507
+ found.add(value);
508
+ continue;
509
+ }
510
+ if (Array.isArray(value)) {
511
+ for (const item of value) {
512
+ if (typeof item === "string" && item.length > 0) {
513
+ found.add(item);
514
+ }
515
+ }
516
+ }
517
+ }
518
+ return Array.from(found);
519
+ };
520
+
521
+ const hostIds: Array<string> = collect([
522
+ "resource.oneuptime.host.id",
523
+ "oneuptime.host.id",
524
+ ]);
525
+ const hostNames: Array<string> = collect([
526
+ "resource.oneuptime.host.name",
527
+ "oneuptime.host.name",
528
+ "resource.host.name",
529
+ "host.name",
530
+ ]);
531
+
532
+ const dockerHostIds: Array<string> = collect([
533
+ "resource.oneuptime.docker.host.id",
534
+ "oneuptime.docker.host.id",
535
+ ]);
536
+ const dockerHostNames: Array<string> = collect([
537
+ "resource.oneuptime.docker.host.name",
538
+ "oneuptime.docker.host.name",
539
+ ]);
540
+
541
+ const clusterIds: Array<string> = collect([
542
+ "resource.oneuptime.kubernetes.cluster.id",
543
+ "oneuptime.kubernetes.cluster.id",
544
+ ]);
545
+ const clusterNames: Array<string> = collect([
546
+ "resource.oneuptime.kubernetes.cluster.name",
547
+ "oneuptime.kubernetes.cluster.name",
548
+ "resource.k8s.cluster.name",
549
+ "k8s.cluster.name",
550
+ ]);
551
+
552
+ /*
553
+ * Services come from OTel-ingested telemetry. The ingest pipeline
554
+ * auto-creates a Service row keyed by `service.name`, so any series
555
+ * label that carries that attribute (raw or prefixed) tells us the
556
+ * emitting service. We also accept the `oneuptime.service.id`
557
+ * stamp for callers that already resolved the ID upstream.
558
+ */
559
+ const serviceIds: Array<string> = collect([
560
+ "resource.oneuptime.service.id",
561
+ "oneuptime.service.id",
562
+ ]);
563
+ const serviceNames: Array<string> = collect([
564
+ "resource.service.name",
565
+ "service.name",
566
+ ]);
567
+
568
+ const [
569
+ resolvedHosts,
570
+ resolvedDockerHosts,
571
+ resolvedClusters,
572
+ resolvedServices,
573
+ ] = await Promise.all([
574
+ this.resolveResourceIds({
575
+ ids: hostIds,
576
+ names: hostNames,
577
+ nameColumn: "hostIdentifier",
578
+ projectId: input.projectId,
579
+ findBy: HostService.findBy.bind(HostService),
580
+ }),
581
+ this.resolveResourceIds({
582
+ ids: dockerHostIds,
583
+ names: dockerHostNames,
584
+ nameColumn: "hostIdentifier",
585
+ projectId: input.projectId,
586
+ findBy: DockerHostService.findBy.bind(DockerHostService),
587
+ }),
588
+ this.resolveResourceIds({
589
+ ids: clusterIds,
590
+ names: clusterNames,
591
+ nameColumn: "clusterIdentifier",
592
+ projectId: input.projectId,
593
+ findBy: KubernetesClusterService.findBy.bind(KubernetesClusterService),
594
+ }),
595
+ this.resolveResourceIds({
596
+ ids: serviceIds,
597
+ names: serviceNames,
598
+ nameColumn: "name",
599
+ projectId: input.projectId,
600
+ findBy: ServiceService.findBy.bind(ServiceService),
601
+ }),
602
+ ]);
603
+
604
+ if (resolvedHosts.length > 0) {
605
+ input.incident.hosts = resolvedHosts.map((id: string): Host => {
606
+ const host: Host = new Host();
607
+ host._id = id;
608
+ return host;
609
+ });
610
+ }
611
+ if (resolvedDockerHosts.length > 0) {
612
+ input.incident.dockerHosts = resolvedDockerHosts.map(
613
+ (id: string): DockerHost => {
614
+ const dockerHost: DockerHost = new DockerHost();
615
+ dockerHost._id = id;
616
+ return dockerHost;
617
+ },
618
+ );
619
+ }
620
+ if (resolvedClusters.length > 0) {
621
+ input.incident.kubernetesClusters = resolvedClusters.map(
622
+ (id: string): KubernetesCluster => {
623
+ const cluster: KubernetesCluster = new KubernetesCluster();
624
+ cluster._id = id;
625
+ return cluster;
626
+ },
627
+ );
628
+ }
629
+ if (resolvedServices.length > 0) {
630
+ input.incident.services = resolvedServices.map((id: string): Service => {
631
+ const service: Service = new Service();
632
+ service._id = id;
633
+ return service;
634
+ });
635
+ }
636
+ }
637
+
638
+ /*
639
+ * Resolve a mix of ids and names to a deduped set of database ids
640
+ * for one resource type, project-scoped. Either or both lists may
641
+ * be empty; if both are empty the method short-circuits with no DB
642
+ * round-trip.
643
+ */
644
+ private static async resolveResourceIds(input: {
645
+ ids: Array<string>;
646
+ names: Array<string>;
647
+ nameColumn: string;
648
+ projectId: ObjectID;
649
+ /*
650
+ * Loosely typed because the three resource services (Host,
651
+ * DockerHost, KubernetesCluster) each have their own
652
+ * `Query<TBaseModel>` shape and we deliberately abstract over
653
+ * them. We only need the row's `_id` back, which every model
654
+ * exposes via `DatabaseBaseModel`.
655
+ */
656
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
657
+ findBy: (args: any) => Promise<Array<{ _id?: string | undefined }>>;
658
+ }): Promise<Array<string>> {
659
+ if (input.ids.length === 0 && input.names.length === 0) {
660
+ return [];
661
+ }
662
+
663
+ const resolved: Set<string> = new Set<string>();
664
+
665
+ const lookups: Array<Promise<Array<{ _id?: string | undefined }>>> = [];
666
+ if (input.ids.length > 0) {
667
+ lookups.push(
668
+ input.findBy({
669
+ query: {
670
+ projectId: input.projectId,
671
+ _id: new Includes(input.ids),
672
+ },
673
+ select: { _id: true },
674
+ skip: 0,
675
+ limit: LIMIT_PER_PROJECT,
676
+ props: { isRoot: true },
677
+ }),
678
+ );
679
+ }
680
+ if (input.names.length > 0) {
681
+ lookups.push(
682
+ input.findBy({
683
+ query: {
684
+ projectId: input.projectId,
685
+ [input.nameColumn]: new Includes(input.names),
686
+ },
687
+ select: { _id: true },
688
+ skip: 0,
689
+ limit: LIMIT_PER_PROJECT,
690
+ props: { isRoot: true },
691
+ }),
692
+ );
693
+ }
694
+
695
+ const buckets: Array<Array<{ _id?: string | undefined }>> =
696
+ await Promise.all(lookups);
697
+ for (const bucket of buckets) {
698
+ for (const row of bucket) {
699
+ if (row._id) {
700
+ resolved.add(String(row._id));
701
+ }
702
+ }
703
+ }
704
+ return Array.from(resolved);
705
+ }
706
+
497
707
  private static async resolveOpenIncident(input: {
498
708
  openIncident: Incident;
499
709
  rootCause: string;
@@ -17,6 +17,7 @@ import Email from "../../../Types/Email";
17
17
  import BadDataException from "../../../Types/Exception/BadDataException";
18
18
  import NotAuthenticatedException from "../../../Types/Exception/NotAuthenticatedException";
19
19
  import SsoAuthorizationException from "../../../Types/Exception/SsoAuthorizationException";
20
+ import TenantNotFoundException from "../../../Types/Exception/TenantNotFoundException";
20
21
  import HashedString from "../../../Types/HashedString";
21
22
  import JSONFunctions from "../../../Types/JSONFunctions";
22
23
  import JSONWebTokenData from "../../../Types/JsonWebTokenData";
@@ -585,9 +586,9 @@ describe("UserMiddleware", () => {
585
586
  describe("getUserTenantAccessPermissionWithTenantId", () => {
586
587
  const req: ExpressRequest = {} as ExpressRequest;
587
588
 
588
- const spyFindOneById: jest.SpyInstance = getJestSpyOn(
589
+ const spyGetRequireSsoForLogin: jest.SpyInstance = getJestSpyOn(
589
590
  ProjectService,
590
- "findOneById",
591
+ "getRequireSsoForLogin",
591
592
  );
592
593
  const spyDoesSsoTokenForProjectExist: jest.SpyInstance = getJestSpyOn(
593
594
  UserMiddleware,
@@ -599,7 +600,9 @@ describe("UserMiddleware", () => {
599
600
  });
600
601
 
601
602
  test("should throw 'Invalid tenantId' error, when project is not found for the tenantId", async () => {
602
- spyFindOneById.mockResolvedValueOnce(null);
603
+ spyGetRequireSsoForLogin.mockRejectedValueOnce(
604
+ new BadDataException("Project not found"),
605
+ );
603
606
 
604
607
  await expect(
605
608
  UserMiddleware.getUserTenantAccessPermissionWithTenantId({
@@ -607,23 +610,12 @@ describe("UserMiddleware", () => {
607
610
  tenantId: projectId,
608
611
  userId,
609
612
  }),
610
- ).rejects.toThrowError(new BadDataException("Invalid tenantId"));
611
- expect(spyFindOneById).toHaveBeenCalledWith({
612
- id: projectId,
613
- select: {
614
- requireSsoForLogin: true,
615
- },
616
- props: {
617
- isRoot: true,
618
- },
619
- });
613
+ ).rejects.toThrowError(new TenantNotFoundException("Invalid tenantId"));
614
+ expect(spyGetRequireSsoForLogin).toHaveBeenCalledWith(projectId);
620
615
  });
621
616
 
622
617
  test("should throw SsoAuthorizationException error, when sso login is required but sso token for the projectId does not exist", async () => {
623
- spyFindOneById.mockResolvedValueOnce({
624
- ...mockedProject,
625
- requireSsoForLogin: true,
626
- });
618
+ spyGetRequireSsoForLogin.mockResolvedValueOnce(true);
627
619
 
628
620
  spyDoesSsoTokenForProjectExist.mockReturnValueOnce(false);
629
621
 
@@ -642,7 +634,7 @@ describe("UserMiddleware", () => {
642
634
  });
643
635
 
644
636
  test("should return null when getUserTenantAccessPermission returns null", async () => {
645
- spyFindOneById.mockResolvedValueOnce(mockedProject);
637
+ spyGetRequireSsoForLogin.mockResolvedValueOnce(false);
646
638
 
647
639
  const spyGetUserTenantAccessPermission: jest.SpyInstance = getJestSpyOn(
648
640
  AccessTokenService,
@@ -668,7 +660,7 @@ describe("UserMiddleware", () => {
668
660
  projectId,
669
661
  } as UserTenantAccessPermission;
670
662
 
671
- spyFindOneById.mockResolvedValueOnce(mockedProject);
663
+ spyGetRequireSsoForLogin.mockResolvedValueOnce(false);
672
664
 
673
665
  const spyGetUserTenantAccessPermission: jest.SpyInstance = getJestSpyOn(
674
666
  AccessTokenService,
@@ -1,4 +1,9 @@
1
- import Permission from "../../Types/Permission";
1
+ import ObjectID from "../../Types/ObjectID";
2
+ import Permission, {
3
+ PermissionHelper,
4
+ UserPermission,
5
+ } from "../../Types/Permission";
6
+ import PermissionScope from "../../Types/Database/AccessControl/PermissionScope";
2
7
 
3
8
  describe("Permission", () => {
4
9
  test("Permission.ProjectMember should be ProjectMember", () => {
@@ -9,3 +14,126 @@ describe("Permission", () => {
9
14
  expect(Permission.Public).toBe("Public");
10
15
  });
11
16
  });
17
+
18
+ const makeRow: (
19
+ permission: Permission,
20
+ scope: PermissionScope | undefined,
21
+ labelIds?: Array<ObjectID>,
22
+ ) => UserPermission = (
23
+ permission: Permission,
24
+ scope: PermissionScope | undefined,
25
+ labelIds: Array<ObjectID> = [],
26
+ ): UserPermission => {
27
+ return {
28
+ _type: "UserPermission",
29
+ permission,
30
+ labelIds,
31
+ scope,
32
+ };
33
+ };
34
+
35
+ describe("PermissionHelper label/scope filtering", () => {
36
+ /*
37
+ * Regression coverage for the bug where a team permission with
38
+ * scope=Labels on a role permission (IncidentViewer, MonitorViewer,
39
+ * Viewer, …) was treated as an unconditional grant because the
40
+ * legacy filter consulted the per-permission `isAccessControlPermission`
41
+ * flag instead of the explicit scope on the row.
42
+ */
43
+
44
+ test("getNonAccessControlPermissions: scope=All counts as unrestricted", () => {
45
+ const rows: Array<UserPermission> = [
46
+ makeRow(Permission.IncidentViewer, PermissionScope.All, []),
47
+ ];
48
+ expect(PermissionHelper.getNonAccessControlPermissions(rows)).toEqual([
49
+ Permission.IncidentViewer,
50
+ ]);
51
+ });
52
+
53
+ test("getNonAccessControlPermissions: scope=Labels with labels is restricted (NOT included)", () => {
54
+ const labelId: ObjectID = ObjectID.generate();
55
+ const rows: Array<UserPermission> = [
56
+ makeRow(Permission.IncidentViewer, PermissionScope.Labels, [labelId]),
57
+ ];
58
+ expect(PermissionHelper.getNonAccessControlPermissions(rows)).toEqual([]);
59
+ });
60
+
61
+ test("getNonAccessControlPermissions: scope=Labels with empty labels is treated as unrestricted (legacy parity)", () => {
62
+ const rows: Array<UserPermission> = [
63
+ makeRow(Permission.IncidentViewer, PermissionScope.Labels, []),
64
+ ];
65
+ expect(PermissionHelper.getNonAccessControlPermissions(rows)).toEqual([
66
+ Permission.IncidentViewer,
67
+ ]);
68
+ });
69
+
70
+ test("getNonAccessControlPermissions: scope=Owned is excluded (OwnedScope handles it)", () => {
71
+ const rows: Array<UserPermission> = [
72
+ makeRow(Permission.IncidentViewer, PermissionScope.Owned, []),
73
+ ];
74
+ expect(PermissionHelper.getNonAccessControlPermissions(rows)).toEqual([]);
75
+ });
76
+
77
+ test("getNonAccessControlPermissions: legacy row (scope undefined, no labels) is unrestricted", () => {
78
+ const rows: Array<UserPermission> = [
79
+ makeRow(Permission.CurrentUser, undefined, []),
80
+ ];
81
+ expect(PermissionHelper.getNonAccessControlPermissions(rows)).toEqual([
82
+ Permission.CurrentUser,
83
+ ]);
84
+ });
85
+
86
+ test("getAccessControlPermissions: role permission with scope=Labels + labels is collected", () => {
87
+ const labelId: ObjectID = ObjectID.generate();
88
+ const row: UserPermission = makeRow(
89
+ Permission.IncidentViewer,
90
+ PermissionScope.Labels,
91
+ [labelId],
92
+ );
93
+ expect(PermissionHelper.getAccessControlPermissions([row])).toEqual([row]);
94
+ });
95
+
96
+ test("getAccessControlPermissions: granular permission with scope=Labels + labels is collected", () => {
97
+ const labelId: ObjectID = ObjectID.generate();
98
+ const row: UserPermission = makeRow(
99
+ Permission.ReadProjectIncident,
100
+ PermissionScope.Labels,
101
+ [labelId],
102
+ );
103
+ expect(PermissionHelper.getAccessControlPermissions([row])).toEqual([row]);
104
+ });
105
+
106
+ test("getAccessControlPermissions: scope=All with labels is NOT collected (All wins over labels)", () => {
107
+ const labelId: ObjectID = ObjectID.generate();
108
+ const row: UserPermission = makeRow(
109
+ Permission.IncidentViewer,
110
+ PermissionScope.All,
111
+ [labelId],
112
+ );
113
+ expect(PermissionHelper.getAccessControlPermissions([row])).toEqual([]);
114
+ });
115
+
116
+ test("getAccessControlPermissions: scope=Owned never contributes a label filter", () => {
117
+ const labelId: ObjectID = ObjectID.generate();
118
+ const row: UserPermission = makeRow(
119
+ Permission.IncidentViewer,
120
+ PermissionScope.Owned,
121
+ [labelId],
122
+ );
123
+ expect(PermissionHelper.getAccessControlPermissions([row])).toEqual([]);
124
+ });
125
+
126
+ test("Mixed: All row on a different permission does NOT suppress a Labels row's filter", () => {
127
+ const labelId: ObjectID = ObjectID.generate();
128
+ const rows: Array<UserPermission> = [
129
+ makeRow(Permission.MonitorViewer, PermissionScope.All, []),
130
+ makeRow(Permission.IncidentViewer, PermissionScope.Labels, [labelId]),
131
+ ];
132
+ expect(PermissionHelper.getNonAccessControlPermissions(rows)).toEqual([
133
+ Permission.MonitorViewer,
134
+ ]);
135
+ expect(PermissionHelper.getAccessControlPermissions(rows)).toEqual([
136
+ rows[1],
137
+ ]);
138
+ });
139
+ });
@@ -20,7 +20,16 @@ export const SUPPORTED_ACCOUNTS_LANGUAGES: Array<AccountsLanguage> = [
20
20
  { code: "ru", nativeName: "Русский", englishName: "Russian" },
21
21
  { code: "ja", nativeName: "日本語", englishName: "Japanese" },
22
22
  { code: "ko", nativeName: "한국어", englishName: "Korean" },
23
- { code: "zh", nativeName: "中文", englishName: "Chinese" },
23
+ {
24
+ code: "zh-CN",
25
+ nativeName: "简体中文",
26
+ englishName: "Chinese (Simplified)",
27
+ },
28
+ {
29
+ code: "zh-TW",
30
+ nativeName: "繁體中文",
31
+ englishName: "Chinese (Traditional)",
32
+ },
24
33
  { code: "hi", nativeName: "हिन्दी", englishName: "Hindi" },
25
34
  ];
26
35
 
@@ -21,7 +21,16 @@ export const SUPPORTED_ADMIN_DASHBOARD_LANGUAGES: Array<AdminDashboardLanguage>
21
21
  { code: "ru", nativeName: "Русский", englishName: "Russian" },
22
22
  { code: "ja", nativeName: "日本語", englishName: "Japanese" },
23
23
  { code: "ko", nativeName: "한국어", englishName: "Korean" },
24
- { code: "zh", nativeName: "中文", englishName: "Chinese" },
24
+ {
25
+ code: "zh-CN",
26
+ nativeName: "简体中文",
27
+ englishName: "Chinese (Simplified)",
28
+ },
29
+ {
30
+ code: "zh-TW",
31
+ nativeName: "繁體中文",
32
+ englishName: "Chinese (Traditional)",
33
+ },
25
34
  { code: "hi", nativeName: "हिन्दी", englishName: "Hindi" },
26
35
  ];
27
36
 
@@ -0,0 +1,3 @@
1
+ export default interface TableEditionAccessControl {
2
+ requiresEnterprise: boolean;
3
+ }
@@ -20,7 +20,16 @@ export const SUPPORTED_DASHBOARD_LANGUAGES: Array<DashboardLanguage> = [
20
20
  { code: "ru", nativeName: "Русский", englishName: "Russian" },
21
21
  { code: "ja", nativeName: "日本語", englishName: "Japanese" },
22
22
  { code: "ko", nativeName: "한국어", englishName: "Korean" },
23
- { code: "zh", nativeName: "中文", englishName: "Chinese" },
23
+ {
24
+ code: "zh-CN",
25
+ nativeName: "简体中文",
26
+ englishName: "Chinese (Simplified)",
27
+ },
28
+ {
29
+ code: "zh-TW",
30
+ nativeName: "繁體中文",
31
+ englishName: "Chinese (Traditional)",
32
+ },
24
33
  { code: "hi", nativeName: "हिन्दी", englishName: "Hindi" },
25
34
  ];
26
35
 
@@ -0,0 +1,8 @@
1
+ import TableEditionAccessControl from "../../BaseDatabase/TableEditionAccessControl";
2
+ import GenericFunction from "../../GenericFunction";
3
+
4
+ export default (accessControl: TableEditionAccessControl) => {
5
+ return (ctr: GenericFunction) => {
6
+ ctr.prototype.requiresEnterprise = accessControl.requiresEnterprise;
7
+ };
8
+ };
package/Types/Date.ts CHANGED
@@ -1560,7 +1560,7 @@ export default class OneUptimeDate {
1560
1560
  */
1561
1561
  try {
1562
1562
  return moment(trimmedDate).toDate();
1563
- } catch (_err: unknown) {
1563
+ } catch {
1564
1564
  return new Date(trimmedDate);
1565
1565
  }
1566
1566
  }
@@ -20,7 +20,16 @@ export const SUPPORTED_DOCS_LANGUAGES: Array<DocsLanguage> = [
20
20
  { code: "ru", nativeName: "Русский", englishName: "Russian" },
21
21
  { code: "ja", nativeName: "日本語", englishName: "Japanese" },
22
22
  { code: "ko", nativeName: "한국어", englishName: "Korean" },
23
- { code: "zh", nativeName: "中文", englishName: "Chinese" },
23
+ {
24
+ code: "zh-CN",
25
+ nativeName: "简体中文",
26
+ englishName: "Chinese (Simplified)",
27
+ },
28
+ {
29
+ code: "zh-TW",
30
+ nativeName: "繁體中文",
31
+ englishName: "Chinese (Traditional)",
32
+ },
24
33
  { code: "hi", nativeName: "हिन्दी", englishName: "Hindi" },
25
34
  ];
26
35