@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.
- package/Models/DatabaseModels/Alert.ts +76 -0
- package/Models/DatabaseModels/AlertEpisode.ts +1201 -0
- package/Models/DatabaseModels/AlertEpisodeFeed.ts +529 -0
- package/Models/DatabaseModels/AlertEpisodeInternalNote.ts +455 -0
- package/Models/DatabaseModels/AlertEpisodeMember.ts +586 -0
- package/Models/DatabaseModels/AlertEpisodeOwnerTeam.ts +421 -0
- package/Models/DatabaseModels/AlertEpisodeOwnerUser.ts +419 -0
- package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +523 -0
- package/Models/DatabaseModels/AlertFeed.ts +1 -0
- package/Models/DatabaseModels/AlertGroupingRule.ts +1432 -0
- package/Models/DatabaseModels/Index.ts +18 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +70 -0
- package/Models/DatabaseModels/StatusPageDomain.ts +2 -0
- package/Models/DatabaseModels/WorkspaceNotificationLog.ts +57 -0
- package/Server/API/SlackAPI.ts +21 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1768938069147-MigrationName.ts +751 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1769125561322-MigrationName.ts +41 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1769170578688-MigrationName.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1769172358833-MigrationName.ts +177 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1769176450526-MigrationName.ts +71 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1769190495840-MigrationName.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1769199303656-MigrationName.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1769202898645-MigrationName.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1769428619414-MigrationName.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1769428821686-MigrationName.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +20 -0
- package/Server/Services/AlertEpisodeFeedService.ts +94 -0
- package/Server/Services/AlertEpisodeInternalNoteService.ts +71 -0
- package/Server/Services/AlertEpisodeMemberService.ts +267 -0
- package/Server/Services/AlertEpisodeOwnerTeamService.ts +10 -0
- package/Server/Services/AlertEpisodeOwnerUserService.ts +10 -0
- package/Server/Services/AlertEpisodeService.ts +988 -0
- package/Server/Services/AlertEpisodeStateTimelineService.ts +557 -0
- package/Server/Services/AlertGroupingEngineService.ts +1120 -0
- package/Server/Services/AlertGroupingRuleService.ts +14 -0
- package/Server/Services/AlertService.ts +12 -0
- package/Server/Services/CallService.ts +2 -0
- package/Server/Services/Index.ts +21 -0
- package/Server/Services/MailService.ts +5 -0
- package/Server/Services/OnCallDutyPolicyService.ts +5 -0
- package/Server/Services/SmsService.ts +2 -0
- package/Server/Services/UserNotificationSettingService.ts +23 -0
- package/Server/Services/WhatsAppService.ts +5 -0
- package/Server/Services/WorkspaceNotificationRuleService.ts +26 -0
- package/Server/Utils/AnalyticsDatabase/Statement.ts +6 -2
- package/Server/Utils/WhatsAppTemplateUtil.ts +13 -0
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes.ts +18 -0
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +689 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +16 -0
- package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +11 -0
- package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +915 -0
- package/Server/Utils/Workspace/Slack/Messages/AlertEpisode.ts +120 -0
- package/Server/Utils/Workspace/WorkspaceMessages/AlertEpisode.ts +74 -0
- package/Tests/Server/Services/AlertEpisodeMemberService.test.ts +200 -0
- package/Tests/Server/Services/AlertEpisodeService.test.ts +240 -0
- package/Tests/Server/Services/AlertGroupingEngineService.test.ts +542 -0
- package/Tests/Server/Services/AlertGroupingRuleService.test.ts +383 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +1 -1
- package/Tests/UI/Components/Input.test.tsx +1 -1
- package/Tests/UI/Components/TextArea.test.tsx +2 -2
- package/Types/BaseDatabase/SortOrder.ts +9 -0
- package/Types/Email/EmailTemplateType.ts +5 -0
- package/Types/NotificationRule/NotificationRuleType.ts +1 -0
- package/Types/NotificationSetting/NotificationSettingEventType.ts +7 -0
- package/Types/Permission.ts +309 -0
- package/Types/UserNotification/UserNotificationEventType.ts +1 -0
- package/Types/WhatsApp/WhatsAppTemplates.ts +20 -0
- package/Types/Workspace/NotificationRules/EventType.ts +1 -0
- package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +32 -3
- package/UI/Components/Accordion/Accordion.tsx +20 -2
- package/UI/Components/Alerts/Alert.tsx +1 -0
- package/UI/Components/Button/Button.tsx +29 -0
- package/UI/Components/CardSelect/CardSelect.tsx +5 -1
- package/UI/Components/Checkbox/Checkbox.tsx +7 -3
- package/UI/Components/ColorCircle/ColorCircle.tsx +2 -0
- package/UI/Components/ColorViewer/ColorViewer.tsx +19 -3
- package/UI/Components/CopyableButton/CopyableButton.tsx +22 -5
- package/UI/Components/Detail/Detail.tsx +1 -1
- package/UI/Components/Dropdown/Dropdown.tsx +14 -1
- package/UI/Components/Forms/Fields/FormField.tsx +28 -0
- package/UI/Components/FullPageModal/FullPageModal.tsx +35 -4
- package/UI/Components/Input/Input.tsx +14 -2
- package/UI/Components/Link/Link.tsx +1 -0
- package/UI/Components/Loader/Loader.tsx +8 -2
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +76 -1
- package/UI/Components/Modal/Modal.tsx +47 -3
- package/UI/Components/ModelTable/BaseModelTable.tsx +42 -1
- package/UI/Components/MoreMenu/MoreMenu.tsx +84 -2
- package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +30 -8
- package/UI/Components/Pagination/Pagination.tsx +113 -8
- package/UI/Components/ProgressBar/ProgressBar.tsx +12 -2
- package/UI/Components/Radio/Radio.tsx +21 -3
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +54 -27
- package/UI/Components/StatusBubble/StatusBubble.tsx +7 -2
- package/UI/Components/Table/TableHeader.tsx +20 -3
- package/UI/Components/Tabs/Tab.tsx +16 -1
- package/UI/Components/Tabs/Tabs.tsx +12 -1
- package/UI/Components/TextArea/TextArea.tsx +12 -2
- package/UI/Components/Toggle/Toggle.tsx +14 -3
- package/UI/Components/Tooltip/Tooltip.tsx +11 -1
- package/UI/Components/TopAlert/TopAlert.tsx +2 -0
- package/build/dist/Models/DatabaseModels/Alert.js +77 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisode.js +1225 -0
- package/build/dist/Models/DatabaseModels/AlertEpisode.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeFeed.js +553 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeInternalNote.js +467 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeInternalNote.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +607 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js +437 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js +436 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +546 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertFeed.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +1437 -0
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +16 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +69 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageDomain.js +2 -0
- package/build/dist/Models/DatabaseModels/StatusPageDomain.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceNotificationLog.js +58 -0
- package/build/dist/Models/DatabaseModels/WorkspaceNotificationLog.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +18 -0
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768938069147-MigrationName.js +266 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1768938069147-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769125561322-MigrationName.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769125561322-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769170578688-MigrationName.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769170578688-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769172358833-MigrationName.js +68 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769172358833-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769176450526-MigrationName.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769176450526-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769190495840-MigrationName.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769190495840-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769199303656-MigrationName.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769199303656-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769202898645-MigrationName.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769202898645-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769428619414-MigrationName.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769428619414-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769428821686-MigrationName.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769428821686-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeFeedService.js +83 -0
- package/build/dist/Server/Services/AlertEpisodeFeedService.js.map +1 -0
- package/build/dist/Server/Services/AlertEpisodeInternalNoteService.js +70 -0
- package/build/dist/Server/Services/AlertEpisodeInternalNoteService.js.map +1 -0
- package/build/dist/Server/Services/AlertEpisodeMemberService.js +256 -0
- package/build/dist/Server/Services/AlertEpisodeMemberService.js.map +1 -0
- package/build/dist/Server/Services/AlertEpisodeOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/AlertEpisodeOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/AlertEpisodeOwnerUserService.js +9 -0
- package/build/dist/Server/Services/AlertEpisodeOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/AlertEpisodeService.js +885 -0
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -0
- package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js +494 -0
- package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js.map +1 -0
- package/build/dist/Server/Services/AlertGroupingEngineService.js +893 -0
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -0
- package/build/dist/Server/Services/AlertGroupingRuleService.js +13 -0
- package/build/dist/Server/Services/AlertGroupingRuleService.js.map +1 -0
- package/build/dist/Server/Services/AlertService.js +11 -0
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/CallService.js +11 -10
- package/build/dist/Server/Services/CallService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +18 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MailService.js +3 -0
- package/build/dist/Server/Services/MailService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyService.js +3 -0
- package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
- package/build/dist/Server/Services/SmsService.js +11 -10
- package/build/dist/Server/Services/SmsService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +9 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/WhatsAppService.js +3 -0
- package/build/dist/Server/Services/WhatsAppService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +25 -0
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +4 -2
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
- package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +8 -0
- package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes.js +17 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +545 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +13 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +10 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +651 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Messages/AlertEpisode.js +100 -0
- package/build/dist/Server/Utils/Workspace/Slack/Messages/AlertEpisode.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceMessages/AlertEpisode.js +70 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceMessages/AlertEpisode.js.map +1 -0
- package/build/dist/Tests/Server/Services/AlertEpisodeMemberService.test.js +165 -0
- package/build/dist/Tests/Server/Services/AlertEpisodeMemberService.test.js.map +1 -0
- package/build/dist/Tests/Server/Services/AlertEpisodeService.test.js +193 -0
- package/build/dist/Tests/Server/Services/AlertEpisodeService.test.js.map +1 -0
- package/build/dist/Tests/Server/Services/AlertGroupingEngineService.test.js +412 -0
- package/build/dist/Tests/Server/Services/AlertGroupingEngineService.test.js.map +1 -0
- package/build/dist/Tests/Server/Services/AlertGroupingRuleService.test.js +308 -0
- package/build/dist/Tests/Server/Services/AlertGroupingRuleService.test.js.map +1 -0
- package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js +1 -1
- package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/Input.test.js +1 -1
- package/build/dist/Tests/UI/Components/Input.test.js.map +1 -1
- package/build/dist/Tests/UI/Components/TextArea.test.js +2 -2
- package/build/dist/Tests/UI/Components/TextArea.test.js.map +1 -1
- package/build/dist/Types/BaseDatabase/SortOrder.js +5 -0
- package/build/dist/Types/BaseDatabase/SortOrder.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +4 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/NotificationRule/NotificationRuleType.js +1 -0
- package/build/dist/Types/NotificationRule/NotificationRuleType.js.map +1 -1
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +5 -0
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
- package/build/dist/Types/Permission.js +264 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/UserNotification/UserNotificationEventType.js +1 -0
- package/build/dist/Types/UserNotification/UserNotificationEventType.js.map +1 -1
- package/build/dist/Types/WhatsApp/WhatsAppTemplates.js +12 -0
- package/build/dist/Types/WhatsApp/WhatsAppTemplates.js.map +1 -1
- package/build/dist/Types/Workspace/NotificationRules/EventType.js +1 -0
- package/build/dist/Types/Workspace/NotificationRules/EventType.js.map +1 -1
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +28 -3
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
- package/build/dist/UI/Components/Accordion/Accordion.js +10 -3
- package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
- package/build/dist/UI/Components/Alerts/Alert.js +1 -1
- package/build/dist/UI/Components/Alerts/Alert.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +8 -2
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/CardSelect/CardSelect.js +1 -1
- package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
- package/build/dist/UI/Components/Checkbox/Checkbox.js +2 -2
- package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
- package/build/dist/UI/Components/ColorCircle/ColorCircle.js +1 -1
- package/build/dist/UI/Components/ColorCircle/ColorCircle.js.map +1 -1
- package/build/dist/UI/Components/ColorViewer/ColorViewer.js +12 -3
- package/build/dist/UI/Components/ColorViewer/ColorViewer.js.map +1 -1
- package/build/dist/UI/Components/CopyableButton/CopyableButton.js +12 -5
- package/build/dist/UI/Components/CopyableButton/CopyableButton.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +1 -1
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -3
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +19 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/FullPageModal/FullPageModal.js +24 -5
- package/build/dist/UI/Components/FullPageModal/FullPageModal.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +3 -3
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/Link/Link.js +1 -1
- package/build/dist/UI/Components/Link/Link.js.map +1 -1
- package/build/dist/UI/Components/Loader/Loader.js +6 -4
- package/build/dist/UI/Components/Loader/Loader.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +56 -3
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +28 -3
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +23 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +67 -6
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +14 -3
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
- package/build/dist/UI/Components/Pagination/Pagination.js +69 -13
- package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js +2 -2
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
- package/build/dist/UI/Components/Radio/Radio.js +8 -5
- package/build/dist/UI/Components/Radio/Radio.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -4
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/StatusBubble/StatusBubble.js +2 -2
- package/build/dist/UI/Components/StatusBubble/StatusBubble.js.map +1 -1
- package/build/dist/UI/Components/Table/TableHeader.js +12 -4
- package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
- package/build/dist/UI/Components/Tabs/Tab.js +8 -1
- package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
- package/build/dist/UI/Components/Tabs/Tabs.js +4 -3
- package/build/dist/UI/Components/Tabs/Tabs.js.map +1 -1
- package/build/dist/UI/Components/TextArea/TextArea.js +3 -3
- package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
- package/build/dist/UI/Components/Toggle/Toggle.js +7 -4
- package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +4 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Components/TopAlert/TopAlert.js +1 -1
- package/build/dist/UI/Components/TopAlert/TopAlert.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import BadDataException from "../../../../../Types/Exception/BadDataException";
|
|
2
|
+
import ObjectID from "../../../../../Types/ObjectID";
|
|
3
|
+
import {
|
|
4
|
+
WorkspaceMessageBlock,
|
|
5
|
+
WorkspaceMessagePayloadButton,
|
|
6
|
+
WorkspacePayloadButtons,
|
|
7
|
+
WorkspacePayloadDivider,
|
|
8
|
+
} from "../../../../../Types/Workspace/WorkspaceMessagePayload";
|
|
9
|
+
import AlertEpisodeService from "../../../../Services/AlertEpisodeService";
|
|
10
|
+
import SlackActionType from "../../../../Utils/Workspace/Slack/Actions/ActionTypes";
|
|
11
|
+
import CaptureSpan from "../../../Telemetry/CaptureSpan";
|
|
12
|
+
|
|
13
|
+
export default class SlackAlertEpisodeMessages {
|
|
14
|
+
@CaptureSpan()
|
|
15
|
+
public static async getAlertEpisodeCreateMessageBlocks(data: {
|
|
16
|
+
alertEpisodeId: ObjectID;
|
|
17
|
+
projectId: ObjectID;
|
|
18
|
+
}): Promise<Array<WorkspaceMessageBlock>> {
|
|
19
|
+
if (!data.alertEpisodeId) {
|
|
20
|
+
throw new BadDataException("Alert Episode ID is required");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Slack.
|
|
24
|
+
|
|
25
|
+
const blockSlack: Array<WorkspaceMessageBlock> = [];
|
|
26
|
+
|
|
27
|
+
// add divider.
|
|
28
|
+
|
|
29
|
+
const dividerBlock: WorkspacePayloadDivider = {
|
|
30
|
+
_type: "WorkspacePayloadDivider",
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
blockSlack.push(dividerBlock);
|
|
34
|
+
|
|
35
|
+
/*
|
|
36
|
+
* now add buttons.
|
|
37
|
+
* View data.
|
|
38
|
+
* Execute On Call
|
|
39
|
+
* Acknowledge alert episode
|
|
40
|
+
* Resolve data.
|
|
41
|
+
* Change Alert Episode State.
|
|
42
|
+
* Add Note.
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
const buttons: Array<WorkspaceMessagePayloadButton> = [];
|
|
46
|
+
|
|
47
|
+
// view data.
|
|
48
|
+
const viewAlertEpisodeButton: WorkspaceMessagePayloadButton = {
|
|
49
|
+
_type: "WorkspaceMessagePayloadButton",
|
|
50
|
+
title: "🔗 View Episode",
|
|
51
|
+
url: await AlertEpisodeService.getEpisodeLinkInDashboard(
|
|
52
|
+
data.projectId!,
|
|
53
|
+
data.alertEpisodeId!,
|
|
54
|
+
),
|
|
55
|
+
value: data.alertEpisodeId?.toString() || "",
|
|
56
|
+
actionId: SlackActionType.ViewAlertEpisode,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
buttons.push(viewAlertEpisodeButton);
|
|
60
|
+
|
|
61
|
+
// execute on call.
|
|
62
|
+
const executeOnCallButton: WorkspaceMessagePayloadButton = {
|
|
63
|
+
_type: "WorkspaceMessagePayloadButton",
|
|
64
|
+
title: "📞 Execute On Call",
|
|
65
|
+
value: data.alertEpisodeId?.toString() || "",
|
|
66
|
+
actionId: SlackActionType.ViewExecuteAlertEpisodeOnCallPolicy,
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
buttons.push(executeOnCallButton);
|
|
70
|
+
|
|
71
|
+
// acknowledge data.
|
|
72
|
+
const acknowledgeAlertEpisodeButton: WorkspaceMessagePayloadButton = {
|
|
73
|
+
_type: "WorkspaceMessagePayloadButton",
|
|
74
|
+
title: "👀 Acknowledge Episode",
|
|
75
|
+
value: data.alertEpisodeId?.toString() || "",
|
|
76
|
+
actionId: SlackActionType.AcknowledgeAlertEpisode,
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
buttons.push(acknowledgeAlertEpisodeButton);
|
|
80
|
+
|
|
81
|
+
// resolve data.
|
|
82
|
+
const resolveAlertEpisodeButton: WorkspaceMessagePayloadButton = {
|
|
83
|
+
_type: "WorkspaceMessagePayloadButton",
|
|
84
|
+
title: "✅ Resolve Episode",
|
|
85
|
+
value: data.alertEpisodeId?.toString() || "",
|
|
86
|
+
actionId: SlackActionType.ResolveAlertEpisode,
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
buttons.push(resolveAlertEpisodeButton);
|
|
90
|
+
|
|
91
|
+
// change alert episode state.
|
|
92
|
+
const changeAlertEpisodeStateButton: WorkspaceMessagePayloadButton = {
|
|
93
|
+
_type: "WorkspaceMessagePayloadButton",
|
|
94
|
+
title: "➡️ Change Episode State",
|
|
95
|
+
value: data.alertEpisodeId?.toString() || "",
|
|
96
|
+
actionId: SlackActionType.ViewChangeAlertEpisodeState,
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
buttons.push(changeAlertEpisodeStateButton);
|
|
100
|
+
|
|
101
|
+
// add note.
|
|
102
|
+
const addNoteButton: WorkspaceMessagePayloadButton = {
|
|
103
|
+
_type: "WorkspaceMessagePayloadButton",
|
|
104
|
+
title: "📄 Add Note",
|
|
105
|
+
value: data.alertEpisodeId?.toString() || "",
|
|
106
|
+
actionId: SlackActionType.ViewAddAlertEpisodeNote,
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
buttons.push(addNoteButton);
|
|
110
|
+
|
|
111
|
+
const workspacePayloadButtons: WorkspacePayloadButtons = {
|
|
112
|
+
buttons: buttons,
|
|
113
|
+
_type: "WorkspacePayloadButtons",
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
blockSlack.push(workspacePayloadButtons);
|
|
117
|
+
|
|
118
|
+
return blockSlack;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import ObjectID from "../../../../Types/ObjectID";
|
|
2
|
+
import NotificationRuleEventType from "../../../../Types/Workspace/NotificationRules/EventType";
|
|
3
|
+
import NotificationRuleWorkspaceChannel from "../../../../Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel";
|
|
4
|
+
import { WorkspaceMessageBlock } from "../../../../Types/Workspace/WorkspaceMessagePayload";
|
|
5
|
+
import WorkspaceType from "../../../../Types/Workspace/WorkspaceType";
|
|
6
|
+
import WorkspaceNotificationRuleService, {
|
|
7
|
+
MessageBlocksByWorkspaceType,
|
|
8
|
+
} from "../../../Services/WorkspaceNotificationRuleService";
|
|
9
|
+
import logger from "../../Logger";
|
|
10
|
+
import SlackAlertEpisodeMessages from "../Slack/Messages/AlertEpisode";
|
|
11
|
+
import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
12
|
+
|
|
13
|
+
export default class AlertEpisodeWorkspaceMessages {
|
|
14
|
+
@CaptureSpan()
|
|
15
|
+
public static async createChannelsAndInviteUsersToChannels(data: {
|
|
16
|
+
projectId: ObjectID;
|
|
17
|
+
alertEpisodeId: ObjectID;
|
|
18
|
+
episodeNumber: number;
|
|
19
|
+
}): Promise<{
|
|
20
|
+
channelsCreated: NotificationRuleWorkspaceChannel[];
|
|
21
|
+
} | null> {
|
|
22
|
+
try {
|
|
23
|
+
// we will notify the workspace about the alert episode creation with the bot tokken which is in WorkspaceProjectAuth Table.
|
|
24
|
+
return await WorkspaceNotificationRuleService.createChannelsAndInviteUsersToChannelsBasedOnRules(
|
|
25
|
+
{
|
|
26
|
+
projectId: data.projectId,
|
|
27
|
+
notificationFor: {
|
|
28
|
+
alertEpisodeId: data.alertEpisodeId,
|
|
29
|
+
},
|
|
30
|
+
notificationRuleEventType: NotificationRuleEventType.AlertEpisode,
|
|
31
|
+
channelNameSiffix: data.episodeNumber.toString(),
|
|
32
|
+
},
|
|
33
|
+
);
|
|
34
|
+
} catch (err) {
|
|
35
|
+
// log the error and continue.
|
|
36
|
+
logger.error(
|
|
37
|
+
"Error in AlertEpisode createChannelsAndInviteUsersToChannels",
|
|
38
|
+
);
|
|
39
|
+
logger.error(err);
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@CaptureSpan()
|
|
45
|
+
public static async getAlertEpisodeCreateMessageBlocks(data: {
|
|
46
|
+
alertEpisodeId: ObjectID;
|
|
47
|
+
projectId: ObjectID;
|
|
48
|
+
}): Promise<Array<MessageBlocksByWorkspaceType>> {
|
|
49
|
+
const { alertEpisodeId, projectId } = data;
|
|
50
|
+
|
|
51
|
+
const slackBlocks: WorkspaceMessageBlock[] =
|
|
52
|
+
await SlackAlertEpisodeMessages.getAlertEpisodeCreateMessageBlocks({
|
|
53
|
+
alertEpisodeId: alertEpisodeId,
|
|
54
|
+
projectId: projectId!,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const microsoftTeamsBlocks: WorkspaceMessageBlock[] =
|
|
58
|
+
await SlackAlertEpisodeMessages.getAlertEpisodeCreateMessageBlocks({
|
|
59
|
+
alertEpisodeId: alertEpisodeId,
|
|
60
|
+
projectId: projectId!,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
return [
|
|
64
|
+
{
|
|
65
|
+
workspaceType: WorkspaceType.Slack,
|
|
66
|
+
messageBlocks: slackBlocks,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
70
|
+
messageBlocks: microsoftTeamsBlocks,
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import AlertEpisodeMember, {
|
|
2
|
+
AlertEpisodeMemberAddedBy,
|
|
3
|
+
} from "../../../Models/DatabaseModels/AlertEpisodeMember";
|
|
4
|
+
import AlertEpisode from "../../../Models/DatabaseModels/AlertEpisode";
|
|
5
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
6
|
+
import { describe, expect, test, beforeEach } from "@jest/globals";
|
|
7
|
+
|
|
8
|
+
describe("AlertEpisodeMemberService", () => {
|
|
9
|
+
const projectId: ObjectID = ObjectID.generate();
|
|
10
|
+
const alertId: ObjectID = ObjectID.generate();
|
|
11
|
+
const episodeId: ObjectID = ObjectID.generate();
|
|
12
|
+
const memberId: ObjectID = ObjectID.generate();
|
|
13
|
+
|
|
14
|
+
let mockMember: AlertEpisodeMember;
|
|
15
|
+
let mockEpisode: AlertEpisode;
|
|
16
|
+
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
mockMember = new AlertEpisodeMember();
|
|
19
|
+
mockMember._id = memberId.toString();
|
|
20
|
+
mockMember.id = memberId;
|
|
21
|
+
mockMember.projectId = projectId;
|
|
22
|
+
mockMember.alertId = alertId;
|
|
23
|
+
mockMember.alertEpisodeId = episodeId;
|
|
24
|
+
mockMember.addedBy = AlertEpisodeMemberAddedBy.Rule;
|
|
25
|
+
|
|
26
|
+
mockEpisode = new AlertEpisode();
|
|
27
|
+
mockEpisode._id = episodeId.toString();
|
|
28
|
+
mockEpisode.id = episodeId;
|
|
29
|
+
mockEpisode.projectId = projectId;
|
|
30
|
+
mockEpisode.title = "Test Episode";
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe("AlertEpisodeMember Model", () => {
|
|
34
|
+
test("should create a new AlertEpisodeMember instance", () => {
|
|
35
|
+
const member: AlertEpisodeMember = new AlertEpisodeMember();
|
|
36
|
+
expect(member).toBeInstanceOf(AlertEpisodeMember);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("should create AlertEpisodeMember with an ID", () => {
|
|
40
|
+
const id: ObjectID = ObjectID.generate();
|
|
41
|
+
const member: AlertEpisodeMember = new AlertEpisodeMember(id);
|
|
42
|
+
expect(member.id).toEqual(id);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("should set and get projectId correctly", () => {
|
|
46
|
+
const member: AlertEpisodeMember = new AlertEpisodeMember();
|
|
47
|
+
const projectId: ObjectID = ObjectID.generate();
|
|
48
|
+
member.projectId = projectId;
|
|
49
|
+
expect(member.projectId).toEqual(projectId);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("should set and get alertId correctly", () => {
|
|
53
|
+
const member: AlertEpisodeMember = new AlertEpisodeMember();
|
|
54
|
+
const alertId: ObjectID = ObjectID.generate();
|
|
55
|
+
member.alertId = alertId;
|
|
56
|
+
expect(member.alertId).toEqual(alertId);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("should set and get alertEpisodeId correctly", () => {
|
|
60
|
+
const member: AlertEpisodeMember = new AlertEpisodeMember();
|
|
61
|
+
const episodeId: ObjectID = ObjectID.generate();
|
|
62
|
+
member.alertEpisodeId = episodeId;
|
|
63
|
+
expect(member.alertEpisodeId).toEqual(episodeId);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("should set addedBy to Rule", () => {
|
|
67
|
+
const member: AlertEpisodeMember = new AlertEpisodeMember();
|
|
68
|
+
member.addedBy = AlertEpisodeMemberAddedBy.Rule;
|
|
69
|
+
expect(member.addedBy).toBe(AlertEpisodeMemberAddedBy.Rule);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("should set addedBy to Manual", () => {
|
|
73
|
+
const member: AlertEpisodeMember = new AlertEpisodeMember();
|
|
74
|
+
member.addedBy = AlertEpisodeMemberAddedBy.Manual;
|
|
75
|
+
expect(member.addedBy).toBe(AlertEpisodeMemberAddedBy.Manual);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("should set addedBy to API", () => {
|
|
79
|
+
const member: AlertEpisodeMember = new AlertEpisodeMember();
|
|
80
|
+
member.addedBy = AlertEpisodeMemberAddedBy.API;
|
|
81
|
+
expect(member.addedBy).toBe(AlertEpisodeMemberAddedBy.API);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test("should set and get matchedRuleId correctly", () => {
|
|
85
|
+
const member: AlertEpisodeMember = new AlertEpisodeMember();
|
|
86
|
+
const ruleId: ObjectID = ObjectID.generate();
|
|
87
|
+
member.matchedRuleId = ruleId;
|
|
88
|
+
expect(member.matchedRuleId).toEqual(ruleId);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
describe("AlertEpisodeMember with full data", () => {
|
|
93
|
+
test("should handle complete member record", () => {
|
|
94
|
+
const id: ObjectID = ObjectID.generate();
|
|
95
|
+
const projectId: ObjectID = ObjectID.generate();
|
|
96
|
+
const alertId: ObjectID = ObjectID.generate();
|
|
97
|
+
const episodeId: ObjectID = ObjectID.generate();
|
|
98
|
+
const ruleId: ObjectID = ObjectID.generate();
|
|
99
|
+
|
|
100
|
+
const member: AlertEpisodeMember = new AlertEpisodeMember(id);
|
|
101
|
+
member.projectId = projectId;
|
|
102
|
+
member.alertId = alertId;
|
|
103
|
+
member.alertEpisodeId = episodeId;
|
|
104
|
+
member.addedBy = AlertEpisodeMemberAddedBy.Rule;
|
|
105
|
+
member.matchedRuleId = ruleId;
|
|
106
|
+
|
|
107
|
+
expect(member.id).toEqual(id);
|
|
108
|
+
expect(member.projectId).toEqual(projectId);
|
|
109
|
+
expect(member.alertId).toEqual(alertId);
|
|
110
|
+
expect(member.alertEpisodeId).toEqual(episodeId);
|
|
111
|
+
expect(member.addedBy).toBe(AlertEpisodeMemberAddedBy.Rule);
|
|
112
|
+
expect(member.matchedRuleId).toEqual(ruleId);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test("should create member with minimal data", () => {
|
|
116
|
+
const member: AlertEpisodeMember = new AlertEpisodeMember();
|
|
117
|
+
const alertId: ObjectID = ObjectID.generate();
|
|
118
|
+
const episodeId: ObjectID = ObjectID.generate();
|
|
119
|
+
|
|
120
|
+
member.alertId = alertId;
|
|
121
|
+
member.alertEpisodeId = episodeId;
|
|
122
|
+
|
|
123
|
+
expect(member.alertId).toEqual(alertId);
|
|
124
|
+
expect(member.alertEpisodeId).toEqual(episodeId);
|
|
125
|
+
expect(member.matchedRuleId).toBeUndefined();
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
describe("Multiple members", () => {
|
|
130
|
+
test("should create distinct member instances", () => {
|
|
131
|
+
const member1: AlertEpisodeMember = new AlertEpisodeMember();
|
|
132
|
+
const member2: AlertEpisodeMember = new AlertEpisodeMember();
|
|
133
|
+
|
|
134
|
+
const alertId1: ObjectID = ObjectID.generate();
|
|
135
|
+
const alertId2: ObjectID = ObjectID.generate();
|
|
136
|
+
|
|
137
|
+
member1.alertId = alertId1;
|
|
138
|
+
member2.alertId = alertId2;
|
|
139
|
+
|
|
140
|
+
expect(member1.alertId).toEqual(alertId1);
|
|
141
|
+
expect(member2.alertId).toEqual(alertId2);
|
|
142
|
+
expect(member1.alertId).not.toEqual(member2.alertId);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test("should allow same alert to be linked to different episodes (model level)", () => {
|
|
146
|
+
/*
|
|
147
|
+
* Note: The service layer enforces single-episode constraint,
|
|
148
|
+
* but the model itself allows it
|
|
149
|
+
*/
|
|
150
|
+
const alertId: ObjectID = ObjectID.generate();
|
|
151
|
+
const episodeId1: ObjectID = ObjectID.generate();
|
|
152
|
+
const episodeId2: ObjectID = ObjectID.generate();
|
|
153
|
+
|
|
154
|
+
const member1: AlertEpisodeMember = new AlertEpisodeMember();
|
|
155
|
+
member1.alertId = alertId;
|
|
156
|
+
member1.alertEpisodeId = episodeId1;
|
|
157
|
+
|
|
158
|
+
const member2: AlertEpisodeMember = new AlertEpisodeMember();
|
|
159
|
+
member2.alertId = alertId;
|
|
160
|
+
member2.alertEpisodeId = episodeId2;
|
|
161
|
+
|
|
162
|
+
expect(member1.alertId).toEqual(member2.alertId);
|
|
163
|
+
expect(member1.alertEpisodeId).not.toEqual(member2.alertEpisodeId);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test("should allow different alerts to be in same episode", () => {
|
|
167
|
+
const episodeId: ObjectID = ObjectID.generate();
|
|
168
|
+
const alertId1: ObjectID = ObjectID.generate();
|
|
169
|
+
const alertId2: ObjectID = ObjectID.generate();
|
|
170
|
+
|
|
171
|
+
const member1: AlertEpisodeMember = new AlertEpisodeMember();
|
|
172
|
+
member1.alertId = alertId1;
|
|
173
|
+
member1.alertEpisodeId = episodeId;
|
|
174
|
+
|
|
175
|
+
const member2: AlertEpisodeMember = new AlertEpisodeMember();
|
|
176
|
+
member2.alertId = alertId2;
|
|
177
|
+
member2.alertEpisodeId = episodeId;
|
|
178
|
+
|
|
179
|
+
expect(member1.alertEpisodeId).toEqual(member2.alertEpisodeId);
|
|
180
|
+
expect(member1.alertId).not.toEqual(member2.alertId);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
describe("AddedBy enum values", () => {
|
|
185
|
+
test("should have Rule value", () => {
|
|
186
|
+
expect(AlertEpisodeMemberAddedBy.Rule).toBeDefined();
|
|
187
|
+
expect(AlertEpisodeMemberAddedBy.Rule).toBe("rule");
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test("should have Manual value", () => {
|
|
191
|
+
expect(AlertEpisodeMemberAddedBy.Manual).toBeDefined();
|
|
192
|
+
expect(AlertEpisodeMemberAddedBy.Manual).toBe("manual");
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test("should have API value", () => {
|
|
196
|
+
expect(AlertEpisodeMemberAddedBy.API).toBeDefined();
|
|
197
|
+
expect(AlertEpisodeMemberAddedBy.API).toBe("api");
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
});
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import AlertEpisode from "../../../Models/DatabaseModels/AlertEpisode";
|
|
2
|
+
import AlertState from "../../../Models/DatabaseModels/AlertState";
|
|
3
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
4
|
+
import { describe, expect, test, beforeEach } from "@jest/globals";
|
|
5
|
+
|
|
6
|
+
describe("AlertEpisodeService", () => {
|
|
7
|
+
const projectId: ObjectID = ObjectID.generate();
|
|
8
|
+
const episodeId: ObjectID = ObjectID.generate();
|
|
9
|
+
|
|
10
|
+
let mockEpisode: AlertEpisode;
|
|
11
|
+
let mockResolvedState: AlertState;
|
|
12
|
+
let mockAcknowledgedState: AlertState;
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
mockEpisode = new AlertEpisode();
|
|
16
|
+
mockEpisode._id = episodeId.toString();
|
|
17
|
+
mockEpisode.id = episodeId;
|
|
18
|
+
mockEpisode.projectId = projectId;
|
|
19
|
+
mockEpisode.title = "Test Episode";
|
|
20
|
+
mockEpisode.alertCount = 5;
|
|
21
|
+
|
|
22
|
+
mockResolvedState = new AlertState();
|
|
23
|
+
mockResolvedState._id = ObjectID.generate().toString();
|
|
24
|
+
mockResolvedState.order = 100;
|
|
25
|
+
mockResolvedState.isResolvedState = true;
|
|
26
|
+
|
|
27
|
+
mockAcknowledgedState = new AlertState();
|
|
28
|
+
mockAcknowledgedState._id = ObjectID.generate().toString();
|
|
29
|
+
mockAcknowledgedState.order = 50;
|
|
30
|
+
mockAcknowledgedState.isAcknowledgedState = true;
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe("AlertEpisode Model", () => {
|
|
34
|
+
test("should create a new AlertEpisode instance", () => {
|
|
35
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
36
|
+
expect(episode).toBeInstanceOf(AlertEpisode);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("should create AlertEpisode with an ID", () => {
|
|
40
|
+
const id: ObjectID = ObjectID.generate();
|
|
41
|
+
const episode: AlertEpisode = new AlertEpisode(id);
|
|
42
|
+
expect(episode.id).toEqual(id);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("should set and get title correctly", () => {
|
|
46
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
47
|
+
episode.title = "CPU Alert Episode";
|
|
48
|
+
expect(episode.title).toBe("CPU Alert Episode");
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("should set and get description correctly", () => {
|
|
52
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
53
|
+
episode.description = "Multiple CPU alerts grouped together";
|
|
54
|
+
expect(episode.description).toBe("Multiple CPU alerts grouped together");
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("should set and get alertCount correctly", () => {
|
|
58
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
59
|
+
episode.alertCount = 10;
|
|
60
|
+
expect(episode.alertCount).toBe(10);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test("should set and get projectId correctly", () => {
|
|
64
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
65
|
+
const projectId: ObjectID = ObjectID.generate();
|
|
66
|
+
episode.projectId = projectId;
|
|
67
|
+
expect(episode.projectId).toEqual(projectId);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("should set and get isManuallyCreated correctly", () => {
|
|
71
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
72
|
+
episode.isManuallyCreated = true;
|
|
73
|
+
expect(episode.isManuallyCreated).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("should set and get titleTemplate correctly", () => {
|
|
77
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
78
|
+
episode.titleTemplate = "{{alertTitle}} - {{alertCount}} alerts";
|
|
79
|
+
expect(episode.titleTemplate).toBe(
|
|
80
|
+
"{{alertTitle}} - {{alertCount}} alerts",
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test("should set and get descriptionTemplate correctly", () => {
|
|
85
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
86
|
+
episode.descriptionTemplate = "Episode with {{alertCount}} alerts";
|
|
87
|
+
expect(episode.descriptionTemplate).toBe(
|
|
88
|
+
"Episode with {{alertCount}} alerts",
|
|
89
|
+
);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test("should set and get groupingKey correctly", () => {
|
|
93
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
94
|
+
episode.groupingKey = "monitor:abc123|severity:critical";
|
|
95
|
+
expect(episode.groupingKey).toBe("monitor:abc123|severity:critical");
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test("should set and get rootCause correctly", () => {
|
|
99
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
100
|
+
episode.rootCause = "Database connection pool exhausted";
|
|
101
|
+
expect(episode.rootCause).toBe("Database connection pool exhausted");
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test("should set and get lastAlertAddedAt correctly", () => {
|
|
105
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
106
|
+
const date: Date = new Date();
|
|
107
|
+
episode.lastAlertAddedAt = date;
|
|
108
|
+
expect(episode.lastAlertAddedAt).toEqual(date);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("should set and get resolvedAt correctly", () => {
|
|
112
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
113
|
+
const date: Date = new Date();
|
|
114
|
+
episode.resolvedAt = date;
|
|
115
|
+
expect(episode.resolvedAt).toEqual(date);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("should set and get assignedToUserId correctly", () => {
|
|
119
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
120
|
+
const userId: ObjectID = ObjectID.generate();
|
|
121
|
+
episode.assignedToUserId = userId;
|
|
122
|
+
expect(episode.assignedToUserId).toEqual(userId);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test("should set and get assignedToTeamId correctly", () => {
|
|
126
|
+
const episode: AlertEpisode = new AlertEpisode();
|
|
127
|
+
const teamId: ObjectID = ObjectID.generate();
|
|
128
|
+
episode.assignedToTeamId = teamId;
|
|
129
|
+
expect(episode.assignedToTeamId).toEqual(teamId);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
describe("Episode with full data", () => {
|
|
134
|
+
test("should handle complete episode record", () => {
|
|
135
|
+
const id: ObjectID = ObjectID.generate();
|
|
136
|
+
const projectId: ObjectID = ObjectID.generate();
|
|
137
|
+
const userId: ObjectID = ObjectID.generate();
|
|
138
|
+
const teamId: ObjectID = ObjectID.generate();
|
|
139
|
+
const ruleId: ObjectID = ObjectID.generate();
|
|
140
|
+
const severityId: ObjectID = ObjectID.generate();
|
|
141
|
+
|
|
142
|
+
const episode: AlertEpisode = new AlertEpisode(id);
|
|
143
|
+
episode.projectId = projectId;
|
|
144
|
+
episode.title = "Database Connection Issues";
|
|
145
|
+
episode.description = "Multiple connection timeout alerts";
|
|
146
|
+
episode.alertCount = 15;
|
|
147
|
+
episode.isManuallyCreated = false;
|
|
148
|
+
episode.groupingKey = "monitor:db-server|severity:critical";
|
|
149
|
+
episode.titleTemplate = "DB Issues ({{alertCount}})";
|
|
150
|
+
episode.descriptionTemplate = "{{alertCount}} connection alerts";
|
|
151
|
+
episode.rootCause = "Network congestion";
|
|
152
|
+
episode.assignedToUserId = userId;
|
|
153
|
+
episode.assignedToTeamId = teamId;
|
|
154
|
+
episode.alertGroupingRuleId = ruleId;
|
|
155
|
+
episode.alertSeverityId = severityId;
|
|
156
|
+
|
|
157
|
+
expect(episode.id).toEqual(id);
|
|
158
|
+
expect(episode.projectId).toEqual(projectId);
|
|
159
|
+
expect(episode.title).toBe("Database Connection Issues");
|
|
160
|
+
expect(episode.description).toBe("Multiple connection timeout alerts");
|
|
161
|
+
expect(episode.alertCount).toBe(15);
|
|
162
|
+
expect(episode.isManuallyCreated).toBe(false);
|
|
163
|
+
expect(episode.groupingKey).toBe("monitor:db-server|severity:critical");
|
|
164
|
+
expect(episode.titleTemplate).toBe("DB Issues ({{alertCount}})");
|
|
165
|
+
expect(episode.descriptionTemplate).toBe(
|
|
166
|
+
"{{alertCount}} connection alerts",
|
|
167
|
+
);
|
|
168
|
+
expect(episode.rootCause).toBe("Network congestion");
|
|
169
|
+
expect(episode.assignedToUserId).toEqual(userId);
|
|
170
|
+
expect(episode.assignedToTeamId).toEqual(teamId);
|
|
171
|
+
expect(episode.alertGroupingRuleId).toEqual(ruleId);
|
|
172
|
+
expect(episode.alertSeverityId).toEqual(severityId);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
describe("Template rendering helper", () => {
|
|
177
|
+
test("should replace {{alertCount}} in title template", () => {
|
|
178
|
+
const template: string = "CPU Issues - {{alertCount}} alerts";
|
|
179
|
+
const alertCount: number = 5;
|
|
180
|
+
const result: string = template.replace(
|
|
181
|
+
/\{\{alertCount\}\}/g,
|
|
182
|
+
alertCount.toString(),
|
|
183
|
+
);
|
|
184
|
+
expect(result).toBe("CPU Issues - 5 alerts");
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test("should replace multiple occurrences of {{alertCount}}", () => {
|
|
188
|
+
const template: string = "{{alertCount}} alerts ({{alertCount}} total)";
|
|
189
|
+
const alertCount: number = 7;
|
|
190
|
+
const result: string = template.replace(
|
|
191
|
+
/\{\{alertCount\}\}/g,
|
|
192
|
+
alertCount.toString(),
|
|
193
|
+
);
|
|
194
|
+
expect(result).toBe("7 alerts (7 total)");
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test("should handle template without placeholders", () => {
|
|
198
|
+
const template: string = "Static Episode Title";
|
|
199
|
+
const alertCount: number = 10;
|
|
200
|
+
const result: string = template.replace(
|
|
201
|
+
/\{\{alertCount\}\}/g,
|
|
202
|
+
alertCount.toString(),
|
|
203
|
+
);
|
|
204
|
+
expect(result).toBe("Static Episode Title");
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
test("should handle empty template", () => {
|
|
208
|
+
const template: string = "";
|
|
209
|
+
const alertCount: number = 3;
|
|
210
|
+
const result: string = template.replace(
|
|
211
|
+
/\{\{alertCount\}\}/g,
|
|
212
|
+
alertCount.toString(),
|
|
213
|
+
);
|
|
214
|
+
expect(result).toBe("");
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
describe("AlertState comparison", () => {
|
|
219
|
+
test("should correctly compare state orders for resolution check", () => {
|
|
220
|
+
const currentOrder: number = 100;
|
|
221
|
+
const resolvedOrder: number = 100;
|
|
222
|
+
const isResolved: boolean = currentOrder >= resolvedOrder;
|
|
223
|
+
expect(isResolved).toBe(true);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
test("should correctly identify unresolved state", () => {
|
|
227
|
+
const currentOrder: number = 50;
|
|
228
|
+
const resolvedOrder: number = 100;
|
|
229
|
+
const isResolved: boolean = currentOrder >= resolvedOrder;
|
|
230
|
+
expect(isResolved).toBe(false);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
test("should correctly identify acknowledged state", () => {
|
|
234
|
+
const currentOrder: number = 50;
|
|
235
|
+
const acknowledgedOrder: number = 50;
|
|
236
|
+
const isAcknowledged: boolean = currentOrder >= acknowledgedOrder;
|
|
237
|
+
expect(isAcknowledged).toBe(true);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
});
|