@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.
Files changed (203) hide show
  1. package/Models/DatabaseModels/Alert.ts +3 -2
  2. package/Models/DatabaseModels/Incident.ts +3 -2
  3. package/Models/DatabaseModels/Index.ts +3 -0
  4. package/Models/DatabaseModels/ProjectUser.ts +335 -0
  5. package/Models/DatabaseModels/ScheduledMaintenance.ts +3 -2
  6. package/Server/API/SlackAPI.ts +65 -97
  7. package/Server/API/UserOnCallLogTimelineAPI.ts +2 -9
  8. package/Server/Infrastructure/Postgres/SchemaMigrations/1740597525803-MigrationName.ts +17 -0
  9. package/Server/Infrastructure/Postgres/SchemaMigrations/1740598793630-MigrationName.ts +17 -0
  10. package/Server/Infrastructure/Postgres/SchemaMigrations/1741031019972-MigrationName.ts +17 -0
  11. package/Server/Infrastructure/Postgres/SchemaMigrations/1741209339971-MigrationName.ts +101 -0
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  13. package/Server/Middleware/SlackAuthorization.ts +11 -2
  14. package/Server/Services/AlertFeedService.ts +2 -2
  15. package/Server/Services/AlertInternalNoteService.ts +2 -2
  16. package/Server/Services/AlertOwnerTeamService.ts +4 -4
  17. package/Server/Services/AlertOwnerUserService.ts +3 -3
  18. package/Server/Services/AlertService.ts +62 -20
  19. package/Server/Services/AlertStateTimelineService.ts +8 -18
  20. package/Server/Services/IncidentFeedService.ts +101 -2
  21. package/Server/Services/IncidentInternalNoteService.ts +47 -4
  22. package/Server/Services/IncidentOwnerTeamService.ts +57 -4
  23. package/Server/Services/IncidentOwnerUserService.ts +59 -15
  24. package/Server/Services/IncidentPublicNoteService.ts +41 -4
  25. package/Server/Services/IncidentService.ts +279 -193
  26. package/Server/Services/IncidentStateService.ts +25 -0
  27. package/Server/Services/IncidentStateTimelineService.ts +37 -19
  28. package/Server/Services/MonitorStatusTimelineService.ts +7 -17
  29. package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -0
  30. package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +74 -7
  31. package/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.ts +63 -4
  32. package/Server/Services/OnCallDutyPolicyService.ts +13 -0
  33. package/Server/Services/ProjectUserService.ts +130 -0
  34. package/Server/Services/ScheduledMaintenanceFeedService.ts +2 -2
  35. package/Server/Services/ScheduledMaintenanceInternalNoteService.ts +12 -10
  36. package/Server/Services/ScheduledMaintenanceOwnerTeamService.ts +22 -18
  37. package/Server/Services/ScheduledMaintenanceOwnerUserService.ts +28 -30
  38. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +12 -10
  39. package/Server/Services/ScheduledMaintenanceService.ts +16 -10
  40. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +1 -1
  41. package/Server/Services/StatusPageSubscriberService.ts +3 -0
  42. package/Server/Services/TeamMemberService.ts +20 -0
  43. package/Server/Services/UserNotificationRuleService.ts +74 -0
  44. package/Server/Services/UserOnCallLogService.ts +1 -1
  45. package/Server/Services/UserService.ts +35 -0
  46. package/Server/Services/WorkspaceNotificationRuleService.ts +508 -149
  47. package/Server/Services/WorkspaceUserAuthTokenService.ts +23 -0
  48. package/Server/Utils/Express.ts +1 -1
  49. package/Server/Utils/StartServer.ts +6 -1
  50. package/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.ts +195 -0
  51. package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +20 -0
  52. package/Server/Utils/Workspace/Slack/Actions/Auth.ts +266 -0
  53. package/Server/Utils/Workspace/Slack/Actions/Incident.ts +1117 -0
  54. package/Server/Utils/Workspace/Slack/Messages/Incident.ts +116 -0
  55. package/Server/Utils/Workspace/Slack/Slack.ts +555 -18
  56. package/Server/Utils/Workspace/Slack/app-manifest.json +18 -10
  57. package/Server/Utils/Workspace/Workspace.ts +194 -1
  58. package/Server/Utils/Workspace/WorkspaceBase.ts +145 -19
  59. package/Server/Utils/Workspace/WorkspaceMessages/Incident.ts +68 -0
  60. package/Types/Icon/IconProp.ts +1 -0
  61. package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +2 -1
  62. package/Types/Workspace/NotificationRules/NotificationRuleUtil.ts +251 -121
  63. package/Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel.ts +6 -0
  64. package/Types/Workspace/WorkspaceMessagePayload.ts +71 -2
  65. package/UI/Components/ComingSoon/ComingSoon.tsx +13 -3
  66. package/UI/Components/Forms/Fields/FormField.tsx +2 -2
  67. package/UI/Components/Icon/Icon.tsx +39 -2
  68. package/UI/Components/ModelTable/BaseModelTable.tsx +16 -0
  69. package/UI/Components/Radio/Radio.tsx +11 -2
  70. package/UI/Components/Table/TableCard.tsx +2 -2
  71. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  72. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  73. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  74. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  75. package/build/dist/Models/DatabaseModels/ProjectUser.js +340 -0
  76. package/build/dist/Models/DatabaseModels/ProjectUser.js.map +1 -0
  77. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  78. package/build/dist/Server/API/SlackAPI.js +39 -79
  79. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  80. package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
  81. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1740597525803-MigrationName.js +12 -0
  82. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1740597525803-MigrationName.js.map +1 -0
  83. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1740598793630-MigrationName.js +12 -0
  84. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1740598793630-MigrationName.js.map +1 -0
  85. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1741031019972-MigrationName.js +12 -0
  86. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1741031019972-MigrationName.js.map +1 -0
  87. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1741209339971-MigrationName.js +42 -0
  88. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1741209339971-MigrationName.js.map +1 -0
  89. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  90. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  91. package/build/dist/Server/Middleware/SlackAuthorization.js +8 -2
  92. package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
  93. package/build/dist/Server/Services/AlertFeedService.js +2 -2
  94. package/build/dist/Server/Services/AlertFeedService.js.map +1 -1
  95. package/build/dist/Server/Services/AlertInternalNoteService.js +2 -2
  96. package/build/dist/Server/Services/AlertInternalNoteService.js.map +1 -1
  97. package/build/dist/Server/Services/AlertOwnerTeamService.js +4 -4
  98. package/build/dist/Server/Services/AlertOwnerTeamService.js.map +1 -1
  99. package/build/dist/Server/Services/AlertOwnerUserService.js +3 -3
  100. package/build/dist/Server/Services/AlertOwnerUserService.js.map +1 -1
  101. package/build/dist/Server/Services/AlertService.js +44 -19
  102. package/build/dist/Server/Services/AlertService.js.map +1 -1
  103. package/build/dist/Server/Services/AlertStateTimelineService.js +6 -16
  104. package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
  105. package/build/dist/Server/Services/IncidentFeedService.js +62 -2
  106. package/build/dist/Server/Services/IncidentFeedService.js.map +1 -1
  107. package/build/dist/Server/Services/IncidentInternalNoteService.js +35 -4
  108. package/build/dist/Server/Services/IncidentInternalNoteService.js.map +1 -1
  109. package/build/dist/Server/Services/IncidentOwnerTeamService.js +42 -4
  110. package/build/dist/Server/Services/IncidentOwnerTeamService.js.map +1 -1
  111. package/build/dist/Server/Services/IncidentOwnerUserService.js +43 -15
  112. package/build/dist/Server/Services/IncidentOwnerUserService.js.map +1 -1
  113. package/build/dist/Server/Services/IncidentPublicNoteService.js +32 -4
  114. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  115. package/build/dist/Server/Services/IncidentService.js +221 -170
  116. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  117. package/build/dist/Server/Services/IncidentStateService.js +14 -0
  118. package/build/dist/Server/Services/IncidentStateService.js.map +1 -1
  119. package/build/dist/Server/Services/IncidentStateTimelineService.js +31 -17
  120. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  121. package/build/dist/Server/Services/MonitorStatusTimelineService.js +5 -15
  122. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  123. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +1 -0
  124. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
  125. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +62 -7
  126. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
  127. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js +51 -5
  128. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js.map +1 -1
  129. package/build/dist/Server/Services/OnCallDutyPolicyService.js +6 -0
  130. package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
  131. package/build/dist/Server/Services/ProjectUserService.js +106 -0
  132. package/build/dist/Server/Services/ProjectUserService.js.map +1 -0
  133. package/build/dist/Server/Services/ScheduledMaintenanceFeedService.js +2 -2
  134. package/build/dist/Server/Services/ScheduledMaintenanceFeedService.js.map +1 -1
  135. package/build/dist/Server/Services/ScheduledMaintenanceInternalNoteService.js +2 -2
  136. package/build/dist/Server/Services/ScheduledMaintenanceInternalNoteService.js.map +1 -1
  137. package/build/dist/Server/Services/ScheduledMaintenanceOwnerTeamService.js +4 -4
  138. package/build/dist/Server/Services/ScheduledMaintenanceOwnerTeamService.js.map +1 -1
  139. package/build/dist/Server/Services/ScheduledMaintenanceOwnerUserService.js +8 -16
  140. package/build/dist/Server/Services/ScheduledMaintenanceOwnerUserService.js.map +1 -1
  141. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +2 -2
  142. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  143. package/build/dist/Server/Services/ScheduledMaintenanceService.js +5 -2
  144. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  145. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +1 -1
  146. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  147. package/build/dist/Server/Services/StatusPageSubscriberService.js +3 -0
  148. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  149. package/build/dist/Server/Services/TeamMemberService.js +17 -0
  150. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  151. package/build/dist/Server/Services/UserNotificationRuleService.js +52 -0
  152. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  153. package/build/dist/Server/Services/UserOnCallLogService.js +1 -1
  154. package/build/dist/Server/Services/UserOnCallLogService.js.map +1 -1
  155. package/build/dist/Server/Services/UserService.js +23 -0
  156. package/build/dist/Server/Services/UserService.js.map +1 -1
  157. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +306 -84
  158. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  159. package/build/dist/Server/Services/WorkspaceUserAuthTokenService.js +18 -0
  160. package/build/dist/Server/Services/WorkspaceUserAuthTokenService.js.map +1 -1
  161. package/build/dist/Server/Utils/StartServer.js +4 -0
  162. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  163. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.js +148 -0
  164. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.js.map +1 -0
  165. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +19 -0
  166. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -0
  167. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +167 -0
  168. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -0
  169. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +727 -0
  170. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -0
  171. package/build/dist/Server/Utils/Workspace/Slack/Messages/Incident.js +82 -0
  172. package/build/dist/Server/Utils/Workspace/Slack/Messages/Incident.js.map +1 -0
  173. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +397 -14
  174. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  175. package/build/dist/Server/Utils/Workspace/Slack/app-manifest.json +18 -10
  176. package/build/dist/Server/Utils/Workspace/Workspace.js +126 -0
  177. package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
  178. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js +69 -11
  179. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
  180. package/build/dist/Server/Utils/Workspace/WorkspaceMessages/Incident.js +47 -0
  181. package/build/dist/Server/Utils/Workspace/WorkspaceMessages/Incident.js.map +1 -0
  182. package/build/dist/Types/Icon/IconProp.js +1 -0
  183. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  184. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +2 -1
  185. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
  186. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleUtil.js +214 -120
  187. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleUtil.js.map +1 -1
  188. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel.js +2 -0
  189. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel.js.map +1 -0
  190. package/build/dist/UI/Components/ComingSoon/ComingSoon.js +3 -2
  191. package/build/dist/UI/Components/ComingSoon/ComingSoon.js.map +1 -1
  192. package/build/dist/UI/Components/Forms/Fields/FormField.js +2 -2
  193. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  194. package/build/dist/UI/Components/Icon/Icon.js +19 -2
  195. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  196. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +11 -0
  197. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  198. package/build/dist/UI/Components/Radio/Radio.js +5 -2
  199. package/build/dist/UI/Components/Radio/Radio.js.map +1 -1
  200. package/build/dist/UI/Components/Table/TableCard.js +2 -2
  201. package/build/dist/UI/Components/Table/TableCard.js.map +1 -1
  202. package/package.json +3 -2
  203. 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
