@oneuptime/common 11.3.20 → 11.3.22

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 (212) hide show
  1. package/Models/AnalyticsModels/AnalyticsBaseModel/CommonModel.ts +2 -0
  2. package/Models/AnalyticsModels/ExceptionInstance.ts +1 -0
  3. package/Models/AnalyticsModels/Log.ts +1 -0
  4. package/Models/AnalyticsModels/Metric.ts +1 -0
  5. package/Models/AnalyticsModels/MonitorLog.ts +1 -0
  6. package/Models/AnalyticsModels/Span.ts +1 -0
  7. package/Models/DatabaseModels/Alert.ts +100 -0
  8. package/Models/DatabaseModels/AlertInternalNote.ts +2 -0
  9. package/Models/DatabaseModels/AlertReminderRule.ts +597 -0
  10. package/Models/DatabaseModels/AlertSeverity.ts +2 -0
  11. package/Models/DatabaseModels/AlertState.ts +2 -0
  12. package/Models/DatabaseModels/AlertStateTimeline.ts +2 -0
  13. package/Models/DatabaseModels/EnterpriseLicenseInstance.ts +173 -0
  14. package/Models/DatabaseModels/GlobalConfig.ts +19 -0
  15. package/Models/DatabaseModels/Incident.ts +100 -0
  16. package/Models/DatabaseModels/IncidentInternalNote.ts +2 -0
  17. package/Models/DatabaseModels/IncidentPublicNote.ts +2 -0
  18. package/Models/DatabaseModels/IncidentReminderRule.ts +597 -0
  19. package/Models/DatabaseModels/IncidentSeverity.ts +2 -0
  20. package/Models/DatabaseModels/IncidentStateTimeline.ts +2 -0
  21. package/Models/DatabaseModels/Index.ts +8 -0
  22. package/Models/DatabaseModels/Label.ts +2 -0
  23. package/Models/DatabaseModels/MonitorStatusTimeline.ts +2 -0
  24. package/Models/DatabaseModels/ScheduledMaintenance.ts +100 -0
  25. package/Models/DatabaseModels/ScheduledMaintenanceReminderRule.ts +585 -0
  26. package/Models/DatabaseModels/ScheduledMaintenanceState.ts +2 -0
  27. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +2 -0
  28. package/Models/DatabaseModels/StatusPageAnnouncement.ts +2 -0
  29. package/Server/API/DashboardAPI.ts +221 -0
  30. package/Server/API/EnterpriseLicenseAPI.ts +279 -12
  31. package/Server/API/GlobalConfigAPI.ts +81 -16
  32. package/Server/API/StatusPageAPI.ts +894 -791
  33. package/Server/EnvironmentConfig.ts +9 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1783226868418-AddEnterpriseLicenseInstance.ts +47 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1783234451106-AddIncidentAlertReminderRules.ts +211 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/1783320000000-AddScheduledMaintenanceReminderRules.ts +113 -0
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/1783330000000-AddRemindWhileScheduledToScheduledMaintenanceReminderRule.ts +20 -0
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/1783340000000-AddLabelsToIncidentAndAlertReminderRules.ts +69 -0
  39. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  40. package/Server/Services/AlertReminderRuleService.ts +253 -0
  41. package/Server/Services/AlertService.ts +106 -0
  42. package/Server/Services/EnterpriseLicenseInstanceService.ts +10 -0
  43. package/Server/Services/IncidentReminderRuleService.ts +256 -0
  44. package/Server/Services/IncidentService.ts +143 -0
  45. package/Server/Services/Index.ts +8 -0
  46. package/Server/Services/IoTDeviceService.ts +99 -4
  47. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +236 -0
  48. package/Server/Services/ScheduledMaintenanceService.ts +127 -0
  49. package/Server/Services/StatusPageService.ts +104 -45
  50. package/Server/Services/TelemetryExceptionService.ts +123 -0
  51. package/Server/Services/UserNotificationSettingService.ts +24 -0
  52. package/Server/Utils/AnalyticsDatabase/Statement.ts +7 -3
  53. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +35 -0
  54. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +6 -4
  55. package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +7 -6
  56. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +6 -4
  57. package/Server/Utils/Telemetry/IoTSnapshotScan.ts +45 -7
  58. package/Server/Utils/WhatsAppTemplateUtil.ts +10 -0
  59. package/ServiceRoute.ts +4 -0
  60. package/Tests/Server/Services/IoTDeviceService.test.ts +280 -0
  61. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +49 -0
  62. package/Tests/Server/Utils/Monitor/Criteria/TelemetryStepMetricAlias.test.ts +390 -0
  63. package/Tests/Server/Utils/Telemetry/IoTSnapshotScan.test.ts +202 -0
  64. package/Tests/Utils/EnterpriseLicenseUsage.test.ts +165 -0
  65. package/Types/Email/EmailTemplateType.ts +3 -0
  66. package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +18 -0
  67. package/Types/Monitor/MonitorStep.ts +32 -0
  68. package/Types/NotificationSetting/NotificationSettingEventType.ts +3 -0
  69. package/Types/Permission.ts +144 -0
  70. package/Types/Reminder/ReminderStopState.ts +6 -0
  71. package/Types/Reminder/ScheduledMaintenanceReminderStopState.ts +6 -0
  72. package/Types/WhatsApp/WhatsAppTemplates.ts +14 -0
  73. package/UI/Components/EditionLabel/EditionLabel.tsx +172 -0
  74. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +125 -0
  75. package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/CommonModel.js.map +1 -1
  76. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +1 -0
  77. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
  78. package/build/dist/Models/AnalyticsModels/Log.js +1 -0
  79. package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
  80. package/build/dist/Models/AnalyticsModels/Metric.js +1 -0
  81. package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
  82. package/build/dist/Models/AnalyticsModels/MonitorLog.js +1 -0
  83. package/build/dist/Models/AnalyticsModels/MonitorLog.js.map +1 -1
  84. package/build/dist/Models/AnalyticsModels/Span.js +1 -0
  85. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  86. package/build/dist/Models/DatabaseModels/Alert.js +103 -0
  87. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  88. package/build/dist/Models/DatabaseModels/AlertInternalNote.js +2 -0
  89. package/build/dist/Models/DatabaseModels/AlertInternalNote.js.map +1 -1
  90. package/build/dist/Models/DatabaseModels/AlertReminderRule.js +605 -0
  91. package/build/dist/Models/DatabaseModels/AlertReminderRule.js.map +1 -0
  92. package/build/dist/Models/DatabaseModels/AlertSeverity.js +2 -0
  93. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  94. package/build/dist/Models/DatabaseModels/AlertState.js +2 -0
  95. package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
  96. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +2 -0
  97. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
  98. package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js +197 -0
  99. package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js.map +1 -0
  100. package/build/dist/Models/DatabaseModels/GlobalConfig.js +18 -0
  101. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  102. package/build/dist/Models/DatabaseModels/Incident.js +103 -0
  103. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  104. package/build/dist/Models/DatabaseModels/IncidentInternalNote.js +2 -0
  105. package/build/dist/Models/DatabaseModels/IncidentInternalNote.js.map +1 -1
  106. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +2 -0
  107. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  108. package/build/dist/Models/DatabaseModels/IncidentReminderRule.js +605 -0
  109. package/build/dist/Models/DatabaseModels/IncidentReminderRule.js.map +1 -0
  110. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +2 -0
  111. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  112. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +2 -0
  113. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  114. package/build/dist/Models/DatabaseModels/Index.js +8 -0
  115. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  116. package/build/dist/Models/DatabaseModels/Label.js +2 -0
  117. package/build/dist/Models/DatabaseModels/Label.js.map +1 -1
  118. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +2 -0
  119. package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
  120. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +103 -0
  121. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  122. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js +596 -0
  123. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js.map +1 -0
  124. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceState.js +2 -0
  125. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceState.js.map +1 -1
  126. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +2 -0
  127. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  128. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +2 -0
  129. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  130. package/build/dist/Server/API/DashboardAPI.js +166 -16
  131. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  132. package/build/dist/Server/API/EnterpriseLicenseAPI.js +203 -13
  133. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
  134. package/build/dist/Server/API/GlobalConfigAPI.js +62 -15
  135. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  136. package/build/dist/Server/API/StatusPageAPI.js +74 -31
  137. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  138. package/build/dist/Server/EnvironmentConfig.js +6 -0
  139. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  140. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783226868418-AddEnterpriseLicenseInstance.js +22 -0
  141. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783226868418-AddEnterpriseLicenseInstance.js.map +1 -0
  142. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783234451106-AddIncidentAlertReminderRules.js +78 -0
  143. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783234451106-AddIncidentAlertReminderRules.js.map +1 -0
  144. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783320000000-AddScheduledMaintenanceReminderRules.js +44 -0
  145. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783320000000-AddScheduledMaintenanceReminderRules.js.map +1 -0
  146. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783330000000-AddRemindWhileScheduledToScheduledMaintenanceReminderRule.js +12 -0
  147. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783330000000-AddRemindWhileScheduledToScheduledMaintenanceReminderRule.js.map +1 -0
  148. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783340000000-AddLabelsToIncidentAndAlertReminderRules.js +30 -0
  149. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783340000000-AddLabelsToIncidentAndAlertReminderRules.js.map +1 -0
  150. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  151. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  152. package/build/dist/Server/Services/AlertReminderRuleService.js +228 -0
  153. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -0
  154. package/build/dist/Server/Services/AlertService.js +87 -0
  155. package/build/dist/Server/Services/AlertService.js.map +1 -1
  156. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +9 -0
  157. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -0
  158. package/build/dist/Server/Services/IncidentReminderRuleService.js +231 -0
  159. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -0
  160. package/build/dist/Server/Services/IncidentService.js +116 -0
  161. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  162. package/build/dist/Server/Services/Index.js +8 -0
  163. package/build/dist/Server/Services/Index.js.map +1 -1
  164. package/build/dist/Server/Services/IoTDeviceService.js +66 -4
  165. package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
  166. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +214 -0
  167. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -0
  168. package/build/dist/Server/Services/ScheduledMaintenanceService.js +102 -0
  169. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  170. package/build/dist/Server/Services/StatusPageService.js +91 -43
  171. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  172. package/build/dist/Server/Services/TelemetryExceptionService.js +101 -0
  173. package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
  174. package/build/dist/Server/Services/UserNotificationSettingService.js +6 -0
  175. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  176. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +4 -2
  177. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  178. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +29 -0
  179. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  180. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +4 -5
  181. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  182. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +6 -5
  183. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
  184. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -9
  185. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  186. package/build/dist/Server/Utils/Telemetry/IoTSnapshotScan.js +33 -2
  187. package/build/dist/Server/Utils/Telemetry/IoTSnapshotScan.js.map +1 -1
  188. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +6 -0
  189. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  190. package/build/dist/ServiceRoute.js +1 -0
  191. package/build/dist/ServiceRoute.js.map +1 -1
  192. package/build/dist/Types/Email/EmailTemplateType.js +3 -0
  193. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  194. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.js +2 -0
  195. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.js.map +1 -0
  196. package/build/dist/Types/Monitor/MonitorStep.js +25 -0
  197. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  198. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  199. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  200. package/build/dist/Types/Permission.js +126 -0
  201. package/build/dist/Types/Permission.js.map +1 -1
  202. package/build/dist/Types/Reminder/ReminderStopState.js +7 -0
  203. package/build/dist/Types/Reminder/ReminderStopState.js.map +1 -0
  204. package/build/dist/Types/Reminder/ScheduledMaintenanceReminderStopState.js +7 -0
  205. package/build/dist/Types/Reminder/ScheduledMaintenanceReminderStopState.js.map +1 -0
  206. package/build/dist/Types/WhatsApp/WhatsAppTemplates.js +9 -0
  207. package/build/dist/Types/WhatsApp/WhatsAppTemplates.js.map +1 -1
  208. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +92 -0
  209. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  210. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +83 -0
  211. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -0
  212. package/package.json +1 -1
