@oneuptime/common 7.0.3148 → 7.0.3153

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 (222) hide show
  1. package/Models/DatabaseModels/Alert.ts +1010 -0
  2. package/Models/DatabaseModels/AlertCustomField.ts +340 -0
  3. package/Models/DatabaseModels/AlertInternalNote.ts +371 -0
  4. package/Models/DatabaseModels/AlertNoteTemplate.ts +352 -0
  5. package/Models/DatabaseModels/AlertOwnerTeam.ts +416 -0
  6. package/Models/DatabaseModels/AlertOwnerUser.ts +415 -0
  7. package/Models/DatabaseModels/AlertSeverity.ts +426 -0
  8. package/Models/DatabaseModels/AlertState.ts +502 -0
  9. package/Models/DatabaseModels/AlertStateTimeline.ts +525 -0
  10. package/Models/DatabaseModels/Incident.ts +2 -11
  11. package/Models/DatabaseModels/Index.ts +34 -12
  12. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +55 -0
  13. package/Models/DatabaseModels/TableView.ts +452 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/1727894983857-MigrationName.ts +51 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/1727906598804-MigrationName.ts +553 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  17. package/Server/Services/AlertCustomFieldService.ts +9 -0
  18. package/Server/Services/AlertInternalNoteService.ts +10 -0
  19. package/Server/Services/AlertNoteTemplateService.ts +9 -0
  20. package/Server/Services/AlertOwnerTeamService.ts +10 -0
  21. package/Server/Services/AlertOwnerUserService.ts +10 -0
  22. package/Server/Services/AlertService.ts +568 -0
  23. package/Server/Services/AlertSeverityService.ts +154 -0
  24. package/Server/Services/AlertStateService.ts +227 -0
  25. package/Server/Services/AlertStateTimelineService.ts +334 -0
  26. package/Server/Services/CallLogService.ts +4 -1
  27. package/Server/Services/DatabaseService.ts +17 -20
  28. package/Server/Services/EmailLogService.ts +4 -1
  29. package/Server/Services/IncidentService.ts +4 -1
  30. package/Server/Services/IncidentStateTimelineService.ts +4 -1
  31. package/Server/Services/Index.ts +23 -0
  32. package/Server/Services/MonitorStatusTimelineService.ts +4 -1
  33. package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +4 -1
  34. package/Server/Services/OnCallDutyPolicyService.ts +15 -0
  35. package/Server/Services/ProjectService.ts +99 -1
  36. package/Server/Services/ScheduledMaintenanceService.ts +4 -1
  37. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +4 -1
  38. package/Server/Services/ShortLinkService.ts +4 -1
  39. package/Server/Services/SmsLogService.ts +4 -1
  40. package/Server/Services/TableViewService.ts +10 -0
  41. package/Server/Services/TelemetryUsageBillingService.ts +4 -1
  42. package/Server/Services/UserNotificationSettingService.ts +58 -0
  43. package/Server/Services/UserOnCallLogService.ts +4 -1
  44. package/Server/Services/WorkflowLogService.ts +4 -1
  45. package/Server/Types/Workflow/Components/API/Post.ts +25 -0
  46. package/Server/Utils/Monitor/MonitorAlert.ts +273 -0
  47. package/Server/Utils/Monitor/MonitorIncident.ts +298 -0
  48. package/Server/Utils/Monitor/MonitorResource.ts +67 -387
  49. package/Server/Utils/Monitor/MonitorStatusTimeline.ts +120 -0
  50. package/Server/Utils/Realtime.ts +1 -35
  51. package/Types/Email/EmailTemplateType.ts +7 -0
  52. package/Types/Icon/IconProp.ts +1 -0
  53. package/Types/Monitor/CriteriaAlert.ts +11 -0
  54. package/Types/Monitor/MonitorCriteria.ts +2 -0
  55. package/Types/Monitor/MonitorCriteriaInstance.ts +134 -1
  56. package/Types/Monitor/MonitorStep.ts +1 -0
  57. package/Types/Monitor/MonitorSteps.ts +1 -0
  58. package/Types/NotificationSetting/NotificationSettingEventType.ts +7 -0
  59. package/Types/Permission.ts +369 -1
  60. package/Types/Telemetry/TelemetryQuery.ts +10 -0
  61. package/Types/UserNotification/UserNotificationEventType.ts +1 -0
  62. package/UI/Components/Card/Card.tsx +40 -31
  63. package/UI/Components/Card/CardButtons/MoreButton.ts +15 -0
  64. package/UI/Components/HeaderAlert/HeaderAlert.tsx +75 -16
  65. package/UI/Components/HeaderAlert/HeaderAlertGroup.tsx +50 -0
  66. package/UI/Components/HeaderAlert/HeaderModelAlert.tsx +5 -1
  67. package/UI/Components/Icon/Icon.tsx +8 -0
  68. package/UI/Components/ModelDetail/CardModelDetail.tsx +4 -2
  69. package/UI/Components/ModelTable/BaseModelTable.tsx +70 -2
  70. package/UI/Components/ModelTable/TableView.tsx +317 -0
  71. package/UI/Components/MoreMenu/Divider.tsx +7 -0
  72. package/UI/Components/MoreMenu/MoreMenu.tsx +54 -0
  73. package/UI/Components/MoreMenu/MoreMenuItem.tsx +37 -0
  74. package/UI/Components/MoreMenu/MoreMenuSection.tsx +22 -0
  75. package/UI/Components/Toggle/Toggle.tsx +14 -0
  76. package/build/dist/Models/DatabaseModels/Alert.js +1028 -0
  77. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -0
  78. package/build/dist/Models/DatabaseModels/AlertCustomField.js +360 -0
  79. package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -0
  80. package/build/dist/Models/DatabaseModels/AlertInternalNote.js +391 -0
  81. package/build/dist/Models/DatabaseModels/AlertInternalNote.js.map +1 -0
  82. package/build/dist/Models/DatabaseModels/AlertNoteTemplate.js +372 -0
  83. package/build/dist/Models/DatabaseModels/AlertNoteTemplate.js.map +1 -0
  84. package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js +434 -0
  85. package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js.map +1 -0
  86. package/build/dist/Models/DatabaseModels/AlertOwnerUser.js +433 -0
  87. package/build/dist/Models/DatabaseModels/AlertOwnerUser.js.map +1 -0
  88. package/build/dist/Models/DatabaseModels/AlertSeverity.js +450 -0
  89. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -0
  90. package/build/dist/Models/DatabaseModels/AlertState.js +530 -0
  91. package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -0
  92. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +548 -0
  93. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -0
  94. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  95. package/build/dist/Models/DatabaseModels/Index.js +29 -9
  96. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  97. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +55 -0
  98. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
  99. package/build/dist/Models/DatabaseModels/TableView.js +475 -0
  100. package/build/dist/Models/DatabaseModels/TableView.js.map +1 -0
  101. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1727894983857-MigrationName.js +24 -0
  102. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1727894983857-MigrationName.js.map +1 -0
  103. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1727906598804-MigrationName.js +198 -0
  104. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1727906598804-MigrationName.js.map +1 -0
  105. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  106. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  107. package/build/dist/Server/Services/AlertCustomFieldService.js +9 -0
  108. package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -0
  109. package/build/dist/Server/Services/AlertInternalNoteService.js +9 -0
  110. package/build/dist/Server/Services/AlertInternalNoteService.js.map +1 -0
  111. package/build/dist/Server/Services/AlertNoteTemplateService.js +9 -0
  112. package/build/dist/Server/Services/AlertNoteTemplateService.js.map +1 -0
  113. package/build/dist/Server/Services/AlertOwnerTeamService.js +9 -0
  114. package/build/dist/Server/Services/AlertOwnerTeamService.js.map +1 -0
  115. package/build/dist/Server/Services/AlertOwnerUserService.js +9 -0
  116. package/build/dist/Server/Services/AlertOwnerUserService.js.map +1 -0
  117. package/build/dist/Server/Services/AlertService.js +418 -0
  118. package/build/dist/Server/Services/AlertService.js.map +1 -0
  119. package/build/dist/Server/Services/AlertSeverityService.js +108 -0
  120. package/build/dist/Server/Services/AlertSeverityService.js.map +1 -0
  121. package/build/dist/Server/Services/AlertStateService.js +158 -0
  122. package/build/dist/Server/Services/AlertStateService.js.map +1 -0
  123. package/build/dist/Server/Services/AlertStateTimelineService.js +267 -0
  124. package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -0
  125. package/build/dist/Server/Services/CallLogService.js +4 -1
  126. package/build/dist/Server/Services/CallLogService.js.map +1 -1
  127. package/build/dist/Server/Services/DatabaseService.js +9 -9
  128. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  129. package/build/dist/Server/Services/EmailLogService.js +4 -1
  130. package/build/dist/Server/Services/EmailLogService.js.map +1 -1
  131. package/build/dist/Server/Services/IncidentService.js +4 -1
  132. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  133. package/build/dist/Server/Services/IncidentStateTimelineService.js +4 -1
  134. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  135. package/build/dist/Server/Services/Index.js +21 -0
  136. package/build/dist/Server/Services/Index.js.map +1 -1
  137. package/build/dist/Server/Services/MonitorStatusTimelineService.js +4 -1
  138. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  139. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +4 -1
  140. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
  141. package/build/dist/Server/Services/OnCallDutyPolicyService.js +8 -0
  142. package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
  143. package/build/dist/Server/Services/ProjectService.js +80 -1
  144. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  145. package/build/dist/Server/Services/ScheduledMaintenanceService.js +4 -1
  146. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  147. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +4 -1
  148. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  149. package/build/dist/Server/Services/ShortLinkService.js +4 -1
  150. package/build/dist/Server/Services/ShortLinkService.js.map +1 -1
  151. package/build/dist/Server/Services/SmsLogService.js +4 -1
  152. package/build/dist/Server/Services/SmsLogService.js.map +1 -1
  153. package/build/dist/Server/Services/TableViewService.js +9 -0
  154. package/build/dist/Server/Services/TableViewService.js.map +1 -0
  155. package/build/dist/Server/Services/TelemetryUsageBillingService.js +4 -1
  156. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  157. package/build/dist/Server/Services/UserNotificationSettingService.js +49 -0
  158. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  159. package/build/dist/Server/Services/UserOnCallLogService.js +4 -1
  160. package/build/dist/Server/Services/UserOnCallLogService.js.map +1 -1
  161. package/build/dist/Server/Services/WorkflowLogService.js +4 -1
  162. package/build/dist/Server/Services/WorkflowLogService.js.map +1 -1
  163. package/build/dist/Server/Types/Workflow/Components/API/Post.js +14 -0
  164. package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
  165. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +177 -0
  166. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -0
  167. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +187 -0
  168. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -0
  169. package/build/dist/Server/Utils/Monitor/MonitorResource.js +46 -254
  170. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  171. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +79 -0
  172. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -0
  173. package/build/dist/Server/Utils/Realtime.js +3 -28
  174. package/build/dist/Server/Utils/Realtime.js.map +1 -1
  175. package/build/dist/Types/Email/EmailTemplateType.js +4 -0
  176. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  177. package/build/dist/Types/Icon/IconProp.js +1 -0
  178. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  179. package/build/dist/Types/Monitor/CriteriaAlert.js +2 -0
  180. package/build/dist/Types/Monitor/CriteriaAlert.js.map +1 -0
  181. package/build/dist/Types/Monitor/MonitorCriteria.js +1 -0
  182. package/build/dist/Types/Monitor/MonitorCriteria.js.map +1 -1
  183. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +120 -1
  184. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  185. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  186. package/build/dist/Types/Monitor/MonitorSteps.js.map +1 -1
  187. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +5 -0
  188. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  189. package/build/dist/Types/Permission.js +323 -1
  190. package/build/dist/Types/Permission.js.map +1 -1
  191. package/build/dist/Types/Telemetry/TelemetryQuery.js +2 -0
  192. package/build/dist/Types/Telemetry/TelemetryQuery.js.map +1 -0
  193. package/build/dist/Types/UserNotification/UserNotificationEventType.js +1 -0
  194. package/build/dist/Types/UserNotification/UserNotificationEventType.js.map +1 -1
  195. package/build/dist/UI/Components/Card/Card.js +3 -2
  196. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  197. package/build/dist/UI/Components/Card/CardButtons/MoreButton.js +12 -0
  198. package/build/dist/UI/Components/Card/CardButtons/MoreButton.js.map +1 -0
  199. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +53 -9
  200. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
  201. package/build/dist/UI/Components/HeaderAlert/HeaderAlertGroup.js +25 -0
  202. package/build/dist/UI/Components/HeaderAlert/HeaderAlertGroup.js.map +1 -0
  203. package/build/dist/UI/Components/HeaderAlert/HeaderModelAlert.js +1 -1
  204. package/build/dist/UI/Components/HeaderAlert/HeaderModelAlert.js.map +1 -1
  205. package/build/dist/UI/Components/Icon/Icon.js +3 -0
  206. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  207. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  208. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +46 -0
  209. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  210. package/build/dist/UI/Components/ModelTable/TableView.js +183 -0
  211. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -0
  212. package/build/dist/UI/Components/MoreMenu/Divider.js +6 -0
  213. package/build/dist/UI/Components/MoreMenu/Divider.js.map +1 -0
  214. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +19 -0
  215. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -0
  216. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +13 -0
  217. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -0
  218. package/build/dist/UI/Components/MoreMenu/MoreMenuSection.js +10 -0
  219. package/build/dist/UI/Components/MoreMenu/MoreMenuSection.js.map +1 -0
  220. package/build/dist/UI/Components/Toggle/Toggle.js +7 -1
  221. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  222. package/package.json +2 -2
