@oneuptime/common 7.0.3717 → 7.0.3786
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 +3 -2
- package/Models/DatabaseModels/Incident.ts +3 -2
- package/Models/DatabaseModels/Index.ts +3 -0
- package/Models/DatabaseModels/ProjectUser.ts +335 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +3 -2
- package/Server/API/SlackAPI.ts +65 -97
- package/Server/API/UserOnCallLogTimelineAPI.ts +2 -9
- package/Server/Infrastructure/Postgres/SchemaMigrations/1740597525803-MigrationName.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1740598793630-MigrationName.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1741031019972-MigrationName.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1741209339971-MigrationName.ts +101 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Middleware/SlackAuthorization.ts +11 -2
- package/Server/Services/AlertFeedService.ts +2 -2
- package/Server/Services/AlertInternalNoteService.ts +2 -2
- package/Server/Services/AlertOwnerTeamService.ts +4 -4
- package/Server/Services/AlertOwnerUserService.ts +3 -3
- package/Server/Services/AlertService.ts +62 -20
- package/Server/Services/AlertStateTimelineService.ts +8 -18
- package/Server/Services/IncidentFeedService.ts +101 -2
- package/Server/Services/IncidentInternalNoteService.ts +47 -4
- package/Server/Services/IncidentOwnerTeamService.ts +57 -4
- package/Server/Services/IncidentOwnerUserService.ts +59 -15
- package/Server/Services/IncidentPublicNoteService.ts +41 -4
- package/Server/Services/IncidentService.ts +279 -193
- package/Server/Services/IncidentStateService.ts +25 -0
- package/Server/Services/IncidentStateTimelineService.ts +37 -19
- package/Server/Services/MonitorStatusTimelineService.ts +7 -17
- package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -0
- package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +74 -7
- package/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.ts +63 -4
- package/Server/Services/OnCallDutyPolicyService.ts +13 -0
- package/Server/Services/ProjectUserService.ts +130 -0
- package/Server/Services/ScheduledMaintenanceFeedService.ts +2 -2
- package/Server/Services/ScheduledMaintenanceInternalNoteService.ts +12 -10
- package/Server/Services/ScheduledMaintenanceOwnerTeamService.ts +22 -18
- package/Server/Services/ScheduledMaintenanceOwnerUserService.ts +28 -30
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +12 -10
- package/Server/Services/ScheduledMaintenanceService.ts +16 -10
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +1 -1
- package/Server/Services/StatusPageSubscriberService.ts +3 -0
- package/Server/Services/TeamMemberService.ts +20 -0
- package/Server/Services/UserNotificationRuleService.ts +74 -0
- package/Server/Services/UserOnCallLogService.ts +1 -1
- package/Server/Services/UserService.ts +35 -0
- package/Server/Services/WorkspaceNotificationRuleService.ts +508 -149
- package/Server/Services/WorkspaceUserAuthTokenService.ts +23 -0
- package/Server/Utils/Express.ts +1 -1
- package/Server/Utils/StartServer.ts +6 -1
- package/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.ts +195 -0
- package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +20 -0
- package/Server/Utils/Workspace/Slack/Actions/Auth.ts +266 -0
- package/Server/Utils/Workspace/Slack/Actions/Incident.ts +1117 -0
- package/Server/Utils/Workspace/Slack/Messages/Incident.ts +116 -0
- package/Server/Utils/Workspace/Slack/Slack.ts +555 -18
- package/Server/Utils/Workspace/Slack/app-manifest.json +18 -10
- package/Server/Utils/Workspace/Workspace.ts +194 -1
- package/Server/Utils/Workspace/WorkspaceBase.ts +145 -19
- package/Server/Utils/Workspace/WorkspaceMessages/Incident.ts +68 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +2 -1
- package/Types/Workspace/NotificationRules/NotificationRuleUtil.ts +251 -121
- package/Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel.ts +6 -0
- package/Types/Workspace/WorkspaceMessagePayload.ts +71 -2
- package/UI/Components/ComingSoon/ComingSoon.tsx +13 -3
- package/UI/Components/Forms/Fields/FormField.tsx +2 -2
- package/UI/Components/Icon/Icon.tsx +39 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +16 -0
- package/UI/Components/Radio/Radio.tsx +11 -2
- package/UI/Components/Table/TableCard.tsx +2 -2
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectUser.js +340 -0
- package/build/dist/Models/DatabaseModels/ProjectUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +39 -79
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1740597525803-MigrationName.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1740597525803-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1740598793630-MigrationName.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1740598793630-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1741031019972-MigrationName.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1741031019972-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1741209339971-MigrationName.js +42 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1741209339971-MigrationName.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/Middleware/SlackAuthorization.js +8 -2
- package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AlertFeedService.js +2 -2
- package/build/dist/Server/Services/AlertFeedService.js.map +1 -1
- package/build/dist/Server/Services/AlertInternalNoteService.js +2 -2
- package/build/dist/Server/Services/AlertInternalNoteService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerTeamService.js +4 -4
- package/build/dist/Server/Services/AlertOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerUserService.js +3 -3
- package/build/dist/Server/Services/AlertOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +44 -19
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AlertStateTimelineService.js +6 -16
- package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentFeedService.js +62 -2
- package/build/dist/Server/Services/IncidentFeedService.js.map +1 -1
- package/build/dist/Server/Services/IncidentInternalNoteService.js +35 -4
- package/build/dist/Server/Services/IncidentInternalNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerTeamService.js +42 -4
- package/build/dist/Server/Services/IncidentOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerUserService.js +43 -15
- package/build/dist/Server/Services/IncidentOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +32 -4
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +221 -170
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateService.js +14 -0
- package/build/dist/Server/Services/IncidentStateService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +31 -17
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +5 -15
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +62 -7
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js +51 -5
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyService.js +6 -0
- package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
- package/build/dist/Server/Services/ProjectUserService.js +106 -0
- package/build/dist/Server/Services/ProjectUserService.js.map +1 -0
- package/build/dist/Server/Services/ScheduledMaintenanceFeedService.js +2 -2
- package/build/dist/Server/Services/ScheduledMaintenanceFeedService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceInternalNoteService.js +2 -2
- package/build/dist/Server/Services/ScheduledMaintenanceInternalNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerTeamService.js +4 -4
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerUserService.js +8 -16
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +2 -2
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +5 -2
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +3 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +17 -0
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +52 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserOnCallLogService.js +1 -1
- package/build/dist/Server/Services/UserOnCallLogService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +23 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +306 -84
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceUserAuthTokenService.js +18 -0
- package/build/dist/Server/Services/WorkspaceUserAuthTokenService.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +4 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.js +148 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +19 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +167 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +727 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Messages/Incident.js +82 -0
- package/build/dist/Server/Utils/Workspace/Slack/Messages/Incident.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +397 -14
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/app-manifest.json +18 -10
- package/build/dist/Server/Utils/Workspace/Workspace.js +126 -0
- package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js +69 -11
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceMessages/Incident.js +47 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceMessages/Incident.js.map +1 -0
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +2 -1
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleUtil.js +214 -120
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleUtil.js.map +1 -1
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel.js +2 -0
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel.js.map +1 -0
- package/build/dist/UI/Components/ComingSoon/ComingSoon.js +3 -2
- package/build/dist/UI/Components/ComingSoon/ComingSoon.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +2 -2
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +19 -2
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +11 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Radio/Radio.js +5 -2
- package/build/dist/UI/Components/Radio/Radio.js.map +1 -1
- package/build/dist/UI/Components/Table/TableCard.js +2 -2
- package/build/dist/UI/Components/Table/TableCard.js.map +1 -1
- package/package.json +3 -2
- package/Server/Utils/Workspace/Slack/app-manifest.example.json +0 -198
|
@@ -5,10 +5,25 @@ import IncidentFeedService from "./IncidentFeedService";
|
|
|
5
5
|
import { IncidentFeedEventType } from "../../Models/DatabaseModels/IncidentFeed";
|
|
6
6
|
import { Blue500, Indigo500 } from "../../Types/BrandColors";
|
|
7
7
|
import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
8
|
+
import IncidentService from "./IncidentService";
|
|
8
9
|
export class Service extends DatabaseService {
|
|
9
10
|
constructor() {
|
|
10
11
|
super(Model);
|
|
11
12
|
}
|
|
13
|
+
async addNote(data) {
|
|
14
|
+
const publicNote = new Model();
|
|
15
|
+
publicNote.createdByUserId = data.userId;
|
|
16
|
+
publicNote.incidentId = data.incidentId;
|
|
17
|
+
publicNote.projectId = data.projectId;
|
|
18
|
+
publicNote.note = data.note;
|
|
19
|
+
publicNote.postedAt = OneUptimeDate.getCurrentDate();
|
|
20
|
+
return this.create({
|
|
21
|
+
data: publicNote,
|
|
22
|
+
props: {
|
|
23
|
+
isRoot: true,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
}
|
|
12
27
|
async onBeforeCreate(createBy) {
|
|
13
28
|
if (!createBy.data.postedAt) {
|
|
14
29
|
createBy.data.postedAt = OneUptimeDate.getCurrentDate();
|
|
@@ -21,16 +36,25 @@ export class Service extends DatabaseService {
|
|
|
21
36
|
async onCreateSuccess(_onCreate, createdItem) {
|
|
22
37
|
var _a;
|
|
23
38
|
const userId = createdItem.createdByUserId || ((_a = createdItem.createdByUser) === null || _a === void 0 ? void 0 : _a.id);
|
|
24
|
-
|
|
39
|
+
const incidentId = createdItem.incidentId;
|
|
40
|
+
const projectId = createdItem.projectId;
|
|
41
|
+
const incidentNumber = await IncidentService.getIncidentNumber({
|
|
42
|
+
incidentId: incidentId,
|
|
43
|
+
});
|
|
44
|
+
await IncidentFeedService.createIncidentFeedItem({
|
|
25
45
|
incidentId: createdItem.incidentId,
|
|
26
46
|
projectId: createdItem.projectId,
|
|
27
47
|
incidentFeedEventType: IncidentFeedEventType.PublicNote,
|
|
28
48
|
displayColor: Indigo500,
|
|
29
49
|
userId: userId || undefined,
|
|
30
|
-
feedInfoInMarkdown:
|
|
50
|
+
feedInfoInMarkdown: `📄 posted **public note** for this [Incident ${incidentNumber}](${(await IncidentService.getIncidentLinkInDashboard(projectId, incidentId)).toString()}) on status page:
|
|
31
51
|
|
|
32
52
|
${createdItem.note}
|
|
33
53
|
`,
|
|
54
|
+
workspaceNotification: {
|
|
55
|
+
sendWorkspaceNotification: true,
|
|
56
|
+
notifyUserId: userId || undefined,
|
|
57
|
+
},
|
|
34
58
|
});
|
|
35
59
|
return createdItem;
|
|
36
60
|
}
|
|
@@ -55,16 +79,20 @@ ${createdItem.note}
|
|
|
55
79
|
});
|
|
56
80
|
const userId = onUpdate.updateBy.props.userId;
|
|
57
81
|
for (const updatedItem of updatedItems) {
|
|
58
|
-
await IncidentFeedService.
|
|
82
|
+
await IncidentFeedService.createIncidentFeedItem({
|
|
59
83
|
incidentId: updatedItem.incidentId,
|
|
60
84
|
projectId: updatedItem.projectId,
|
|
61
85
|
incidentFeedEventType: IncidentFeedEventType.PublicNote,
|
|
62
86
|
displayColor: Blue500,
|
|
63
87
|
userId: userId || undefined,
|
|
64
|
-
feedInfoInMarkdown:
|
|
88
|
+
feedInfoInMarkdown: `📄 **Updated Public Note**
|
|
65
89
|
|
|
66
90
|
${updatedItem.note}
|
|
67
91
|
`,
|
|
92
|
+
workspaceNotification: {
|
|
93
|
+
sendWorkspaceNotification: true,
|
|
94
|
+
notifyUserId: userId || undefined,
|
|
95
|
+
},
|
|
68
96
|
});
|
|
69
97
|
}
|
|
70
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncidentPublicNoteService.js","sourceRoot":"","sources":["../../../../Server/Services/IncidentPublicNoteService.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,MAAM,iDAAiD,CAAC;AACpE,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"IncidentPublicNoteService.js","sourceRoot":"","sources":["../../../../Server/Services/IncidentPublicNoteService.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,8 +37,7 @@ import { IncidentFeedEventType } from "../../Models/DatabaseModels/IncidentFeed"
|
|
|
37
37
|
import { Gray500, Red500 } from "../../Types/BrandColors";
|
|
38
38
|
import LabelService from "./LabelService";
|
|
39
39
|
import IncidentSeverityService from "./IncidentSeverityService";
|
|
40
|
-
import
|
|
41
|
-
import NotificationRuleEventType from "../../Types/Workspace/NotificationRules/EventType";
|
|
40
|
+
import IncidentWorkspaceMessages from "../Utils/Workspace/WorkspaceMessages/Incident";
|
|
42
41
|
export class Service extends DatabaseService {
|
|
43
42
|
constructor() {
|
|
44
43
|
super(Model);
|
|
@@ -46,6 +45,40 @@ export class Service extends DatabaseService {
|
|
|
46
45
|
this.hardDeleteItemsOlderThanInDays("createdAt", 120);
|
|
47
46
|
}
|
|
48
47
|
}
|
|
48
|
+
async isIncidentResolved(data) {
|
|
49
|
+
const incident = await this.findOneBy({
|
|
50
|
+
query: {
|
|
51
|
+
_id: data.incidentId,
|
|
52
|
+
},
|
|
53
|
+
select: {
|
|
54
|
+
projectId: true,
|
|
55
|
+
currentIncidentState: {
|
|
56
|
+
order: true,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
props: {
|
|
60
|
+
isRoot: true,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
if (!incident) {
|
|
64
|
+
throw new BadDataException("Incident not found");
|
|
65
|
+
}
|
|
66
|
+
if (!incident.projectId) {
|
|
67
|
+
throw new BadDataException("Incient Project ID not found");
|
|
68
|
+
}
|
|
69
|
+
const resolvedIncidentState = await IncidentStateService.getResolvedIncidentState({
|
|
70
|
+
projectId: incident.projectId,
|
|
71
|
+
props: {
|
|
72
|
+
isRoot: true,
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
const currentIncidentStateOrder = incident.currentIncidentState.order;
|
|
76
|
+
const resolvedIncidentStateOrder = resolvedIncidentState.order;
|
|
77
|
+
if (currentIncidentStateOrder >= resolvedIncidentStateOrder) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
49
82
|
async isIncidentAcknowledged(data) {
|
|
50
83
|
const incident = await this.findOneBy({
|
|
51
84
|
query: {
|
|
@@ -80,11 +113,55 @@ export class Service extends DatabaseService {
|
|
|
80
113
|
}
|
|
81
114
|
return false;
|
|
82
115
|
}
|
|
116
|
+
async resolveIncident(incidentId, resolvedByUserId) {
|
|
117
|
+
const incident = await this.findOneById({
|
|
118
|
+
id: incidentId,
|
|
119
|
+
select: {
|
|
120
|
+
projectId: true,
|
|
121
|
+
incidentNumber: true,
|
|
122
|
+
},
|
|
123
|
+
props: {
|
|
124
|
+
isRoot: true,
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
if (!incident || !incident.projectId) {
|
|
128
|
+
throw new BadDataException("Incident not found.");
|
|
129
|
+
}
|
|
130
|
+
const incidentState = await IncidentStateService.findOneBy({
|
|
131
|
+
query: {
|
|
132
|
+
projectId: incident.projectId,
|
|
133
|
+
isResolvedState: true,
|
|
134
|
+
},
|
|
135
|
+
select: {
|
|
136
|
+
_id: true,
|
|
137
|
+
},
|
|
138
|
+
props: {
|
|
139
|
+
isRoot: true,
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
if (!incidentState || !incidentState.id) {
|
|
143
|
+
throw new BadDataException("Acknowledged state not found for this project. Please add acknowledged state from settings.");
|
|
144
|
+
}
|
|
145
|
+
const incidentStateTimeline = new IncidentStateTimeline();
|
|
146
|
+
incidentStateTimeline.projectId = incident.projectId;
|
|
147
|
+
incidentStateTimeline.incidentId = incidentId;
|
|
148
|
+
incidentStateTimeline.incidentStateId = incidentState.id;
|
|
149
|
+
incidentStateTimeline.createdByUserId = resolvedByUserId;
|
|
150
|
+
await IncidentStateTimelineService.create({
|
|
151
|
+
data: incidentStateTimeline,
|
|
152
|
+
props: {
|
|
153
|
+
isRoot: true,
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
// store incident metric
|
|
157
|
+
return incident;
|
|
158
|
+
}
|
|
83
159
|
async acknowledgeIncident(incidentId, acknowledgedByUserId) {
|
|
84
160
|
const incident = await this.findOneById({
|
|
85
161
|
id: incidentId,
|
|
86
162
|
select: {
|
|
87
163
|
projectId: true,
|
|
164
|
+
incidentNumber: true,
|
|
88
165
|
},
|
|
89
166
|
props: {
|
|
90
167
|
isRoot: true,
|
|
@@ -120,6 +197,7 @@ export class Service extends DatabaseService {
|
|
|
120
197
|
},
|
|
121
198
|
});
|
|
122
199
|
// store incident metric
|
|
200
|
+
return incident;
|
|
123
201
|
}
|
|
124
202
|
async getExistingIncidentNumberForProject(data) {
|
|
125
203
|
// get last incident number.
|
|
@@ -198,21 +276,11 @@ export class Service extends DatabaseService {
|
|
|
198
276
|
if (createBy.data.createdByUser && createBy.data.createdByUser.id) {
|
|
199
277
|
userId = createBy.data.createdByUser.id;
|
|
200
278
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
_id: true,
|
|
207
|
-
name: true,
|
|
208
|
-
email: true,
|
|
209
|
-
},
|
|
210
|
-
props: {
|
|
211
|
-
isRoot: true,
|
|
212
|
-
},
|
|
213
|
-
});
|
|
214
|
-
if (user) {
|
|
215
|
-
createBy.data.rootCause = `Incident created by ${user.name} (${user.email})`;
|
|
279
|
+
if (userId) {
|
|
280
|
+
createBy.data.rootCause = `Incident created by ${await UserService.getUserMarkdownString({
|
|
281
|
+
userId: userId,
|
|
282
|
+
projectId: projectId,
|
|
283
|
+
})}`;
|
|
216
284
|
}
|
|
217
285
|
}
|
|
218
286
|
return {
|
|
@@ -223,7 +291,7 @@ export class Service extends DatabaseService {
|
|
|
223
291
|
};
|
|
224
292
|
}
|
|
225
293
|
async onCreateSuccess(onCreate, createdItem) {
|
|
226
|
-
var _a, _b, _c, _d, _e;
|
|
294
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
227
295
|
// these should never be null.
|
|
228
296
|
if (!createdItem.projectId) {
|
|
229
297
|
throw new BadDataException("projectId is required");
|
|
@@ -231,6 +299,33 @@ export class Service extends DatabaseService {
|
|
|
231
299
|
if (!createdItem.id) {
|
|
232
300
|
throw new BadDataException("id is required");
|
|
233
301
|
}
|
|
302
|
+
const incident = await this.findOneById({
|
|
303
|
+
id: createdItem.id,
|
|
304
|
+
select: {
|
|
305
|
+
projectId: true,
|
|
306
|
+
incidentNumber: true,
|
|
307
|
+
title: true,
|
|
308
|
+
description: true,
|
|
309
|
+
incidentSeverity: {
|
|
310
|
+
name: true,
|
|
311
|
+
},
|
|
312
|
+
rootCause: true,
|
|
313
|
+
remediationNotes: true,
|
|
314
|
+
currentIncidentState: {
|
|
315
|
+
name: true,
|
|
316
|
+
},
|
|
317
|
+
monitors: {
|
|
318
|
+
name: true,
|
|
319
|
+
_id: true,
|
|
320
|
+
},
|
|
321
|
+
},
|
|
322
|
+
props: {
|
|
323
|
+
isRoot: true,
|
|
324
|
+
},
|
|
325
|
+
});
|
|
326
|
+
if (!incident) {
|
|
327
|
+
throw new BadDataException("Incident not found");
|
|
328
|
+
}
|
|
234
329
|
// release the mutex.
|
|
235
330
|
if (onCreate.carryForward && onCreate.carryForward.mutex) {
|
|
236
331
|
const mutex = onCreate.carryForward.mutex;
|
|
@@ -251,30 +346,83 @@ export class Service extends DatabaseService {
|
|
|
251
346
|
}
|
|
252
347
|
}
|
|
253
348
|
const createdByUserId = createdItem.createdByUserId || ((_a = createdItem.createdByUser) === null || _a === void 0 ? void 0 : _a.id);
|
|
254
|
-
|
|
255
|
-
|
|
349
|
+
// send message to workspaces - slack, teams, etc.
|
|
350
|
+
const workspaceResult = await IncidentWorkspaceMessages.createChannelsAndInviteUsersToChannels({
|
|
256
351
|
projectId: createdItem.projectId,
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
352
|
+
incidentId: createdItem.id,
|
|
353
|
+
incidentNumber: createdItem.incidentNumber,
|
|
354
|
+
});
|
|
355
|
+
if (workspaceResult && ((_b = workspaceResult.channelsCreated) === null || _b === void 0 ? void 0 : _b.length) > 0) {
|
|
356
|
+
// update incident with these channels.
|
|
357
|
+
await this.updateOneById({
|
|
358
|
+
id: createdItem.id,
|
|
359
|
+
data: {
|
|
360
|
+
postUpdatesToWorkspaceChannels: workspaceResult.channelsCreated || [],
|
|
361
|
+
},
|
|
362
|
+
props: {
|
|
363
|
+
isRoot: true,
|
|
364
|
+
},
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
let feedInfoInMarkdown = `#### 🚨 Incident ${(_c = createdItem.incidentNumber) === null || _c === void 0 ? void 0 : _c.toString()} Created:
|
|
260
368
|
|
|
261
|
-
|
|
369
|
+
**${createdItem.title || "No title provided."}**:
|
|
262
370
|
|
|
263
|
-
${createdItem.
|
|
371
|
+
${createdItem.description || "No description provided."}
|
|
264
372
|
|
|
265
|
-
|
|
373
|
+
`;
|
|
374
|
+
if ((_d = incident.currentIncidentState) === null || _d === void 0 ? void 0 : _d.name) {
|
|
375
|
+
feedInfoInMarkdown += `🔴 **Incident State**: ${incident.currentIncidentState.name} \n\n`;
|
|
376
|
+
}
|
|
377
|
+
if ((_e = incident.incidentSeverity) === null || _e === void 0 ? void 0 : _e.name) {
|
|
378
|
+
feedInfoInMarkdown += `⚠️ **Severity**: ${incident.incidentSeverity.name} \n\n`;
|
|
379
|
+
}
|
|
380
|
+
if (incident.monitors && incident.monitors.length > 0) {
|
|
381
|
+
feedInfoInMarkdown += `🌎 **Resources Affected**:\n`;
|
|
382
|
+
for (const monitor of incident.monitors) {
|
|
383
|
+
feedInfoInMarkdown += `- [${monitor.name}](${(await MonitorService.getMonitorLinkInDashboard(createdItem.projectId, monitor.id)).toString()})\n`;
|
|
384
|
+
}
|
|
385
|
+
feedInfoInMarkdown += `\n\n`;
|
|
386
|
+
}
|
|
387
|
+
if (createdItem.rootCause) {
|
|
388
|
+
feedInfoInMarkdown += `\n
|
|
389
|
+
📄 **Root Cause**:
|
|
266
390
|
|
|
267
|
-
${createdItem.
|
|
391
|
+
${createdItem.rootCause || "No root cause provided."}
|
|
268
392
|
|
|
269
|
-
|
|
393
|
+
`;
|
|
394
|
+
}
|
|
395
|
+
if (createdItem.remediationNotes) {
|
|
396
|
+
feedInfoInMarkdown += `\n
|
|
397
|
+
🎯 **Remediation Notes**:
|
|
398
|
+
|
|
399
|
+
${createdItem.remediationNotes || "No remediation notes provided."}
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
`;
|
|
403
|
+
}
|
|
404
|
+
const incidentCreateMessageBlocks = await IncidentWorkspaceMessages.getIncidentCreateMessageBlocks({
|
|
405
|
+
incidentId: createdItem.id,
|
|
406
|
+
projectId: createdItem.projectId,
|
|
407
|
+
});
|
|
408
|
+
await IncidentFeedService.createIncidentFeedItem({
|
|
409
|
+
incidentId: createdItem.id,
|
|
410
|
+
projectId: createdItem.projectId,
|
|
411
|
+
incidentFeedEventType: IncidentFeedEventType.IncidentCreated,
|
|
412
|
+
displayColor: Red500,
|
|
413
|
+
feedInfoInMarkdown: feedInfoInMarkdown,
|
|
270
414
|
userId: createdByUserId || undefined,
|
|
415
|
+
workspaceNotification: {
|
|
416
|
+
appendMessageBlocks: incidentCreateMessageBlocks,
|
|
417
|
+
sendWorkspaceNotification: true,
|
|
418
|
+
},
|
|
271
419
|
});
|
|
272
420
|
if (!createdItem.currentIncidentStateId) {
|
|
273
421
|
throw new BadDataException("currentIncidentStateId is required");
|
|
274
422
|
}
|
|
275
423
|
if (createdItem.changeMonitorStatusToId && createdItem.projectId) {
|
|
276
424
|
// change status of all the monitors.
|
|
277
|
-
await MonitorService.changeMonitorStatus(createdItem.projectId, ((
|
|
425
|
+
await MonitorService.changeMonitorStatus(createdItem.projectId, ((_f = createdItem.monitors) === null || _f === void 0 ? void 0 : _f.map((monitor) => {
|
|
278
426
|
return new ObjectID(monitor._id || "");
|
|
279
427
|
})) || [], createdItem.changeMonitorStatusToId, true, // notifyMonitorOwners
|
|
280
428
|
createdItem.rootCause ||
|
|
@@ -295,24 +443,6 @@ ${createdItem.description || "No description provided."}
|
|
|
295
443
|
isRoot: true,
|
|
296
444
|
},
|
|
297
445
|
});
|
|
298
|
-
await IncidentFeedService.createIncidentFeed({
|
|
299
|
-
incidentId: createdItem.id,
|
|
300
|
-
projectId: createdItem.projectId,
|
|
301
|
-
incidentFeedEventType: IncidentFeedEventType.RootCause,
|
|
302
|
-
displayColor: Red500,
|
|
303
|
-
feedInfoInMarkdown: `**Root Cause**
|
|
304
|
-
|
|
305
|
-
${createdItem.rootCause || "No root cause provided."}`,
|
|
306
|
-
});
|
|
307
|
-
await IncidentFeedService.createIncidentFeed({
|
|
308
|
-
incidentId: createdItem.id,
|
|
309
|
-
projectId: createdItem.projectId,
|
|
310
|
-
incidentFeedEventType: IncidentFeedEventType.RemediationNotes,
|
|
311
|
-
displayColor: Red500,
|
|
312
|
-
feedInfoInMarkdown: `**Remediation Notes**
|
|
313
|
-
|
|
314
|
-
${createdItem.remediationNotes || "No remediation notes provided."}`,
|
|
315
|
-
});
|
|
316
446
|
// add owners.
|
|
317
447
|
if (onCreate.createBy.miscDataProps &&
|
|
318
448
|
(onCreate.createBy.miscDataProps["ownerTeams"] ||
|
|
@@ -321,8 +451,8 @@ ${createdItem.remediationNotes || "No remediation notes provided."}`,
|
|
|
321
451
|
[], onCreate.createBy.miscDataProps["ownerTeams"] ||
|
|
322
452
|
[], false, onCreate.createBy.props);
|
|
323
453
|
}
|
|
324
|
-
if (((
|
|
325
|
-
((
|
|
454
|
+
if (((_g = createdItem.onCallDutyPolicies) === null || _g === void 0 ? void 0 : _g.length) &&
|
|
455
|
+
((_h = createdItem.onCallDutyPolicies) === null || _h === void 0 ? void 0 : _h.length) > 0) {
|
|
326
456
|
for (const policy of createdItem.onCallDutyPolicies) {
|
|
327
457
|
await OnCallDutyPolicyService.executePolicy(new ObjectID(policy._id), {
|
|
328
458
|
triggeredByIncidentId: createdItem.id,
|
|
@@ -345,30 +475,6 @@ ${createdItem.remediationNotes || "No remediation notes provided."}`,
|
|
|
345
475
|
});
|
|
346
476
|
}
|
|
347
477
|
}
|
|
348
|
-
// // send message to workspaces - slack, teams, etc.
|
|
349
|
-
// const createdChannels: {
|
|
350
|
-
// channelsCreated: Array<WorkspaceChannel>;
|
|
351
|
-
// } | null = await this.notifyWorkspaceOnIncidentCreate({
|
|
352
|
-
// projectId: createdItem.projectId,
|
|
353
|
-
// incidentId: createdItem.id!,
|
|
354
|
-
// incidentNumber: createdItem.incidentNumber!,
|
|
355
|
-
// });
|
|
356
|
-
// if (
|
|
357
|
-
// createdChannels &&
|
|
358
|
-
// createdChannels.channelsCreated &&
|
|
359
|
-
// createdChannels.channelsCreated.length > 0
|
|
360
|
-
// ) {
|
|
361
|
-
// // update incident with these channels.
|
|
362
|
-
// await this.updateOneById({
|
|
363
|
-
// id: createdItem.id!,
|
|
364
|
-
// data: {
|
|
365
|
-
// postUpdatesToWorkspaceChannels: createdChannels.channelsCreated,
|
|
366
|
-
// },
|
|
367
|
-
// props: {
|
|
368
|
-
// isRoot: true,
|
|
369
|
-
// },
|
|
370
|
-
// });
|
|
371
|
-
// }
|
|
372
478
|
return createdItem;
|
|
373
479
|
}
|
|
374
480
|
async getIncidentIdentifiedDate(incidentId) {
|
|
@@ -505,8 +611,20 @@ ${createdItem.remediationNotes || "No remediation notes provided."}`,
|
|
|
505
611
|
}
|
|
506
612
|
if (updatedItemIds.length > 0) {
|
|
507
613
|
for (const incidentId of updatedItemIds) {
|
|
614
|
+
const incident = await this.findOneById({
|
|
615
|
+
id: incidentId,
|
|
616
|
+
select: {
|
|
617
|
+
projectId: true,
|
|
618
|
+
incidentNumber: true,
|
|
619
|
+
},
|
|
620
|
+
props: {
|
|
621
|
+
isRoot: true,
|
|
622
|
+
},
|
|
623
|
+
});
|
|
624
|
+
const projectId = incident.projectId;
|
|
625
|
+
const incidentNumber = incident.incidentNumber;
|
|
508
626
|
let shouldAddIncidentFeed = false;
|
|
509
|
-
let feedInfoInMarkdown =
|
|
627
|
+
let feedInfoInMarkdown = `**[Incident ${incidentNumber}](${(await this.getIncidentLinkInDashboard(projectId, incidentId)).toString()}) was updated.**`;
|
|
510
628
|
const createdByUserId = onUpdate.updateBy.props.userId;
|
|
511
629
|
if (onUpdate.updateBy.data.title) {
|
|
512
630
|
// add incident feed.
|
|
@@ -518,7 +636,7 @@ ${onUpdate.updateBy.data.title || "No title provided."}
|
|
|
518
636
|
if (onUpdate.updateBy.data.rootCause) {
|
|
519
637
|
if (onUpdate.updateBy.data.title) {
|
|
520
638
|
// add incident feed.
|
|
521
|
-
feedInfoInMarkdown += `\n\n
|
|
639
|
+
feedInfoInMarkdown += `\n\n**📄 Root Cause**:
|
|
522
640
|
${onUpdate.updateBy.data.rootCause || "No root cause provided."}
|
|
523
641
|
`;
|
|
524
642
|
shouldAddIncidentFeed = true;
|
|
@@ -533,7 +651,7 @@ ${onUpdate.updateBy.data.rootCause || "No root cause provided."}
|
|
|
533
651
|
}
|
|
534
652
|
if (onUpdate.updateBy.data.remediationNotes) {
|
|
535
653
|
// add incident feed.
|
|
536
|
-
feedInfoInMarkdown += `\n\n
|
|
654
|
+
feedInfoInMarkdown += `\n\n**🎯 Remediation Notes**:
|
|
537
655
|
${onUpdate.updateBy.data.remediationNotes || "No remediation notes provided."}
|
|
538
656
|
`;
|
|
539
657
|
shouldAddIncidentFeed = true;
|
|
@@ -566,7 +684,7 @@ ${onUpdate.updateBy.data.remediationNotes || "No remediation notes provided."}
|
|
|
566
684
|
},
|
|
567
685
|
});
|
|
568
686
|
if (labels.length > 0) {
|
|
569
|
-
feedInfoInMarkdown += `\n\n
|
|
687
|
+
feedInfoInMarkdown += `\n\n**🏷️ Labels**:
|
|
570
688
|
|
|
571
689
|
${labels
|
|
572
690
|
.map((label) => {
|
|
@@ -591,20 +709,23 @@ ${labels
|
|
|
591
709
|
},
|
|
592
710
|
});
|
|
593
711
|
if (incidentSeverity) {
|
|
594
|
-
feedInfoInMarkdown += `\n\n
|
|
712
|
+
feedInfoInMarkdown += `\n\n**⚠️ Incident Severity**:
|
|
595
713
|
${incidentSeverity.name}
|
|
596
714
|
`;
|
|
597
715
|
shouldAddIncidentFeed = true;
|
|
598
716
|
}
|
|
599
717
|
}
|
|
600
718
|
if (shouldAddIncidentFeed) {
|
|
601
|
-
await IncidentFeedService.
|
|
719
|
+
await IncidentFeedService.createIncidentFeedItem({
|
|
602
720
|
incidentId: incidentId,
|
|
603
721
|
projectId: onUpdate.updateBy.props.tenantId,
|
|
604
722
|
incidentFeedEventType: IncidentFeedEventType.IncidentUpdated,
|
|
605
723
|
displayColor: Gray500,
|
|
606
724
|
feedInfoInMarkdown: feedInfoInMarkdown,
|
|
607
725
|
userId: createdByUserId || undefined,
|
|
726
|
+
workspaceNotification: {
|
|
727
|
+
sendWorkspaceNotification: true,
|
|
728
|
+
},
|
|
608
729
|
});
|
|
609
730
|
}
|
|
610
731
|
}
|
|
@@ -1009,110 +1130,40 @@ ${incidentSeverity.name}
|
|
|
1009
1130
|
logger.error(err);
|
|
1010
1131
|
});
|
|
1011
1132
|
}
|
|
1012
|
-
async
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
}),
|
|
1025
|
-
});
|
|
1026
|
-
}
|
|
1027
|
-
catch (err) {
|
|
1028
|
-
// log the error and continue.
|
|
1029
|
-
logger.error(err);
|
|
1030
|
-
return null;
|
|
1133
|
+
async getWorkspaceChannelForIncident(data) {
|
|
1134
|
+
const incident = await this.findOneById({
|
|
1135
|
+
id: data.incidentId,
|
|
1136
|
+
select: {
|
|
1137
|
+
postUpdatesToWorkspaceChannels: true,
|
|
1138
|
+
},
|
|
1139
|
+
props: {
|
|
1140
|
+
isRoot: true,
|
|
1141
|
+
},
|
|
1142
|
+
});
|
|
1143
|
+
if (!incident) {
|
|
1144
|
+
throw new BadDataException("Incident not found.");
|
|
1031
1145
|
}
|
|
1146
|
+
return (incident.postUpdatesToWorkspaceChannels || []).filter((channel) => {
|
|
1147
|
+
if (!data.workspaceType) {
|
|
1148
|
+
return true;
|
|
1149
|
+
}
|
|
1150
|
+
return channel.workspaceType === data.workspaceType;
|
|
1151
|
+
});
|
|
1032
1152
|
}
|
|
1033
|
-
async
|
|
1034
|
-
var _a, _b;
|
|
1153
|
+
async getIncidentNumber(data) {
|
|
1035
1154
|
const incident = await this.findOneById({
|
|
1036
1155
|
id: data.incidentId,
|
|
1037
1156
|
select: {
|
|
1038
|
-
projectId: true,
|
|
1039
1157
|
incidentNumber: true,
|
|
1040
|
-
title: true,
|
|
1041
|
-
description: true,
|
|
1042
|
-
incidentSeverity: {
|
|
1043
|
-
name: true,
|
|
1044
|
-
},
|
|
1045
|
-
rootCause: true,
|
|
1046
|
-
remediationNotes: true,
|
|
1047
|
-
currentIncidentState: {
|
|
1048
|
-
name: true,
|
|
1049
|
-
},
|
|
1050
1158
|
},
|
|
1051
1159
|
props: {
|
|
1052
1160
|
isRoot: true,
|
|
1053
1161
|
},
|
|
1054
1162
|
});
|
|
1055
1163
|
if (!incident) {
|
|
1056
|
-
throw new BadDataException("Incident not found");
|
|
1057
|
-
}
|
|
1058
|
-
const blocks = [];
|
|
1059
|
-
if (incident.incidentNumber) {
|
|
1060
|
-
const markdownBlock1 = {
|
|
1061
|
-
_type: "WorkspacePayloadMarkdown",
|
|
1062
|
-
text: `**Incident #${incident.incidentNumber} Created**`,
|
|
1063
|
-
};
|
|
1064
|
-
blocks.push(markdownBlock1);
|
|
1065
|
-
}
|
|
1066
|
-
if (incident.title) {
|
|
1067
|
-
const markdownBlock2 = {
|
|
1068
|
-
_type: "WorkspacePayloadMarkdown",
|
|
1069
|
-
text: `**Incident Title**:
|
|
1070
|
-
${incident.title}`,
|
|
1071
|
-
};
|
|
1072
|
-
blocks.push(markdownBlock2);
|
|
1073
|
-
}
|
|
1074
|
-
if (incident.description) {
|
|
1075
|
-
const markdownBlock3 = {
|
|
1076
|
-
_type: "WorkspacePayloadMarkdown",
|
|
1077
|
-
text: `**Description**:
|
|
1078
|
-
${incident.description}`,
|
|
1079
|
-
};
|
|
1080
|
-
blocks.push(markdownBlock3);
|
|
1081
|
-
}
|
|
1082
|
-
if ((_a = incident.incidentSeverity) === null || _a === void 0 ? void 0 : _a.name) {
|
|
1083
|
-
const markdownBlock4 = {
|
|
1084
|
-
_type: "WorkspacePayloadMarkdown",
|
|
1085
|
-
text: `**Severity**:
|
|
1086
|
-
${incident.incidentSeverity.name}`,
|
|
1087
|
-
};
|
|
1088
|
-
blocks.push(markdownBlock4);
|
|
1089
|
-
}
|
|
1090
|
-
if (incident.rootCause) {
|
|
1091
|
-
const markdownBlock5 = {
|
|
1092
|
-
_type: "WorkspacePayloadMarkdown",
|
|
1093
|
-
text: `**Root Cause**:
|
|
1094
|
-
${incident.rootCause}`,
|
|
1095
|
-
};
|
|
1096
|
-
blocks.push(markdownBlock5);
|
|
1097
|
-
}
|
|
1098
|
-
if (incident.remediationNotes) {
|
|
1099
|
-
const markdownBlock6 = {
|
|
1100
|
-
_type: "WorkspacePayloadMarkdown",
|
|
1101
|
-
text: `**Remediation Notes**:
|
|
1102
|
-
${incident.remediationNotes}`,
|
|
1103
|
-
};
|
|
1104
|
-
blocks.push(markdownBlock6);
|
|
1105
|
-
}
|
|
1106
|
-
if ((_b = incident.currentIncidentState) === null || _b === void 0 ? void 0 : _b.name) {
|
|
1107
|
-
const markdownBlock7 = {
|
|
1108
|
-
_type: "WorkspacePayloadMarkdown",
|
|
1109
|
-
text: `**Incident State**:
|
|
1110
|
-
${incident.currentIncidentState.name}`,
|
|
1111
|
-
};
|
|
1112
|
-
blocks.push(markdownBlock7);
|
|
1164
|
+
throw new BadDataException("Incident not found.");
|
|
1113
1165
|
}
|
|
1114
|
-
|
|
1115
|
-
return blocks;
|
|
1166
|
+
return incident.incidentNumber || null;
|
|
1116
1167
|
}
|
|
1117
1168
|
}
|
|
1118
1169
|
export default new Service();
|