@oneuptime/common 9.4.7 → 9.4.8

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 (304) hide show
  1. package/Models/DatabaseModels/Alert.ts +76 -0
  2. package/Models/DatabaseModels/AlertEpisode.ts +1201 -0
  3. package/Models/DatabaseModels/AlertEpisodeFeed.ts +529 -0
  4. package/Models/DatabaseModels/AlertEpisodeInternalNote.ts +455 -0
  5. package/Models/DatabaseModels/AlertEpisodeMember.ts +586 -0
  6. package/Models/DatabaseModels/AlertEpisodeOwnerTeam.ts +421 -0
  7. package/Models/DatabaseModels/AlertEpisodeOwnerUser.ts +419 -0
  8. package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +523 -0
  9. package/Models/DatabaseModels/AlertFeed.ts +1 -0
  10. package/Models/DatabaseModels/AlertGroupingRule.ts +1432 -0
  11. package/Models/DatabaseModels/Index.ts +18 -0
  12. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +70 -0
  13. package/Models/DatabaseModels/StatusPageDomain.ts +2 -0
  14. package/Models/DatabaseModels/WorkspaceNotificationLog.ts +57 -0
  15. package/Server/API/SlackAPI.ts +21 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1768938069147-MigrationName.ts +751 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1769125561322-MigrationName.ts +41 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1769170578688-MigrationName.ts +29 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1769172358833-MigrationName.ts +177 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1769176450526-MigrationName.ts +71 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1769190495840-MigrationName.ts +35 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1769199303656-MigrationName.ts +29 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1769202898645-MigrationName.ts +29 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1769428619414-MigrationName.ts +35 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1769428821686-MigrationName.ts +47 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +20 -0
  27. package/Server/Services/AlertEpisodeFeedService.ts +94 -0
  28. package/Server/Services/AlertEpisodeInternalNoteService.ts +71 -0
  29. package/Server/Services/AlertEpisodeMemberService.ts +267 -0
  30. package/Server/Services/AlertEpisodeOwnerTeamService.ts +10 -0
  31. package/Server/Services/AlertEpisodeOwnerUserService.ts +10 -0
  32. package/Server/Services/AlertEpisodeService.ts +988 -0
  33. package/Server/Services/AlertEpisodeStateTimelineService.ts +557 -0
  34. package/Server/Services/AlertGroupingEngineService.ts +1120 -0
  35. package/Server/Services/AlertGroupingRuleService.ts +14 -0
  36. package/Server/Services/AlertService.ts +12 -0
  37. package/Server/Services/CallService.ts +2 -0
  38. package/Server/Services/Index.ts +21 -0
  39. package/Server/Services/MailService.ts +5 -0
  40. package/Server/Services/OnCallDutyPolicyService.ts +5 -0
  41. package/Server/Services/SmsService.ts +2 -0
  42. package/Server/Services/UserNotificationSettingService.ts +23 -0
  43. package/Server/Services/WhatsAppService.ts +5 -0
  44. package/Server/Services/WorkspaceNotificationRuleService.ts +26 -0
  45. package/Server/Utils/AnalyticsDatabase/Statement.ts +6 -2
  46. package/Server/Utils/WhatsAppTemplateUtil.ts +13 -0
  47. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes.ts +18 -0
  48. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +689 -0
  49. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +16 -0
  50. package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +11 -0
  51. package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +915 -0
  52. package/Server/Utils/Workspace/Slack/Messages/AlertEpisode.ts +120 -0
  53. package/Server/Utils/Workspace/WorkspaceMessages/AlertEpisode.ts +74 -0
  54. package/Tests/Server/Services/AlertEpisodeMemberService.test.ts +200 -0
  55. package/Tests/Server/Services/AlertEpisodeService.test.ts +240 -0
  56. package/Tests/Server/Services/AlertGroupingEngineService.test.ts +542 -0
  57. package/Tests/Server/Services/AlertGroupingRuleService.test.ts +383 -0
  58. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +1 -1
  59. package/Tests/UI/Components/Input.test.tsx +1 -1
  60. package/Tests/UI/Components/TextArea.test.tsx +2 -2
  61. package/Types/BaseDatabase/SortOrder.ts +9 -0
  62. package/Types/Email/EmailTemplateType.ts +5 -0
  63. package/Types/NotificationRule/NotificationRuleType.ts +1 -0
  64. package/Types/NotificationSetting/NotificationSettingEventType.ts +7 -0
  65. package/Types/Permission.ts +309 -0
  66. package/Types/UserNotification/UserNotificationEventType.ts +1 -0
  67. package/Types/WhatsApp/WhatsAppTemplates.ts +20 -0
  68. package/Types/Workspace/NotificationRules/EventType.ts +1 -0
  69. package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +32 -3
  70. package/UI/Components/Accordion/Accordion.tsx +20 -2
  71. package/UI/Components/Alerts/Alert.tsx +1 -0
  72. package/UI/Components/Button/Button.tsx +29 -0
  73. package/UI/Components/CardSelect/CardSelect.tsx +5 -1
  74. package/UI/Components/Checkbox/Checkbox.tsx +7 -3
  75. package/UI/Components/ColorCircle/ColorCircle.tsx +2 -0
  76. package/UI/Components/ColorViewer/ColorViewer.tsx +19 -3
  77. package/UI/Components/CopyableButton/CopyableButton.tsx +22 -5
  78. package/UI/Components/Detail/Detail.tsx +1 -1
  79. package/UI/Components/Dropdown/Dropdown.tsx +14 -1
  80. package/UI/Components/Forms/Fields/FormField.tsx +28 -0
  81. package/UI/Components/FullPageModal/FullPageModal.tsx +35 -4
  82. package/UI/Components/Input/Input.tsx +14 -2
  83. package/UI/Components/Link/Link.tsx +1 -0
  84. package/UI/Components/Loader/Loader.tsx +8 -2
  85. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +76 -1
  86. package/UI/Components/Modal/Modal.tsx +47 -3
  87. package/UI/Components/ModelTable/BaseModelTable.tsx +42 -1
  88. package/UI/Components/MoreMenu/MoreMenu.tsx +84 -2
  89. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +30 -8
  90. package/UI/Components/Pagination/Pagination.tsx +113 -8
  91. package/UI/Components/ProgressBar/ProgressBar.tsx +12 -2
  92. package/UI/Components/Radio/Radio.tsx +21 -3
  93. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +54 -27
  94. package/UI/Components/StatusBubble/StatusBubble.tsx +7 -2
  95. package/UI/Components/Table/TableHeader.tsx +20 -3
  96. package/UI/Components/Tabs/Tab.tsx +16 -1
  97. package/UI/Components/Tabs/Tabs.tsx +12 -1
  98. package/UI/Components/TextArea/TextArea.tsx +12 -2
  99. package/UI/Components/Toggle/Toggle.tsx +14 -3
  100. package/UI/Components/Tooltip/Tooltip.tsx +11 -1
  101. package/UI/Components/TopAlert/TopAlert.tsx +2 -0
  102. package/build/dist/Models/DatabaseModels/Alert.js +77 -0
  103. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  104. package/build/dist/Models/DatabaseModels/AlertEpisode.js +1225 -0
  105. package/build/dist/Models/DatabaseModels/AlertEpisode.js.map +1 -0
  106. package/build/dist/Models/DatabaseModels/AlertEpisodeFeed.js +553 -0
  107. package/build/dist/Models/DatabaseModels/AlertEpisodeFeed.js.map +1 -0
  108. package/build/dist/Models/DatabaseModels/AlertEpisodeInternalNote.js +467 -0
  109. package/build/dist/Models/DatabaseModels/AlertEpisodeInternalNote.js.map +1 -0
  110. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +607 -0
  111. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -0
  112. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js +437 -0
  113. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js.map +1 -0
  114. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js +436 -0
  115. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js.map +1 -0
  116. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +546 -0
  117. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -0
  118. package/build/dist/Models/DatabaseModels/AlertFeed.js +1 -0
  119. package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
  120. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +1437 -0
  121. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -0
  122. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  123. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  124. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +69 -0
  125. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
  126. package/build/dist/Models/DatabaseModels/StatusPageDomain.js +2 -0
  127. package/build/dist/Models/DatabaseModels/StatusPageDomain.js.map +1 -1
  128. package/build/dist/Models/DatabaseModels/WorkspaceNotificationLog.js +58 -0
  129. package/build/dist/Models/DatabaseModels/WorkspaceNotificationLog.js.map +1 -1
  130. package/build/dist/Server/API/SlackAPI.js +18 -0
  131. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  132. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768938069147-MigrationName.js +266 -0
  133. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768938069147-MigrationName.js.map +1 -0
  134. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769125561322-MigrationName.js +20 -0
  135. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769125561322-MigrationName.js.map +1 -0
  136. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769170578688-MigrationName.js +16 -0
  137. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769170578688-MigrationName.js.map +1 -0
  138. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769172358833-MigrationName.js +68 -0
  139. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769172358833-MigrationName.js.map +1 -0
  140. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769176450526-MigrationName.js +30 -0
  141. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769176450526-MigrationName.js.map +1 -0
  142. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769190495840-MigrationName.js +18 -0
  143. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769190495840-MigrationName.js.map +1 -0
  144. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769199303656-MigrationName.js +16 -0
  145. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769199303656-MigrationName.js.map +1 -0
  146. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769202898645-MigrationName.js +16 -0
  147. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769202898645-MigrationName.js.map +1 -0
  148. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769428619414-MigrationName.js +18 -0
  149. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769428619414-MigrationName.js.map +1 -0
  150. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769428821686-MigrationName.js +22 -0
  151. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769428821686-MigrationName.js.map +1 -0
  152. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +20 -0
  153. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  154. package/build/dist/Server/Services/AlertEpisodeFeedService.js +83 -0
  155. package/build/dist/Server/Services/AlertEpisodeFeedService.js.map +1 -0
  156. package/build/dist/Server/Services/AlertEpisodeInternalNoteService.js +70 -0
  157. package/build/dist/Server/Services/AlertEpisodeInternalNoteService.js.map +1 -0
  158. package/build/dist/Server/Services/AlertEpisodeMemberService.js +256 -0
  159. package/build/dist/Server/Services/AlertEpisodeMemberService.js.map +1 -0
  160. package/build/dist/Server/Services/AlertEpisodeOwnerTeamService.js +9 -0
  161. package/build/dist/Server/Services/AlertEpisodeOwnerTeamService.js.map +1 -0
  162. package/build/dist/Server/Services/AlertEpisodeOwnerUserService.js +9 -0
  163. package/build/dist/Server/Services/AlertEpisodeOwnerUserService.js.map +1 -0
  164. package/build/dist/Server/Services/AlertEpisodeService.js +885 -0
  165. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -0
  166. package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js +494 -0
  167. package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js.map +1 -0
  168. package/build/dist/Server/Services/AlertGroupingEngineService.js +893 -0
  169. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -0
  170. package/build/dist/Server/Services/AlertGroupingRuleService.js +13 -0
  171. package/build/dist/Server/Services/AlertGroupingRuleService.js.map +1 -0
  172. package/build/dist/Server/Services/AlertService.js +11 -0
  173. package/build/dist/Server/Services/AlertService.js.map +1 -1
  174. package/build/dist/Server/Services/CallService.js +11 -10
  175. package/build/dist/Server/Services/CallService.js.map +1 -1
  176. package/build/dist/Server/Services/Index.js +18 -0
  177. package/build/dist/Server/Services/Index.js.map +1 -1
  178. package/build/dist/Server/Services/MailService.js +3 -0
  179. package/build/dist/Server/Services/MailService.js.map +1 -1
  180. package/build/dist/Server/Services/OnCallDutyPolicyService.js +3 -0
  181. package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
  182. package/build/dist/Server/Services/SmsService.js +11 -10
  183. package/build/dist/Server/Services/SmsService.js.map +1 -1
  184. package/build/dist/Server/Services/UserNotificationSettingService.js +9 -0
  185. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  186. package/build/dist/Server/Services/WhatsAppService.js +3 -0
  187. package/build/dist/Server/Services/WhatsAppService.js.map +1 -1
  188. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +25 -0
  189. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  190. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +4 -2
  191. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  192. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +8 -0
  193. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  194. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes.js +17 -0
  195. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes.js.map +1 -1
  196. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +545 -0
  197. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -0
  198. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +13 -0
  199. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  200. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +10 -0
  201. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -1
  202. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +651 -0
  203. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -0
  204. package/build/dist/Server/Utils/Workspace/Slack/Messages/AlertEpisode.js +100 -0
  205. package/build/dist/Server/Utils/Workspace/Slack/Messages/AlertEpisode.js.map +1 -0
  206. package/build/dist/Server/Utils/Workspace/WorkspaceMessages/AlertEpisode.js +70 -0
  207. package/build/dist/Server/Utils/Workspace/WorkspaceMessages/AlertEpisode.js.map +1 -0
  208. package/build/dist/Tests/Server/Services/AlertEpisodeMemberService.test.js +165 -0
  209. package/build/dist/Tests/Server/Services/AlertEpisodeMemberService.test.js.map +1 -0
  210. package/build/dist/Tests/Server/Services/AlertEpisodeService.test.js +193 -0
  211. package/build/dist/Tests/Server/Services/AlertEpisodeService.test.js.map +1 -0
  212. package/build/dist/Tests/Server/Services/AlertGroupingEngineService.test.js +412 -0
  213. package/build/dist/Tests/Server/Services/AlertGroupingEngineService.test.js.map +1 -0
  214. package/build/dist/Tests/Server/Services/AlertGroupingRuleService.test.js +308 -0
  215. package/build/dist/Tests/Server/Services/AlertGroupingRuleService.test.js.map +1 -0
  216. package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js +1 -1
  217. package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js.map +1 -1
  218. package/build/dist/Tests/UI/Components/Input.test.js +1 -1
  219. package/build/dist/Tests/UI/Components/Input.test.js.map +1 -1
  220. package/build/dist/Tests/UI/Components/TextArea.test.js +2 -2
  221. package/build/dist/Tests/UI/Components/TextArea.test.js.map +1 -1
  222. package/build/dist/Types/BaseDatabase/SortOrder.js +5 -0
  223. package/build/dist/Types/BaseDatabase/SortOrder.js.map +1 -1
  224. package/build/dist/Types/Email/EmailTemplateType.js +4 -0
  225. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  226. package/build/dist/Types/NotificationRule/NotificationRuleType.js +1 -0
  227. package/build/dist/Types/NotificationRule/NotificationRuleType.js.map +1 -1
  228. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +5 -0
  229. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  230. package/build/dist/Types/Permission.js +264 -0
  231. package/build/dist/Types/Permission.js.map +1 -1
  232. package/build/dist/Types/UserNotification/UserNotificationEventType.js +1 -0
  233. package/build/dist/Types/UserNotification/UserNotificationEventType.js.map +1 -1
  234. package/build/dist/Types/WhatsApp/WhatsAppTemplates.js +12 -0
  235. package/build/dist/Types/WhatsApp/WhatsAppTemplates.js.map +1 -1
  236. package/build/dist/Types/Workspace/NotificationRules/EventType.js +1 -0
  237. package/build/dist/Types/Workspace/NotificationRules/EventType.js.map +1 -1
  238. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +28 -3
  239. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
  240. package/build/dist/UI/Components/Accordion/Accordion.js +10 -3
  241. package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
  242. package/build/dist/UI/Components/Alerts/Alert.js +1 -1
  243. package/build/dist/UI/Components/Alerts/Alert.js.map +1 -1
  244. package/build/dist/UI/Components/Button/Button.js +8 -2
  245. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  246. package/build/dist/UI/Components/CardSelect/CardSelect.js +1 -1
  247. package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
  248. package/build/dist/UI/Components/Checkbox/Checkbox.js +2 -2
  249. package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
  250. package/build/dist/UI/Components/ColorCircle/ColorCircle.js +1 -1
  251. package/build/dist/UI/Components/ColorCircle/ColorCircle.js.map +1 -1
  252. package/build/dist/UI/Components/ColorViewer/ColorViewer.js +12 -3
  253. package/build/dist/UI/Components/ColorViewer/ColorViewer.js.map +1 -1
  254. package/build/dist/UI/Components/CopyableButton/CopyableButton.js +12 -5
  255. package/build/dist/UI/Components/CopyableButton/CopyableButton.js.map +1 -1
  256. package/build/dist/UI/Components/Detail/Detail.js +1 -1
  257. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  258. package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -3
  259. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  260. package/build/dist/UI/Components/Forms/Fields/FormField.js +19 -1
  261. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  262. package/build/dist/UI/Components/FullPageModal/FullPageModal.js +24 -5
  263. package/build/dist/UI/Components/FullPageModal/FullPageModal.js.map +1 -1
  264. package/build/dist/UI/Components/Input/Input.js +3 -3
  265. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  266. package/build/dist/UI/Components/Link/Link.js +1 -1
  267. package/build/dist/UI/Components/Link/Link.js.map +1 -1
  268. package/build/dist/UI/Components/Loader/Loader.js +6 -4
  269. package/build/dist/UI/Components/Loader/Loader.js.map +1 -1
  270. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +56 -3
  271. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  272. package/build/dist/UI/Components/Modal/Modal.js +28 -3
  273. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  274. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +23 -1
  275. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  276. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +67 -6
  277. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  278. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +14 -3
  279. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  280. package/build/dist/UI/Components/Pagination/Pagination.js +69 -13
  281. package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
  282. package/build/dist/UI/Components/ProgressBar/ProgressBar.js +2 -2
  283. package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
  284. package/build/dist/UI/Components/Radio/Radio.js +8 -5
  285. package/build/dist/UI/Components/Radio/Radio.js.map +1 -1
  286. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -4
  287. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  288. package/build/dist/UI/Components/StatusBubble/StatusBubble.js +2 -2
  289. package/build/dist/UI/Components/StatusBubble/StatusBubble.js.map +1 -1
  290. package/build/dist/UI/Components/Table/TableHeader.js +12 -4
  291. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  292. package/build/dist/UI/Components/Tabs/Tab.js +8 -1
  293. package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
  294. package/build/dist/UI/Components/Tabs/Tabs.js +4 -3
  295. package/build/dist/UI/Components/Tabs/Tabs.js.map +1 -1
  296. package/build/dist/UI/Components/TextArea/TextArea.js +3 -3
  297. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  298. package/build/dist/UI/Components/Toggle/Toggle.js +7 -4
  299. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  300. package/build/dist/UI/Components/Tooltip/Tooltip.js +4 -1
  301. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  302. package/build/dist/UI/Components/TopAlert/TopAlert.js +1 -1
  303. package/build/dist/UI/Components/TopAlert/TopAlert.js.map +1 -1
  304. package/package.json +2 -1