- await IncidentFeedService.createIncidentFeed({
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: `**Posted public note for this incident on status page**
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.createIncidentFeed({
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: `**Updated Public Note**
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;AAElE,MAAM,OAAO,OAAQ,SAAQ,eAAsB;IACjD;QACE,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEkB,KAAK,CAAC,cAAc,CACrC,QAAyB;QAEzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC;QAC1D,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,YAAY,EAAE,IAAI;SACnB,CAAC;IACJ,CAAC;IAEe,KAAK,CAAC,eAAe,CACnC,SAA0B,EAC1B,WAAkB;;QAElB,MAAM,MAAM,GACV,WAAW,CAAC,eAAe,KAAI,MAAA,WAAW,CAAC,aAAa,0CAAE,EAAE,CAAA,CAAC;QAE/D,MAAM,mBAAmB,CAAC,kBAAkB,CAAC;YAC3C,UAAU,EAAE,WAAW,CAAC,UAAW;YACnC,SAAS,EAAE,WAAW,CAAC,SAAU;YACjC,qBAAqB,EAAE,qBAAqB,CAAC,UAAU;YACvD,YAAY,EAAE,SAAS;YACvB,MAAM,EAAE,MAAM,IAAI,SAAS;YAC3B,kBAAkB,EAAE;;EAExB,WAAW,CAAC,IAAI;WACP;SACN,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACrB,CAAC;IAEe,KAAK,CAAC,eAAe,CACnC,QAAyB,EACzB,eAAgC;QAEhC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,YAAY,GAAiB,MAAM,IAAI,CAAC,MAAM,CAAC;gBACnD,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK;gBAC9B,KAAK,EAAE,iBAAiB;gBACxB,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE;oBACL,MAAM,EAAE,IAAI;iBACb;gBACD,MAAM,EAAE;oBACN,UAAU,EAAE,IAAI;oBAChB,SAAS,EAAE,IAAI;oBACf,IAAI,EAAE,IAAI;oBACV,eAAe,EAAE,IAAI;oBACrB,aAAa,EAAE;wBACb,GAAG,EAAE,IAAI;qBACV;iBACF;aACF,CAAC,CAAC;YAEH,MAAM,MAAM,GACV,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;YAEjC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;gBACvC,MAAM,mBAAmB,CAAC,kBAAkB,CAAC;oBAC3C,UAAU,EAAE,WAAW,CAAC,UAAW;oBACnC,SAAS,EAAE,WAAW,CAAC,SAAU;oBACjC,qBAAqB,EAAE,qBAAqB,CAAC,UAAU;oBACvD,YAAY,EAAE,OAAO;oBACrB,MAAM,EAAE,MAAM,IAAI,SAAS;oBAE3B,kBAAkB,EAAE;;EAE5B,WAAW,CAAC,IAAI;aACL;iBACJ,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED,eAAe,IAAI,OAAO,EAAE,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 WorkspaceNotificationRuleService from "./WorkspaceNotificationRuleService";
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
- const user = await UserService.findOneBy({
202
- query: {
203
- _id: userId === null || userId === void 0 ? void 0 : userId.toString(),
204
- },
205
- select: {
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
- await IncidentFeedService.createIncidentFeed({
255
- incidentId: createdItem.id,
349
+ // send message to workspaces - slack, teams, etc.
350
+ const workspaceResult = await IncidentWorkspaceMessages.createChannelsAndInviteUsersToChannels({
256
351
  projectId: createdItem.projectId,
257
- incidentFeedEventType: IncidentFeedEventType.IncidentCreated,
258
- displayColor: Red500,
259
- feedInfoInMarkdown: `**Incident #${(_b = createdItem.incidentNumber) === null || _b === void 0 ? void 0 : _b.toString()} Created**:
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
- **Incident Title**:
369
+ **${createdItem.title || "No title provided."}**:
262
370
 
263
- ${createdItem.title || "No title provided."}
371
+ ${createdItem.description || "No description provided."}
264
372
 
265
- **Description**:
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.description || "No description provided."}
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, ((_c = createdItem.monitors) === null || _c === void 0 ? void 0 : _c.map((monitor) => {
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 (((_d = createdItem.onCallDutyPolicies) === null || _d === void 0 ? void 0 : _d.length) &&
325
- ((_e = createdItem.onCallDutyPolicies) === null || _e === void 0 ? void 0 : _e.length) > 0) {
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 = "**Incident was updated.**";
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**Root Cause**:
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**Remediation Notes**:
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**Labels**:
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**Incident Severity**:
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.createIncidentFeed({
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 notifyWorkspaceOnIncidentCreate(data) {
1013
- try {
1014
- // we will notify the workspace about the incident creation with the bot tokken which is in WorkspaceProjectAuth Table.
1015
- return await WorkspaceNotificationRuleService.createInviteAndPostToChannelsBasedOnRules({
1016
- projectId: data.projectId,
1017
- notificationFor: {
1018
- incidentId: data.incidentId,
1019
- },
1020
- notificationRuleEventType: NotificationRuleEventType.Incident,
1021
- channelNameSiffix: data.incidentNumber.toString(),
1022
- messageBlocks: await this.getWorkspaceMessageBlocksForIncidentCreate({
1023
- incidentId: data.incidentId,
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 getWorkspaceMessageBlocksForIncidentCreate(data) {
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
- // TODO: Add buttons to Post Private Note, Ack Incident, Resolve Incident. etc.
1115
- return blocks;
1166
+ return incident.incidentNumber || null;
1116
1167
  }
1117
1168
  }
1118
1169
  export default new Service();