@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,17 +1,37 @@
1
+ import DockerHost from "../../Models/DatabaseModels/DockerHost";
2
+ import DockerHostOwnerTeam from "../../Models/DatabaseModels/DockerHostOwnerTeam";
3
+ import DockerHostOwnerUser from "../../Models/DatabaseModels/DockerHostOwnerUser";
4
+ import Host from "../../Models/DatabaseModels/Host";
5
+ import HostOwnerTeam from "../../Models/DatabaseModels/HostOwnerTeam";
6
+ import HostOwnerUser from "../../Models/DatabaseModels/HostOwnerUser";
7
+ import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
8
+ import KubernetesClusterOwnerTeam from "../../Models/DatabaseModels/KubernetesClusterOwnerTeam";
9
+ import KubernetesClusterOwnerUser from "../../Models/DatabaseModels/KubernetesClusterOwnerUser";
1
10
  import Label from "../../Models/DatabaseModels/Label";
2
11
  import Monitor from "../../Models/DatabaseModels/Monitor";
3
12
  import MonitorOwnerTeam from "../../Models/DatabaseModels/MonitorOwnerTeam";
4
13
  import MonitorOwnerUser from "../../Models/DatabaseModels/MonitorOwnerUser";
5
14
  import ScheduledMaintenance from "../../Models/DatabaseModels/ScheduledMaintenance";
6
15
  import ScheduledMaintenanceOwnerRule from "../../Models/DatabaseModels/ScheduledMaintenanceOwnerRule";
16
+ import Service from "../../Models/DatabaseModels/Service";
17
+ import ServiceOwnerTeam from "../../Models/DatabaseModels/ServiceOwnerTeam";
18
+ import ServiceOwnerUser from "../../Models/DatabaseModels/ServiceOwnerUser";
7
19
  import Team from "../../Models/DatabaseModels/Team";
8
20
  import User from "../../Models/DatabaseModels/User";
21
+ import DockerHostOwnerTeamService from "./DockerHostOwnerTeamService";
22
+ import DockerHostOwnerUserService from "./DockerHostOwnerUserService";
23
+ import HostOwnerTeamService from "./HostOwnerTeamService";
24
+ import HostOwnerUserService from "./HostOwnerUserService";
25
+ import KubernetesClusterOwnerTeamService from "./KubernetesClusterOwnerTeamService";
26
+ import KubernetesClusterOwnerUserService from "./KubernetesClusterOwnerUserService";
9
27
  import MonitorOwnerTeamService from "./MonitorOwnerTeamService";
10
28
  import MonitorOwnerUserService from "./MonitorOwnerUserService";
11
29
  import MonitorService from "./MonitorService";
12
30
  import ScheduledMaintenanceFeedService from "./ScheduledMaintenanceFeedService";
13
31
  import ScheduledMaintenanceOwnerRuleService from "./ScheduledMaintenanceOwnerRuleService";
14
32
  import ScheduledMaintenanceService from "./ScheduledMaintenanceService";
33
+ import ServiceOwnerTeamService from "./ServiceOwnerTeamService";
34
+ import ServiceOwnerUserService from "./ServiceOwnerUserService";
15
35
  import TeamService from "./TeamService";
16
36
  import UserService from "./UserService";
17
37
  import { ScheduledMaintenanceFeedEventType } from "../../Models/DatabaseModels/ScheduledMaintenanceFeed";
@@ -59,6 +79,10 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
59
79
  ownerUsers: { _id: true },
60
80
  ownerTeams: { _id: true },
61
81
  inheritOwnersFromMonitors: true,
82
+ inheritOwnersFromHosts: true,
83
+ inheritOwnersFromKubernetesClusters: true,
84
+ inheritOwnersFromDockerHosts: true,
85
+ inheritOwnersFromServices: true,
62
86
  },
63
87
  limit: 100,
64
88
  skip: 0,
@@ -81,6 +105,10 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
81
105
  const allUserIds: Set<string> = new Set();
82
106
  const allTeamIds: Set<string> = new Set();
83
107
  let inheritFromMonitors: boolean = false;
108
+ let inheritFromHosts: boolean = false;
109
+ let inheritFromKubernetesClusters: boolean = false;
110
+ let inheritFromDockerHosts: boolean = false;
111
+ let inheritFromServices: boolean = false;
84
112
  const inheritNotifyMode: { value: boolean | null } = { value: null };
85
113
 
