@oneuptime/common 9.4.11 → 9.4.13
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/Incident.ts +77 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +1223 -0
- package/Models/DatabaseModels/IncidentEpisodeFeed.ts +533 -0
- package/Models/DatabaseModels/IncidentEpisodeInternalNote.ts +456 -0
- package/Models/DatabaseModels/IncidentEpisodeMember.ts +587 -0
- package/Models/DatabaseModels/IncidentEpisodeOwnerTeam.ts +421 -0
- package/Models/DatabaseModels/IncidentEpisodeOwnerUser.ts +419 -0
- package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +524 -0
- package/Models/DatabaseModels/IncidentGroupingRule.ts +1430 -0
- package/Models/DatabaseModels/Index.ts +18 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +70 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.ts +59 -0
- package/Models/DatabaseModels/Project.ts +29 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +48 -0
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +49 -0
- package/Models/DatabaseModels/WorkspaceNotificationLog.ts +57 -0
- package/Server/API/BillingAPI.ts +78 -1
- package/Server/API/IncidentEpisodeAPI.ts +150 -0
- package/Server/API/SlackAPI.ts +23 -0
- package/Server/API/UserOnCallLogTimelineAPI.ts +24 -4
- package/Server/BillingConfig.ts +3 -0
- package/Server/EnvironmentConfig.ts +1 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1769599843642-MigrationName.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1769626069479-MigrationName.ts +729 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1769629928240-MigrationName.ts +261 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1769676117342-RenameEvaluateOverTimeInCriteriaFilter.ts +28 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Services/AIBillingService.ts +10 -0
- package/Server/Services/BillingService.ts +349 -1
- package/Server/Services/CallService.ts +1 -0
- package/Server/Services/IncidentEpisodeFeedService.ts +94 -0
- package/Server/Services/IncidentEpisodeInternalNoteService.ts +71 -0
- package/Server/Services/IncidentEpisodeMemberService.ts +321 -0
- package/Server/Services/IncidentEpisodeOwnerTeamService.ts +10 -0
- package/Server/Services/IncidentEpisodeOwnerUserService.ts +10 -0
- package/Server/Services/IncidentEpisodeService.ts +1045 -0
- package/Server/Services/IncidentEpisodeStateTimelineService.ts +566 -0
- package/Server/Services/IncidentGroupingEngineService.ts +1047 -0
- package/Server/Services/IncidentGroupingRuleService.ts +14 -0
- package/Server/Services/IncidentService.ts +11 -0
- package/Server/Services/Index.ts +18 -0
- package/Server/Services/MailService.ts +1 -0
- package/Server/Services/MonitorService.ts +9 -0
- package/Server/Services/NotificationService.ts +10 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +18 -0
- package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +64 -2
- package/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.ts +26 -1
- package/Server/Services/OnCallDutyPolicyService.ts +15 -0
- package/Server/Services/ProjectService.ts +33 -2
- package/Server/Services/SmsService.ts +1 -0
- package/Server/Services/UserNotificationRuleService.ts +48 -2
- package/Server/Services/UserNotificationSettingService.ts +23 -0
- package/Server/Services/UserOnCallLogService.ts +41 -4
- package/Server/Services/UserService.ts +45 -1
- package/Server/Services/WhatsAppService.ts +1 -0
- package/Server/Services/WorkspaceNotificationLogService.ts +16 -0
- package/Server/Services/WorkspaceNotificationRuleService.ts +116 -0
- package/Server/Types/Database/Permissions/TenantPermission.ts +20 -0
- package/Server/Utils/AI/IncidentEpisodeAIContextBuilder.ts +490 -0
- package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +1 -1
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +1 -1
- package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +1 -1
- package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +2 -2
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +182 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +13 -0
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +1 -1
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +37 -0
- package/Server/Utils/PushNotificationUtil.ts +31 -0
- package/Server/Utils/WhatsAppTemplateUtil.ts +14 -0
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes.ts +18 -0
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +702 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +20 -0
- package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +11 -0
- package/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.ts +918 -0
- package/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.ts +120 -0
- package/Server/Utils/Workspace/WorkspaceMessages/IncidentEpisode.ts +74 -0
- package/Types/Email/EmailTemplateType.ts +7 -0
- package/Types/Monitor/CriteriaFilter.ts +24 -4
- package/Types/Monitor/MonitorCriteriaInstance.ts +67 -0
- package/Types/Monitor/MonitorStep.ts +37 -0
- package/Types/Monitor/MonitorStepSnmpMonitor.ts +102 -0
- package/Types/Monitor/MonitorType.ts +15 -2
- package/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.ts +8 -0
- package/Types/Monitor/SnmpMonitor/SnmpDataType.ts +21 -0
- package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +16 -0
- package/Types/Monitor/SnmpMonitor/SnmpOid.ts +60 -0
- package/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.ts +7 -0
- package/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.ts +7 -0
- package/Types/Monitor/SnmpMonitor/SnmpV3Auth.ts +12 -0
- package/Types/Monitor/SnmpMonitor/SnmpVersion.ts +7 -0
- package/Types/NotificationSetting/NotificationSettingEventType.ts +7 -0
- package/Types/Permission.ts +311 -0
- package/Types/Probe/ProbeMonitorResponse.ts +2 -0
- package/Types/UserNotification/UserNotificationEventType.ts +1 -0
- package/Types/WhatsApp/WhatsAppTemplates.ts +24 -0
- package/Types/Workspace/NotificationRules/EventType.ts +1 -0
- package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +38 -1
- package/Utils/Monitor/MonitorMetricType.ts +2 -1
- package/build/dist/Models/DatabaseModels/Incident.js +78 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1250 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeFeed.js +555 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeInternalNote.js +467 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeInternalNote.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +607 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js +437 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js +436 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +546 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +1437 -0
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.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/OnCallDutyPolicyExecutionLogTimeline.js +58 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +30 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +47 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +48 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.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/BillingAPI.js +44 -1
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +97 -0
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -0
- package/build/dist/Server/API/SlackAPI.js +18 -0
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js +30 -10
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
- package/build/dist/Server/BillingConfig.js +2 -0
- package/build/dist/Server/BillingConfig.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +1 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769599843642-MigrationName.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769599843642-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769626069479-MigrationName.js +256 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769626069479-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769629928240-MigrationName.js +96 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769629928240-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769676117342-RenameEvaluateOverTimeInCriteriaFilter.js +25 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769676117342-RenameEvaluateOverTimeInCriteriaFilter.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AIBillingService.js +10 -1
- package/build/dist/Server/Services/AIBillingService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +224 -5
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CallService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeFeedService.js +83 -0
- package/build/dist/Server/Services/IncidentEpisodeFeedService.js.map +1 -0
- package/build/dist/Server/Services/IncidentEpisodeInternalNoteService.js +70 -0
- package/build/dist/Server/Services/IncidentEpisodeInternalNoteService.js.map +1 -0
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js +298 -0
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -0
- package/build/dist/Server/Services/IncidentEpisodeOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/IncidentEpisodeOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/IncidentEpisodeOwnerUserService.js +9 -0
- package/build/dist/Server/Services/IncidentEpisodeOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js +933 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -0
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +498 -0
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -0
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +799 -0
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -0
- package/build/dist/Server/Services/IncidentGroupingRuleService.js +13 -0
- package/build/dist/Server/Services/IncidentGroupingRuleService.js.map +1 -0
- package/build/dist/Server/Services/IncidentService.js +10 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +16 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MailService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +9 -1
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NotificationService.js +10 -1
- package/build/dist/Server/Services/NotificationService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +10 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +48 -2
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js +20 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyService.js +8 -0
- package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +16 -3
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/SmsService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +39 -2
- package/build/dist/Server/Services/UserNotificationRuleService.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/UserOnCallLogService.js +35 -3
- package/build/dist/Server/Services/UserOnCallLogService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +40 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/WhatsAppService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationLogService.js +12 -0
- package/build/dist/Server/Services/WorkspaceNotificationLogService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +95 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +17 -0
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/IncidentEpisodeAIContextBuilder.js +402 -0
- package/build/dist/Server/Utils/AI/IncidentEpisodeAIContextBuilder.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +2 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +135 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +10 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +26 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/PushNotificationUtil.js +20 -0
- package/build/dist/Server/Utils/PushNotificationUtil.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/IncidentEpisode.js +547 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +15 -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/IncidentEpisode.js +651 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.js +100 -0
- package/build/dist/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceMessages/IncidentEpisode.js +70 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceMessages/IncidentEpisode.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +6 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +16 -3
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +62 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +26 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js +77 -0
- package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +13 -2
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js +9 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpDataType.js +22 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpDataType.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.js +2 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOid.js +55 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOid.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js +8 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js +8 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpV3Auth.js +2 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpV3Auth.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpVersion.js +8 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpVersion.js.map +1 -0
- 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 +15 -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 +33 -1
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +2 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,566 @@
|
|
|
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 IncidentStateService from "./IncidentStateService";
|
|
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 IncidentState from "../../Models/DatabaseModels/IncidentState";
|
|
14
|
+
import IncidentEpisode from "../../Models/DatabaseModels/IncidentEpisode";
|
|
15
|
+
import IncidentEpisodeStateTimeline from "../../Models/DatabaseModels/IncidentEpisodeStateTimeline";
|
|
16
|
+
import { IsBillingEnabled } from "../EnvironmentConfig";
|
|
17
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
18
|
+
import logger from "../Utils/Logger";
|
|
19
|
+
import IncidentEpisodeFeedService from "./IncidentEpisodeFeedService";
|
|
20
|
+
import { IncidentEpisodeFeedEventType } from "../../Models/DatabaseModels/IncidentEpisodeFeed";
|
|
21
|
+
import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
|
|
22
|
+
import IncidentEpisodeService from "./IncidentEpisodeService";
|
|
23
|
+
|
|
24
|
+
export class Service extends DatabaseService<IncidentEpisodeStateTimeline> {
|
|
25
|
+
public constructor() {
|
|
26
|
+
super(IncidentEpisodeStateTimeline);
|
|
27
|
+
if (IsBillingEnabled) {
|
|
28
|
+
this.hardDeleteItemsOlderThanInDays("createdAt", 3 * 365); // 3 years
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@CaptureSpan()
|
|
33
|
+
protected override async onBeforeCreate(
|
|
34
|
+
createBy: CreateBy<IncidentEpisodeStateTimeline>,
|
|
35
|
+
): Promise<OnCreate<IncidentEpisodeStateTimeline>> {
|
|
36
|
+
if (!createBy.data.incidentEpisodeId) {
|
|
37
|
+
throw new BadDataException("incidentEpisodeId 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.incidentEpisodeId.toString(),
|
|
50
|
+
namespace: "IncidentEpisodeStateTimeline.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 incidentStateId: ObjectID | undefined | null =
|
|
83
|
+
createBy.data.incidentStateId || createBy.data.incidentState?.id;
|
|
84
|
+
|
|
85
|
+
if (!incidentStateId) {
|
|
86
|
+
throw new BadDataException("incidentStateId is null");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const stateBeforeThis: IncidentEpisodeStateTimeline | null =
|
|
90
|
+
await this.findOneBy({
|
|
91
|
+
query: {
|
|
92
|
+
incidentEpisodeId: createBy.data.incidentEpisodeId,
|
|
93
|
+
startsAt: QueryHelper.lessThanEqualTo(createBy.data.startsAt),
|
|
94
|
+
},
|
|
95
|
+
sort: {
|
|
96
|
+
startsAt: SortOrder.Descending,
|
|
97
|
+
},
|
|
98
|
+
props: {
|
|
99
|
+
isRoot: true,
|
|
100
|
+
},
|
|
101
|
+
select: {
|
|
102
|
+
incidentStateId: true,
|
|
103
|
+
incidentState: {
|
|
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 (
|
|
123
|
+
stateBeforeThis &&
|
|
124
|
+
stateBeforeThis.incidentStateId &&
|
|
125
|
+
incidentStateId
|
|
126
|
+
) {
|
|
127
|
+
if (
|
|
128
|
+
stateBeforeThis.incidentStateId.toString() ===
|
|
129
|
+
incidentStateId.toString()
|
|
130
|
+
) {
|
|
131
|
+
throw new BadDataException(
|
|
132
|
+
"Episode state cannot be same as previous state.",
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const stateAfterThis: IncidentEpisodeStateTimeline | null =
|
|
138
|
+
await this.findOneBy({
|
|
139
|
+
query: {
|
|
140
|
+
incidentEpisodeId: createBy.data.incidentEpisodeId,
|
|
141
|
+
startsAt: QueryHelper.greaterThan(createBy.data.startsAt),
|
|
142
|
+
},
|
|
143
|
+
sort: {
|
|
144
|
+
startsAt: SortOrder.Ascending,
|
|
145
|
+
},
|
|
146
|
+
props: {
|
|
147
|
+
isRoot: true,
|
|
148
|
+
},
|
|
149
|
+
select: {
|
|
150
|
+
incidentStateId: true,
|
|
151
|
+
startsAt: true,
|
|
152
|
+
endsAt: true,
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// compute ends at. It's the start of the next status.
|
|
157
|
+
if (stateAfterThis && stateAfterThis.startsAt) {
|
|
158
|
+
createBy.data.endsAt = stateAfterThis.startsAt;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Check if this new state and the next state are same.
|
|
162
|
+
if (stateAfterThis && stateAfterThis.incidentStateId && incidentStateId) {
|
|
163
|
+
if (
|
|
164
|
+
stateAfterThis.incidentStateId.toString() ===
|
|
165
|
+
incidentStateId.toString()
|
|
166
|
+
) {
|
|
167
|
+
throw new BadDataException(
|
|
168
|
+
"Episode state cannot be same as next state.",
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
logger.debug("State After this");
|
|
174
|
+
logger.debug(stateAfterThis);
|
|
175
|
+
|
|
176
|
+
return {
|
|
177
|
+
createBy,
|
|
178
|
+
carryForward: {
|
|
179
|
+
statusTimelineBeforeThisStatus: stateBeforeThis || null,
|
|
180
|
+
statusTimelineAfterThisStatus: stateAfterThis || null,
|
|
181
|
+
mutex: mutex,
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
} catch (error) {
|
|
185
|
+
// release the mutex if it was acquired.
|
|
186
|
+
if (mutex) {
|
|
187
|
+
try {
|
|
188
|
+
await Semaphore.release(mutex);
|
|
189
|
+
} catch (err) {
|
|
190
|
+
logger.error(err);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
throw error;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
@CaptureSpan()
|
|
199
|
+
protected override async onCreateSuccess(
|
|
200
|
+
onCreate: OnCreate<IncidentEpisodeStateTimeline>,
|
|
201
|
+
createdItem: IncidentEpisodeStateTimeline,
|
|
202
|
+
): Promise<IncidentEpisodeStateTimeline> {
|
|
203
|
+
if (!createdItem.incidentEpisodeId) {
|
|
204
|
+
throw new BadDataException("incidentEpisodeId is null");
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const mutex: SemaphoreMutex | null = onCreate.carryForward.mutex;
|
|
208
|
+
|
|
209
|
+
if (!createdItem.incidentStateId) {
|
|
210
|
+
throw new BadDataException("incidentStateId is null");
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
logger.debug("Status Timeline Before this");
|
|
214
|
+
logger.debug(onCreate.carryForward.statusTimelineBeforeThisStatus);
|
|
215
|
+
|
|
216
|
+
logger.debug("Status Timeline After this");
|
|
217
|
+
logger.debug(onCreate.carryForward.statusTimelineAfterThisStatus);
|
|
218
|
+
|
|
219
|
+
logger.debug("Created Item");
|
|
220
|
+
logger.debug(createdItem);
|
|
221
|
+
|
|
222
|
+
// Handle timeline updates
|
|
223
|
+
if (!onCreate.carryForward.statusTimelineBeforeThisStatus) {
|
|
224
|
+
// This is the first status, no need to update previous status.
|
|
225
|
+
logger.debug("This is the first status.");
|
|
226
|
+
} else if (!onCreate.carryForward.statusTimelineAfterThisStatus) {
|
|
227
|
+
// This is the last status. Update the previous status to end at the start of this status.
|
|
228
|
+
await this.updateOneById({
|
|
229
|
+
id: onCreate.carryForward.statusTimelineBeforeThisStatus.id!,
|
|
230
|
+
data: {
|
|
231
|
+
endsAt: createdItem.startsAt!,
|
|
232
|
+
},
|
|
233
|
+
props: {
|
|
234
|
+
isRoot: true,
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
logger.debug("This is the last status.");
|
|
238
|
+
} else {
|
|
239
|
+
// This is in the middle. Update the previous status to end at the start of this status.
|
|
240
|
+
await this.updateOneById({
|
|
241
|
+
id: onCreate.carryForward.statusTimelineBeforeThisStatus.id!,
|
|
242
|
+
data: {
|
|
243
|
+
endsAt: createdItem.startsAt!,
|
|
244
|
+
},
|
|
245
|
+
props: {
|
|
246
|
+
isRoot: true,
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
// Update the next status to start at the end of this status.
|
|
251
|
+
await this.updateOneById({
|
|
252
|
+
id: onCreate.carryForward.statusTimelineAfterThisStatus.id!,
|
|
253
|
+
data: {
|
|
254
|
+
startsAt: createdItem.endsAt!,
|
|
255
|
+
},
|
|
256
|
+
props: {
|
|
257
|
+
isRoot: true,
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
logger.debug("This status is in the middle.");
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Update episode's current state if this is the latest timeline entry
|
|
264
|
+
if (!createdItem.endsAt) {
|
|
265
|
+
const updateData: {
|
|
266
|
+
currentIncidentStateId: ObjectID;
|
|
267
|
+
resolvedAt?: Date | null;
|
|
268
|
+
} = {
|
|
269
|
+
currentIncidentStateId: createdItem.incidentStateId,
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
// Check if the new state is a resolved state and update resolvedAt accordingly
|
|
273
|
+
const newIncidentState: IncidentState | null =
|
|
274
|
+
await IncidentStateService.findOneById({
|
|
275
|
+
id: createdItem.incidentStateId,
|
|
276
|
+
select: {
|
|
277
|
+
isResolvedState: true,
|
|
278
|
+
},
|
|
279
|
+
props: {
|
|
280
|
+
isRoot: true,
|
|
281
|
+
},
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
if (newIncidentState?.isResolvedState) {
|
|
285
|
+
// Set resolvedAt when transitioning to resolved state
|
|
286
|
+
updateData.resolvedAt = OneUptimeDate.getCurrentDate();
|
|
287
|
+
} else {
|
|
288
|
+
// Clear resolvedAt when transitioning away from resolved state
|
|
289
|
+
updateData.resolvedAt = null;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
await IncidentEpisodeService.updateOneBy({
|
|
293
|
+
query: {
|
|
294
|
+
_id: createdItem.incidentEpisodeId?.toString(),
|
|
295
|
+
},
|
|
296
|
+
data: updateData,
|
|
297
|
+
props: onCreate.createBy.props,
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
// Cascade state change to all member incidents
|
|
301
|
+
if (createdItem.projectId) {
|
|
302
|
+
try {
|
|
303
|
+
await IncidentEpisodeService.cascadeStateToMemberIncidents({
|
|
304
|
+
projectId: createdItem.projectId,
|
|
305
|
+
episodeId: createdItem.incidentEpisodeId,
|
|
306
|
+
incidentStateId: createdItem.incidentStateId,
|
|
307
|
+
props: {
|
|
308
|
+
isRoot: true,
|
|
309
|
+
},
|
|
310
|
+
});
|
|
311
|
+
} catch (error) {
|
|
312
|
+
logger.error(
|
|
313
|
+
`Failed to cascade state change to member incidents: ${error}`,
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
if (mutex) {
|
|
320
|
+
try {
|
|
321
|
+
await Semaphore.release(mutex);
|
|
322
|
+
} catch (err) {
|
|
323
|
+
logger.error(err);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
const incidentState: IncidentState | null =
|
|
328
|
+
await IncidentStateService.findOneBy({
|
|
329
|
+
query: {
|
|
330
|
+
_id: createdItem.incidentStateId.toString()!,
|
|
331
|
+
},
|
|
332
|
+
props: {
|
|
333
|
+
isRoot: true,
|
|
334
|
+
},
|
|
335
|
+
select: {
|
|
336
|
+
_id: true,
|
|
337
|
+
isResolvedState: true,
|
|
338
|
+
isAcknowledgedState: true,
|
|
339
|
+
isCreatedState: true,
|
|
340
|
+
color: true,
|
|
341
|
+
name: true,
|
|
342
|
+
},
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
const stateName: string = incidentState?.name || "";
|
|
346
|
+
let stateEmoji: string = "➡️";
|
|
347
|
+
|
|
348
|
+
if (incidentState?.isResolvedState) {
|
|
349
|
+
stateEmoji = "✅";
|
|
350
|
+
} else if (incidentState?.isAcknowledgedState) {
|
|
351
|
+
stateEmoji = "👀";
|
|
352
|
+
} else if (incidentState?.isCreatedState) {
|
|
353
|
+
stateEmoji = "🔴";
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
const episode: IncidentEpisode | null =
|
|
357
|
+
await IncidentEpisodeService.findOneById({
|
|
358
|
+
id: createdItem.incidentEpisodeId,
|
|
359
|
+
select: {
|
|
360
|
+
episodeNumber: true,
|
|
361
|
+
},
|
|
362
|
+
props: {
|
|
363
|
+
isRoot: true,
|
|
364
|
+
},
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
const episodeNumber: number = episode?.episodeNumber || 0;
|
|
368
|
+
|
|
369
|
+
await IncidentEpisodeFeedService.createIncidentEpisodeFeedItem({
|
|
370
|
+
incidentEpisodeId: createdItem.incidentEpisodeId!,
|
|
371
|
+
projectId: createdItem.projectId!,
|
|
372
|
+
incidentEpisodeFeedEventType:
|
|
373
|
+
IncidentEpisodeFeedEventType.EpisodeStateChanged,
|
|
374
|
+
displayColor: incidentState?.color,
|
|
375
|
+
feedInfoInMarkdown:
|
|
376
|
+
stateEmoji +
|
|
377
|
+
` Changed **Episode ${episodeNumber} State** to **` +
|
|
378
|
+
stateName +
|
|
379
|
+
"**",
|
|
380
|
+
moreInformationInMarkdown: createdItem.rootCause
|
|
381
|
+
? `**Cause:** \n${createdItem.rootCause}`
|
|
382
|
+
: undefined,
|
|
383
|
+
userId: createdItem.createdByUserId || onCreate.createBy.props.userId,
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
return createdItem;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
@CaptureSpan()
|
|
390
|
+
protected override async onBeforeDelete(
|
|
391
|
+
deleteBy: DeleteBy<IncidentEpisodeStateTimeline>,
|
|
392
|
+
): Promise<OnDelete<IncidentEpisodeStateTimeline>> {
|
|
393
|
+
if (deleteBy.query._id) {
|
|
394
|
+
const episodeStateTimelineToBeDeleted: IncidentEpisodeStateTimeline | null =
|
|
395
|
+
await this.findOneById({
|
|
396
|
+
id: new ObjectID(deleteBy.query._id as string),
|
|
397
|
+
select: {
|
|
398
|
+
incidentEpisodeId: true,
|
|
399
|
+
startsAt: true,
|
|
400
|
+
endsAt: true,
|
|
401
|
+
},
|
|
402
|
+
props: {
|
|
403
|
+
isRoot: true,
|
|
404
|
+
},
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
const episodeId: ObjectID | undefined =
|
|
408
|
+
episodeStateTimelineToBeDeleted?.incidentEpisodeId;
|
|
409
|
+
|
|
410
|
+
if (episodeId) {
|
|
411
|
+
const episodeStateTimeline: PositiveNumber = await this.countBy({
|
|
412
|
+
query: {
|
|
413
|
+
incidentEpisodeId: episodeId,
|
|
414
|
+
},
|
|
415
|
+
props: {
|
|
416
|
+
isRoot: true,
|
|
417
|
+
},
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
if (!episodeStateTimelineToBeDeleted) {
|
|
421
|
+
throw new BadDataException("Episode state timeline not found.");
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
if (episodeStateTimeline.isOne()) {
|
|
425
|
+
throw new BadDataException(
|
|
426
|
+
"Cannot delete the only state timeline. Episode should have at least one state in its timeline.",
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// Handle timeline adjustments
|
|
431
|
+
const stateBeforeThis: IncidentEpisodeStateTimeline | null =
|
|
432
|
+
await this.findOneBy({
|
|
433
|
+
query: {
|
|
434
|
+
_id: QueryHelper.notEquals(deleteBy.query._id as string),
|
|
435
|
+
incidentEpisodeId: episodeId,
|
|
436
|
+
startsAt: QueryHelper.lessThanEqualTo(
|
|
437
|
+
episodeStateTimelineToBeDeleted.startsAt!,
|
|
438
|
+
),
|
|
439
|
+
},
|
|
440
|
+
sort: {
|
|
441
|
+
startsAt: SortOrder.Descending,
|
|
442
|
+
},
|
|
443
|
+
props: {
|
|
444
|
+
isRoot: true,
|
|
445
|
+
},
|
|
446
|
+
select: {
|
|
447
|
+
incidentStateId: true,
|
|
448
|
+
startsAt: true,
|
|
449
|
+
endsAt: true,
|
|
450
|
+
},
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
const stateAfterThis: IncidentEpisodeStateTimeline | null =
|
|
454
|
+
await this.findOneBy({
|
|
455
|
+
query: {
|
|
456
|
+
incidentEpisodeId: episodeId,
|
|
457
|
+
startsAt: QueryHelper.greaterThan(
|
|
458
|
+
episodeStateTimelineToBeDeleted.startsAt!,
|
|
459
|
+
),
|
|
460
|
+
},
|
|
461
|
+
sort: {
|
|
462
|
+
startsAt: SortOrder.Ascending,
|
|
463
|
+
},
|
|
464
|
+
props: {
|
|
465
|
+
isRoot: true,
|
|
466
|
+
},
|
|
467
|
+
select: {
|
|
468
|
+
incidentStateId: true,
|
|
469
|
+
startsAt: true,
|
|
470
|
+
endsAt: true,
|
|
471
|
+
},
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
if (!stateBeforeThis) {
|
|
475
|
+
// This is the first state, no need to update previous state.
|
|
476
|
+
logger.debug("This is the first state.");
|
|
477
|
+
} else if (!stateAfterThis) {
|
|
478
|
+
// This is the last state. Update the previous state to end at the end of this state.
|
|
479
|
+
await this.updateOneById({
|
|
480
|
+
id: stateBeforeThis.id!,
|
|
481
|
+
data: {
|
|
482
|
+
endsAt: episodeStateTimelineToBeDeleted.endsAt!,
|
|
483
|
+
},
|
|
484
|
+
props: {
|
|
485
|
+
isRoot: true,
|
|
486
|
+
},
|
|
487
|
+
});
|
|
488
|
+
logger.debug("This is the last state.");
|
|
489
|
+
} else {
|
|
490
|
+
// This state is in the middle. Update the previous state to end at the start of the next state.
|
|
491
|
+
await this.updateOneById({
|
|
492
|
+
id: stateBeforeThis.id!,
|
|
493
|
+
data: {
|
|
494
|
+
endsAt: stateAfterThis.startsAt!,
|
|
495
|
+
},
|
|
496
|
+
props: {
|
|
497
|
+
isRoot: true,
|
|
498
|
+
},
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
// Update the next state to start at the start of this state.
|
|
502
|
+
await this.updateOneById({
|
|
503
|
+
id: stateAfterThis.id!,
|
|
504
|
+
data: {
|
|
505
|
+
startsAt: episodeStateTimelineToBeDeleted.startsAt!,
|
|
506
|
+
},
|
|
507
|
+
props: {
|
|
508
|
+
isRoot: true,
|
|
509
|
+
},
|
|
510
|
+
});
|
|
511
|
+
logger.debug("This state is in the middle.");
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
return { deleteBy, carryForward: episodeId };
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
return { deleteBy, carryForward: null };
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
@CaptureSpan()
|
|
522
|
+
protected override async onDeleteSuccess(
|
|
523
|
+
onDelete: OnDelete<IncidentEpisodeStateTimeline>,
|
|
524
|
+
_itemIdsBeforeDelete: ObjectID[],
|
|
525
|
+
): Promise<OnDelete<IncidentEpisodeStateTimeline>> {
|
|
526
|
+
if (onDelete.carryForward) {
|
|
527
|
+
const episodeId: ObjectID = onDelete.carryForward as ObjectID;
|
|
528
|
+
|
|
529
|
+
// Get last status of this episode.
|
|
530
|
+
const episodeStateTimeline: IncidentEpisodeStateTimeline | null =
|
|
531
|
+
await this.findOneBy({
|
|
532
|
+
query: {
|
|
533
|
+
incidentEpisodeId: episodeId,
|
|
534
|
+
},
|
|
535
|
+
sort: {
|
|
536
|
+
startsAt: SortOrder.Descending,
|
|
537
|
+
},
|
|
538
|
+
props: {
|
|
539
|
+
isRoot: true,
|
|
540
|
+
},
|
|
541
|
+
select: {
|
|
542
|
+
_id: true,
|
|
543
|
+
incidentStateId: true,
|
|
544
|
+
},
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
if (episodeStateTimeline && episodeStateTimeline.incidentStateId) {
|
|
548
|
+
await IncidentEpisodeService.updateOneBy({
|
|
549
|
+
query: {
|
|
550
|
+
_id: episodeId.toString(),
|
|
551
|
+
},
|
|
552
|
+
data: {
|
|
553
|
+
currentIncidentStateId: episodeStateTimeline.incidentStateId,
|
|
554
|
+
},
|
|
555
|
+
props: {
|
|
556
|
+
isRoot: true,
|
|
557
|
+
},
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
return onDelete;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
export default new Service();
|