@@ -0,0 +1,231 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import SortOrder from "../../Types/BaseDatabase/SortOrder";
11
+ import DatabaseService from "./DatabaseService";
12
+ import Model from "../../Models/DatabaseModels/IncidentReminderRule";
13
+ import IncidentService from "./IncidentService";
14
+ import IncidentStateService from "./IncidentStateService";
15
+ import QueryHelper from "../Types/Database/QueryHelper";
16
+ import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
17
+ import ObjectID from "../../Types/ObjectID";
18
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
19
+ import logger from "../Utils/Logger";
20
+ import { IsBillingEnabled } from "../EnvironmentConfig";
21
+ export class Service extends DatabaseService {
22
+ constructor() {
23
+ super(Model);
24
+ if (IsBillingEnabled) {
25
+ this.hardDeleteItemsOlderThanInDays("createdAt", 3 * 365); // 3 years
26
+ }
27
+ }
28
+ async onBeforeCreate(createBy) {
29
+ // Auto-assign order on creation
30
+ if (!createBy.data.order) {
31
+ const highestOrderRule = await this.findOneBy({
32
+ query: {
33
+ projectId: createBy.data.projectId,
34
+ },
35
+ select: {
36
+ order: true,
37
+ },
38
+ sort: {
39
+ order: SortOrder.Descending,
40
+ },
41
+ props: {
42
+ isRoot: true,
43
+ },
44
+ });
45
+ createBy.data.order = ((highestOrderRule === null || highestOrderRule === void 0 ? void 0 : highestOrderRule.order) || 0) + 1;
46
+ }
47
+ return {
48
+ createBy,
49
+ carryForward: null,
50
+ };
51
+ }
52
+ async onCreateSuccess(_onCreate, createdItem) {
53
+ if (createdItem.projectId) {
54
+ await this.refreshSchedulesForOpenIncidents(createdItem.projectId);
55
+ }
56
+ return createdItem;
57
+ }
58
+ async onUpdateSuccess(onUpdate, _updatedItemIds) {
59
+ const projectId = onUpdate.updateBy.props.tenantId;
60
+ if (projectId) {
61
+ await this.refreshSchedulesForOpenIncidents(projectId);
62
+ }
63
+ return onUpdate;
64
+ }
65
+ async onDeleteSuccess(onDelete, _itemIdsBeforeDelete) {
66
+ const projectId = onDelete.deleteBy.props.tenantId;
67
+ if (projectId) {
68
+ await this.refreshSchedulesForOpenIncidents(projectId);
69
+ }
70
+ return onDelete;
71
+ }
72
+ async refreshSchedulesForOpenIncidents(projectId) {
73
+ try {
74
+ const unresolvedStates = await IncidentStateService.findBy({
75
+ query: {
76
+ projectId: projectId,
77
+ isResolvedState: false,
78
+ },
79
+ select: {
80
+ _id: true,
81
+ },
82
+ limit: LIMIT_PER_PROJECT,
83
+ skip: 0,
84
+ props: {
85
+ isRoot: true,
86
+ },
87
+ });
88
+ const unresolvedStateIds = unresolvedStates
89
+ .map((state) => {
90
+ return state.id;
91
+ })
92
+ .filter(Boolean);
93
+ if (unresolvedStateIds.length === 0) {
94
+ return;
95
+ }
96
+ const openIncidents = await IncidentService.findBy({
97
+ query: {
98
+ projectId: projectId,
99
+ currentIncidentStateId: QueryHelper.any(unresolvedStateIds),
100
+ },
101
+ select: {
102
+ _id: true,
103
+ },
104
+ limit: LIMIT_MAX,
105
+ skip: 0,
106
+ props: {
107
+ isRoot: true,
108
+ },
109
+ });
110
+ for (const incident of openIncidents) {
111
+ try {
112
+ await IncidentService.refreshReminderSchedule({
113
+ incidentId: incident.id,
114
+ projectId: projectId,
115
+ });
116
+ }
117
+ catch (error) {
118
+ logger.error(`Failed to refresh reminder schedule for incident ${incident.id}: ${error}`, { projectId: projectId === null || projectId === void 0 ? void 0 : projectId.toString() });
119
+ }
120
+ }
121
+ }
122
+ catch (error) {
123
+ logger.error(`Failed to refresh reminder schedules for open incidents: ${error}`, { projectId: projectId === null || projectId === void 0 ? void 0 : projectId.toString() });
124
+ }
125
+ }
126
+ async findMatchingRule(data) {
127
+ var _a;
128
+ // Get all enabled rules sorted by order. First matching rule wins.
129
+ const rules = await this.findBy({
130
+ query: {
131
+ projectId: data.projectId,
132
+ isEnabled: true,
133
+ },
134
+ sort: {
135
+ order: SortOrder.Ascending,
136
+ },
137
+ select: {
138
+ _id: true,
139
+ name: true,
140
+ order: true,
141
+ reminderIntervalInMinutes: true,
142
+ stopRemindersOnState: true,
143
+ incidentSeverities: {
144
+ _id: true,
145
+ },
146
+ labels: {
147
+ _id: true,
148
+ },
149
+ },
150
+ limit: 100,
151
+ skip: 0,
152
+ props: {
153
+ isRoot: true,
154
+ },
155
+ });
156
+ for (const rule of rules) {
157
+ if (rule.incidentSeverities && rule.incidentSeverities.length > 0) {
158
+ if (!data.incidentSeverityId) {
159
+ continue;
160
+ }
161
+ const severityIds = rule.incidentSeverities.map((severity) => {
162
+ var _a;
163
+ return ((_a = severity.id) === null || _a === void 0 ? void 0 : _a.toString()) || "";
164
+ });
165
+ if (!severityIds.includes(data.incidentSeverityId.toString())) {
166
+ continue;
167
+ }
168
+ }
169
+ if (rule.labels && rule.labels.length > 0) {
170
+ if (!data.labelIds || data.labelIds.length === 0) {
171
+ continue;
172
+ }
173
+ const ruleLabelIds = rule.labels.map((label) => {
174
+ var _a;
175
+ return ((_a = label.id) === null || _a === void 0 ? void 0 : _a.toString()) || "";
176
+ });
177
+ const hasMatchingLabel = data.labelIds.some((labelId) => {
178
+ return ruleLabelIds.includes(labelId.toString());
179
+ });
180
+ if (!hasMatchingLabel) {
181
+ continue;
182
+ }
183
+ }
184
+ /*
185
+ * Rule matched: (no severities OR severity matches) AND
186
+ * (no labels OR labels intersect). A rule with neither matches all.
187
+ */
188
+ logger.debug(`Incident reminder rule ${rule.name || rule.id} matched for project ${data.projectId}`, { projectId: (_a = data.projectId) === null || _a === void 0 ? void 0 : _a.toString() });
189
+ return rule;
190
+ }
191
+ return null;
192
+ }
193
+ }
194
+ __decorate([
195
+ CaptureSpan(),
196
+ __metadata("design:type", Function),
197
+ __metadata("design:paramtypes", [Object]),
198
+ __metadata("design:returntype", Promise)
199
+ ], Service.prototype, "onBeforeCreate", null);
200
+ __decorate([
201
+ CaptureSpan(),
202
+ __metadata("design:type", Function),
203
+ __metadata("design:paramtypes", [Object, Model]),
204
+ __metadata("design:returntype", Promise)
205
+ ], Service.prototype, "onCreateSuccess", null);
206
+ __decorate([
207
+ CaptureSpan(),
208
+ __metadata("design:type", Function),
209
+ __metadata("design:paramtypes", [Object, Array]),
210
+ __metadata("design:returntype", Promise)
211
+ ], Service.prototype, "onUpdateSuccess", null);
212
+ __decorate([
213
+ CaptureSpan(),
214
+ __metadata("design:type", Function),
215
+ __metadata("design:paramtypes", [Object, Array]),
216
+ __metadata("design:returntype", Promise)
217
+ ], Service.prototype, "onDeleteSuccess", null);
218
+ __decorate([
219
+ CaptureSpan(),
220
+ __metadata("design:type", Function),
221
+ __metadata("design:paramtypes", [ObjectID]),
222
+ __metadata("design:returntype", Promise)
223
+ ], Service.prototype, "refreshSchedulesForOpenIncidents", null);
224
+ __decorate([
225
+ CaptureSpan(),
226
+ __metadata("design:type", Function),
227
+ __metadata("design:paramtypes", [Object]),
228
+ __metadata("design:returntype", Promise)
229
+ ], Service.prototype, "findMatchingRule", null);
230
+ export default new Service();
231
+ //# sourceMappingURL=IncidentReminderRuleService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncidentReminderRuleService.js","sourceRoot":"","sources":["../../../../Server/Services/IncidentReminderRuleService.ts"],"names":[],"mappings":"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"}
@@ -53,6 +53,7 @@ import logger from "../Utils/Logger";
53
53
  import Semaphore from "../Infrastructure/Semaphore";
