@oneuptime/common 9.5.2 → 9.5.4

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 (218) hide show
  1. package/Models/DatabaseModels/Alert.ts +28 -0
  2. package/Models/DatabaseModels/AlertEpisode.ts +27 -0
  3. package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +1 -0
  4. package/Models/DatabaseModels/AlertStateTimeline.ts +1 -0
  5. package/Models/DatabaseModels/Incident.ts +28 -0
  6. package/Models/DatabaseModels/IncidentEpisode.ts +182 -0
  7. package/Models/DatabaseModels/IncidentEpisodeFeed.ts +2 -0
  8. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +611 -0
  9. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +84 -0
  10. package/Models/DatabaseModels/IncidentGroupingRule.ts +36 -0
  11. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  12. package/Models/DatabaseModels/Index.ts +2 -0
  13. package/Models/DatabaseModels/MonitorStatusTimeline.ts +1 -0
  14. package/Models/DatabaseModels/Project.ts +252 -1
  15. package/Models/DatabaseModels/ProjectCallSMSConfig.ts +1 -0
  16. package/Models/DatabaseModels/ScheduledMaintenance.ts +28 -0
  17. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -0
  18. package/Models/DatabaseModels/StatusPage.ts +120 -0
  19. package/Server/API/IncidentEpisodePublicNoteAPI.ts +98 -0
  20. package/Server/API/StatusPageAPI.ts +1092 -45
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1770232207959-MigrationName.ts +181 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1770237245069-MigrationName.ts +35 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1770237245070-MigrationName.ts +57 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1770407024682-MigrationName.ts +83 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  26. package/Server/Services/AlertEpisodeMemberService.ts +6 -3
  27. package/Server/Services/AlertEpisodeService.ts +45 -97
  28. package/Server/Services/AlertEpisodeStateTimelineService.ts +4 -2
  29. package/Server/Services/AlertInternalNoteService.ts +5 -2
  30. package/Server/Services/AlertOwnerTeamService.ts +10 -4
  31. package/Server/Services/AlertOwnerUserService.ts +10 -4
  32. package/Server/Services/AlertService.ts +24 -38
  33. package/Server/Services/AlertStateTimelineService.ts +6 -3
  34. package/Server/Services/DatabaseService.ts +12 -0
  35. package/Server/Services/IncidentEpisodeMemberService.ts +8 -4
  36. package/Server/Services/IncidentEpisodePublicNoteService.ts +257 -0
  37. package/Server/Services/IncidentEpisodeService.ts +67 -93
  38. package/Server/Services/IncidentEpisodeStateTimelineService.ts +4 -2
  39. package/Server/Services/IncidentInternalNoteService.ts +10 -5
  40. package/Server/Services/IncidentMemberService.ts +20 -10
  41. package/Server/Services/IncidentOwnerTeamService.ts +20 -10
  42. package/Server/Services/IncidentOwnerUserService.ts +20 -10
  43. package/Server/Services/IncidentPublicNoteService.ts +10 -5
  44. package/Server/Services/IncidentService.ts +34 -110
  45. package/Server/Services/IncidentStateTimelineService.ts +11 -6
  46. package/Server/Services/Index.ts +2 -0
  47. package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +61 -39
  48. package/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.ts +31 -19
  49. package/Server/Services/ProjectService.ts +227 -0
  50. package/Server/Services/ScheduledMaintenanceInternalNoteService.ts +9 -6
  51. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +9 -6
  52. package/Server/Services/ScheduledMaintenanceService.ts +27 -39
  53. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +8 -6
  54. package/Server/Services/UserNotificationRuleService.ts +32 -21
  55. package/Server/Utils/AI/IncidentEpisodeAIContextBuilder.ts +4 -2
  56. package/Server/Utils/Browser.ts +28 -20
  57. package/Server/Utils/Monitor/MonitorAlert.ts +5 -0
  58. package/Server/Utils/Monitor/MonitorIncident.ts +13 -0
  59. package/Server/Utils/PushNotificationUtil.ts +69 -26
  60. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +8 -4
  61. package/Server/Utils/Workspace/Slack/Actions/Alert.ts +20 -8
  62. package/Server/Utils/Workspace/Slack/Actions/Incident.ts +42 -22
  63. package/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.ts +23 -17
  64. package/Server/Utils/Workspace/WorkspaceMessages/Alert.ts +1 -0
  65. package/Server/Utils/Workspace/WorkspaceMessages/Incident.ts +1 -0
  66. package/Server/Utils/Workspace/WorkspaceMessages/ScheduledMaintenance.ts +1 -0
  67. package/Types/Email/EmailTemplateType.ts +4 -0
  68. package/Types/Icon/IconProp.ts +172 -0
  69. package/Types/Monitor/CriteriaIncident.ts +2 -0
  70. package/Types/Monitor/MonitorEvaluationSummary.ts +2 -0
  71. package/Types/Permission.ts +40 -0
  72. package/Types/StatusPage/StatusPageSubscriberNotificationEventType.ts +5 -0
  73. package/UI/Components/Icon/Icon.tsx +1333 -1
  74. package/Utils/Analytics.ts +11 -0
  75. package/build/dist/Models/DatabaseModels/Alert.js +30 -0
  76. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  77. package/build/dist/Models/DatabaseModels/AlertEpisode.js +29 -0
  78. package/build/dist/Models/DatabaseModels/AlertEpisode.js.map +1 -1
  79. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +1 -0
  80. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -1
  81. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +1 -0
  82. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
  83. package/build/dist/Models/DatabaseModels/Incident.js +30 -0
  84. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  85. package/build/dist/Models/DatabaseModels/IncidentEpisode.js +189 -0
  86. package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
  87. package/build/dist/Models/DatabaseModels/IncidentEpisodeFeed.js +2 -0
  88. package/build/dist/Models/DatabaseModels/IncidentEpisodeFeed.js.map +1 -1
  89. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +626 -0
  90. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -0
  91. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +86 -0
  92. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  93. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +37 -0
  94. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
  95. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  96. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  97. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  98. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  99. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +1 -0
  100. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
  101. package/build/dist/Models/DatabaseModels/Project.js +267 -1
  102. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  103. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +1 -0
  104. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
  105. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +29 -0
  106. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  107. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -0
  108. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  109. package/build/dist/Models/DatabaseModels/StatusPage.js +126 -0
  110. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  111. package/build/dist/Server/API/IncidentEpisodePublicNoteAPI.js +68 -0
  112. package/build/dist/Server/API/IncidentEpisodePublicNoteAPI.js.map +1 -0
  113. package/build/dist/Server/API/StatusPageAPI.js +874 -47
  114. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  115. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770232207959-MigrationName.js +68 -0
  116. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770232207959-MigrationName.js.map +1 -0
  117. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770237245069-MigrationName.js +18 -0
  118. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770237245069-MigrationName.js.map +1 -0
  119. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770237245070-MigrationName.js +27 -0
  120. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770237245070-MigrationName.js.map +1 -0
  121. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770407024682-MigrationName.js +34 -0
  122. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1770407024682-MigrationName.js.map +1 -0
  123. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  124. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  125. package/build/dist/Server/Services/AlertEpisodeMemberService.js +6 -3
  126. package/build/dist/Server/Services/AlertEpisodeMemberService.js.map +1 -1
  127. package/build/dist/Server/Services/AlertEpisodeService.js +33 -90
  128. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  129. package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js +3 -2
  130. package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js.map +1 -1
  131. package/build/dist/Server/Services/AlertInternalNoteService.js +2 -2
  132. package/build/dist/Server/Services/AlertInternalNoteService.js.map +1 -1
  133. package/build/dist/Server/Services/AlertOwnerTeamService.js +4 -4
  134. package/build/dist/Server/Services/AlertOwnerTeamService.js.map +1 -1
  135. package/build/dist/Server/Services/AlertOwnerUserService.js +4 -4
  136. package/build/dist/Server/Services/AlertOwnerUserService.js.map +1 -1
  137. package/build/dist/Server/Services/AlertService.js +16 -34
  138. package/build/dist/Server/Services/AlertService.js.map +1 -1
  139. package/build/dist/Server/Services/AlertStateTimelineService.js +3 -3
  140. package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
  141. package/build/dist/Server/Services/DatabaseService.js +9 -0
  142. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  143. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +8 -4
  144. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
  145. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +224 -0
  146. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -0
  147. package/build/dist/Server/Services/IncidentEpisodeService.js +47 -82
  148. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  149. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +3 -2
  150. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
  151. package/build/dist/Server/Services/IncidentInternalNoteService.js +4 -2
  152. package/build/dist/Server/Services/IncidentInternalNoteService.js.map +1 -1
  153. package/build/dist/Server/Services/IncidentMemberService.js +8 -4
  154. package/build/dist/Server/Services/IncidentMemberService.js.map +1 -1
  155. package/build/dist/Server/Services/IncidentOwnerTeamService.js +8 -4
  156. package/build/dist/Server/Services/IncidentOwnerTeamService.js.map +1 -1
  157. package/build/dist/Server/Services/IncidentOwnerUserService.js +8 -4
  158. package/build/dist/Server/Services/IncidentOwnerUserService.js.map +1 -1
  159. package/build/dist/Server/Services/IncidentPublicNoteService.js +4 -2
  160. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  161. package/build/dist/Server/Services/IncidentService.js +24 -94
  162. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  163. package/build/dist/Server/Services/IncidentStateTimelineService.js +5 -3
  164. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  165. package/build/dist/Server/Services/Index.js +2 -0
  166. package/build/dist/Server/Services/Index.js.map +1 -1
  167. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +20 -16
  168. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
  169. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js +10 -8
  170. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js.map +1 -1
  171. package/build/dist/Server/Services/ProjectService.js +207 -0
  172. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  173. package/build/dist/Server/Services/ScheduledMaintenanceInternalNoteService.js +4 -3
  174. package/build/dist/Server/Services/ScheduledMaintenanceInternalNoteService.js.map +1 -1
  175. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +4 -3
  176. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  177. package/build/dist/Server/Services/ScheduledMaintenanceService.js +16 -37
  178. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  179. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +3 -3
  180. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  181. package/build/dist/Server/Services/UserNotificationRuleService.js +33 -25
  182. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  183. package/build/dist/Server/Utils/AI/IncidentEpisodeAIContextBuilder.js +4 -2
  184. package/build/dist/Server/Utils/AI/IncidentEpisodeAIContextBuilder.js.map +1 -1
  185. package/build/dist/Server/Utils/Browser.js +19 -12
  186. package/build/dist/Server/Utils/Browser.js.map +1 -1
  187. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +4 -0
  188. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  189. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +9 -0
  190. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  191. package/build/dist/Server/Utils/PushNotificationUtil.js +36 -28
  192. package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
  193. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +8 -4
  194. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  195. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js +8 -8
  196. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js.map +1 -1
  197. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +18 -10
  198. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -1
  199. package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js +8 -8
  200. package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js.map +1 -1
  201. package/build/dist/Server/Utils/Workspace/WorkspaceMessages/Alert.js.map +1 -1
  202. package/build/dist/Server/Utils/Workspace/WorkspaceMessages/Incident.js.map +1 -1
  203. package/build/dist/Server/Utils/Workspace/WorkspaceMessages/ScheduledMaintenance.js.map +1 -1
  204. package/build/dist/Types/Email/EmailTemplateType.js +3 -0
  205. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  206. package/build/dist/Types/Icon/IconProp.js +172 -0
  207. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  208. package/build/dist/Types/Monitor/CriteriaIncident.js +1 -0
  209. package/build/dist/Types/Monitor/CriteriaIncident.js.map +1 -1
  210. package/build/dist/Types/Permission.js +34 -0
  211. package/build/dist/Types/Permission.js.map +1 -1
  212. package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js +4 -0
  213. package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js.map +1 -1
  214. package/build/dist/UI/Components/Icon/Icon.js +502 -1
  215. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  216. package/build/dist/Utils/Analytics.js +5 -0
  217. package/build/dist/Utils/Analytics.js.map +1 -1
  218. package/package.json +1 -1