86
114
  for (const rule of rules) {
@@ -113,6 +141,30 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
113
141
  inheritNotifyMode.value =
114
142
  inheritNotifyMode.value === true ? true : notify;
115
143
  }
144
+ if (rule.inheritOwnersFromHosts) {
145
+ inheritFromHosts = true;
146
+ ruleAddedAny = true;
147
+ inheritNotifyMode.value =
148
+ inheritNotifyMode.value === true ? true : notify;
149
+ }
150
+ if (rule.inheritOwnersFromKubernetesClusters) {
151
+ inheritFromKubernetesClusters = true;
152
+ ruleAddedAny = true;
153
+ inheritNotifyMode.value =
154
+ inheritNotifyMode.value === true ? true : notify;
155
+ }
156
+ if (rule.inheritOwnersFromDockerHosts) {
157
+ inheritFromDockerHosts = true;
158
+ ruleAddedAny = true;
159
+ inheritNotifyMode.value =
160
+ inheritNotifyMode.value === true ? true : notify;
161
+ }
162
+ if (rule.inheritOwnersFromServices) {
163
+ inheritFromServices = true;
164
+ ruleAddedAny = true;
165
+ inheritNotifyMode.value =
166
+ inheritNotifyMode.value === true ? true : notify;
167
+ }
116
168
  if (ruleAddedAny) {
117
169
  matchedRules.push(rule);
118
170
  }
@@ -120,6 +172,14 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
120
172
 
121
173
  const inheritedFromMonitorUserIds: Set<string> = new Set();
122
174
  const inheritedFromMonitorTeamIds: Set<string> = new Set();
175
+ const inheritedFromHostUserIds: Set<string> = new Set();
176
+ const inheritedFromHostTeamIds: Set<string> = new Set();
177
+ const inheritedFromKubernetesClusterUserIds: Set<string> = new Set();
178
+ const inheritedFromKubernetesClusterTeamIds: Set<string> = new Set();
179
+ const inheritedFromDockerHostUserIds: Set<string> = new Set();
180
+ const inheritedFromDockerHostTeamIds: Set<string> = new Set();
181
+ const inheritedFromServiceUserIds: Set<string> = new Set();
182
+ const inheritedFromServiceTeamIds: Set<string> = new Set();
123
183
 
124
184
  if (inheritFromMonitors && scheduledMaintenance.monitors?.length) {
125
185
  const monitorIds: Array<ObjectID> = scheduledMaintenance.monitors
@@ -162,16 +222,200 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
162
222
  }
163
223
  }
164
224
 
