@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,165 @@
1
+ import EnterpriseLicenseUsageUtil from "../../Utils/EnterpriseLicense/EnterpriseLicenseUsage";
2
+ import OneUptimeDate from "../../Types/Date";
3
+ import { describe, expect, it } from "@jest/globals";
4
+
5
+ type HashFunction = (seed: string) => string;
6
+
7
+ // Deterministic fake SHA-256-shaped hex string for tests.
8
+ const fakeHash: HashFunction = (seed: string): string => {
9
+ return seed
10
+ .repeat(64)
11
+ .replace(/[^a-f0-9]/g, "a")
12
+ .substring(0, 64);
13
+ };
14
+
15
+ describe("EnterpriseLicenseUsageUtil.sanitizeUserEmailHashes", () => {
16
+ it("returns empty array for non-array input", () => {
17
+ expect(EnterpriseLicenseUsageUtil.sanitizeUserEmailHashes(null)).toEqual(
18
+ [],
19
+ );
20
+ expect(
21
+ EnterpriseLicenseUsageUtil.sanitizeUserEmailHashes("not-an-array"),
22
+ ).toEqual([]);
23
+ expect(EnterpriseLicenseUsageUtil.sanitizeUserEmailHashes({})).toEqual([]);
24
+ });
25
+
26
+ it("keeps only valid sha256 hex strings and normalizes case", () => {
27
+ const valid: string = fakeHash("1");
28
+
29
+ const result: Array<string> =
30
+ EnterpriseLicenseUsageUtil.sanitizeUserEmailHashes([
31
+ valid.toUpperCase(),
32
+ ` ${valid} `,
33
+ "short",
34
+ 12345,
35
+ "z".repeat(64), // not hex
36
+ null,
37
+ ]);
38
+
39
+ expect(result).toEqual([valid]);
40
+ });
41
+
42
+ it("removes duplicates", () => {
43
+ const a: string = fakeHash("a");
44
+ const b: string = fakeHash("b");
45
+
46
+ const result: Array<string> =
47
+ EnterpriseLicenseUsageUtil.sanitizeUserEmailHashes([a, b, a, b, a]);
48
+
49
+ expect(result.sort()).toEqual([a, b].sort());
50
+ });
51
+ });
52
+
53
+ describe("EnterpriseLicenseUsageUtil.getUniqueUserCount", () => {
54
+ const now: Date = OneUptimeDate.getCurrentDate();
55
+ const fresh: Date = OneUptimeDate.addRemoveDays(now, -1);
56
+ const stale: Date = OneUptimeDate.addRemoveDays(now, -60);
57
+
58
+ it("counts the same user on multiple instances once", () => {
59
+ const sharedUser: string = fakeHash("shared");
60
+ const stagingOnlyUser: string = fakeHash("staging");
61
+ const prodOnlyUser: string = fakeHash("prod");
62
+
63
+ const count: number = EnterpriseLicenseUsageUtil.getUniqueUserCount(
64
+ [
65
+ {
66
+ userCount: 2,
67
+ userEmailHashes: [sharedUser, stagingOnlyUser],
68
+ lastReportedAt: fresh,
69
+ },
70
+ {
71
+ userCount: 2,
72
+ userEmailHashes: [sharedUser, prodOnlyUser],
73
+ lastReportedAt: fresh,
74
+ },
75
+ ],
76
+ now,
77
+ );
78
+
79
+ expect(count).toBe(3);
80
+ });
81
+
82
+ it("adds plain user counts for instances without hashes", () => {
83
+ const count: number = EnterpriseLicenseUsageUtil.getUniqueUserCount(
84
+ [
85
+ {
86
+ userCount: 2,
87
+ userEmailHashes: [fakeHash("a"), fakeHash("b")],
88
+ lastReportedAt: fresh,
89
+ },
90
+ {
91
+ // Older installation that reports a count but no hashes.
92
+ userCount: 7,
93
+ userEmailHashes: undefined,
94
+ lastReportedAt: fresh,
95
+ },
96
+ ],
97
+ now,
98
+ );
99
+
100
+ expect(count).toBe(9);
101
+ });
102
+
103
+ it("counts overflow users when the hash list was capped", () => {
104
+ /*
105
+ * An instance with more users than the hash cap: userCount is larger
106
+ * than the number of hashes stored. The overflow must still count.
107
+ */
108
+ const count: number = EnterpriseLicenseUsageUtil.getUniqueUserCount(
109
+ [
110
+ {
111
+ userCount: 250_000,
112
+ userEmailHashes: [fakeHash("a"), fakeHash("b")], // capped list
113
+ lastReportedAt: fresh,
114
+ },
115
+ ],
116
+ now,
117
+ );
118
+
119
+ expect(count).toBe(250_000);
120
+ });
121
+
122
+ it("ignores instances that stopped reporting", () => {
123
+ const count: number = EnterpriseLicenseUsageUtil.getUniqueUserCount(
124
+ [
125
+ {
126
+ userCount: 4,
127
+ userEmailHashes: [
128
+ fakeHash("a"),
129
+ fakeHash("b"),
130
+ fakeHash("c"),
131
+ fakeHash("d"),
132
+ ],
133
+ lastReportedAt: fresh,
134
+ },
135
+ {
136
+ userCount: 100,
137
+ userEmailHashes: [fakeHash("e")],
138
+ lastReportedAt: stale,
139
+ },
140
+ ],
141
+ now,
142
+ );
143
+
144
+ expect(count).toBe(4);
145
+ });
146
+
147
+ it("ignores instances that never reported", () => {
148
+ const count: number = EnterpriseLicenseUsageUtil.getUniqueUserCount(
149
+ [
150
+ {
151
+ userCount: undefined,
152
+ userEmailHashes: undefined,
153
+ lastReportedAt: undefined,
154
+ },
155
+ ],
156
+ now,
157
+ );
158
+
159
+ expect(count).toBe(0);
160
+ });
161
+
162
+ it("returns 0 for no instances", () => {
163
+ expect(EnterpriseLicenseUsageUtil.getUniqueUserCount([], now)).toBe(0);
164
+ });
165
+ });
@@ -37,11 +37,13 @@ enum EmailTemplateType {
37
37
  IncidentOwnerNotePosted = "IncidentOwnerNotePosted.hbs",
38
38
  IncidentOwnerResourceCreated = "IncidentOwnerResourceCreated.hbs",
39
39
  IncidentMemberAdded = "IncidentMemberAdded.hbs",
40
+ IncidentOwnerUnresolvedReminder = "IncidentOwnerUnresolvedReminder.hbs",
40
41
 
41
42
  AlertOwnerAdded = "AlertOwnerAdded.hbs",
42
43
  AlertOwnerStateChanged = "AlertOwnerStateChanged.hbs",
43
44
  AlertOwnerNotePosted = "AlertOwnerNotePosted.hbs",
44
45
  AlertOwnerResourceCreated = "AlertOwnerResourceCreated.hbs",
46
+ AlertOwnerUnresolvedReminder = "AlertOwnerUnresolvedReminder.hbs",
45
47
 
46
48
  AlertEpisodeOwnerAdded = "AlertEpisodeOwnerAdded.hbs",
47
49
  AlertEpisodeOwnerStateChanged = "AlertEpisodeOwnerStateChanged.hbs",
@@ -63,6 +65,7 @@ enum EmailTemplateType {
63
65
  ScheduledMaintenanceOwnerAdded = "ScheduledMaintenanceOwnerAdded.hbs",
64
66
  ScheduledMaintenanceOwnerStateChanged = "ScheduledMaintenanceOwnerStateChanged.hbs",
65
67
  ScheduledMaintenanceOwnerResourceCreated = "ScheduledMaintenanceOwnerResourceCreated.hbs",
68
+ ScheduledMaintenanceOwnerUnresolvedReminder = "ScheduledMaintenanceOwnerUnresolvedReminder.hbs",
66
69
  StatusPageOwnerResourceCreated = "StatusPageOwnerResourceCreated.hbs",
67
70
  StatusPageOwnerAdded = "StatusPageOwnerAdded.hbs",
68
71
  StatusPageOwnerAnnouncementPosted = "StatusPageOwnerAnnouncementPosted.hbs",
@@ -0,0 +1,18 @@
1
+ /*
2
+ * Summary of a self-hosted OneUptime instance that uses an enterprise
3
+ * license. Returned by the license server (oneuptime.com) on validate and
4
+ * report-user-count calls, stored in GlobalConfig on the customer's
5
+ * instances, and shown in the license modal.
6
+ *
7
+ * Kept as a `type` of plain primitives (not an interface) so it stays
8
+ * structurally compatible with JSONObject and safe to store in JSON columns.
9
+ */
10
+ type EnterpriseLicenseInstanceSummary = {
11
+ instanceId: string;
12
+ host: string | null;
13
+ userCount: number | null;
14
+ // ISO date string of the most recent usage report from this instance.
15
+ lastReportedAt: string | null;
16
+ };
17
+
18
+ export default EnterpriseLicenseInstanceSummary;
@@ -68,6 +68,7 @@ import MonitorStepCephMonitor, {
68
68
  import MonitorStepIoTMonitor, {
69
69
  MonitorStepIoTMonitorUtil,
70
70
  } from "./MonitorStepIoTMonitor";
71
+ import MetricsViewConfig from "../Metrics/MetricsViewConfig";
71
72
  import Zod, { ZodSchema } from "../../Utils/Schema/Zod";
72
73
 
73
74
  /*
@@ -305,6 +306,37 @@ export default class MonitorStep extends DatabaseProperty {
305
306
  return monitorStep;
306
307
  }
307
308
 
309
+ /**
310
+ * Telemetry monitor steps store their metric query configs under their
311
+ * own step shape (metricMonitor, iotMonitor, kubernetesMonitor, ...),
312
+ * yet all of them produce a MetricMonitorResponse whose result slots
313
+ * are ordered by these configs. Criteria evaluation must resolve
314
+ * metric aliases through whichever shape the step carries — reading
315
+ * only `metricMonitor` silently falls back to result slot 0 for every
316
+ * other telemetry monitor type.
317
+ */
318
+ public static getMetricsViewConfig(
319
+ monitorStep: MonitorStep | undefined,
320
+ ): MetricsViewConfig | undefined {
321
+ const data: MonitorStepType | undefined = monitorStep?.data;
322
+
323
+ if (!data) {
324
+ return undefined;
325
+ }
326
+
327
+ return (
328
+ data.metricMonitor?.metricViewConfig ||
329
+ data.iotMonitor?.metricViewConfig ||
330
+ data.kubernetesMonitor?.metricViewConfig ||
331
+ data.dockerMonitor?.metricViewConfig ||
332
+ data.dockerSwarmMonitor?.metricViewConfig ||
333
+ data.hostMonitor?.metricViewConfig ||
334
+ data.podmanMonitor?.metricViewConfig ||
335
+ data.proxmoxMonitor?.metricViewConfig ||
336
+ data.cephMonitor?.metricViewConfig
337
+ );
338
+ }
339
+
308
340
  public get id(): ObjectID {
309
341
  return new ObjectID(this.data?.id as string);
310
342
  }
@@ -5,6 +5,7 @@ enum NotificationSettingEventType {
5
5
  SEND_INCIDENT_STATE_CHANGED_OWNER_NOTIFICATION = "Send incident state changed notification when I am the owner of the incident",
6
6
  SEND_INCIDENT_OWNER_ADDED_NOTIFICATION = "Send notification when I am added as a owner to the incident",
7
7
  SEND_INCIDENT_MEMBER_ADDED_NOTIFICATION = "Send notification when I am assigned to an incident as a member",
8
+ SEND_INCIDENT_REMINDER_OWNER_NOTIFICATION = "Send reminder notification when an incident I own is still open",
8
9
 
9
10
  // Alerts
10
11
 
@@ -12,6 +13,7 @@ enum NotificationSettingEventType {
12
13
  SEND_ALERT_NOTE_POSTED_OWNER_NOTIFICATION = "Send alert note posted notification when I am the owner of the alert",
13
14
  SEND_ALERT_STATE_CHANGED_OWNER_NOTIFICATION = "Send alert state changed notification when I am the owner of the alert",
14
15
  SEND_ALERT_OWNER_ADDED_NOTIFICATION = "Send notification when I am added as a owner to the alert",
16
+ SEND_ALERT_REMINDER_OWNER_NOTIFICATION = "Send reminder notification when an alert I own is still open",
15
17
 
16
18
  // Alert Episodes
17
19
 
@@ -41,6 +43,7 @@ enum NotificationSettingEventType {
41
43
  SEND_SCHEDULED_MAINTENANCE_NOTE_POSTED_OWNER_NOTIFICATION = "Send event note posted notification when I am the owner of the event",
42
44
  SEND_SCHEDULED_MAINTENANCE_OWNER_ADDED_NOTIFICATION = "Send notification when I am added as a owner to the event",
43
45
  SEND_SCHEDULED_MAINTENANCE_STATE_CHANGED_OWNER_NOTIFICATION = "Send event state changed notification when I am the owner of the event",
46
+ SEND_SCHEDULED_MAINTENANCE_REMINDER_OWNER_NOTIFICATION = "Send reminder notification when a scheduled maintenance event I own is still not complete",
44
47
 
45
48
  // Status Page
46
49
  SEND_STATUS_PAGE_ANNOUNCEMENT_CREATED_OWNER_NOTIFICATION = "Send status page announcement created notification when I am the owner of the status page",
@@ -421,6 +421,12 @@ enum Permission {
421
421
  EditScheduledMaintenanceLabelRule = "EditScheduledMaintenanceLabelRule",
422
422
  ReadScheduledMaintenanceLabelRule = "ReadScheduledMaintenanceLabelRule",
423
423
 
424
+ // Scheduled Maintenance Reminder Rule Permissions
425
+ CreateScheduledMaintenanceReminderRule = "CreateScheduledMaintenanceReminderRule",
426
+ DeleteScheduledMaintenanceReminderRule = "DeleteScheduledMaintenanceReminderRule",
427
+ EditScheduledMaintenanceReminderRule = "EditScheduledMaintenanceReminderRule",
428
+ ReadScheduledMaintenanceReminderRule = "ReadScheduledMaintenanceReminderRule",
429
+
424
430
  CreateStatusPageOwnerTeam = "CreateStatusPageOwnerTeam",
425
431
  DeleteStatusPageOwnerTeam = "DeleteStatusPageOwnerTeam",
426
432
  EditStatusPageOwnerTeam = "EditStatusPageOwnerTeam",
@@ -1407,6 +1413,12 @@ enum Permission {
1407
1413
  EditAlertGroupingRule = "EditAlertGroupingRule",
1408
1414
  ReadAlertGroupingRule = "ReadAlertGroupingRule",
1409
1415
 
1416
+ // Alert Reminder Rule Permissions
1417
+ CreateAlertReminderRule = "CreateAlertReminderRule",
1418
+ DeleteAlertReminderRule = "DeleteAlertReminderRule",
1419
+ EditAlertReminderRule = "EditAlertReminderRule",
1420
+ ReadAlertReminderRule = "ReadAlertReminderRule",
1421
+
1410
1422
  // Alert On-Call Rule Permissions
1411
1423
  CreateAlertOnCallRule = "CreateAlertOnCallRule",
1412
1424
  DeleteAlertOnCallRule = "DeleteAlertOnCallRule",
@@ -1587,6 +1599,12 @@ enum Permission {
1587
1599
  EditIncidentSlaRule = "EditIncidentSlaRule",
1588
1600
  ReadIncidentSlaRule = "ReadIncidentSlaRule",
1589
1601
 
1602
+ // Incident Reminder Rule Permissions
1603
+ CreateIncidentReminderRule = "CreateIncidentReminderRule",
1604
+ DeleteIncidentReminderRule = "DeleteIncidentReminderRule",
1605
+ EditIncidentReminderRule = "EditIncidentReminderRule",
1606
+ ReadIncidentReminderRule = "ReadIncidentReminderRule",
1607
+
1590
1608
  // Incident SLA Permissions
1591
1609
  CreateIncidentSla = "CreateIncidentSla",
1592
1610
  DeleteIncidentSla = "DeleteIncidentSla",
@@ -11996,6 +12014,48 @@ export class PermissionHelper {
11996
12014
  group: PermissionGroup.ScheduledMaintenance,
11997
12015
  },
11998
12016
 
12017
+ // Scheduled Maintenance Reminder Rule Permissions
12018
+ {
12019
+ permission: Permission.CreateScheduledMaintenanceReminderRule,
12020
+ title: "Create Scheduled Maintenance Reminder Rule",
12021
+ description:
12022
+ "This permission can create Scheduled Maintenance Reminder Rules in this project.",
12023
+ isAssignableToTenant: true,
12024
+ isAccessControlPermission: false,
12025
+ isRolePermission: false,
12026
+ group: PermissionGroup.ScheduledMaintenance,
12027
+ },
12028
+ {
12029
+ permission: Permission.DeleteScheduledMaintenanceReminderRule,
12030
+ title: "Delete Scheduled Maintenance Reminder Rule",
12031
+ description:
12032
+ "This permission can delete Scheduled Maintenance Reminder Rules of this project.",
12033
+ isAssignableToTenant: true,
12034
+ isAccessControlPermission: false,
12035
+ isRolePermission: false,
12036
+ group: PermissionGroup.ScheduledMaintenance,
12037
+ },
12038
+ {
12039
+ permission: Permission.EditScheduledMaintenanceReminderRule,
12040
+ title: "Edit Scheduled Maintenance Reminder Rule",
12041
+ description:
12042
+ "This permission can edit Scheduled Maintenance Reminder Rules of this project.",
12043
+ isAssignableToTenant: true,
12044
+ isAccessControlPermission: false,
12045
+ isRolePermission: false,
12046
+ group: PermissionGroup.ScheduledMaintenance,
12047
+ },
12048
+ {
12049
+ permission: Permission.ReadScheduledMaintenanceReminderRule,
12050
+ title: "Read Scheduled Maintenance Reminder Rule",
12051
+ description:
12052
+ "This permission can read Scheduled Maintenance Reminder Rules of this project.",
12053
+ isAssignableToTenant: true,
12054
+ isAccessControlPermission: false,
12055
+ isRolePermission: false,
12056
+ group: PermissionGroup.ScheduledMaintenance,
12057
+ },
12058
+
11999
12059
  // Alert Episode Permissions
12000
12060
  {
12001
12061
  permission: Permission.CreateAlertEpisode,
@@ -12120,6 +12180,48 @@ export class PermissionHelper {
12120
12180
  group: PermissionGroup.Alert,
12121
12181
  },
12122
12182
 
12183
+ // Alert Reminder Rule Permissions
12184
+ {
12185
+ permission: Permission.CreateAlertReminderRule,
12186
+ title: "Create Alert Reminder Rule",
12187
+ description:
12188
+ "This permission can create Alert Reminder Rules in this project.",
12189
+ isAssignableToTenant: true,
12190
+ isAccessControlPermission: false,
12191
+ isRolePermission: false,
12192
+ group: PermissionGroup.Alert,
12193
+ },
12194
+ {
12195
+ permission: Permission.DeleteAlertReminderRule,
12196
+ title: "Delete Alert Reminder Rule",
12197
+ description:
12198
+ "This permission can delete Alert Reminder Rules of this project.",
12199
+ isAssignableToTenant: true,
12200
+ isAccessControlPermission: false,
12201
+ isRolePermission: false,
12202
+ group: PermissionGroup.Alert,
12203
+ },
12204
+ {
12205
+ permission: Permission.EditAlertReminderRule,
12206
+ title: "Edit Alert Reminder Rule",
12207
+ description:
12208
+ "This permission can edit Alert Reminder Rules of this project.",
12209
+ isAssignableToTenant: true,
12210
+ isAccessControlPermission: false,
12211
+ isRolePermission: false,
12212
+ group: PermissionGroup.Alert,
12213
+ },
12214
+ {
12215
+ permission: Permission.ReadAlertReminderRule,
12216
+ title: "Read Alert Reminder Rule",
12217
+ description:
12218
+ "This permission can read Alert Reminder Rules of this project.",
12219
+ isAssignableToTenant: true,
12220
+ isAccessControlPermission: false,
12221
+ isRolePermission: false,
12222
+ group: PermissionGroup.Alert,
12223
+ },
12224
+
12123
12225
  // Alert On-Call Rule Permissions
12124
12226
  {
12125
12227
  permission: Permission.CreateAlertOnCallRule,
@@ -13402,6 +13504,48 @@ export class PermissionHelper {
13402
13504
  group: PermissionGroup.Incident,
13403
13505
  },
13404
13506
 
13507
+ // Incident Reminder Rule Permissions
13508
+ {
13509
+ permission: Permission.CreateIncidentReminderRule,
13510
+ title: "Create Incident Reminder Rule",
13511
+ description:
13512
+ "This permission can create Incident Reminder Rules in this project.",
13513
+ isAssignableToTenant: true,
13514
+ isAccessControlPermission: false,
13515
+ isRolePermission: false,
13516
+ group: PermissionGroup.Incident,
13517
+ },
13518
+ {
13519
+ permission: Permission.DeleteIncidentReminderRule,
13520
+ title: "Delete Incident Reminder Rule",
13521
+ description:
13522
+ "This permission can delete Incident Reminder Rules of this project.",
13523
+ isAssignableToTenant: true,
13524
+ isAccessControlPermission: false,
13525
+ isRolePermission: false,
13526
+ group: PermissionGroup.Incident,
13527
+ },
13528
+ {
13529
+ permission: Permission.EditIncidentReminderRule,
13530
+ title: "Edit Incident Reminder Rule",
13531
+ description:
13532
+ "This permission can edit Incident Reminder Rules of this project.",
13533
+ isAssignableToTenant: true,
13534
+ isAccessControlPermission: false,
13535
+ isRolePermission: false,
13536
+ group: PermissionGroup.Incident,
13537
+ },
13538
+ {
13539
+ permission: Permission.ReadIncidentReminderRule,
13540
+ title: "Read Incident Reminder Rule",
13541
+ description:
13542
+ "This permission can read Incident Reminder Rules of this project.",
13543
+ isAssignableToTenant: true,
13544
+ isAccessControlPermission: false,
13545
+ isRolePermission: false,
13546
+ group: PermissionGroup.Incident,
13547
+ },
13548
+
13405
13549
  // Incident SLA Permissions
13406
13550
  {
13407
13551
  permission: Permission.CreateIncidentSla,
@@ -0,0 +1,6 @@
1
+ enum ReminderStopState {
2
+ Acknowledged = "Acknowledged",
3
+ Resolved = "Resolved",
4
+ }
5
+
6
+ export default ReminderStopState;
@@ -0,0 +1,6 @@
1
+ enum ScheduledMaintenanceReminderStopState {
2
+ Ongoing = "Ongoing",
3
+ Completed = "Completed",
4
+ }
5
+
6
+ export default ScheduledMaintenanceReminderStopState;
@@ -10,6 +10,8 @@ type TemplateIdsMap = {
10
10
  readonly IncidentStateChangedOwnerNotification: "oneuptime_incident_state_change_owner_notification";
11
11
  readonly IncidentOwnerAddedNotification: "oneuptime_incident_owner_added_notification";
12
12
  readonly IncidentMemberAddedNotification: "oneuptime_incident_member_added_notification";
13
+ readonly IncidentReminderOwnerNotification: "oneuptime_incident_reminder_owner_notification";
14
+ readonly AlertReminderOwnerNotification: "oneuptime_alert_reminder_owner_notification";
13
15
  readonly AlertCreatedOwnerNotification: "oneuptime_alert_created_owner_notification";
14
16
  readonly AlertNotePostedOwnerNotification: "oneuptime_alert_note_posted_owner_notification";
15
17
  readonly AlertStateChangedOwnerNotification: "oneuptime_alert_state_changed_owner_notification";
@@ -33,6 +35,7 @@ type TemplateIdsMap = {
33
35
  readonly ScheduledMaintenanceNotePostedOwnerNotification: "oneuptime_scheduled_maintenance_note_posted_owner_notification";
34
36
  readonly ScheduledMaintenanceOwnerAddedNotification: "oneuptime_scheduled_maintenance_owner_added_notification";
35
37
  readonly ScheduledMaintenanceStateChangedOwnerNotification: "oneuptime_scheduled_maintenance_state_changed_owner_notification";
38
+ readonly ScheduledMaintenanceReminderOwnerNotification: "oneuptime_scheduled_maintenance_reminder_owner_notification";
36
39
  readonly StatusPageAnnouncementCreatedOwnerNotification: "oneuptime_status_page_announcement_created_owner_notification";
37
40
  readonly StatusPageCreatedOwnerNotification: "oneuptime_status_page_created_owner_notification";
38
41
  readonly StatusPageOwnerAddedNotification: "oneuptime_status_page_owner_added_notification";
@@ -63,6 +66,9 @@ const templateIds: TemplateIdsMap = {
63
66
  IncidentOwnerAddedNotification: "oneuptime_incident_owner_added_notification",
64
67
  IncidentMemberAddedNotification:
65
68
  "oneuptime_incident_member_added_notification",
69
+ IncidentReminderOwnerNotification:
70
+ "oneuptime_incident_reminder_owner_notification",
71
+ AlertReminderOwnerNotification: "oneuptime_alert_reminder_owner_notification",
66
72
  AlertCreatedOwnerNotification: "oneuptime_alert_created_owner_notification",
67
73
  AlertNotePostedOwnerNotification:
68
74
  "oneuptime_alert_note_posted_owner_notification",
@@ -106,6 +112,8 @@ const templateIds: TemplateIdsMap = {
106
112
  "oneuptime_scheduled_maintenance_owner_added_notification",
107
113
  ScheduledMaintenanceStateChangedOwnerNotification:
108
114
  "oneuptime_scheduled_maintenance_state_changed_owner_notification",
115
+ ScheduledMaintenanceReminderOwnerNotification:
116
+ "oneuptime_scheduled_maintenance_reminder_owner_notification",
109
117
  StatusPageAnnouncementCreatedOwnerNotification:
110
118
  "oneuptime_status_page_announcement_created_owner_notification",
111
119
  StatusPageCreatedOwnerNotification:
@@ -154,6 +162,8 @@ export const WhatsAppTemplateMessages: WhatsAppTemplateMessagesDefinition = {
154
162
  [WhatsAppTemplateIds.IncidentStateChangedOwnerNotification]: `Incident #{{incident_number}} ({{incident_title}}) state changed to {{incident_state}}. Track the incident status using {{incident_link}} on the OneUptime dashboard for more context.`,
155
163
  [WhatsAppTemplateIds.IncidentOwnerAddedNotification]: `You have been added as an owner of incident #{{incident_number}} ({{incident_title}}). Manage the incident using {{incident_link}} on the OneUptime dashboard.`,
156
164
  [WhatsAppTemplateIds.IncidentMemberAddedNotification]: `You have been assigned as {{incident_role}} to incident #{{incident_number}} ({{incident_title}}). Manage the incident using {{incident_link}} on the OneUptime dashboard.`,
165
+ [WhatsAppTemplateIds.IncidentReminderOwnerNotification]: `Reminder: Incident #{{incident_number}} ({{incident_title}}) is still {{incident_state}} and has been open for {{elapsed_time}}. Review the incident using {{incident_link}} on the OneUptime dashboard.`,
166
+ [WhatsAppTemplateIds.AlertReminderOwnerNotification]: `Reminder: Alert #{{alert_number}} ({{alert_title}}) is still {{alert_state}} and has been open for {{elapsed_time}}. Review the alert using {{alert_link}} on the OneUptime dashboard.`,
157
167
  [WhatsAppTemplateIds.AlertCreatedOwnerNotification]: `Alert #{{alert_number}} ({{alert_title}}) has been created for project {{project_name}}. View alert details using {{alert_link}} on the OneUptime dashboard `,
158
168
  [WhatsAppTemplateIds.AlertNotePostedOwnerNotification]: `A new note was posted on alert #{{alert_number}} ({{alert_title}}). Review the alert using {{alert_link}} on the OneUptime dashboard for updates.`,
159
169
  [WhatsAppTemplateIds.AlertStateChangedOwnerNotification]: `Alert #{{alert_number}} ({{alert_title}}) state changed to {{alert_state}}. Track the alert status using {{alert_link}} on the OneUptime dashboard to stay informed.`,
@@ -177,6 +187,7 @@ export const WhatsAppTemplateMessages: WhatsAppTemplateMessagesDefinition = {
177
187
  [WhatsAppTemplateIds.ScheduledMaintenanceNotePostedOwnerNotification]: `A new note was posted on scheduled maintenance #{{event_number}} ({{event_title}}). Review the event using {{maintenance_link}} on the OneUptime dashboard for the latest updates.`,
178
188
  [WhatsAppTemplateIds.ScheduledMaintenanceOwnerAddedNotification]: `You have been added as an owner of scheduled maintenance #{{event_number}} ({{event_title}}). Please check the event using {{maintenance_link}} on the OneUptime dashboard.`,
179
189
  [WhatsAppTemplateIds.ScheduledMaintenanceStateChangedOwnerNotification]: `Scheduled maintenance #{{event_number}} ({{event_title}}) state changed to {{event_state}}. Track event status using {{maintenance_link}} on the OneUptime dashboard to stay aligned.`,
190
+ [WhatsAppTemplateIds.ScheduledMaintenanceReminderOwnerNotification]: `Reminder: Scheduled maintenance #{{event_number}} ({{event_title}}) is still {{event_state}} and has been open for {{elapsed_time}}. Review the event using {{event_link}} on the OneUptime dashboard.`,
180
191
  [WhatsAppTemplateIds.StatusPageAnnouncementCreatedOwnerNotification]: `Announcement {{announcement_title}} was published on status page {{status_page_name}}. View the announcement using {{status_page_link}} on the OneUptime dashboard `,
181
192
  [WhatsAppTemplateIds.StatusPageCreatedOwnerNotification]: `Status page {{status_page_name}} has been created. View status page details using {{status_page_link}} on the OneUptime dashboard for full context.`,
182
193
  [WhatsAppTemplateIds.StatusPageOwnerAddedNotification]: `You have been added as an owner of status page {{status_page_name}}. Manage the status page using {{status_page_link}} on the OneUptime dashboard to stay engaged.`,
@@ -203,6 +214,8 @@ export const WhatsAppTemplateLanguage: Record<WhatsAppTemplateId, string> = {
203
214
  [WhatsAppTemplateIds.IncidentStateChangedOwnerNotification]: "en",
204
215
  [WhatsAppTemplateIds.IncidentOwnerAddedNotification]: "en",
205
216
  [WhatsAppTemplateIds.IncidentMemberAddedNotification]: "en",
217
+ [WhatsAppTemplateIds.IncidentReminderOwnerNotification]: "en",
218
+ [WhatsAppTemplateIds.AlertReminderOwnerNotification]: "en",
206
219
  [WhatsAppTemplateIds.AlertCreatedOwnerNotification]: "en",
207
220
  [WhatsAppTemplateIds.AlertNotePostedOwnerNotification]: "en",
208
221
  [WhatsAppTemplateIds.AlertStateChangedOwnerNotification]: "en",
@@ -226,6 +239,7 @@ export const WhatsAppTemplateLanguage: Record<WhatsAppTemplateId, string> = {
226
239
  [WhatsAppTemplateIds.ScheduledMaintenanceNotePostedOwnerNotification]: "en",
227
240
  [WhatsAppTemplateIds.ScheduledMaintenanceOwnerAddedNotification]: "en",
228
241
  [WhatsAppTemplateIds.ScheduledMaintenanceStateChangedOwnerNotification]: "en",
242
+ [WhatsAppTemplateIds.ScheduledMaintenanceReminderOwnerNotification]: "en",
229
243
  [WhatsAppTemplateIds.StatusPageAnnouncementCreatedOwnerNotification]: "en",
230
244
  [WhatsAppTemplateIds.StatusPageCreatedOwnerNotification]: "en",
231
245
  [WhatsAppTemplateIds.StatusPageOwnerAddedNotification]: "en",