54
54
  import IncidentFeedService from "./IncidentFeedService";
55
55
  import IncidentSlaService from "./IncidentSlaService";
56
+ import IncidentReminderRuleService from "./IncidentReminderRuleService";
56
57
  import { setIsPublicForMarkdownImages } from "../Utils/InlineImageAccessTokenSync";
57
58
  import { IncidentFeedEventType } from "../../Models/DatabaseModels/IncidentFeed";
58
59
  import IncidentGroupingEngineService from "./IncidentGroupingEngineService";
@@ -157,6 +158,49 @@ export class Service extends DatabaseService {
157
158
  }
158
159
  return false;
159
160
  }
161
+ async refreshReminderSchedule(data) {
162
+ var _a;
163
+ const incident = await this.findOneById({
164
+ id: data.incidentId,
165
+ select: {
166
+ enableReminders: true,
167
+ incidentSeverityId: true,
168
+ labels: {
169
+ _id: true,
170
+ },
171
+ },
172
+ props: {
173
+ isRoot: true,
174
+ },
175
+ });
176
+ if (!incident) {
177
+ return;
178
+ }
179
+ let nextReminderNotificationAt = null;
180
+ if (incident.enableReminders !== false) {
181
+ const matchingRule = await IncidentReminderRuleService.findMatchingRule({
182
+ projectId: data.projectId,
183
+ incidentSeverityId: incident.incidentSeverityId,
184
+ labelIds: (_a = incident.labels) === null || _a === void 0 ? void 0 : _a.map((label) => {
185
+ return label.id;
186
+ }),
187
+ });
188
+ if (matchingRule &&
189
+ matchingRule.reminderIntervalInMinutes &&
190
+ !(await this.isIncidentResolved({ incidentId: data.incidentId }))) {
191
+ nextReminderNotificationAt = OneUptimeDate.addRemoveMinutes(OneUptimeDate.getCurrentDate(), matchingRule.reminderIntervalInMinutes);
192
+ }
193
+ }
194
+ await this.updateOneById({
195
+ id: data.incidentId,
196
+ data: {
197
+ nextReminderNotificationAt: nextReminderNotificationAt,
198
+ },
199
+ props: {
200
+ isRoot: true,
201
+ },
202
+ });
203
+ }
160
204
  async resolveIncident(incidentId, resolvedByUserId) {
161
205
  // check if the incident is already resolved.
162
206
  const isIncidentResolved = await this.isIncidentResolved({
@@ -873,6 +917,25 @@ export class Service extends DatabaseService {
873
917
  userId: (_c = createdItem.createdByUserId) === null || _c === void 0 ? void 0 : _c.toString(),
874
918
  });
875
919
  }
920
+ })
921
+ .then(async () => {
922
+ var _a, _b, _c;
923
+ // Schedule reminder notifications for incident if a matching reminder rule exists
924
+ try {
925
+ if (createdItem.projectId && createdItem.id) {
926
+ await this.refreshReminderSchedule({
927
+ incidentId: createdItem.id,
928
+ projectId: createdItem.projectId,
929
+ });
930
+ }
931
+ }
932
+ catch (error) {
933
+ logger.error(`Reminder scheduling failed in IncidentService.onCreateSuccess: ${error}`, {
934
+ projectId: (_a = createdItem.projectId) === null || _a === void 0 ? void 0 : _a.toString(),
935
+ incidentId: (_b = createdItem.id) === null || _b === void 0 ? void 0 : _b.toString(),
936
+ userId: (_c = createdItem.createdByUserId) === null || _c === void 0 ? void 0 : _c.toString(),
937
+ });
938
+ }
876
939
  })
