@oneuptime/common 9.4.7 → 9.4.9

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 (342) 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/OnCallDutyPolicyExecutionLogTimeline.ts +59 -0
  14. package/Models/DatabaseModels/StatusPageDomain.ts +2 -0
  15. package/Models/DatabaseModels/UserOnCallLog.ts +48 -0
  16. package/Models/DatabaseModels/UserOnCallLogTimeline.ts +49 -0
  17. package/Models/DatabaseModels/WorkspaceNotificationLog.ts +57 -0
  18. package/Server/API/SlackAPI.ts +21 -0
  19. package/Server/API/UserOnCallLogTimelineAPI.ts +65 -25
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1768938069147-MigrationName.ts +751 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1769125561322-MigrationName.ts +41 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1769170578688-MigrationName.ts +29 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1769172358833-MigrationName.ts +177 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1769176450526-MigrationName.ts +71 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1769190495840-MigrationName.ts +35 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1769199303656-MigrationName.ts +29 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1769202898645-MigrationName.ts +29 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1769428619414-MigrationName.ts +35 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1769428821686-MigrationName.ts +47 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1769469813786-MigrationName.ts +71 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1769517677937-RenameNotificationRuleTypes.ts +67 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +24 -0
  33. package/Server/Services/AlertEpisodeFeedService.ts +94 -0
  34. package/Server/Services/AlertEpisodeInternalNoteService.ts +71 -0
  35. package/Server/Services/AlertEpisodeMemberService.ts +267 -0
  36. package/Server/Services/AlertEpisodeOwnerTeamService.ts +10 -0
  37. package/Server/Services/AlertEpisodeOwnerUserService.ts +10 -0
  38. package/Server/Services/AlertEpisodeService.ts +1096 -0
  39. package/Server/Services/AlertEpisodeStateTimelineService.ts +557 -0
  40. package/Server/Services/AlertGroupingEngineService.ts +1120 -0
  41. package/Server/Services/AlertGroupingRuleService.ts +14 -0
  42. package/Server/Services/AlertService.ts +12 -0
  43. package/Server/Services/CallService.ts +2 -0
  44. package/Server/Services/Index.ts +21 -0
  45. package/Server/Services/MailService.ts +5 -0
  46. package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +18 -1
  47. package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +64 -2
  48. package/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.ts +27 -1
  49. package/Server/Services/OnCallDutyPolicyService.ts +16 -1
  50. package/Server/Services/PushNotificationService.ts +1 -0
  51. package/Server/Services/SmsService.ts +2 -0
  52. package/Server/Services/UserNotificationRuleService.ts +641 -10
  53. package/Server/Services/UserNotificationSettingService.ts +23 -0
  54. package/Server/Services/UserOnCallLogService.ts +58 -14
  55. package/Server/Services/WhatsAppService.ts +5 -0
  56. package/Server/Services/WorkspaceNotificationRuleService.ts +26 -0
  57. package/Server/Utils/AnalyticsDatabase/Statement.ts +6 -2
  58. package/Server/Utils/PushNotificationUtil.ts +75 -16
  59. package/Server/Utils/WhatsAppTemplateUtil.ts +13 -0
  60. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes.ts +18 -0
  61. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +689 -0
  62. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +16 -0
  63. package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +11 -0
  64. package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +915 -0
  65. package/Server/Utils/Workspace/Slack/Messages/AlertEpisode.ts +120 -0
  66. package/Server/Utils/Workspace/WorkspaceMessages/AlertEpisode.ts +74 -0
  67. package/Tests/Server/Services/AlertEpisodeMemberService.test.ts +200 -0
  68. package/Tests/Server/Services/AlertEpisodeService.test.ts +240 -0
  69. package/Tests/Server/Services/AlertGroupingEngineService.test.ts +542 -0
  70. package/Tests/Server/Services/AlertGroupingRuleService.test.ts +383 -0
  71. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +1 -1
  72. package/Tests/UI/Components/Input.test.tsx +1 -1
  73. package/Tests/UI/Components/TextArea.test.tsx +2 -2
  74. package/Types/BaseDatabase/SortOrder.ts +9 -0
  75. package/Types/Email/EmailTemplateType.ts +6 -0
  76. package/Types/NotificationRule/NotificationRuleType.ts +3 -1
  77. package/Types/NotificationSetting/NotificationSettingEventType.ts +7 -0
  78. package/Types/Permission.ts +309 -0
  79. package/Types/UserNotification/UserNotificationEventType.ts +1 -0
  80. package/Types/WhatsApp/WhatsAppTemplates.ts +24 -0
  81. package/Types/Workspace/NotificationRules/EventType.ts +1 -0
  82. package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +32 -3
  83. package/UI/Components/Accordion/Accordion.tsx +20 -2
  84. package/UI/Components/Alerts/Alert.tsx +1 -0
  85. package/UI/Components/Button/Button.tsx +29 -0
  86. package/UI/Components/CardSelect/CardSelect.tsx +5 -1
  87. package/UI/Components/Checkbox/Checkbox.tsx +7 -3
  88. package/UI/Components/ColorCircle/ColorCircle.tsx +2 -0
  89. package/UI/Components/ColorViewer/ColorViewer.tsx +19 -3
  90. package/UI/Components/CopyableButton/CopyableButton.tsx +22 -5
  91. package/UI/Components/Detail/Detail.tsx +1 -1
  92. package/UI/Components/Dropdown/Dropdown.tsx +14 -1
  93. package/UI/Components/Forms/Fields/FormField.tsx +28 -0
  94. package/UI/Components/FullPageModal/FullPageModal.tsx +35 -4
  95. package/UI/Components/Input/Input.tsx +14 -2
  96. package/UI/Components/Link/Link.tsx +1 -0
  97. package/UI/Components/Loader/Loader.tsx +8 -2
  98. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +76 -1
  99. package/UI/Components/Modal/Modal.tsx +47 -3
  100. package/UI/Components/ModelTable/BaseModelTable.tsx +42 -1
  101. package/UI/Components/MoreMenu/MoreMenu.tsx +84 -2
  102. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +30 -8
  103. package/UI/Components/Pagination/Pagination.tsx +113 -8
  104. package/UI/Components/ProgressBar/ProgressBar.tsx +12 -2
  105. package/UI/Components/Radio/Radio.tsx +21 -3
  106. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +54 -27
  107. package/UI/Components/StatusBubble/StatusBubble.tsx +7 -2
  108. package/UI/Components/Table/TableHeader.tsx +20 -3
  109. package/UI/Components/Tabs/Tab.tsx +16 -1
  110. package/UI/Components/Tabs/Tabs.tsx +12 -1
  111. package/UI/Components/TextArea/TextArea.tsx +12 -2
  112. package/UI/Components/Toggle/Toggle.tsx +14 -3
  113. package/UI/Components/Tooltip/Tooltip.tsx +11 -1
  114. package/UI/Components/TopAlert/TopAlert.tsx +2 -0
  115. package/build/dist/Models/DatabaseModels/Alert.js +77 -0
  116. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  117. package/build/dist/Models/DatabaseModels/AlertEpisode.js +1225 -0
  118. package/build/dist/Models/DatabaseModels/AlertEpisode.js.map +1 -0
  119. package/build/dist/Models/DatabaseModels/AlertEpisodeFeed.js +553 -0
  120. package/build/dist/Models/DatabaseModels/AlertEpisodeFeed.js.map +1 -0
  121. package/build/dist/Models/DatabaseModels/AlertEpisodeInternalNote.js +467 -0
  122. package/build/dist/Models/DatabaseModels/AlertEpisodeInternalNote.js.map +1 -0
  123. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +607 -0
  124. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -0
  125. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js +437 -0
  126. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js.map +1 -0
  127. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js +436 -0
  128. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js.map +1 -0
  129. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +546 -0
  130. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -0
  131. package/build/dist/Models/DatabaseModels/AlertFeed.js +1 -0
  132. package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
  133. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +1437 -0
  134. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -0
  135. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  136. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  137. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +69 -0
  138. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
  139. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js +58 -0
  140. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js.map +1 -1
  141. package/build/dist/Models/DatabaseModels/StatusPageDomain.js +2 -0
  142. package/build/dist/Models/DatabaseModels/StatusPageDomain.js.map +1 -1
  143. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +47 -0
  144. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  145. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +48 -0
  146. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
  147. package/build/dist/Models/DatabaseModels/WorkspaceNotificationLog.js +58 -0
  148. package/build/dist/Models/DatabaseModels/WorkspaceNotificationLog.js.map +1 -1
  149. package/build/dist/Server/API/SlackAPI.js +18 -0
  150. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  151. package/build/dist/Server/API/UserOnCallLogTimelineAPI.js +55 -15
  152. package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
  153. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768938069147-MigrationName.js +266 -0
  154. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768938069147-MigrationName.js.map +1 -0
  155. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769125561322-MigrationName.js +20 -0
  156. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769125561322-MigrationName.js.map +1 -0
  157. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769170578688-MigrationName.js +16 -0
  158. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769170578688-MigrationName.js.map +1 -0
  159. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769172358833-MigrationName.js +68 -0
  160. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769172358833-MigrationName.js.map +1 -0
  161. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769176450526-MigrationName.js +30 -0
  162. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769176450526-MigrationName.js.map +1 -0
  163. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769190495840-MigrationName.js +18 -0
  164. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769190495840-MigrationName.js.map +1 -0
  165. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769199303656-MigrationName.js +16 -0
  166. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769199303656-MigrationName.js.map +1 -0
  167. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769202898645-MigrationName.js +16 -0
  168. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769202898645-MigrationName.js.map +1 -0
  169. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769428619414-MigrationName.js +18 -0
  170. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769428619414-MigrationName.js.map +1 -0
  171. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769428821686-MigrationName.js +22 -0
  172. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769428821686-MigrationName.js.map +1 -0
  173. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769469813786-MigrationName.js +30 -0
  174. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769469813786-MigrationName.js.map +1 -0
  175. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769517677937-RenameNotificationRuleTypes.js +67 -0
  176. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769517677937-RenameNotificationRuleTypes.js.map +1 -0
  177. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +24 -0
  178. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  179. package/build/dist/Server/Services/AlertEpisodeFeedService.js +83 -0
  180. package/build/dist/Server/Services/AlertEpisodeFeedService.js.map +1 -0
  181. package/build/dist/Server/Services/AlertEpisodeInternalNoteService.js +70 -0
  182. package/build/dist/Server/Services/AlertEpisodeInternalNoteService.js.map +1 -0
  183. package/build/dist/Server/Services/AlertEpisodeMemberService.js +256 -0
  184. package/build/dist/Server/Services/AlertEpisodeMemberService.js.map +1 -0
  185. package/build/dist/Server/Services/AlertEpisodeOwnerTeamService.js +9 -0
  186. package/build/dist/Server/Services/AlertEpisodeOwnerTeamService.js.map +1 -0
  187. package/build/dist/Server/Services/AlertEpisodeOwnerUserService.js +9 -0
  188. package/build/dist/Server/Services/AlertEpisodeOwnerUserService.js.map +1 -0
  189. package/build/dist/Server/Services/AlertEpisodeService.js +973 -0
  190. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -0
  191. package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js +494 -0
  192. package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js.map +1 -0
  193. package/build/dist/Server/Services/AlertGroupingEngineService.js +893 -0
  194. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -0
  195. package/build/dist/Server/Services/AlertGroupingRuleService.js +13 -0
  196. package/build/dist/Server/Services/AlertGroupingRuleService.js.map +1 -0
  197. package/build/dist/Server/Services/AlertService.js +11 -0
  198. package/build/dist/Server/Services/AlertService.js.map +1 -1
  199. package/build/dist/Server/Services/CallService.js +11 -10
  200. package/build/dist/Server/Services/CallService.js.map +1 -1
  201. package/build/dist/Server/Services/Index.js +18 -0
  202. package/build/dist/Server/Services/Index.js.map +1 -1
  203. package/build/dist/Server/Services/MailService.js +3 -0
  204. package/build/dist/Server/Services/MailService.js.map +1 -1
  205. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +10 -1
  206. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
  207. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +49 -2
  208. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
  209. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js +21 -1
  210. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js.map +1 -1
  211. package/build/dist/Server/Services/OnCallDutyPolicyService.js +9 -1
  212. package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
  213. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  214. package/build/dist/Server/Services/SmsService.js +11 -10
  215. package/build/dist/Server/Services/SmsService.js.map +1 -1
  216. package/build/dist/Server/Services/UserNotificationRuleService.js +521 -43
  217. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  218. package/build/dist/Server/Services/UserNotificationSettingService.js +9 -0
  219. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  220. package/build/dist/Server/Services/UserOnCallLogService.js +48 -12
  221. package/build/dist/Server/Services/UserOnCallLogService.js.map +1 -1
  222. package/build/dist/Server/Services/WhatsAppService.js +3 -0
  223. package/build/dist/Server/Services/WhatsAppService.js.map +1 -1
  224. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +25 -0
  225. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  226. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +4 -2
  227. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  228. package/build/dist/Server/Utils/PushNotificationUtil.js +51 -16
  229. package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
  230. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +8 -0
  231. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  232. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes.js +17 -0
  233. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes.js.map +1 -1
  234. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +545 -0
  235. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -0
  236. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +13 -0
  237. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  238. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +10 -0
  239. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -1
  240. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +651 -0
  241. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -0
  242. package/build/dist/Server/Utils/Workspace/Slack/Messages/AlertEpisode.js +100 -0
  243. package/build/dist/Server/Utils/Workspace/Slack/Messages/AlertEpisode.js.map +1 -0
  244. package/build/dist/Server/Utils/Workspace/WorkspaceMessages/AlertEpisode.js +70 -0
  245. package/build/dist/Server/Utils/Workspace/WorkspaceMessages/AlertEpisode.js.map +1 -0
  246. package/build/dist/Tests/Server/Services/AlertEpisodeMemberService.test.js +165 -0
  247. package/build/dist/Tests/Server/Services/AlertEpisodeMemberService.test.js.map +1 -0
  248. package/build/dist/Tests/Server/Services/AlertEpisodeService.test.js +193 -0
  249. package/build/dist/Tests/Server/Services/AlertEpisodeService.test.js.map +1 -0
  250. package/build/dist/Tests/Server/Services/AlertGroupingEngineService.test.js +412 -0
  251. package/build/dist/Tests/Server/Services/AlertGroupingEngineService.test.js.map +1 -0
  252. package/build/dist/Tests/Server/Services/AlertGroupingRuleService.test.js +308 -0
  253. package/build/dist/Tests/Server/Services/AlertGroupingRuleService.test.js.map +1 -0
  254. package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js +1 -1
  255. package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js.map +1 -1
  256. package/build/dist/Tests/UI/Components/Input.test.js +1 -1
  257. package/build/dist/Tests/UI/Components/Input.test.js.map +1 -1
  258. package/build/dist/Tests/UI/Components/TextArea.test.js +2 -2
  259. package/build/dist/Tests/UI/Components/TextArea.test.js.map +1 -1
  260. package/build/dist/Types/BaseDatabase/SortOrder.js +5 -0
  261. package/build/dist/Types/BaseDatabase/SortOrder.js.map +1 -1
  262. package/build/dist/Types/Email/EmailTemplateType.js +5 -0
  263. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  264. package/build/dist/Types/NotificationRule/NotificationRuleType.js +3 -1
  265. package/build/dist/Types/NotificationRule/NotificationRuleType.js.map +1 -1
  266. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +5 -0
  267. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  268. package/build/dist/Types/Permission.js +264 -0
  269. package/build/dist/Types/Permission.js.map +1 -1
  270. package/build/dist/Types/UserNotification/UserNotificationEventType.js +1 -0
  271. package/build/dist/Types/UserNotification/UserNotificationEventType.js.map +1 -1
  272. package/build/dist/Types/WhatsApp/WhatsAppTemplates.js +15 -0
  273. package/build/dist/Types/WhatsApp/WhatsAppTemplates.js.map +1 -1
  274. package/build/dist/Types/Workspace/NotificationRules/EventType.js +1 -0
  275. package/build/dist/Types/Workspace/NotificationRules/EventType.js.map +1 -1
  276. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +28 -3
  277. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
  278. package/build/dist/UI/Components/Accordion/Accordion.js +10 -3
  279. package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
  280. package/build/dist/UI/Components/Alerts/Alert.js +1 -1
  281. package/build/dist/UI/Components/Alerts/Alert.js.map +1 -1
  282. package/build/dist/UI/Components/Button/Button.js +8 -2
  283. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  284. package/build/dist/UI/Components/CardSelect/CardSelect.js +1 -1
  285. package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
  286. package/build/dist/UI/Components/Checkbox/Checkbox.js +2 -2
  287. package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
  288. package/build/dist/UI/Components/ColorCircle/ColorCircle.js +1 -1
  289. package/build/dist/UI/Components/ColorCircle/ColorCircle.js.map +1 -1
  290. package/build/dist/UI/Components/ColorViewer/ColorViewer.js +12 -3
  291. package/build/dist/UI/Components/ColorViewer/ColorViewer.js.map +1 -1
  292. package/build/dist/UI/Components/CopyableButton/CopyableButton.js +12 -5
  293. package/build/dist/UI/Components/CopyableButton/CopyableButton.js.map +1 -1
  294. package/build/dist/UI/Components/Detail/Detail.js +1 -1
  295. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  296. package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -3
  297. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  298. package/build/dist/UI/Components/Forms/Fields/FormField.js +19 -1
  299. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  300. package/build/dist/UI/Components/FullPageModal/FullPageModal.js +24 -5
  301. package/build/dist/UI/Components/FullPageModal/FullPageModal.js.map +1 -1
  302. package/build/dist/UI/Components/Input/Input.js +3 -3
  303. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  304. package/build/dist/UI/Components/Link/Link.js +1 -1
  305. package/build/dist/UI/Components/Link/Link.js.map +1 -1
  306. package/build/dist/UI/Components/Loader/Loader.js +6 -4
  307. package/build/dist/UI/Components/Loader/Loader.js.map +1 -1
  308. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +56 -3
  309. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  310. package/build/dist/UI/Components/Modal/Modal.js +28 -3
  311. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  312. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +23 -1
  313. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  314. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +67 -6
  315. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  316. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +14 -3
  317. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  318. package/build/dist/UI/Components/Pagination/Pagination.js +69 -13
  319. package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
  320. package/build/dist/UI/Components/ProgressBar/ProgressBar.js +2 -2
  321. package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
  322. package/build/dist/UI/Components/Radio/Radio.js +8 -5
  323. package/build/dist/UI/Components/Radio/Radio.js.map +1 -1
  324. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -4
  325. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  326. package/build/dist/UI/Components/StatusBubble/StatusBubble.js +2 -2
  327. package/build/dist/UI/Components/StatusBubble/StatusBubble.js.map +1 -1
  328. package/build/dist/UI/Components/Table/TableHeader.js +12 -4
  329. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  330. package/build/dist/UI/Components/Tabs/Tab.js +8 -1
  331. package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
  332. package/build/dist/UI/Components/Tabs/Tabs.js +4 -3
  333. package/build/dist/UI/Components/Tabs/Tabs.js.map +1 -1
  334. package/build/dist/UI/Components/TextArea/TextArea.js +3 -3
  335. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  336. package/build/dist/UI/Components/Toggle/Toggle.js +7 -4
  337. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  338. package/build/dist/UI/Components/Tooltip/Tooltip.js +4 -1
  339. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  340. package/build/dist/UI/Components/TopAlert/TopAlert.js +1 -1
  341. package/build/dist/UI/Components/TopAlert/TopAlert.js.map +1 -1
  342. 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();