@@ -0,0 +1,227 @@
1
+ import CreateBy from "../Types/Database/CreateBy";
2
+ import DeleteBy from "../Types/Database/DeleteBy";
3
+ import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
4
+ import QueryHelper from "../Types/Database/QueryHelper";
5
+ import UpdateBy from "../Types/Database/UpdateBy";
6
+ import DatabaseService from "./DatabaseService";
7
+ import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
8
+ import SortOrder from "../../Types/BaseDatabase/SortOrder";
9
+ import LIMIT_MAX from "../../Types/Database/LimitMax";
10
+ import BadDataException from "../../Types/Exception/BadDataException";
11
+ import ObjectID from "../../Types/ObjectID";
12
+ import AlertState from "Common/Models/DatabaseModels/AlertState";
13
+
14
+ export class Service extends DatabaseService<AlertState> {
15
+ public constructor() {
16
+ super(AlertState);
17
+ }
18
+
19
+ protected override async onBeforeCreate(
20
+ createBy: CreateBy<AlertState>,
21
+ ): Promise<OnCreate<AlertState>> {
22
+ if (!createBy.data.order) {
23
+ throw new BadDataException("Alert State order is required");
24
+ }
25
+
26
+ if (!createBy.data.projectId) {
27
+ throw new BadDataException("Alert State projectId is required");
28
+ }
29
+
30
+ await this.rearrangeOrder(
31
+ createBy.data.order,
32
+ createBy.data.projectId,
33
+ true,
34
+ );
35
+
36
+ return {
37
+ createBy: createBy,
38
+ carryForward: null,
39
+ };
40
+ }
41
+
42
+ protected override async onBeforeDelete(
43
+ deleteBy: DeleteBy<AlertState>,
44
+ ): Promise<OnDelete<AlertState>> {
45
+ if (!deleteBy.query._id && !deleteBy.props.isRoot) {
46
+ throw new BadDataException(
47
+ "_id should be present when deleting alert states. Please try the delete with objectId",
48
+ );
49
+ }
50
+
51
+ let alertState: AlertState | null = null;
52
+
53
+ if (!deleteBy.props.isRoot) {
54
+ alertState = await this.findOneBy({
55
+ query: deleteBy.query,
56
+ props: {
57
+ isRoot: true,
58
+ },
59
+ select: {
60
+ order: true,
61
+ projectId: true,
62
+ },
63
+ });
64
+ }
65
+
66
+ return {
67
+ deleteBy,
68
+ carryForward: alertState,
69
+ };
70
+ }
71
+
72
+ protected override async onDeleteSuccess(
73
+ onDelete: OnDelete<AlertState>,
74
+ _itemIdsBeforeDelete: ObjectID[],
75
+ ): Promise<OnDelete<AlertState>> {
76
+ const deleteBy: DeleteBy<AlertState> = onDelete.deleteBy;
77
+ const alertState: AlertState | null = onDelete.carryForward;
78
+
79
+ if (!deleteBy.props.isRoot && alertState) {
80
+ if (alertState && alertState.order && alertState.projectId) {
81
+ await this.rearrangeOrder(
82
+ alertState.order,
83
+ alertState.projectId,
84
+ false,
85
+ );
86
+ }
87
+ }
88
+
89
+ return {
90
+ deleteBy: deleteBy,
91
+ carryForward: null,
92
+ };
93
+ }
94
+
95
+ protected override async onBeforeUpdate(
96
+ updateBy: UpdateBy<AlertState>,
97
+ ): Promise<OnUpdate<AlertState>> {
98
+ if (updateBy.data.order && !updateBy.props.isRoot) {
99
+ throw new BadDataException(
100
+ "Alert State order should not be updated. Delete this alert state and create a new state with the right order.",
101
+ );
102
+ }
103
+
104
+ return { updateBy, carryForward: null };
105
+ }
106
+
107
+ private async rearrangeOrder(
108
+ currentOrder: number,
109
+ projectId: ObjectID,
110
+ increaseOrder: boolean = true,
111
+ ): Promise<void> {
112
+ // get alert with this order.
113
+ const alertStates: Array<AlertState> = await this.findBy({
114
+ query: {
115
+ order: QueryHelper.greaterThanEqualTo(currentOrder),
116
+ projectId: projectId,
117
+ },
118
+ limit: LIMIT_MAX,
119
+ skip: 0,
120
+ props: {
121
+ isRoot: true,
122
+ },
123
+ select: {
124
+ _id: true,
125
+ order: true,
126
+ },
127
+ sort: {
128
+ order: SortOrder.Ascending,
129
+ },
130
+ });
131
+
132
+ let newOrder: number = currentOrder;
133
+
134
+ for (const alertState of alertStates) {
135
+ if (increaseOrder) {
136
+ newOrder = alertState.order! + 1;
137
+ } else {
138
+ newOrder = alertState.order! - 1;
139
+ }
140
+
141
+ await this.updateOneBy({
142
+ query: {
143
+ _id: alertState._id!,
144
+ },
145
+ data: {
146
+ order: newOrder,
147
+ },
148
+ props: {
149
+ isRoot: true,
150
+ },
151
+ });
152
+ }
153
+ }
154
+
155
+ public async getAllAlertStates(data: {
156
+ projectId: ObjectID;
157
+ props: DatabaseCommonInteractionProps;
158
+ }): Promise<Array<AlertState>> {
159
+ const alertStates: Array<AlertState> = await this.findBy({
160
+ query: {
161
+ projectId: data.projectId,
162
+ },
163
+ skip: 0,
164
+ limit: LIMIT_MAX,
165
+ sort: {
166
+ order: SortOrder.Ascending,
167
+ },
168
+ select: {
169
+ _id: true,
170
+ isResolvedState: true,
171
+ isAcknowledgedState: true,
172
+ isCreatedState: true,
173
+ order: true,
174
+ },
175
+ props: data.props,
176
+ });
177
+
178
+ return alertStates;
179
+ }
180
+
181
+ public async getUnresolvedAlertStates(
182
+ projectId: ObjectID,
183
+ props: DatabaseCommonInteractionProps,
184
+ ): Promise<AlertState[]> {
185
+ const alertStates: Array<AlertState> = await this.getAllAlertStates({
186
+ projectId: projectId,
187
+ props: props,
188
+ });
189
+
190
+ const unresolvedAlertStates: Array<AlertState> = [];
191
+
192
+ for (const state of alertStates) {
193
+ if (!state.isResolvedState) {
194
+ unresolvedAlertStates.push(state);
195
+ } else {
196
+ break; // everything after resolved state is resolved
197
+ }
198
+ }
199
+
200
+ return unresolvedAlertStates;
201
+ }
202
+
203
+ public async getAcknowledgedAlertState(data: {
204
+ projectId: ObjectID;
205
+ props: DatabaseCommonInteractionProps;
206
+ }): Promise<AlertState> {
207
+ const alertStates: Array<AlertState> = await this.getAllAlertStates({
208
+ projectId: data.projectId,
209
+ props: data.props,
210
+ });
211
+
212
+ const ackAlertState: AlertState | undefined = alertStates.find(
213
+ (alertState: AlertState) => {
214
+ return alertState?.isAcknowledgedState;
215
+ },
216
+ );
217
+
218
+ if (!ackAlertState) {
219
+ throw new BadDataException(
220
+ "Acknowledged Alert State not found for this project",
221
+ );
222
+ }
223
+
224
+ return ackAlertState;
225
+ }
226
+ }
227
+ export default new Service();
@@ -0,0 +1,334 @@
1
+ import CreateBy from "../Types/Database/CreateBy";
2
+ import DeleteBy from "../Types/Database/DeleteBy";
3
+ import { OnCreate, OnDelete } from "../Types/Database/Hooks";
4
+ import QueryHelper from "../Types/Database/QueryHelper";
5
+ import DatabaseService from "./DatabaseService";
6
+ import AlertService from "./AlertService";
7
+ import AlertStateService from "./AlertStateService";
8
+ import UserService from "./UserService";
9
+ import SortOrder from "../../Types/BaseDatabase/SortOrder";
10
+ import OneUptimeDate from "../../Types/Date";
11
+ import BadDataException from "../../Types/Exception/BadDataException";
12
+ import ObjectID from "../../Types/ObjectID";
13
+ import PositiveNumber from "../../Types/PositiveNumber";
14
+ import AlertState from "Common/Models/DatabaseModels/AlertState";
15
+ import AlertStateTimeline from "Common/Models/DatabaseModels/AlertStateTimeline";
16
+ import User from "Common/Models/DatabaseModels/User";
17
+ import { IsBillingEnabled } from "../EnvironmentConfig";
18
+ import { JSONObject } from "../../Types/JSON";
19
+ import AlertInternalNote from "../../Models/DatabaseModels/AlertInternalNote";
20
+ import AlertInternalNoteService from "./AlertInternalNoteService";
21
+
22
+ export class Service extends DatabaseService<AlertStateTimeline> {
23
+ public constructor() {
24
+ super(AlertStateTimeline);
25
+ if (IsBillingEnabled) {
26
+ this.hardDeleteItemsOlderThanInDays("createdAt", 120);
27
+ }
28
+ }
29
+
30
+ public async getResolvedStateIdForProject(
31
+ projectId: ObjectID,
32
+ ): Promise<ObjectID> {
33
+ const resolvedState: AlertState | null = await AlertStateService.findOneBy({
34
+ query: {
35
+ projectId: projectId,
36
+ isResolvedState: true,
37
+ },
38
+ props: {
39
+ isRoot: true,
40
+ },
41
+ select: {
42
+ _id: true,
43
+ },
44
+ });
45
+
46
+ if (!resolvedState) {
47
+ throw new BadDataException("No resolved state found for the project");
48
+ }
49
+
50
+ return resolvedState.id!;
51
+ }
52
+
53
+ protected override async onBeforeCreate(
54
+ createBy: CreateBy<AlertStateTimeline>,
55
+ ): Promise<OnCreate<AlertStateTimeline>> {
56
+ if (!createBy.data.alertId) {
57
+ throw new BadDataException("alertId is null");
58
+ }
59
+
60
+ if (!createBy.data.startsAt) {
61
+ createBy.data.startsAt = OneUptimeDate.getCurrentDate();
62
+ }
63
+
64
+ if (
65
+ (createBy.data.createdByUserId ||
66
+ createBy.data.createdByUser ||
67
+ createBy.props.userId) &&
68
+ !createBy.data.rootCause
69
+ ) {
70
+ let userId: ObjectID | undefined = createBy.data.createdByUserId;
71
+
72
+ if (createBy.props.userId) {
73
+ userId = createBy.props.userId;
74
+ }
75
+
76
+ if (createBy.data.createdByUser && createBy.data.createdByUser.id) {
77
+ userId = createBy.data.createdByUser.id;
78
+ }
79
+
80
+ const user: User | null = await UserService.findOneBy({
81
+ query: {
82
+ _id: userId?.toString() as string,
83
+ },
84
+ select: {
85
+ _id: true,
86
+ name: true,
87
+ email: true,
88
+ },
89
+ props: {
90
+ isRoot: true,
91
+ },
92
+ });
93
+
94
+ if (user) {
95
+ createBy.data.rootCause = `Alert state created by ${user.name} (${user.email})`;
96
+ }
97
+ }
98
+
99
+ const lastAlertStateTimeline: AlertStateTimeline | null =
100
+ await this.findOneBy({
101
+ query: {
102
+ alertId: createBy.data.alertId,
103
+ },
104
+ sort: {
105
+ createdAt: SortOrder.Descending,
106
+ },
107
+ props: {
108
+ isRoot: true,
109
+ },
110
+ select: {
111
+ _id: true,
112
+ },
113
+ });
114
+
115
+ const internalNote: string | undefined = (
116
+ createBy.miscDataProps as JSONObject | undefined
117
+ )?.["internalNote"] as string | undefined;
118
+
119
+ if (internalNote) {
120
+ const alertNote: AlertInternalNote = new AlertInternalNote();
121
+ alertNote.alertId = createBy.data.alertId;
122
+ alertNote.note = internalNote;
123
+ alertNote.createdAt = createBy.data.startsAt;
124
+ alertNote.projectId = createBy.data.projectId!;
125
+
126
+ await AlertInternalNoteService.create({
127
+ data: alertNote,
128
+ props: createBy.props,
129
+ });
130
+ }
131
+
132
+ return {
133
+ createBy,
134
+ carryForward: {
135
+ lastAlertStateTimelineId: lastAlertStateTimeline?.id || null,
136
+ },
137
+ };
138
+ }
139
+
140
+ protected override async onCreateSuccess(
141
+ onCreate: OnCreate<AlertStateTimeline>,
142
+ createdItem: AlertStateTimeline,
143
+ ): Promise<AlertStateTimeline> {
144
+ if (!createdItem.alertId) {
145
+ throw new BadDataException("alertId is null");
146
+ }
147
+
148
+ if (!createdItem.alertStateId) {
149
+ throw new BadDataException("alertStateId is null");
150
+ }
151
+
152
+ // update the last status as ended.
153
+
154
+ if (onCreate.carryForward.lastAlertStateTimelineId) {
155
+ await this.updateOneById({
156
+ id: onCreate.carryForward.lastAlertStateTimelineId!,
157
+ data: {
158
+ endsAt: createdItem.createdAt || OneUptimeDate.getCurrentDate(),
159
+ },
160
+ props: {
161
+ isRoot: true,
162
+ },
163
+ });
164
+ }
165
+
166
+ await AlertService.updateOneBy({
167
+ query: {
168
+ _id: createdItem.alertId?.toString(),
169
+ },
170
+ data: {
171
+ currentAlertStateId: createdItem.alertStateId,
172
+ },
173
+ props: onCreate.createBy.props,
174
+ });
175
+
176
+ return createdItem;
177
+ }
178
+
179
+ protected override async onBeforeDelete(
180
+ deleteBy: DeleteBy<AlertStateTimeline>,
181
+ ): Promise<OnDelete<AlertStateTimeline>> {
182
+ if (deleteBy.query._id) {
183
+ const alertStateTimelineToBeDeleted: AlertStateTimeline | null =
184
+ await this.findOneById({
185
+ id: new ObjectID(deleteBy.query._id as string),
186
+ select: {
187
+ alertId: true,
188
+ startsAt: true,
189
+ },
190
+ props: {
191
+ isRoot: true,
192
+ },
193
+ });
194
+
195
+ const alertId: ObjectID | undefined =
196
+ alertStateTimelineToBeDeleted?.alertId;
197
+
198
+ if (alertId) {
199
+ const alertStateTimeline: PositiveNumber = await this.countBy({
200
+ query: {
201
+ alertId: alertId,
202
+ },
203
+ props: {
204
+ isRoot: true,
205
+ },
206
+ });
207
+
208
+ if (alertStateTimeline.isOne()) {
209
+ throw new BadDataException(
210
+ "Cannot delete the only state timeline. Alert should have at least one state in its timeline.",
211
+ );
212
+ }
213
+
214
+ if (alertStateTimelineToBeDeleted?.startsAt) {
215
+ const beforeState: AlertStateTimeline | null = await this.findOneBy({
216
+ query: {
217
+ alertId: alertId,
218
+ startsAt: QueryHelper.lessThan(
219
+ alertStateTimelineToBeDeleted?.startsAt,
220
+ ),
221
+ },
222
+ sort: {
223
+ createdAt: SortOrder.Descending,
224
+ },
225
+ props: {
226
+ isRoot: true,
227
+ },
228
+ select: {
229
+ _id: true,
230
+ startsAt: true,
231
+ },
232
+ });
233
+
234
+ if (beforeState) {
235
+ const afterState: AlertStateTimeline | null = await this.findOneBy({
236
+ query: {
237
+ alertId: alertId,
238
+ startsAt: QueryHelper.greaterThan(
239
+ alertStateTimelineToBeDeleted?.startsAt,
240
+ ),
241
+ },
242
+ sort: {
243
+ createdAt: SortOrder.Ascending,
244
+ },
245
+ props: {
246
+ isRoot: true,
247
+ },
248
+ select: {
249
+ _id: true,
250
+ startsAt: true,
251
+ },
252
+ });
253
+
254
+ if (!afterState) {
255
+ // if there's nothing after then end date of before state is null.
256
+
257
+ await this.updateOneById({
258
+ id: beforeState.id!,
259
+ data: {
260
+ endsAt: null as any,
261
+ },
262
+ props: {
263
+ isRoot: true,
264
+ },
265
+ });
266
+ } else {
267
+ // if there's something after then end date of before state is start date of after state.
268
+
269
+ await this.updateOneById({
270
+ id: beforeState.id!,
271
+ data: {
272
+ endsAt: afterState.startsAt!,
273
+ },
274
+ props: {
275
+ isRoot: true,
276
+ },
277
+ });
278
+ }
279
+ }
280
+ }
281
+ }
282
+
283
+ return { deleteBy, carryForward: alertId };
284
+ }
285
+
286
+ return { deleteBy, carryForward: null };
287
+ }
288
+
289
+ protected override async onDeleteSuccess(
290
+ onDelete: OnDelete<AlertStateTimeline>,
291
+ _itemIdsBeforeDelete: ObjectID[],
292
+ ): Promise<OnDelete<AlertStateTimeline>> {
293
+ if (onDelete.carryForward) {
294
+ // this is alertId.
295
+ const alertId: ObjectID = onDelete.carryForward as ObjectID;
296
+
297
+ // get last status of this monitor.
298
+ const alertStateTimeline: AlertStateTimeline | null =
299
+ await this.findOneBy({
300
+ query: {
301
+ alertId: alertId,
302
+ },
303
+ sort: {
304
+ createdAt: SortOrder.Descending,
305
+ },
306
+ props: {
307
+ isRoot: true,
308
+ },
309
+ select: {
310
+ _id: true,
311
+ alertStateId: true,
312
+ },
313
+ });
314
+
315
+ if (alertStateTimeline && alertStateTimeline.alertStateId) {
316
+ await AlertService.updateOneBy({
317
+ query: {
318
+ _id: alertId.toString(),
319
+ },
320
+ data: {
321
+ currentAlertStateId: alertStateTimeline.alertStateId,
322
+ },
323
+ props: {
324
+ isRoot: true,
325
+ },
326
+ });
327
+ }
328
+ }
329
+
330
+ return onDelete;
331
+ }
332
+ }
333
+
334
+ export default new Service();
@@ -1,10 +1,13 @@
1
+ import { IsBillingEnabled } from "../EnvironmentConfig";
1
2
  import DatabaseService from "./DatabaseService";