877
940
  .catch((error) => {
878
941
  var _a, _b, _c;
@@ -1296,6 +1359,21 @@ ${incident.remediationNotes || "No remediation notes provided."}
1296
1359
  },
1297
1360
  });
1298
1361
  }
1362
+ // Re-evaluate reminder schedule when reminders are enabled or disabled for this incident
1363
+ if (Object.prototype.hasOwnProperty.call(updatedIncidentData, "enableReminders")) {
1364
+ try {
1365
+ await this.refreshReminderSchedule({
1366
+ incidentId: incidentId,
1367
+ projectId: projectId,
1368
+ });
1369
+ }
1370
+ catch (reminderError) {
1371
+ logger.error(`Reminder rescheduling failed in IncidentService.onUpdateSuccess: ${reminderError}`, {
1372
+ projectId: projectId === null || projectId === void 0 ? void 0 : projectId.toString(),
1373
+ incidentId: incidentId === null || incidentId === void 0 ? void 0 : incidentId.toString(),
1374
+ });
1375
+ }
1376
+ }
1299
1377
  // emit postmortem completion time metric when postmortemPostedAt is set
1300
1378
  if (Object.prototype.hasOwnProperty.call(updatedIncidentData, "postmortemPostedAt") &&
1301
1379
  updatedIncidentData["postmortemPostedAt"]) {
@@ -1468,6 +1546,25 @@ ${labels
1468
1546
  shouldAddIncidentFeed = true;
1469
1547
  }
1470
1548
  }