@@ -10,6 +10,7 @@ import ScreenSizeType from "../../Types/ScreenSizeType";
10
10
  import BrowserType from "../../Types/BrowserType";
11
11
  import logger from "./Logger";
12
12
  import CaptureSpan from "./Telemetry/CaptureSpan";
13
+ import os from "os";
13
14
 
14
15
  export type Page = PlaywrightPage;
15
16
  export type Browser = PlaywrightBrowser;
@@ -138,19 +139,26 @@ export default class BrowserUtil {
138
139
  return { height: viewPortHeight, width: viewPortWidth };
139
140
  }
140
141
 
142
+ private static getPlaywrightBrowsersPath(): string {
143
+ return (
144
+ process.env["PLAYWRIGHT_BROWSERS_PATH"] ||
145
+ `${os.homedir()}/.cache/ms-playwright`
146
+ );
147
+ }
148
+
141
149
  @CaptureSpan()
142
150
  public static async getChromeExecutablePath(): Promise<string> {
143
- const doesDirectoryExist: boolean = await LocalFile.doesDirectoryExist(
144
- "/root/.cache/ms-playwright",
145
- );
151
+ const browsersPath: string = this.getPlaywrightBrowsersPath();
152
+
153
+ const doesDirectoryExist: boolean =
154
+ await LocalFile.doesDirectoryExist(browsersPath);
146
155
  if (!doesDirectoryExist) {
147
156
  throw new BadDataException("Chrome executable path not found.");
148
157
  }
149
158
 
150
159
  // get list of files in the directory
151
- const directories: string[] = await LocalFile.getListOfDirectories(
152
- "/root/.cache/ms-playwright",
153
- );
160
+ const directories: string[] =
161
+ await LocalFile.getListOfDirectories(browsersPath);
154
162
 
155
163
  if (directories.length === 0) {
156
164
  throw new BadDataException("Chrome executable path not found.");
@@ -167,10 +175,10 @@ export default class BrowserUtil {
167
175
  }
168
176
 
169
177
  const chromeExecutableCandidates: Array<string> = [
170
- `/root/.cache/ms-playwright/${chromeInstallationName}/chrome-linux/chrome`,
171
- `/root/.cache/ms-playwright/${chromeInstallationName}/chrome-linux64/chrome`,
172
- `/root/.cache/ms-playwright/${chromeInstallationName}/chrome64/chrome`,
173
- `/root/.cache/ms-playwright/${chromeInstallationName}/chrome/chrome`,
178
+ `${browsersPath}/${chromeInstallationName}/chrome-linux/chrome`,
179
+ `${browsersPath}/${chromeInstallationName}/chrome-linux64/chrome`,
180
+ `${browsersPath}/${chromeInstallationName}/chrome64/chrome`,
181
+ `${browsersPath}/${chromeInstallationName}/chrome/chrome`,
174
182
  ];
175
183
 
176
184
  for (const executablePath of chromeExecutableCandidates) {
@@ -184,17 +192,17 @@ export default class BrowserUtil {
184
192
 
185
193
  @CaptureSpan()
186
194
  public static async getFirefoxExecutablePath(): Promise<string> {
187
- const doesDirectoryExist: boolean = await LocalFile.doesDirectoryExist(
188
- "/root/.cache/ms-playwright",
189
- );
195
+ const browsersPath: string = this.getPlaywrightBrowsersPath();
196
+
197
+ const doesDirectoryExist: boolean =
198
+ await LocalFile.doesDirectoryExist(browsersPath);
190
199
  if (!doesDirectoryExist) {
191
200
  throw new BadDataException("Firefox executable path not found.");
192
201
  }
193
202
 
194
203
  // get list of files in the directory
195
- const directories: string[] = await LocalFile.getListOfDirectories(
196
- "/root/.cache/ms-playwright",
197
- );
204
+ const directories: string[] =
205
+ await LocalFile.getListOfDirectories(browsersPath);
198
206
 
199
207
  if (directories.length === 0) {
200
208
  throw new BadDataException("Firefox executable path not found.");
@@ -211,10 +219,10 @@ export default class BrowserUtil {
211
219
  }
212
220
 
213
221
  const firefoxExecutableCandidates: Array<string> = [
214
- `/root/.cache/ms-playwright/${firefoxInstallationName}/firefox/firefox`,
215
- `/root/.cache/ms-playwright/${firefoxInstallationName}/firefox-linux64/firefox`,
216
- `/root/.cache/ms-playwright/${firefoxInstallationName}/firefox64/firefox`,
217
- `/root/.cache/ms-playwright/${firefoxInstallationName}/firefox-64/firefox`,
222
+ `${browsersPath}/${firefoxInstallationName}/firefox/firefox`,
223
+ `${browsersPath}/${firefoxInstallationName}/firefox-linux64/firefox`,
224
+ `${browsersPath}/${firefoxInstallationName}/firefox64/firefox`,
225
+ `${browsersPath}/${firefoxInstallationName}/firefox-64/firefox`,
218
226
  ];
219
227
 
220
228
  for (const executablePath of firefoxExecutableCandidates) {
@@ -50,6 +50,7 @@ export default class MonitorAlert {
50
50
  createdCriteriaId: true,
51
51
  projectId: true,
52
52
  alertNumber: true,
53
+ alertNumberWithPrefix: true,
53
54
  },
54
55
  props: {
55
56
  isRoot: true,
@@ -81,6 +82,7 @@ export default class MonitorAlert {
81
82
  "Alert auto-resolved because autoresolve is enabled for this criteria.",
82
83
  relatedAlertId: openAlert.id?.toString(),
83
84
  relatedAlertNumber: openAlert.alertNumber,
85
+ relatedAlertNumberWithPrefix: openAlert.alertNumberWithPrefix,
84
86
  relatedCriteriaId: input.criteriaInstance?.data?.id,
85
87
  at: OneUptimeDate.getCurrentDate(),
86
88
  });
@@ -150,6 +152,8 @@ export default class MonitorAlert {
150
152
  relatedCriteriaId: input.criteriaInstance.data?.id,
151
153
  relatedAlertId: alreadyOpenAlert?.id?.toString(),
152
154
  relatedAlertNumber: alreadyOpenAlert?.alertNumber,
155
+ relatedAlertNumberWithPrefix:
156
+ alreadyOpenAlert?.alertNumberWithPrefix,
153
157
  at: OneUptimeDate.getCurrentDate(),
154
158
  });
155
159
  continue;
@@ -292,6 +296,7 @@ export default class MonitorAlert {
292
296
  relatedCriteriaId: input.criteriaInstance.data?.id,
293
297
  relatedAlertId: createdAlert.id?.toString(),
294
298
  relatedAlertNumber: createdAlert.alertNumber,
299
+ relatedAlertNumberWithPrefix: createdAlert.alertNumberWithPrefix,
295
300
  at: OneUptimeDate.getCurrentDate(),
296
301
  });
297
302
  }
@@ -56,6 +56,7 @@ export default class MonitorIncident {
56
56
  createdIncidentTemplateId: true,
57
57
  projectId: true,
58
58
  incidentNumber: true,
59
+ incidentNumberWithPrefix: true,
59
60
  },
60
61
  props: {
61
62
  isRoot: true,
@@ -87,6 +88,8 @@ export default class MonitorIncident {
87
88
  "Incident auto-resolved because autoresolve is enabled for this criteria.",
88
89
  relatedIncidentId: openIncident.id?.toString(),
89
90
  relatedIncidentNumber: openIncident.incidentNumber,
91
+ relatedIncidentNumberWithPrefix:
92
+ openIncident.incidentNumberWithPrefix,
90
93
  relatedCriteriaId: input.criteriaInstance?.data?.id,
91
94
  at: OneUptimeDate.getCurrentDate(),
92
95
  });
@@ -161,6 +164,8 @@ export default class MonitorIncident {
161
164
  relatedCriteriaId: input.criteriaInstance.data?.id,
162
165
  relatedIncidentId: alreadyOpenIncident?.id?.toString(),
163
166
  relatedIncidentNumber: alreadyOpenIncident?.incidentNumber,
167
+ relatedIncidentNumberWithPrefix:
168
+ alreadyOpenIncident?.incidentNumberWithPrefix,
164
169
  at: OneUptimeDate.getCurrentDate(),
165
170
  });
166
171
  continue;
@@ -242,6 +247,12 @@ export default class MonitorIncident {
242
247
 
243
248
  incident.isCreatedAutomatically = true;
244
249
 
250
+ // Set status page visibility (defaults to true if not specified)
251
+ if (criteriaIncident.showIncidentOnStatusPage !== undefined) {
252
+ incident.isVisibleOnStatusPage =
253
+ criteriaIncident.showIncidentOnStatusPage;
254
+ }
255
+
245
256
  if (input.props.telemetryQuery) {
246
257
  incident.telemetryQuery = input.props.telemetryQuery;
247
258
  }
@@ -347,6 +358,8 @@ export default class MonitorIncident {
347
358
  relatedCriteriaId: input.criteriaInstance.data?.id,
348
359
  relatedIncidentId: createdIncident.id?.toString(),
349
360
  relatedIncidentNumber: createdIncident.incidentNumber,
361
+ relatedIncidentNumberWithPrefix:
362
+ createdIncident.incidentNumberWithPrefix,
350
363
  at: OneUptimeDate.getCurrentDate(),
351
364
  });
352
365
  }
@@ -20,14 +20,22 @@ export default class PushNotificationUtil {
20
20
  projectName: string;
21
21
  incidentViewLink: string;
22
22
  incidentNumber?: number;
23
+ incidentNumberWithPrefix?: string;
23
24
  }): PushNotificationMessage {
24
- const { incidentTitle, projectName, incidentViewLink, incidentNumber } =
25
- params;
26
- const incidentIdentifier: string = incidentNumber
27
- ? `#${incidentNumber} (${incidentTitle})`
25
+ const {
26
+ incidentTitle,
27
+ projectName,
28
+ incidentViewLink,
29
+ incidentNumber,
30
+ incidentNumberWithPrefix,
31
+ } = params;
32
+ const displayNumber: string =
33
+ incidentNumberWithPrefix || (incidentNumber ? `#${incidentNumber}` : "");
34
+ const incidentIdentifier: string = displayNumber
35
+ ? `${displayNumber} (${incidentTitle})`
28
36
  : incidentTitle;
29
37
  return PushNotificationUtil.applyDefaults({
30
- title: `New Incident${incidentNumber ? ` #${incidentNumber}` : ""}: ${incidentTitle}`,
38
+ title: `New Incident${displayNumber ? ` ${displayNumber}` : ""}: ${incidentTitle}`,
31
39
  body: `A new incident has been created: ${incidentIdentifier} in ${projectName}. Click to view details.`,
32
40
  clickAction: incidentViewLink,
33
41
  url: incidentViewLink,
@@ -49,6 +57,7 @@ export default class PushNotificationUtil {
49
57
  previousState?: string;
50
58
  incidentViewLink: string;
51
59
  incidentNumber?: number;
60
+ incidentNumberWithPrefix?: string;
52
61
  }): PushNotificationMessage {
53
62
  const {
54
63
  incidentTitle,
@@ -57,15 +66,18 @@ export default class PushNotificationUtil {
57
66
  previousState,
58
67
  incidentViewLink,
59
68
  incidentNumber,
69
+ incidentNumberWithPrefix,
60
70
  } = params;
61
- const incidentIdentifier: string = incidentNumber
62
- ? `#${incidentNumber} (${incidentTitle})`
71
+ const displayNumber: string =
72
+ incidentNumberWithPrefix || (incidentNumber ? `#${incidentNumber}` : "");
73
+ const incidentIdentifier: string = displayNumber
74
+ ? `${displayNumber} (${incidentTitle})`
63
75
  : incidentTitle;
64
76
  const stateChangeText: string = previousState
65
77
  ? `Incident ${incidentIdentifier} state changed from ${previousState} to ${newState}`
66
78
  : `Incident ${incidentIdentifier} state changed to ${newState}`;
67
79
  return PushNotificationUtil.applyDefaults({
68
- title: `Incident${incidentNumber ? ` #${incidentNumber}` : ""} Updated: ${incidentTitle}`,
80
+ title: `Incident${displayNumber ? ` ${displayNumber}` : ""} Updated: ${incidentTitle}`,
69
81
  body: `${stateChangeText} in ${projectName}. Click to view details.`,
70
82
  clickAction: incidentViewLink,
71
83
  url: incidentViewLink,
@@ -88,6 +100,7 @@ export default class PushNotificationUtil {
88
100
  isPrivateNote: boolean;
89
101
  incidentViewLink: string;
90
102
  incidentNumber?: number;
103
+ incidentNumberWithPrefix?: string;
91
104
  }): PushNotificationMessage {
92
105
  const {
93
106
  incidentTitle,
@@ -95,13 +108,16 @@ export default class PushNotificationUtil {
95
108
  isPrivateNote,
96
109
  incidentViewLink,
97
110
  incidentNumber,
111
+ incidentNumberWithPrefix,
98
112
  } = params;
99
113
  const noteType: string = isPrivateNote ? "Private" : "Public";
100
- const incidentIdentifier: string = incidentNumber
101
- ? `#${incidentNumber} (${incidentTitle})`
114
+ const displayNumber: string =
115
+ incidentNumberWithPrefix || (incidentNumber ? `#${incidentNumber}` : "");
116
+ const incidentIdentifier: string = displayNumber
117
+ ? `${displayNumber} (${incidentTitle})`
102
118
  : incidentTitle;
103
119
  return PushNotificationUtil.applyDefaults({
104
- title: `${noteType} Note Added: Incident${incidentNumber ? ` #${incidentNumber}` : ""} - ${incidentTitle}`,
120
+ title: `${noteType} Note Added: Incident${displayNumber ? ` ${displayNumber}` : ""} - ${incidentTitle}`,
105
121
  body: `A ${noteType.toLowerCase()} note has been posted on incident ${incidentIdentifier} in ${projectName}. Click to view details.`,
106
122
  clickAction: incidentViewLink,
107
123
  url: incidentViewLink,
@@ -122,13 +138,22 @@ export default class PushNotificationUtil {
122
138
  projectName: string;
123
139
  alertViewLink: string;
124
140
  alertNumber?: number;
141
+ alertNumberWithPrefix?: string;
125
142
  }): PushNotificationMessage {
126
- const { alertTitle, projectName, alertViewLink, alertNumber } = params;
127
- const alertIdentifier: string = alertNumber
128
- ? `#${alertNumber} (${alertTitle})`
143
+ const {
144
+ alertTitle,
145
+ projectName,
146
+ alertViewLink,
147
+ alertNumber,
148
+ alertNumberWithPrefix,
149
+ } = params;
150
+ const displayNumber: string =
151
+ alertNumberWithPrefix || (alertNumber ? `#${alertNumber}` : "");
152
+ const alertIdentifier: string = displayNumber
153
+ ? `${displayNumber} (${alertTitle})`
129
154
  : alertTitle;
130
155
  return PushNotificationUtil.applyDefaults({
131
- title: `New Alert${alertNumber ? ` #${alertNumber}` : ""}: ${alertTitle}`,
156
+ title: `New Alert${displayNumber ? ` ${displayNumber}` : ""}: ${alertTitle}`,
132
157
  body: `A new alert has been created: ${alertIdentifier} in ${projectName}. Click to view details.`,
133
158
  clickAction: alertViewLink,
134
159
  url: alertViewLink,
@@ -148,18 +173,22 @@ export default class PushNotificationUtil {
148
173
  projectName: string;
149
174
  alertEpisodeViewLink: string;
150
175
  episodeNumber?: number;
176
+ episodeNumberWithPrefix?: string;
151
177
  }): PushNotificationMessage {
152
178
  const {
153
179
  alertEpisodeTitle,
154
180
  projectName,
155
181
  alertEpisodeViewLink,
156
182
  episodeNumber,
183
+ episodeNumberWithPrefix,
157
184
  } = params;
158
- const episodeIdentifier: string = episodeNumber
159
- ? `#${episodeNumber} (${alertEpisodeTitle})`
185
+ const displayNumber: string =
186
+ episodeNumberWithPrefix || (episodeNumber ? `#${episodeNumber}` : "");
187
+ const episodeIdentifier: string = displayNumber
188
+ ? `${displayNumber} (${alertEpisodeTitle})`
160
189
  : alertEpisodeTitle;
161
190
  return PushNotificationUtil.applyDefaults({
162
- title: `New Alert Episode${episodeNumber ? ` #${episodeNumber}` : ""}: ${alertEpisodeTitle}`,
191
+ title: `New Alert Episode${displayNumber ? ` ${displayNumber}` : ""}: ${alertEpisodeTitle}`,
163
192
  body: `A new alert episode has been created: ${episodeIdentifier} in ${projectName}. Click to view details.`,
164
193
  clickAction: alertEpisodeViewLink,
165
194
  url: alertEpisodeViewLink,
@@ -179,18 +208,22 @@ export default class PushNotificationUtil {
179
208
  projectName: string;
180
209
  incidentEpisodeViewLink: string;
181
210
  episodeNumber?: number;
211
+ episodeNumberWithPrefix?: string;
182
212
  }): PushNotificationMessage {
183
213
  const {
184
214
  incidentEpisodeTitle,
185
215
  projectName,
186
216
  incidentEpisodeViewLink,
187
217
  episodeNumber,
218
+ episodeNumberWithPrefix,
188
219
  } = params;
189
- const episodeIdentifier: string = episodeNumber
190
- ? `#${episodeNumber} (${incidentEpisodeTitle})`
220
+ const displayNumber: string =
221
+ episodeNumberWithPrefix || (episodeNumber ? `#${episodeNumber}` : "");
222
+ const episodeIdentifier: string = displayNumber
223
+ ? `${displayNumber} (${incidentEpisodeTitle})`
191
224
  : incidentEpisodeTitle;
192
225
  return PushNotificationUtil.applyDefaults({
193
- title: `New Incident Episode${episodeNumber ? ` #${episodeNumber}` : ""}: ${incidentEpisodeTitle}`,
226
+ title: `New Incident Episode${displayNumber ? ` ${displayNumber}` : ""}: ${incidentEpisodeTitle}`,
194
227
  body: `A new incident episode has been created: ${episodeIdentifier} in ${projectName}. Click to view details.`,
195
228
  clickAction: incidentEpisodeViewLink,
196
229
  url: incidentEpisodeViewLink,
@@ -246,14 +279,24 @@ export default class PushNotificationUtil {
246
279
  state: string;
247
280
  viewLink: string;
248
281
  scheduledMaintenanceNumber?: number;
282
+ scheduledMaintenanceNumberWithPrefix?: string;
249
283
  }): PushNotificationMessage {
250
- const { title, projectName, state, viewLink, scheduledMaintenanceNumber } =
251
- params;
252
- const maintenanceIdentifier: string = scheduledMaintenanceNumber
253
- ? `#${scheduledMaintenanceNumber} (${title})`
284
+ const {
285
+ title,
286
+ projectName,
287
+ state,
288
+ viewLink,
289
+ scheduledMaintenanceNumber,
290
+ scheduledMaintenanceNumberWithPrefix,
291
+ } = params;
292
+ const displayNumber: string =
293
+ scheduledMaintenanceNumberWithPrefix ||
294
+ (scheduledMaintenanceNumber ? `#${scheduledMaintenanceNumber}` : "");
295
+ const maintenanceIdentifier: string = displayNumber
296
+ ? `${displayNumber} (${title})`
254
297
  : title;
255
298
  return PushNotificationUtil.applyDefaults({
256
- title: `Scheduled Maintenance${scheduledMaintenanceNumber ? ` #${scheduledMaintenanceNumber}` : ""} ${state}: ${title}`,
299
+ title: `Scheduled Maintenance${displayNumber ? ` ${displayNumber}` : ""} ${state}: ${title}`,
257
300
  body: `Scheduled maintenance ${maintenanceIdentifier} ${state.toLowerCase()} in ${projectName}. Click to view details.`,
258
301
  clickAction: viewLink,
259
302
  url: viewLink,
@@ -2003,6 +2003,7 @@ Just type any of these commands to get the information you need!`;
2003
2003
  select: {
2004
2004
  _id: true,
2005
2005
  incidentNumber: true,
2006
+ incidentNumberWithPrefix: true,
2006
2007
  title: true,
2007
2008
  description: true,
2008
2009
  currentIncidentState: {
@@ -2063,7 +2064,7 @@ If you need to report an incident or check historical incidents, please visit th
2063
2064
  incident.id!,
2064
2065
  );
2065
2066
 
2066
- message += `${severityIcon} **[Incident #${incident.incidentNumber}: ${incident.title}](${incidentUrl.toString()})**
2067
+ message += `${severityIcon} **[Incident ${incident.incidentNumberWithPrefix || "#" + incident.incidentNumber}: ${incident.title}](${incidentUrl.toString()})**
2067
2068
  • **Severity:** ${severity}
2068
2069
  • **Status:** ${state}
2069
2070
  • **Declared:** ${declaredAtText}
@@ -2124,6 +2125,7 @@ If you need to report an incident or check historical incidents, please visit th
2124
2125
  name: true,
2125
2126
  },
2126
2127
  scheduledMaintenanceNumber: true,
2128
+ scheduledMaintenanceNumberWithPrefix: true,
2127
2129
  },
2128
2130
  sort: {
2129
2131
  startsAt: SortOrder.Ascending,
@@ -2169,7 +2171,7 @@ Check back later for upcoming maintenance windows.`;
2169
2171
  event.id!,
2170
2172
  );
2171
2173
 
2172
- message += `🛠️ **[Scheduled Maintenance #${event.scheduledMaintenanceNumber}: ${event.title}](${eventUrl.toString()})**
2174
+ message += `🛠️ **[Scheduled Maintenance ${event.scheduledMaintenanceNumberWithPrefix || "#" + event.scheduledMaintenanceNumber}: ${event.title}](${eventUrl.toString()})**
2173
2175
  • **Status:** ${state}
2174
2176
  • **Starts:** ${startTime}
2175
2177
  • **Ends:** ${endTime}
@@ -2229,6 +2231,7 @@ Check back later for upcoming maintenance windows.`;
2229
2231
  name: true,
2230
2232
  },
2231
2233
  scheduledMaintenanceNumber: true,
2234
+ scheduledMaintenanceNumberWithPrefix: true,
2232
2235
  },
2233
2236
  sort: {
2234
2237
  startsAt: SortOrder.Descending,
@@ -2274,7 +2277,7 @@ All systems are currently operating normally.`;
2274
2277
  event.id!,
2275
2278
  );
2276
2279
 
2277
- message += `🔧 **[Scheduled Maintenance #${event.scheduledMaintenanceNumber}: ${event.title}](${eventUrl.toString()})**
2280
+ message += `🔧 **[Scheduled Maintenance ${event.scheduledMaintenanceNumberWithPrefix || "#" + event.scheduledMaintenanceNumber}: ${event.title}](${eventUrl.toString()})**
2278
2281
  • **Status:** ${state}
2279
2282
  • **Started:** ${startTime}
2280
2283
  • **Expected End:** ${endTime}
@@ -2331,6 +2334,7 @@ All systems are currently operating normally.`;
2331
2334
  select: {
2332
2335
  _id: true,
2333
2336
  alertNumber: true,
2337
+ alertNumberWithPrefix: true,
2334
2338
  title: true,
2335
2339
  description: true,
2336
2340
  currentAlertState: {
@@ -2387,7 +2391,7 @@ All monitoring checks are passing normally.`;
2387
2391
  alert.id!,
2388
2392
  );
2389
2393
 
2390
- message += `⚠️ **[Alert #${alert.alertNumber}: ${alert.title}](${alertUrl.toString()})**
2394
+ message += `⚠️ **[Alert ${alert.alertNumberWithPrefix || "#" + alert.alertNumber}: ${alert.title}](${alertUrl.toString()})**
2391
2395
  • **Severity:** ${severity}
2392
2396
  • **Status:** ${state}
2393
2397
  • **Triggered:** ${createdAt}
@@ -110,14 +110,17 @@ export default class SlackAlertActions {
110
110
  });
111
111
 
112
112
  if (isAlreadyAcknowledged) {
113
- const alertNumber: number | null = await AlertService.getAlertNumber({
113
+ const alertNumberResult: {
114
+ number: number | null;
115
+ numberWithPrefix: string | null;
116
+ } = await AlertService.getAlertNumber({
114
117
  alertId: alertId,
115
118
  });
116
119
 
117
120
  // send a message to the channel visible to user, that the alert has already been acknowledged.
118
121
  const markdwonPayload: WorkspacePayloadMarkdown = {
119
122
  _type: "WorkspacePayloadMarkdown",
120
- text: `@${slackUsername}, unfortunately you cannot acknowledge the **[Alert ${alertNumber?.toString()}](${await AlertService.getAlertLinkInDashboard(slackRequest.projectId!, alertId)})**. It has already been acknowledged.`,
123
+ text: `@${slackUsername}, unfortunately you cannot acknowledge the **[Alert ${alertNumberResult.numberWithPrefix || "#" + alertNumberResult.number}](${await AlertService.getAlertLinkInDashboard(slackRequest.projectId!, alertId)})**. It has already been acknowledged.`,
121
124
  };
122
125
 
123
126
  await SlackUtil.sendDirectMessageToUser({
@@ -232,13 +235,16 @@ export default class SlackAlertActions {
232
235
  });
233
236
 
234
237
  if (isAlreadyResolved) {
235
- const alertNumber: number | null = await AlertService.getAlertNumber({
238
+ const alertNumberResult: {
239
+ number: number | null;
240
+ numberWithPrefix: string | null;
241
+ } = await AlertService.getAlertNumber({
236
242
  alertId: alertId,
237
243
  });
238
244
  // send a message to the channel visible to user, that the alert has already been Resolved.
239
245
  const markdwonPayload: WorkspacePayloadMarkdown = {
240
246
  _type: "WorkspacePayloadMarkdown",
241
- text: `@${slackUsername}, unfortunately you cannot resolve the **[Alert ${alertNumber?.toString()}](${await AlertService.getAlertLinkInDashboard(slackRequest.projectId!, alertId)})**. It has already been resolved.`,
247
+ text: `@${slackUsername}, unfortunately you cannot resolve the **[Alert ${alertNumberResult.numberWithPrefix || "#" + alertNumberResult.number}](${await AlertService.getAlertLinkInDashboard(slackRequest.projectId!, alertId)})**. It has already been resolved.`,
242
248
  };
243
249
 
244
250
  await SlackUtil.sendDirectMessageToUser({
@@ -568,13 +574,16 @@ export default class SlackAlertActions {
568
574
  });
569
575
 
570
576
  if (isAlreadyResolved) {
571
- const alertNumber: number | null = await AlertService.getAlertNumber({
577
+ const alertNumberResult: {
578
+ number: number | null;
579
+ numberWithPrefix: string | null;
580
+ } = await AlertService.getAlertNumber({
572
581
  alertId: alertId,
573
582
  });
574
583
  // send a message to the channel visible to user, that the alert has already been Resolved.
575
584
  const markdwonPayload: WorkspacePayloadMarkdown = {
576
585
  _type: "WorkspacePayloadMarkdown",
577
- text: `@${slackUsername}, unfortunately you cannot execute the on-call policy for **[Alert ${alertNumber?.toString()}](${await AlertService.getAlertLinkInDashboard(slackRequest.projectId!, alertId)})**. It has already been resolved.`,
586
+ text: `@${slackUsername}, unfortunately you cannot execute the on-call policy for **[Alert ${alertNumberResult.numberWithPrefix || "#" + alertNumberResult.number}](${await AlertService.getAlertLinkInDashboard(slackRequest.projectId!, alertId)})**. It has already been resolved.`,
578
587
  };
579
588
 
580
589
  await SlackUtil.sendDirectMessageToUser({
@@ -853,7 +862,10 @@ export default class SlackAlertActions {
853
862
  const alertId: ObjectID = workspaceLog.alertId;
854
863
 
855
864
  // Get the alert number for the confirmation message
856
- const alertNumber: number | null = await AlertService.getAlertNumber({
865
+ const alertNumberResult: {
866
+ number: number | null;
867
+ numberWithPrefix: string | null;
868
+ } = await AlertService.getAlertNumber({
857
869
  alertId: alertId,
858
870
  });
859
871
 
@@ -940,7 +952,7 @@ export default class SlackAlertActions {
940
952
  await AlertService.getAlertLinkInDashboard(projectId, alertId)
941
953
  ).toString();
942
954
 
943
- const confirmationMessage: string = `✅ Message saved as *private note* to <${alertLink}|Alert #${alertNumber}>.`;
955
+ const confirmationMessage: string = `✅ Message saved as *private note* to <${alertLink}|Alert ${alertNumberResult.numberWithPrefix || "#" + alertNumberResult.number}>.`;
944
956
 
945
957
  await SlackUtil.sendMessageToThread({
946
958
  authToken: authToken,
@@ -242,7 +242,7 @@ export default class SlackIncidentActions {
242
242
  messageBlocks: [
243
243
  {
244
244
  _type: "WorkspacePayloadMarkdown",
245
- text: `**Incident #${createdIncident.incidentNumber}** created successfully. [View Incident](${await IncidentService.getIncidentLinkInDashboard(
245
+ text: `**Incident ${createdIncident.incidentNumberWithPrefix || "#" + createdIncident.incidentNumber}** created successfully. [View Incident](${await IncidentService.getIncidentLinkInDashboard(
246
246
  slackRequest.projectId!,
247
247
  createdIncident.id!,
248
248
  )})`,
@@ -563,15 +563,20 @@ export default class SlackIncidentActions {
563
563
  });
564
564
 
565
565
  if (isAlreadyAcknowledged) {
566
- const incidentNumber: number | null =
567
- await IncidentService.getIncidentNumber({
568
- incidentId: incidentId,
569
- });
566
+ const incidentNumberResult: {
567
+ number: number | null;
568
+ numberWithPrefix: string | null;
569
+ } = await IncidentService.getIncidentNumber({
570
+ incidentId: incidentId,
571
+ });
572
+ const incidentNumberDisplay: string =
573
+ incidentNumberResult.numberWithPrefix ||
574
+ "#" + incidentNumberResult.number;
570
575
 
571
576
  // send a message to the channel visible to user, that the incident has already been acknowledged.
572
577
  const markdwonPayload: WorkspacePayloadMarkdown = {
573
578
  _type: "WorkspacePayloadMarkdown",
574
- text: `@${slackUsername}, unfortunately you cannot acknowledge the **[Incident ${incidentNumber?.toString()}](${await IncidentService.getIncidentLinkInDashboard(slackRequest.projectId!, incidentId)})**. It has already been acknowledged.`,
579
+ text: `@${slackUsername}, unfortunately you cannot acknowledge the **[Incident ${incidentNumberDisplay}](${await IncidentService.getIncidentLinkInDashboard(slackRequest.projectId!, incidentId)})**. It has already been acknowledged.`,
575
580
  };
576
581
 
577
582
  await SlackUtil.sendDirectMessageToUser({
@@ -687,14 +692,19 @@ export default class SlackIncidentActions {
687
692
  });
688
693
 
689
694
  if (isAlreadyResolved) {
690
- const incidentNumber: number | null =
691
- await IncidentService.getIncidentNumber({
692
- incidentId: incidentId,
693
- });
695
+ const incidentNumberResult: {
696
+ number: number | null;
697
+ numberWithPrefix: string | null;
698
+ } = await IncidentService.getIncidentNumber({
699
+ incidentId: incidentId,
700
+ });
701
+ const incidentNumberDisplay: string =
702
+ incidentNumberResult.numberWithPrefix ||
703
+ "#" + incidentNumberResult.number;
694
704
  // send a message to the channel visible to user, that the incident has already been Resolved.
695
705
  const markdwonPayload: WorkspacePayloadMarkdown = {
696
706
  _type: "WorkspacePayloadMarkdown",
697
- text: `@${slackUsername}, unfortunately you cannot resolve the **[Incident ${incidentNumber?.toString()}](${await IncidentService.getIncidentLinkInDashboard(slackRequest.projectId!, incidentId)})**. It has already been resolved.`,
707
+ text: `@${slackUsername}, unfortunately you cannot resolve the **[Incident ${incidentNumberDisplay}](${await IncidentService.getIncidentLinkInDashboard(slackRequest.projectId!, incidentId)})**. It has already been resolved.`,
698
708
  };
699
709
 
700
710
  await SlackUtil.sendDirectMessageToUser({
@@ -1026,14 +1036,19 @@ export default class SlackIncidentActions {
1026
1036
  });
1027
1037
 
1028
1038
  if (isAlreadyResolved) {
1029
- const incidentNumber: number | null =
1030
- await IncidentService.getIncidentNumber({
1031
- incidentId: incidentId,
1032
- });
1039
+ const incidentNumberResult: {
1040
+ number: number | null;
1041
+ numberWithPrefix: string | null;
1042
+ } = await IncidentService.getIncidentNumber({
1043
+ incidentId: incidentId,
1044
+ });
1045
+ const incidentNumberDisplay: string =
1046
+ incidentNumberResult.numberWithPrefix ||
1047
+ "#" + incidentNumberResult.number;
1033
1048
  // send a message to the channel visible to user, that the incident has already been Resolved.
1034
1049
  const markdwonPayload: WorkspacePayloadMarkdown = {
1035
1050
  _type: "WorkspacePayloadMarkdown",
1036
- text: `@${slackUsername}, unfortunately you cannot execute the on-call policy for **[Incident ${incidentNumber?.toString()}](${await IncidentService.getIncidentLinkInDashboard(slackRequest.projectId!, incidentId)})**. It has already been resolved.`,
1051
+ text: `@${slackUsername}, unfortunately you cannot execute the on-call policy for **[Incident ${incidentNumberDisplay}](${await IncidentService.getIncidentLinkInDashboard(slackRequest.projectId!, incidentId)})**. It has already been resolved.`,
1037
1052
  };
1038
1053
 
1039
1054
  await SlackUtil.sendDirectMessageToUser({
@@ -1369,10 +1384,15 @@ export default class SlackIncidentActions {
1369
1384
  const incidentId: ObjectID = workspaceLog.incidentId;
1370
1385
 
1371
1386
  // Get the incident number for the confirmation message
1372
- const incidentNumber: number | null =
1373
- await IncidentService.getIncidentNumber({
1374
- incidentId: incidentId,
1375
- });
1387
+ const incidentNumberResult: {
1388
+ number: number | null;
1389
+ numberWithPrefix: string | null;
1390
+ } = await IncidentService.getIncidentNumber({
1391
+ incidentId: incidentId,
1392
+ });
1393
+ const incidentNumberDisplay: string =
1394
+ incidentNumberResult.numberWithPrefix ||
1395
+ "#" + incidentNumberResult.number;
1376
1396
 
1377
1397
  // Get the user ID in OneUptime based on Slack user ID
1378
1398
  const userAuth: WorkspaceUserAuthToken | null =
@@ -1491,8 +1511,8 @@ export default class SlackIncidentActions {
1491
1511
 
1492
1512
  const confirmationMessage: string =
1493
1513
  noteType === "private"
1494
- ? `✅ Message saved as *private note* to <${incidentLink}|Incident #${incidentNumber}>.`
1495
- : `✅ Message saved as *public note* to <${incidentLink}|Incident #${incidentNumber}>. This note will be visible on the status page.`;
1514
+ ? `✅ Message saved as *private note* to <${incidentLink}|Incident ${incidentNumberDisplay}>.`
1515
+ : `✅ Message saved as *public note* to <${incidentLink}|Incident ${incidentNumberDisplay}>. This note will be visible on the status page.`;
1496
1516
 
1497
1517
  await SlackUtil.sendMessageToThread({
1498
1518
  authToken: authToken,