@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
@@ -67,15 +67,17 @@ export class Service extends DatabaseService<Model> {
67
67
  });
68
68
 
69
69
  if (user && user.name) {
70
- await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeed({
71
- scheduledMaintenanceId: scheduledMaintenanceId,
72
- projectId: projectId,
73
- scheduledMaintenanceFeedEventType:
74
- ScheduledMaintenanceFeedEventType.OwnerUserRemoved,
75
- displayColor: Red500,
76
- feedInfoInMarkdown: `**${user.name.toString()}** (${user.email?.toString()}) was removed from the scheduled maintenance as the owner.`,
77
- userId: deleteByUserId || undefined,
78
- });
70
+ await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeedItem(
71
+ {
72
+ scheduledMaintenanceId: scheduledMaintenanceId,
73
+ projectId: projectId,
74
+ scheduledMaintenanceFeedEventType:
75
+ ScheduledMaintenanceFeedEventType.OwnerUserRemoved,
76
+ displayColor: Red500,
77
+ feedInfoInMarkdown: `Removed **${user.name.toString()}** (${user.email?.toString()}) from the scheduled maintenance as the owner.`,
78
+ userId: deleteByUserId || undefined,
79
+ },
80
+ );
79
81
  }
80
82
  }
81
83
  }
@@ -97,27 +99,23 @@ export class Service extends DatabaseService<Model> {
97
99
  createdItem.createdByUserId || onCreate.createBy.props.userId;
98
100
 
99
101
  if (scheduledMaintenanceId && userId && projectId) {
100
- const user: User | null = await UserService.findOneById({
101
- id: userId,
102
- select: {
103
- name: true,
104
- email: true,
105
- },
106
- props: {
107
- isRoot: true,
108
- },
109
- });
110
-
111
- if (user && user.name) {
112
- await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeed({
113
- scheduledMaintenanceId: scheduledMaintenanceId,
114
- projectId: projectId,
115
- scheduledMaintenanceFeedEventType:
116
- ScheduledMaintenanceFeedEventType.OwnerUserAdded,
117
- displayColor: Gray500,
118
- feedInfoInMarkdown: `**${user.name.toString()}** (${user.email?.toString()}) was added to the scheduled maintenance as the owner.`,
119
- userId: createdByUserId || undefined,
120
- });
102
+ if (userId) {
103
+ await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeedItem(
104
+ {
105
+ scheduledMaintenanceId: scheduledMaintenanceId,
106
+ projectId: projectId,
107
+ scheduledMaintenanceFeedEventType:
108
+ ScheduledMaintenanceFeedEventType.OwnerUserAdded,
109
+ displayColor: Gray500,
110
+ feedInfoInMarkdown: `Added **${await UserService.getUserMarkdownString(
111
+ {
112
+ userId: userId,
113
+ projectId: projectId,
114
+ },
115
+ )}** to the scheduled maintenance as the owner.`,
116
+ userId: createdByUserId || undefined,
117
+ },
118
+ );
121
119
  }
122
120
  }
123
121
 
@@ -34,7 +34,7 @@ export class Service extends DatabaseService<Model> {
34
34
  const userId: ObjectID | null | undefined =
35
35
  createdItem.createdByUserId || createdItem.createdByUser?.id;
36
36
 
37
- await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeed({
37
+ await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeedItem({
38
38
  scheduledMaintenanceId: createdItem.scheduledMaintenanceId!,
39
39
  projectId: createdItem.projectId!,
40
40
  scheduledMaintenanceFeedEventType:
@@ -77,19 +77,21 @@ ${createdItem.note}
77
77
  onUpdate.updateBy.props.userId;
78
78
 
79
79
  for (const updatedItem of updatedItems) {
80
- await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeed({
81
- scheduledMaintenanceId: updatedItem.scheduledMaintenanceId!,
82
- projectId: updatedItem.projectId!,
83
- scheduledMaintenanceFeedEventType:
84
- ScheduledMaintenanceFeedEventType.PublicNote,
85
- displayColor: Blue500,
86
- userId: userId || undefined,
80
+ await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeedItem(
81
+ {
82
+ scheduledMaintenanceId: updatedItem.scheduledMaintenanceId!,
83
+ projectId: updatedItem.projectId!,
84
+ scheduledMaintenanceFeedEventType:
85
+ ScheduledMaintenanceFeedEventType.PublicNote,
86
+ displayColor: Blue500,
87
+ userId: userId || undefined,
87
88
 
88
- feedInfoInMarkdown: `**Updated Public Note**
89
+ feedInfoInMarkdown: `**Updated Public Note**
89
90
 
90
91
  ${updatedItem.note}
91
92
  `,
92
- });
93
+ },
94
+ );
93
95
  }
94
96
  }
95
97
  return onUpdate;
@@ -162,6 +162,10 @@ export class Service extends DatabaseService<Model> {
162
162
  continue;
163
163
  }
164
164
 
165
+ if (!statuspage.showScheduledMaintenanceEventsOnStatusPage) {
166
+ continue; // Do not send notification to subscribers if incidents are not visible on status page.
167
+ }
168
+
165
169
  const subscribers: Array<StatusPageSubscriber> =
166
170
  await StatusPageSubscriberService.getSubscribersByStatusPage(
167
171
  statuspage.id!,
@@ -487,7 +491,7 @@ export class Service extends DatabaseService<Model> {
487
491
  const createdByUserId: ObjectID | undefined | null =
488
492
  createdItem.createdByUserId || createdItem.createdByUser?.id;
489
493
 
490
- await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeed({
494
+ await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeedItem({
491
495
  scheduledMaintenanceId: createdItem.id!,
492
496
  projectId: createdItem.projectId!,
493
497
  scheduledMaintenanceFeedEventType:
@@ -940,15 +944,17 @@ ${labels
940
944
  }
941
945
 
942
946
  if (shouldAddScheduledMaintenanceFeed) {
943
- await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeed({
944
- scheduledMaintenanceId: scheduledMaintenanceId,
945
- projectId: onUpdate.updateBy.props.tenantId as ObjectID,
946
- scheduledMaintenanceFeedEventType:
947
- ScheduledMaintenanceFeedEventType.ScheduledMaintenanceUpdated,
948
- displayColor: Gray500,
949
- feedInfoInMarkdown: feedInfoInMarkdown,
950
- userId: createdByUserId || undefined,
951
- });
947
+ await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeedItem(
948
+ {
949
+ scheduledMaintenanceId: scheduledMaintenanceId,
950
+ projectId: onUpdate.updateBy.props.tenantId as ObjectID,
951
+ scheduledMaintenanceFeedEventType:
952
+ ScheduledMaintenanceFeedEventType.ScheduledMaintenanceUpdated,
953
+ displayColor: Gray500,
954
+ feedInfoInMarkdown: feedInfoInMarkdown,
955
+ userId: createdByUserId || undefined,
956
+ },
957
+ );
952
958
  }
953
959
  }
954
960
  }
@@ -155,7 +155,7 @@ export class Service extends DatabaseService<ScheduledMaintenanceStateTimeline>
155
155
 
156
156
  const stateName: string = scheduledMaintenanceState?.name || "";
157
157
 
158
- await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeed({
158
+ await ScheduledMaintenanceFeedService.createScheduledMaintenanceFeedItem({
159
159
  scheduledMaintenanceId: createdItem.scheduledMaintenanceId!,
160
160
  projectId: createdItem.projectId!,
161
161
  scheduledMaintenanceFeedEventType:
@@ -800,6 +800,9 @@ export class Service extends DatabaseService<Model> {
800
800
  subscriberTimezones: true,
801
801
  reportDataInDays: true,
802
802
  isReportEnabled: true,
803
+ showAnnouncementsOnStatusPage: true,
804
+ showIncidentsOnStatusPage: true,
805
+ showScheduledMaintenanceEventsOnStatusPage: true,
803
806
  },
804
807
  });
805
808
 
@@ -32,6 +32,7 @@ import PositiveNumber from "../../Types/PositiveNumber";
32
32
  import Project from "Common/Models/DatabaseModels/Project";
33
33
  import TeamMember from "Common/Models/DatabaseModels/TeamMember";
34
34
  import User from "Common/Models/DatabaseModels/User";
35
+ import ProjectUserService from "./ProjectUserService";
35
36
 
36
37
  export class TeamMemberService extends DatabaseService<TeamMember> {
37
38
  public constructor() {
@@ -190,6 +191,12 @@ export class TeamMemberService extends DatabaseService<TeamMember> {
190
191
  onCreate.createBy.data.projectId!,
191
192
  );
192
193
 
194
+ ProjectUserService.refreshProjectUsersByProject({
195
+ projectId: onCreate.createBy.data.projectId!,
196
+ }).catch((err: Error) => {
197
+ logger.error(err);
198
+ });
199
+
193
200
  return createdItem;
194
201
  }
195
202
 
@@ -232,6 +239,12 @@ export class TeamMemberService extends DatabaseService<TeamMember> {
232
239
  item.user?.email as Email,
233
240
  );
234
241
  }
242
+
243
+ ProjectUserService.refreshProjectUsersByProject({
244
+ projectId: item.projectId!,
245
+ }).catch((err: Error) => {
246
+ logger.error(err);
247
+ });
235
248
  }
236
249
 
237
250
  return { updateBy, carryForward: onUpdate.carryForward };
@@ -304,6 +317,13 @@ export class TeamMemberService extends DatabaseService<TeamMember> {
304
317
  item.userId!,
305
318
  item.projectId!,
306
319
  );
320
+
321
+ // refresh project users.
322
+ ProjectUserService.refreshProjectUsersByProject({
323
+ projectId: item.projectId!,
324
+ }).catch((err: Error) => {
325
+ logger.error(err);
326
+ });
307
327
  }
308
328
 
309
329
  return onDelete;
@@ -43,6 +43,11 @@ import Alert from "../../Models/DatabaseModels/Alert";
43
43
  import AlertService from "./AlertService";
44
44
  import AlertSeverity from "../../Models/DatabaseModels/AlertSeverity";
45
45
  import AlertSeverityService from "./AlertSeverityService";
46
+ import WorkspaceNotificationRule from "../../Models/DatabaseModels/WorkspaceNotificationRule";
47
+ import WorkspaceNotificationRuleService from "./WorkspaceNotificationRuleService";
48
+ import NotificationRuleEventType from "../../Types/Workspace/NotificationRules/EventType";
49
+ import NotificationRuleWorkspaceChannel from "../../Types/Workspace/NotificationRules/NotificationRuleWorkspaceChannel";
50
+ import logger from "../Utils/Logger";
46
51
 
47
52
  export class Service extends DatabaseService<Model> {
48
53
  public constructor() {
@@ -888,6 +893,75 @@ export class Service extends DatabaseService<Model> {
888
893
  isRoot: true,
889
894
  },
890
895
  });
896
+
897
+ // Alert workspace here. Invite users to channels for example. If they are not invited.
898
+
899
+ this.runWorkspaceRulesForOnCallNotification({
900
+ projectId: options.projectId,
901
+ alertId: options.triggeredByAlertId,
902
+ incidentId: options.triggeredByIncidentId,
903
+ userId: userId,
904
+ }).catch((error: Error) => {
905
+ logger.error(error);
906
+ });
907
+ }
908
+
909
+ public async runWorkspaceRulesForOnCallNotification(data: {
910
+ projectId: ObjectID;
911
+ incidentId?: ObjectID | undefined;
912
+ alertId?: ObjectID | undefined;
913
+ userId: ObjectID;
914
+ }): Promise<void> {
915
+ // if alert and incidient are both present, then throw an error.
916
+ if (data.incidentId && data.alertId) {
917
+ throw new BadDataException("Either incidentId or alertId is required.");
918
+ }
919
+
920
+ // if none are present, then throw an error.
921
+
922
+ if (!data.incidentId && !data.alertId) {
923
+ throw new BadDataException("Either incidentId or alertId is required.");
924
+ }
925
+
926
+ // get notification rule where inviteOwners is true.
927
+ const notificationRules: Array<WorkspaceNotificationRule> =
928
+ await WorkspaceNotificationRuleService.getNotificationRulesWhereInviteOwnersIsTrue(
929
+ {
930
+ projectId: data.projectId!,
931
+ notificationFor: {
932
+ incidentId: data.incidentId,
933
+ alertId: data.alertId,
934
+ },
935
+ notificationRuleEventType: data.incidentId
936
+ ? NotificationRuleEventType.Incident
937
+ : NotificationRuleEventType.Alert,
938
+ },
939
+ );
940
+
941
+ let workspaceChannels: Array<NotificationRuleWorkspaceChannel> = [];
942
+
943
+ if (data.incidentId) {
944
+ workspaceChannels = await IncidentService.getWorkspaceChannelForIncident({
945
+ incidentId: data.incidentId!,
946
+ });
947
+ }
948
+
949
+ if (data.alertId) {
950
+ workspaceChannels = await AlertService.getWorkspaceChannelForAlert({
951
+ alertId: data.alertId!,
952
+ });
953
+ }
954
+
955
+ WorkspaceNotificationRuleService.inviteUsersBasedOnRulesAndWorkspaceChannels(
956
+ {
957
+ notificationRules: notificationRules,
958
+ projectId: data.projectId!,
959
+ workspaceChannels: workspaceChannels,
960
+ userIds: [data.userId],
961
+ },
962
+ ).catch((error: Error) => {
963
+ logger.error(error);
964
+ });
891
965
  }
892
966
 
893
967
  protected override async onBeforeCreate(
@@ -266,7 +266,7 @@ export class Service extends DatabaseService<Model> {
266
266
  id: createdItem.onCallDutyPolicyExecutionLogTimelineId!,
267
267
  data: {
268
268
  status: OnCallDutyExecutionLogTimelineStatus.NotificationSent,
269
- statusMessage: "Initial notification sent to the user.",
269
+ statusMessage: "Alert Sent",
270
270
  },
271
271
  props: {
272
272
  isRoot: true,
@@ -39,6 +39,41 @@ export class Service extends DatabaseService<Model> {
39
39
  super(Model);
40
40
  }
41
41
 
42
+ public async getUserMarkdownString(data: {
43
+ userId: ObjectID;
44
+ projectId: ObjectID;
45
+ }): Promise<string> {
46
+ const user: Model | null = await this.findOneBy({
47
+ query: {
48
+ _id: data.userId,
49
+ },
50
+ select: {
51
+ name: true,
52
+ email: true,
53
+ },
54
+ props: {
55
+ isRoot: true,
56
+ },
57
+ });
58
+
59
+ if (!user) {
60
+ return "";
61
+ }
62
+
63
+ return `[${user.name?.toString() || user.email?.toString() || "User"}](${(await this.getUserLinkInDashboard(data.projectId, data.userId)).toString()})`;
64
+ }
65
+
66
+ public async getUserLinkInDashboard(
67
+ projectId: ObjectID,
68
+ userId: ObjectID,
69
+ ): Promise<URL> {
70
+ const dashboardUrl: URL = await DatabaseConfig.getDashboardUrl();
71
+
72
+ return URL.fromString(dashboardUrl.toString()).addRoute(
73
+ `/${projectId.toString()}/settings/users/${userId.toString()}`,
74
+ );
75
+ }
76
+
42
77
  protected override async onCreateSuccess(
43
78
  _onCreate: OnCreate<Model>,
44
79
  createdItem: Model,