1549
+ /*
1550
+ * Re-match reminder rule on any labels change (including clearing all
1551
+ * labels), since labels can change which reminder rule matches.
1552
+ */
1553
+ if (updatedIncidentData.labels &&
1554
+ Array.isArray(updatedIncidentData.labels)) {
1555
+ try {
1556
+ await this.refreshReminderSchedule({
1557
+ incidentId: incidentId,
1558
+ projectId: projectId,
1559
+ });
1560
+ }
1561
+ catch (reminderError) {
1562
+ logger.error(`Reminder rescheduling failed in IncidentService.onUpdateSuccess: ${reminderError}`, {
1563
+ projectId: projectId === null || projectId === void 0 ? void 0 : projectId.toString(),
1564
+ incidentId: incidentId === null || incidentId === void 0 ? void 0 : incidentId.toString(),
1565
+ });
1566
+ }
1567
+ }
1471
1568
  if (updatedIncidentData.incidentSeverity &&
1472
1569
  updatedIncidentData.incidentSeverity._id) {
1473
1570
  const incidentSeverity = await IncidentSeverityService.findOneBy({
@@ -1498,6 +1595,19 @@ ${incidentSeverity.name}
1498
1595
  incidentId: incidentId === null || incidentId === void 0 ? void 0 : incidentId.toString(),
1499
1596
  });
1500
1597
  }