2
3
  import Model from "Common/Models/DatabaseModels/CallLog";
3
4
 
4
5
  export class Service extends DatabaseService<Model> {
5
6
  public constructor() {
6
7
  super(Model);
7
- this.hardDeleteItemsOlderThanInDays("createdAt", 3);
8
+ if (IsBillingEnabled) {
9
+ this.hardDeleteItemsOlderThanInDays("createdAt", 3);
10
+ }
8
11
  }
9
12
  }
10
13
 
@@ -671,28 +671,25 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
671
671
  );
672
672
  }
673
673
 
674
- // hit workflow.;
675
- if (this.getModel().enableWorkflowOn?.create) {
676
- let tenantId: ObjectID | undefined = createBy.props.tenantId;
674
+ let tenantId: ObjectID | undefined = createBy.props.tenantId;
677
675
 
678
- if (!tenantId && this.getModel().getTenantColumn()) {
679
- tenantId = createBy.data.getValue<ObjectID>(
680
- this.getModel().getTenantColumn()!,
681
- );
682
- }
676
+ if (!tenantId && this.getModel().getTenantColumn()) {
677
+ tenantId = createBy.data.getValue<ObjectID>(
678
+ this.getModel().getTenantColumn()!,
679
+ );
680
+ }
683
681
 
684
- if (tenantId) {
685
- await this.onTriggerWorkflow(
686
- createBy.data.id!,
687
- tenantId,
688
- "on-create",
689
- );
690
- await this.onTriggerRealtime(
691
- createBy.data.id!,
692
- tenantId,
693
- ModelEventType.Create,
694
- );
695
- }
682
+ // hit workflow.;
683
+ if (this.getModel().enableWorkflowOn?.create && tenantId) {
684
+ await this.onTriggerWorkflow(createBy.data.id!, tenantId, "on-create");
685
+ }
686
+
687
+ if (tenantId) {
688
+ await this.onTriggerRealtime(
689
+ createBy.data.id!,
690
+ tenantId,
691
+ ModelEventType.Create,
692
+ );
696
693
  }
697
694
 
698
695
  return createBy.data;
@@ -1,10 +1,13 @@
1
+ import { IsBillingEnabled } from "../EnvironmentConfig";
1
2
  import DatabaseService from "./DatabaseService";
2
3
  import Model from "Common/Models/DatabaseModels/EmailLog";
3
4
 
4
5
  export class Service extends DatabaseService<Model> {
5
6
  public constructor() {
6
7
  super(Model);
7
- this.hardDeleteItemsOlderThanInDays("createdAt", 3);
8
+ if (IsBillingEnabled) {
9
+ this.hardDeleteItemsOlderThanInDays("createdAt", 3);
10
+ }
8
11
  }
9
12
  }
10
13
 
@@ -33,11 +33,14 @@ import Monitor from "Common/Models/DatabaseModels/Monitor";
33
33
  import MonitorStatus from "Common/Models/DatabaseModels/MonitorStatus";
34
34
  import MonitorStatusTimeline from "Common/Models/DatabaseModels/MonitorStatusTimeline";
35
35
  import User from "Common/Models/DatabaseModels/User";
36
+ import { IsBillingEnabled } from "../EnvironmentConfig";
36
37
 
37
38
  export class Service extends DatabaseService<Model> {
38
39
  public constructor() {
39
40
  super(Model);
40
- this.hardDeleteItemsOlderThanInDays("createdAt", 120);
41
+ if (IsBillingEnabled) {
42
+ this.hardDeleteItemsOlderThanInDays("createdAt", 120);
43
+ }
41
44
  }
42
45
 
43
46
  public async isIncidentAcknowledged(data: {
@@ -18,11 +18,14 @@ import IncidentPublicNote from "Common/Models/DatabaseModels/IncidentPublicNote"
18
18
  import IncidentState from "Common/Models/DatabaseModels/IncidentState";
19
19
  import IncidentStateTimeline from "Common/Models/DatabaseModels/IncidentStateTimeline";
20
20
  import User from "Common/Models/DatabaseModels/User";
21
+ import { IsBillingEnabled } from "../EnvironmentConfig";
21
22
 
22
23
  export class Service extends DatabaseService<IncidentStateTimeline> {
23
24
  public constructor() {
24
25
  super(IncidentStateTimeline);
25
- this.hardDeleteItemsOlderThanInDays("createdAt", 120);
26
+ if (IsBillingEnabled) {
27
+ this.hardDeleteItemsOlderThanInDays("createdAt", 120);
28
+ }
26
29
  }
27
30
 
28
31
  public async getResolvedStateIdForProject(