@@ -0,0 +1,557 @@
1
+ import CreateBy from "../Types/Database/CreateBy";
2
+ import DeleteBy from "../Types/Database/DeleteBy";
3
+ import { OnCreate, OnDelete } from "../Types/Database/Hooks";
4
+ import QueryHelper from "../Types/Database/QueryHelper";
5
+ import DatabaseService from "./DatabaseService";
6
+ import AlertStateService from "./AlertStateService";
7
+ import UserService from "./UserService";
8
+ import SortOrder from "../../Types/BaseDatabase/SortOrder";
9
+ import OneUptimeDate from "../../Types/Date";
10
+ import BadDataException from "../../Types/Exception/BadDataException";
11
+ import ObjectID from "../../Types/ObjectID";
12
+ import PositiveNumber from "../../Types/PositiveNumber";
13
+ import AlertState from "../../Models/DatabaseModels/AlertState";
14
+ import AlertEpisode from "../../Models/DatabaseModels/AlertEpisode";
15
+ import AlertEpisodeStateTimeline from "../../Models/DatabaseModels/AlertEpisodeStateTimeline";
16
+ import { IsBillingEnabled } from "../EnvironmentConfig";
17
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
18
+ import logger from "../Utils/Logger";
19
+ import AlertEpisodeFeedService from "./AlertEpisodeFeedService";
20
+ import { AlertEpisodeFeedEventType } from "../../Models/DatabaseModels/AlertEpisodeFeed";
21
+ import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
22
+ import AlertEpisodeService from "./AlertEpisodeService";
23
+
24
+ export class Service extends DatabaseService<AlertEpisodeStateTimeline> {
25
+ public constructor() {
26
+ super(AlertEpisodeStateTimeline);
27
+ if (IsBillingEnabled) {
28
+ this.hardDeleteItemsOlderThanInDays("createdAt", 3 * 365); // 3 years
29
+ }
30
+ }
31
+
32
+ @CaptureSpan()
33
+ protected override async onBeforeCreate(
34
+ createBy: CreateBy<AlertEpisodeStateTimeline>,
35
+ ): Promise<OnCreate<AlertEpisodeStateTimeline>> {
36
+ if (!createBy.data.alertEpisodeId) {
37
+ throw new BadDataException("alertEpisodeId is null");
38
+ }
39
+
40
+ let mutex: SemaphoreMutex | null = null;
41
+
42
+ try {
43
+ if (!createBy.data.startsAt) {
44
+ createBy.data.startsAt = OneUptimeDate.getCurrentDate();
45
+ }
46
+
47
+ try {
48
+ mutex = await Semaphore.lock({
49
+ key: createBy.data.alertEpisodeId.toString(),
50
+ namespace: "AlertEpisodeStateTimeline.create",
51
+ });
52
+ } catch (err) {
53
+ logger.error(err);
54
+ }
55
+
56
+ if (
57
+ (createBy.data.createdByUserId ||
58
+ createBy.data.createdByUser ||
59
+ createBy.props.userId) &&
60
+ !createBy.data.rootCause
61
+ ) {
62
+ let userId: ObjectID | undefined = createBy.data.createdByUserId;
63
+
64
+ if (createBy.props.userId) {
65
+ userId = createBy.props.userId;
66
+ }
67
+
68
+ if (createBy.data.createdByUser && createBy.data.createdByUser.id) {
69
+ userId = createBy.data.createdByUser.id;
70
+ }
71
+
72
+ if (userId) {
73
+ createBy.data.rootCause = `Episode state created by ${await UserService.getUserMarkdownString(
74
+ {
75
+ userId: userId!,
76
+ projectId: createBy.data.projectId || createBy.props.tenantId!,
77
+ },
78
+ )}`;
79
+ }
80
+ }
81
+
82
+ const alertStateId: ObjectID | undefined | null =
83
+ createBy.data.alertStateId || createBy.data.alertState?.id;
84
+
85
+ if (!alertStateId) {
86
+ throw new BadDataException("alertStateId is null");
87
+ }
88
+
89
+ const stateBeforeThis: AlertEpisodeStateTimeline | null =
90
+ await this.findOneBy({
91
+ query: {
92
+ alertEpisodeId: createBy.data.alertEpisodeId,
93
+ startsAt: QueryHelper.lessThanEqualTo(createBy.data.startsAt),
94
+ },
95
+ sort: {
96
+ startsAt: SortOrder.Descending,
97
+ },
98
+ props: {
99
+ isRoot: true,
100
+ },
101
+ select: {
102
+ alertStateId: true,
103
+ alertState: {
104
+ order: true,
105
+ name: true,
106
+ },
107
+ startsAt: true,
108
+ endsAt: true,
109
+ },
110
+ });
111
+
112
+ logger.debug("State Before this");
113
+ logger.debug(stateBeforeThis);
114
+
115
+ // If this is the first state, then do not notify the owner.
116
+ if (!stateBeforeThis) {
117
+ // since this is the first status, do not notify the owner.
118
+ createBy.data.isOwnerNotified = true;
119
+ }
120
+
121
+ // Check if this new state and the previous state are same.
122
+ if (stateBeforeThis && stateBeforeThis.alertStateId && alertStateId) {
123
+ if (
124
+ stateBeforeThis.alertStateId.toString() === alertStateId.toString()
125
+ ) {
126
+ throw new BadDataException(
127
+ "Episode state cannot be same as previous state.",
128
+ );
129
+ }
130
+ }
131
+
132
+ const stateAfterThis: AlertEpisodeStateTimeline | null =
133
+ await this.findOneBy({
134
+ query: {
135
+ alertEpisodeId: createBy.data.alertEpisodeId,
136
+ startsAt: QueryHelper.greaterThan(createBy.data.startsAt),
137
+ },
138
+ sort: {
139
+ startsAt: SortOrder.Ascending,
140
+ },
141
+ props: {
142
+ isRoot: true,
143
+ },
144
+ select: {
145
+ alertStateId: true,
146
+ startsAt: true,
147
+ endsAt: true,
148
+ },
149
+ });
150
+
151
+ // compute ends at. It's the start of the next status.
152
+ if (stateAfterThis && stateAfterThis.startsAt) {
153
+ createBy.data.endsAt = stateAfterThis.startsAt;
154
+ }
155
+
156
+ // Check if this new state and the next state are same.
157
+ if (stateAfterThis && stateAfterThis.alertStateId && alertStateId) {
158
+ if (
159
+ stateAfterThis.alertStateId.toString() === alertStateId.toString()
160
+ ) {
161
+ throw new BadDataException(
162
+ "Episode state cannot be same as next state.",
163
+ );
164
+ }
165
+ }
166
+
167
+ logger.debug("State After this");
168
+ logger.debug(stateAfterThis);
169
+
170
+ return {
171
+ createBy,
172
+ carryForward: {
173
+ statusTimelineBeforeThisStatus: stateBeforeThis || null,
174
+ statusTimelineAfterThisStatus: stateAfterThis || null,
175
+ mutex: mutex,
176
+ },
177
+ };
178
+ } catch (error) {
179
+ // release the mutex if it was acquired.
180
+ if (mutex) {
181
+ try {
182
+ await Semaphore.release(mutex);
183
+ } catch (err) {
184
+ logger.error(err);
185
+ }
186
+ }
187
+
188
+ throw error;
189
+ }
190
+ }
191
+
192
+ @CaptureSpan()
193
+ protected override async onCreateSuccess(
194
+ onCreate: OnCreate<AlertEpisodeStateTimeline>,
195
+ createdItem: AlertEpisodeStateTimeline,
196
+ ): Promise<AlertEpisodeStateTimeline> {
197
+ if (!createdItem.alertEpisodeId) {
198
+ throw new BadDataException("alertEpisodeId is null");
199
+ }
200
+
201
+ const mutex: SemaphoreMutex | null = onCreate.carryForward.mutex;
202
+
203
+ if (!createdItem.alertStateId) {
204
+ throw new BadDataException("alertStateId is null");
205
+ }
206
+
207
+ logger.debug("Status Timeline Before this");
208
+ logger.debug(onCreate.carryForward.statusTimelineBeforeThisStatus);
209
+
210
+ logger.debug("Status Timeline After this");
211
+ logger.debug(onCreate.carryForward.statusTimelineAfterThisStatus);
212
+
213
+ logger.debug("Created Item");
214
+ logger.debug(createdItem);
215
+
216
+ // Handle timeline updates
217
+ if (!onCreate.carryForward.statusTimelineBeforeThisStatus) {
218
+ // This is the first status, no need to update previous status.
219
+ logger.debug("This is the first status.");
220
+ } else if (!onCreate.carryForward.statusTimelineAfterThisStatus) {
221
+ // This is the last status. Update the previous status to end at the start of this status.
222
+ await this.updateOneById({
223
+ id: onCreate.carryForward.statusTimelineBeforeThisStatus.id!,
224
+ data: {
225
+ endsAt: createdItem.startsAt!,
226
+ },
227
+ props: {
228
+ isRoot: true,
229
+ },
230
+ });
231
+ logger.debug("This is the last status.");
232
+ } else {
233
+ // This is in the middle. Update the previous status to end at the start of this status.
234
+ await this.updateOneById({
235
+ id: onCreate.carryForward.statusTimelineBeforeThisStatus.id!,
236
+ data: {
237
+ endsAt: createdItem.startsAt!,
238
+ },
239
+ props: {
240
+ isRoot: true,
241
+ },
242
+ });
243
+
244
+ // Update the next status to start at the end of this status.
245
+ await this.updateOneById({
246
+ id: onCreate.carryForward.statusTimelineAfterThisStatus.id!,
247
+ data: {
248
+ startsAt: createdItem.endsAt!,
249
+ },
250
+ props: {
251
+ isRoot: true,
252
+ },
253
+ });
254
+ logger.debug("This status is in the middle.");
255
+ }
256
+
257
+ // Update episode's current state if this is the latest timeline entry
258
+ if (!createdItem.endsAt) {
259
+ const updateData: {
260
+ currentAlertStateId: ObjectID;
261
+ resolvedAt?: Date | null;
262
+ } = {
263
+ currentAlertStateId: createdItem.alertStateId,
264
+ };
265
+
266
+ // Check if the new state is a resolved state and update resolvedAt accordingly
267
+ const newAlertState: AlertState | null =
268
+ await AlertStateService.findOneById({
269
+ id: createdItem.alertStateId,
270
+ select: {
271
+ isResolvedState: true,
272
+ },
273
+ props: {
274
+ isRoot: true,
275
+ },
276
+ });
277
+
278
+ if (newAlertState?.isResolvedState) {
279
+ // Set resolvedAt when transitioning to resolved state
280
+ updateData.resolvedAt = OneUptimeDate.getCurrentDate();
281
+ } else {
282
+ // Clear resolvedAt when transitioning away from resolved state
283
+ updateData.resolvedAt = null;
284
+ }
285
+
286
+ await AlertEpisodeService.updateOneBy({
287
+ query: {
288
+ _id: createdItem.alertEpisodeId?.toString(),
289
+ },
290
+ data: updateData,
291
+ props: onCreate.createBy.props,
292
+ });
293
+
294
+ // Cascade state change to all member alerts
295
+ if (createdItem.projectId) {
296
+ try {
297
+ await AlertEpisodeService.cascadeStateToMemberAlerts({
298
+ projectId: createdItem.projectId,
299
+ episodeId: createdItem.alertEpisodeId,
300
+ alertStateId: createdItem.alertStateId,
301
+ props: {
302
+ isRoot: true,
303
+ },
304
+ });
305
+ } catch (error) {
306
+ logger.error(
307
+ `Failed to cascade state change to member alerts: ${error}`,
308
+ );
309
+ }
310
+ }
311
+ }
312
+
313
+ if (mutex) {
314
+ try {
315
+ await Semaphore.release(mutex);
316
+ } catch (err) {
317
+ logger.error(err);
318
+ }
319
+ }
320
+
321
+ const alertState: AlertState | null = await AlertStateService.findOneBy({
322
+ query: {
323
+ _id: createdItem.alertStateId.toString()!,
324
+ },
325
+ props: {
326
+ isRoot: true,
327
+ },
328
+ select: {
329
+ _id: true,
330
+ isResolvedState: true,
331
+ isAcknowledgedState: true,
332
+ isCreatedState: true,
333
+ color: true,
334
+ name: true,
335
+ },
336
+ });
337
+
338
+ const stateName: string = alertState?.name || "";
339
+ let stateEmoji: string = "➡️";
340
+
341
+ if (alertState?.isResolvedState) {
342
+ stateEmoji = "✅";
343
+ } else if (alertState?.isAcknowledgedState) {
344
+ stateEmoji = "👀";
345
+ } else if (alertState?.isCreatedState) {
346
+ stateEmoji = "🔴";
347
+ }
348
+
349
+ const episode: AlertEpisode | null = await AlertEpisodeService.findOneById({
350
+ id: createdItem.alertEpisodeId,
351
+ select: {
352
+ episodeNumber: true,
353
+ },
354
+ props: {
355
+ isRoot: true,
356
+ },
357
+ });
358
+
359
+ const episodeNumber: number = episode?.episodeNumber || 0;
360
+
361
+ await AlertEpisodeFeedService.createAlertEpisodeFeedItem({
362
+ alertEpisodeId: createdItem.alertEpisodeId!,
363
+ projectId: createdItem.projectId!,
364
+ alertEpisodeFeedEventType: AlertEpisodeFeedEventType.EpisodeStateChanged,
365
+ displayColor: alertState?.color,
366
+ feedInfoInMarkdown:
367
+ stateEmoji +
368
+ ` Changed **Episode ${episodeNumber} State** to **` +
369
+ stateName +
370
+ "**",
371
+ moreInformationInMarkdown: createdItem.rootCause
372
+ ? `**Cause:** \n${createdItem.rootCause}`
373
+ : undefined,
374
+ userId: createdItem.createdByUserId || onCreate.createBy.props.userId,
375
+ });
376
+
377
+ return createdItem;
378
+ }
379
+
380
+ @CaptureSpan()
381
+ protected override async onBeforeDelete(
382
+ deleteBy: DeleteBy<AlertEpisodeStateTimeline>,
383
+ ): Promise<OnDelete<AlertEpisodeStateTimeline>> {
384
+ if (deleteBy.query._id) {
385
+ const episodeStateTimelineToBeDeleted: AlertEpisodeStateTimeline | null =
386
+ await this.findOneById({
387
+ id: new ObjectID(deleteBy.query._id as string),
388
+ select: {
389
+ alertEpisodeId: true,
390
+ startsAt: true,
391
+ endsAt: true,
392
+ },
393
+ props: {
394
+ isRoot: true,
395
+ },
396
+ });
397
+
398
+ const episodeId: ObjectID | undefined =
399
+ episodeStateTimelineToBeDeleted?.alertEpisodeId;
400
+
401
+ if (episodeId) {
402
+ const episodeStateTimeline: PositiveNumber = await this.countBy({
403
+ query: {
404
+ alertEpisodeId: episodeId,
405
+ },
406
+ props: {
407
+ isRoot: true,
408
+ },
409
+ });
410
+
411
+ if (!episodeStateTimelineToBeDeleted) {
412
+ throw new BadDataException("Episode state timeline not found.");
413
+ }
414
+
415
+ if (episodeStateTimeline.isOne()) {
416
+ throw new BadDataException(
417
+ "Cannot delete the only state timeline. Episode should have at least one state in its timeline.",
418
+ );
419
+ }
420
+
421
+ // Handle timeline adjustments
422
+ const stateBeforeThis: AlertEpisodeStateTimeline | null =
423
+ await this.findOneBy({
424
+ query: {
425
+ _id: QueryHelper.notEquals(deleteBy.query._id as string),
426
+ alertEpisodeId: episodeId,
427
+ startsAt: QueryHelper.lessThanEqualTo(
428
+ episodeStateTimelineToBeDeleted.startsAt!,
429
+ ),
430
+ },
431
+ sort: {
432
+ startsAt: SortOrder.Descending,
433
+ },
434
+ props: {
435
+ isRoot: true,
436
+ },
437
+ select: {
438
+ alertStateId: true,
439
+ startsAt: true,
440
+ endsAt: true,
441
+ },
442
+ });
443
+
444
+ const stateAfterThis: AlertEpisodeStateTimeline | null =
445
+ await this.findOneBy({
446
+ query: {
447
+ alertEpisodeId: episodeId,
448
+ startsAt: QueryHelper.greaterThan(
449
+ episodeStateTimelineToBeDeleted.startsAt!,
450
+ ),
451
+ },
452
+ sort: {
453
+ startsAt: SortOrder.Ascending,
454
+ },
455
+ props: {
456
+ isRoot: true,
457
+ },
458
+ select: {
459
+ alertStateId: true,
460
+ startsAt: true,
461
+ endsAt: true,
462
+ },
463
+ });
464
+
465
+ if (!stateBeforeThis) {
466
+ // This is the first state, no need to update previous state.
467
+ logger.debug("This is the first state.");
468
+ } else if (!stateAfterThis) {
469
+ // This is the last state. Update the previous state to end at the end of this state.
470
+ await this.updateOneById({
471
+ id: stateBeforeThis.id!,
472
+ data: {
473
+ endsAt: episodeStateTimelineToBeDeleted.endsAt!,
474
+ },
475
+ props: {
476
+ isRoot: true,
477
+ },
478
+ });
479
+ logger.debug("This is the last state.");
480
+ } else {
481
+ // This state is in the middle. Update the previous state to end at the start of the next state.
482
+ await this.updateOneById({
483
+ id: stateBeforeThis.id!,
484
+ data: {
485
+ endsAt: stateAfterThis.startsAt!,
486
+ },
487
+ props: {
488
+ isRoot: true,
489
+ },
490
+ });
491
+
492
+ // Update the next state to start at the start of this state.
493
+ await this.updateOneById({
494
+ id: stateAfterThis.id!,
495
+ data: {
496
+ startsAt: episodeStateTimelineToBeDeleted.startsAt!,
497
+ },
498
+ props: {
499
+ isRoot: true,
500
+ },
501
+ });
502
+ logger.debug("This state is in the middle.");
503
+ }
504
+ }
505
+
506
+ return { deleteBy, carryForward: episodeId };
507
+ }
508
+
509
+ return { deleteBy, carryForward: null };
510
+ }
511
+
512
+ @CaptureSpan()
513
+ protected override async onDeleteSuccess(
514
+ onDelete: OnDelete<AlertEpisodeStateTimeline>,
515
+ _itemIdsBeforeDelete: ObjectID[],
516
+ ): Promise<OnDelete<AlertEpisodeStateTimeline>> {
517
+ if (onDelete.carryForward) {
518
+ const episodeId: ObjectID = onDelete.carryForward as ObjectID;
519
+
520
+ // Get last status of this episode.
521
+ const episodeStateTimeline: AlertEpisodeStateTimeline | null =
522
+ await this.findOneBy({
523
+ query: {
524
+ alertEpisodeId: episodeId,
525
+ },
526
+ sort: {
527
+ startsAt: SortOrder.Descending,
528
+ },
529
+ props: {
530
+ isRoot: true,
531
+ },
532
+ select: {
533
+ _id: true,
534
+ alertStateId: true,
535
+ },
536
+ });
537
+
538
+ if (episodeStateTimeline && episodeStateTimeline.alertStateId) {
539
+ await AlertEpisodeService.updateOneBy({
540
+ query: {
541
+ _id: episodeId.toString(),
542
+ },
543
+ data: {
544
+ currentAlertStateId: episodeStateTimeline.alertStateId,
545
+ },
546
+ props: {
547
+ isRoot: true,
548
+ },
549
+ });
550
+ }
551
+ }
552
+
553
+ return onDelete;
554
+ }
555
+ }
556
+
557
+ export default new Service();