1598
+ // Re-match reminder rule when severity changes
1599
+ try {
1600
+ await this.refreshReminderSchedule({
1601
+ incidentId: incidentId,
1602
+ projectId: projectId,
1603
+ });
1604
+ }
1605
+ catch (reminderError) {
1606
+ logger.error(`Reminder rescheduling failed in IncidentService.onUpdateSuccess: ${reminderError}`, {
1607
+ projectId: projectId === null || projectId === void 0 ? void 0 : projectId.toString(),
1608
+ incidentId: incidentId === null || incidentId === void 0 ? void 0 : incidentId.toString(),
1609
+ });
1610
+ }
1501
1611
  // emit severity change metric
1502
1612
  try {
1503
1613
  const severityChangeMetric = new MutableMetric();
@@ -2496,6 +2606,12 @@ __decorate([
2496
2606
  __metadata("design:paramtypes", [Object]),
2497
2607
  __metadata("design:returntype", Promise)
2498
2608
  ], Service.prototype, "isIncidentAcknowledged", null);
2609
+ __decorate([
2610
+ CaptureSpan(),
2611
+ __metadata("design:type", Function),
2612
+ __metadata("design:paramtypes", [Object]),
2613
+ __metadata("design:returntype", Promise)
2614
+ ], Service.prototype, "refreshReminderSchedule", null);
2499
2615
  __decorate([
2500
2616
  CaptureSpan(),
2501
2617
  __metadata("design:type", Function),