225
+ if (inheritFromHosts && scheduledMaintenance.hosts?.length) {
226
+ const hostIds: Array<ObjectID> = scheduledMaintenance.hosts
227
+ .map((h: Host) => {
228
+ return h.id;
229
+ })
230
+ .filter((id: ObjectID | null | undefined): id is ObjectID => {
231
+ return Boolean(id);
232
+ });
233
+ if (hostIds.length > 0) {
234
+ const [hostOwnerUsers, hostOwnerTeams]: [
235
+ Array<HostOwnerUser>,
236
+ Array<HostOwnerTeam>,
237
+ ] = await Promise.all([
238
+ HostOwnerUserService.findBy({
239
+ query: { hostId: QueryHelper.any(hostIds) },
240
+ select: { userId: true },
241
+ props: { isRoot: true },
242
+ limit: LIMIT_MAX,
243
+ skip: 0,
244
+ }),
245
+ HostOwnerTeamService.findBy({
246
+ query: { hostId: QueryHelper.any(hostIds) },
247
+ select: { teamId: true },
248
+ props: { isRoot: true },
249
+ limit: LIMIT_MAX,
250
+ skip: 0,
251
+ }),
252
+ ]);
253
+ for (const ownerUser of hostOwnerUsers) {
254
+ if (ownerUser.userId) {
255
+ inheritedFromHostUserIds.add(ownerUser.userId.toString());
256
+ }
257
+ }
258
+ for (const ownerTeam of hostOwnerTeams) {
259
+ if (ownerTeam.teamId) {
260
+ inheritedFromHostTeamIds.add(ownerTeam.teamId.toString());
261
+ }
262
+ }
263
+ }
264
+ }
265
+
165
266
  if (
166
- inheritedFromMonitorUserIds.size > 0 ||
167
- inheritedFromMonitorTeamIds.size > 0
267
+ inheritFromKubernetesClusters &&
268
+ scheduledMaintenance.kubernetesClusters?.length
168
269
  ) {
270
+ const clusterIds: Array<ObjectID> =
271
+ scheduledMaintenance.kubernetesClusters
272
+ .map((c: KubernetesCluster) => {
273
+ return c.id;
274
+ })
275
+ .filter((id: ObjectID | null | undefined): id is ObjectID => {
276
+ return Boolean(id);
277
+ });
278
+ if (clusterIds.length > 0) {
279
+ const [clusterOwnerUsers, clusterOwnerTeams]: [
280
+ Array<KubernetesClusterOwnerUser>,
281
+ Array<KubernetesClusterOwnerTeam>,
282
+ ] = await Promise.all([
283
+ KubernetesClusterOwnerUserService.findBy({
284
+ query: { kubernetesClusterId: QueryHelper.any(clusterIds) },
285
+ select: { userId: true },
286
+ props: { isRoot: true },
287
+ limit: LIMIT_MAX,
288
+ skip: 0,
289
+ }),
290
+ KubernetesClusterOwnerTeamService.findBy({
291
+ query: { kubernetesClusterId: QueryHelper.any(clusterIds) },
292
+ select: { teamId: true },
293
+ props: { isRoot: true },
294
+ limit: LIMIT_MAX,
295
+ skip: 0,
296
+ }),
297
+ ]);
298
+ for (const ownerUser of clusterOwnerUsers) {
299
+ if (ownerUser.userId) {
300
+ inheritedFromKubernetesClusterUserIds.add(
301
+ ownerUser.userId.toString(),
302
+ );
303
+ }
304
+ }
305
+ for (const ownerTeam of clusterOwnerTeams) {
306
+ if (ownerTeam.teamId) {
307
+ inheritedFromKubernetesClusterTeamIds.add(
308
+ ownerTeam.teamId.toString(),
309
+ );
310
+ }
311
+ }
312
+ }
313
+ }
314
+
315
+ if (inheritFromDockerHosts && scheduledMaintenance.dockerHosts?.length) {
316
+ const dockerHostIds: Array<ObjectID> = scheduledMaintenance.dockerHosts
317
+ .map((d: DockerHost) => {
318
+ return d.id;
319
+ })
320
+ .filter((id: ObjectID | null | undefined): id is ObjectID => {
321
+ return Boolean(id);
322
+ });
323
+ if (dockerHostIds.length > 0) {
324
+ const [dockerHostOwnerUsers, dockerHostOwnerTeams]: [
325
+ Array<DockerHostOwnerUser>,
326
+ Array<DockerHostOwnerTeam>,
327
+ ] = await Promise.all([
328
+ DockerHostOwnerUserService.findBy({
329
+ query: { dockerHostId: QueryHelper.any(dockerHostIds) },
330
+ select: { userId: true },
331
+ props: { isRoot: true },
332
+ limit: LIMIT_MAX,
333
+ skip: 0,
334
+ }),
335
+ DockerHostOwnerTeamService.findBy({
336
+ query: { dockerHostId: QueryHelper.any(dockerHostIds) },
337
+ select: { teamId: true },
338
+ props: { isRoot: true },
339
+ limit: LIMIT_MAX,
340
+ skip: 0,
341
+ }),
342
+ ]);
343
+ for (const ownerUser of dockerHostOwnerUsers) {
344
+ if (ownerUser.userId) {
345
+ inheritedFromDockerHostUserIds.add(ownerUser.userId.toString());
346
+ }
347
+ }
348
+ for (const ownerTeam of dockerHostOwnerTeams) {
349
+ if (ownerTeam.teamId) {
350
+ inheritedFromDockerHostTeamIds.add(ownerTeam.teamId.toString());
351
+ }
352
+ }
353
+ }
354
+ }
355
+
356
+ if (inheritFromServices && scheduledMaintenance.services?.length) {
357
+ const serviceIds: Array<ObjectID> = scheduledMaintenance.services
358
+ .map((s: Service) => {
359
+ return s.id;
360
+ })
361
+ .filter((id: ObjectID | null | undefined): id is ObjectID => {
362
+ return Boolean(id);
363
+ });
364
+ if (serviceIds.length > 0) {
365
+ const [serviceOwnerUsers, serviceOwnerTeams]: [
366
+ Array<ServiceOwnerUser>,
367
+ Array<ServiceOwnerTeam>,
368
+ ] = await Promise.all([
369
+ ServiceOwnerUserService.findBy({
370
+ query: { serviceId: QueryHelper.any(serviceIds) },
371
+ select: { userId: true },
372
+ props: { isRoot: true },
373
+ limit: LIMIT_MAX,
374
+ skip: 0,
375
+ }),
376
+ ServiceOwnerTeamService.findBy({
377
+ query: { serviceId: QueryHelper.any(serviceIds) },
378
+ select: { teamId: true },
379
+ props: { isRoot: true },
380
+ limit: LIMIT_MAX,
381
+ skip: 0,
382
+ }),
383
+ ]);
384
+ for (const ownerUser of serviceOwnerUsers) {
385
+ if (ownerUser.userId) {
386
+ inheritedFromServiceUserIds.add(ownerUser.userId.toString());
387
+ }
388
+ }
389
+ for (const ownerTeam of serviceOwnerTeams) {
390
+ if (ownerTeam.teamId) {
391
+ inheritedFromServiceTeamIds.add(ownerTeam.teamId.toString());
392
+ }
393
+ }
394
+ }
395
+ }
396
+
397
+ const inheritedUserIds: Set<string> = new Set([
398
+ ...inheritedFromMonitorUserIds,
399
+ ...inheritedFromHostUserIds,
400
+ ...inheritedFromKubernetesClusterUserIds,
401
+ ...inheritedFromDockerHostUserIds,
402
+ ...inheritedFromServiceUserIds,
403
+ ]);
404
+ const inheritedTeamIds: Set<string> = new Set([
405
+ ...inheritedFromMonitorTeamIds,
406
+ ...inheritedFromHostTeamIds,
407
+ ...inheritedFromKubernetesClusterTeamIds,
408
+ ...inheritedFromDockerHostTeamIds,
409
+ ...inheritedFromServiceTeamIds,
410
+ ]);
411
+
412
+ if (inheritedUserIds.size > 0 || inheritedTeamIds.size > 0) {
169
413
  const inheritNotify: boolean = inheritNotifyMode.value === true;
170
- for (const id of inheritedFromMonitorUserIds) {
414
+ for (const id of inheritedUserIds) {
171
415
  usersByNotify.get(inheritNotify)!.add(id);
172
416
  allUserIds.add(id);
173
417
  }
174
- for (const id of inheritedFromMonitorTeamIds) {
418
+ for (const id of inheritedTeamIds) {
175
419
  teamsByNotify.get(inheritNotify)!.add(id);
176
420
  allTeamIds.add(id);
177
421
  }
@@ -226,6 +470,19 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
226
470
  inheritedFromMonitors:
227
471
  inheritedFromMonitorUserIds.size + inheritedFromMonitorTeamIds.size >
228
472
  0,
473
+ inheritedFromHosts:
474
+ inheritedFromHostUserIds.size + inheritedFromHostTeamIds.size > 0,
475
+ inheritedFromKubernetesClusters:
476
+ inheritedFromKubernetesClusterUserIds.size +
477
+ inheritedFromKubernetesClusterTeamIds.size >
478
+ 0,
479
+ inheritedFromDockerHosts:
480
+ inheritedFromDockerHostUserIds.size +
481
+ inheritedFromDockerHostTeamIds.size >
482
+ 0,
483
+ inheritedFromServices:
484
+ inheritedFromServiceUserIds.size + inheritedFromServiceTeamIds.size >
485
+ 0,
229
486
  });
230
487
  } catch (error) {
231
488
  logger.error(
@@ -245,6 +502,10 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
245
502
  userIds: Array<string>;
246
503
  teamIds: Array<string>;
247
504
  inheritedFromMonitors: boolean;
505
+ inheritedFromHosts: boolean;
506
+ inheritedFromKubernetesClusters: boolean;
507
+ inheritedFromDockerHosts: boolean;
508
+ inheritedFromServices: boolean;
248
509
  }): Promise<void> {
249
510
  const {
250
511
  scheduledMaintenance,
@@ -252,6 +513,10 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
252
513
  userIds,
253
514
  teamIds,
254
515
  inheritedFromMonitors,
516
+ inheritedFromHosts,
517
+ inheritedFromKubernetesClusters,
518
+ inheritedFromDockerHosts,
519
+ inheritedFromServices,
255
520
  } = data;
256
521
  if (
257
522
  !scheduledMaintenance.id ||
@@ -322,9 +587,26 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
322
587
  ? userLines.concat(teamLines).join("")
323
588
  : "\n- (no named owners)";
324
589
 
325
- const inheritedNote: string = inheritedFromMonitors
326
- ? `\n\n_Some owners were inherited from the event's monitors._`
327
- : "";
590
+ const inheritedSources: Array<string> = [];
591
+ if (inheritedFromMonitors) {
592
+ inheritedSources.push("monitors");
593
+ }
594
+ if (inheritedFromHosts) {
595
+ inheritedSources.push("hosts");
596
+ }
597
+ if (inheritedFromKubernetesClusters) {
598
+ inheritedSources.push("Kubernetes clusters");
599
+ }
600
+ if (inheritedFromDockerHosts) {
601
+ inheritedSources.push("Docker hosts");
602
+ }
603
+ if (inheritedFromServices) {
604
+ inheritedSources.push("services");
605
+ }
606
+ const inheritedNote: string =
607
+ inheritedSources.length > 0
608
+ ? `\n\n_Some owners were inherited from the event's ${inheritedSources.join(", ")}._`
609
+ : "";
328
610
 
329
611
  const feedInfoInMarkdown: string = `🛡️ **Scheduled Maintenance Owner Rule${
330
612
  matchedRules.length > 1 ? "s" : ""
@@ -1,4 +1,5 @@
1
1
  import DatabaseConfig from "../DatabaseConfig";
2
+ import InMemoryTTLCache from "../Infrastructure/InMemoryTTLCache";
2
3
  import CreateBy from "../Types/Database/CreateBy";
3
4
  import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
4
5
  import UpdateBy from "../Types/Database/UpdateBy";
@@ -87,10 +88,31 @@ export interface StatusPageReport {
87
88
  }
88
89
 
89
90
  export class Service extends DatabaseService<StatusPage> {
91
+ /*
92
+ * Caches the resolved status page URL per statusPageId. `getStatusPageURL`
93
+ * is called inside per-subscriber notification loops (see
94
+ * `StatusPageSubscriberService`), where a single batch can fire N×
95
+ * Postgres lookups against `StatusPageDomain`. SSL-provisioned custom
96
+ * domains change rarely (provisioning takes minutes), so a 60s staleness
97
+ * window is acceptable. Callers that need stronger consistency can call
98
+ * `clearStatusPageUrlCache` after writes to the underlying domain.
99
+ */
100
+ private statusPageUrlCache: InMemoryTTLCache<string> = new InMemoryTTLCache(
101
+ 10_000,
102
+ );
103
+
90
104
  public constructor() {
91
105
  super(StatusPage);
92
106
  }
93
107
 
108
+ public clearStatusPageUrlCache(statusPageId?: ObjectID): void {
109
+ if (statusPageId) {
110
+ this.statusPageUrlCache.delete(statusPageId.toString());
111
+ return;
112
+ }
113
+ this.statusPageUrlCache.clear();
114
+ }
115
+
94
116
  public static getDefaultEmailFooterText(): string {
95
117
  return "This is an automated email sent to you because you are subscribed to this Status Page.";
96
118
  }
@@ -655,6 +677,12 @@ export class Service extends DatabaseService<StatusPage> {
655
677
 
656
678
  @CaptureSpan()
657
679
  public async getStatusPageURL(statusPageId: ObjectID): Promise<string> {
680
+ const cacheKey: string = statusPageId.toString();
681
+ const cached: string | undefined = this.statusPageUrlCache.get(cacheKey);
682
+ if (cached !== undefined) {
683
+ return cached;
684
+ }
685
+
658
686
  const domain: StatusPageDomain | null =
659
687
  await StatusPageDomainService.findOneBy({
660
688
  query: {
@@ -685,6 +713,8 @@ export class Service extends DatabaseService<StatusPage> {
685
713
  .toString();
686
714
  }
687
715
 
716
+ this.statusPageUrlCache.set(cacheKey, statusPageURL, 60_000);
717
+
688
718
  return statusPageURL;
689
719
  }
690
720
 
@@ -0,0 +1,9 @@
1
+ import DatabaseService from "./DatabaseService";
2
+ import Model from "../../Models/DatabaseModels/TeamCustomField";
3
+
4
+ export class Service extends DatabaseService<Model> {
5
+ public constructor() {
6
+ super(Model);
7
+ }
8
+ }
9
+ export default new Service();