@oneuptime/common 10.0.65 → 10.0.67
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.
- package/Models/DatabaseModels/DockerHostOwnerTeam.ts +464 -0
- package/Models/DatabaseModels/DockerHostOwnerUser.ts +463 -0
- package/Models/DatabaseModels/GlobalConfig.ts +56 -0
- package/Models/DatabaseModels/Index.ts +28 -0
- package/Models/DatabaseModels/KubernetesClusterOwnerTeam.ts +464 -0
- package/Models/DatabaseModels/KubernetesClusterOwnerUser.ts +463 -0
- package/Models/DatabaseModels/KubernetesResource.ts +548 -0
- package/Models/DatabaseModels/MetricPipelineRule.ts +804 -0
- package/Models/DatabaseModels/MetricRecordingRule.ts +470 -0
- package/Models/DatabaseModels/Monitor.ts +2 -0
- package/Models/DatabaseModels/Project.ts +83 -0
- package/Models/DatabaseModels/Service.ts +79 -0
- package/Models/DatabaseModels/TelegramLog.ts +1025 -0
- package/Models/DatabaseModels/TraceDropFilter.ts +508 -0
- package/Models/DatabaseModels/TracePipeline.ts +436 -0
- package/Models/DatabaseModels/TracePipelineProcessor.ts +454 -0
- package/Models/DatabaseModels/TraceRecordingRule.ts +470 -0
- package/Models/DatabaseModels/TraceScrubRule.ts +546 -0
- package/Models/DatabaseModels/UserNotificationRule.ts +49 -0
- package/Models/DatabaseModels/UserNotificationSetting.ts +17 -0
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +48 -0
- package/Models/DatabaseModels/UserTelegram.ts +312 -0
- package/Server/API/KubernetesResourceAPI.ts +129 -0
- package/Server/API/UserTelegramAPI.ts +167 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1776504277320-MigrationName.ts +399 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1776505976155-AddTracePipelineTables.ts +205 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1776509413763-MigrationName.ts +335 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1776541018853-MigrationName.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1776544084793-MigrationName.ts +53 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1776761171349-MigrationName.ts +325 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -1
- package/Server/Services/DockerHostOwnerTeamService.ts +10 -0
- package/Server/Services/DockerHostOwnerUserService.ts +10 -0
- package/Server/Services/Index.ts +6 -0
- package/Server/Services/KubernetesClusterOwnerTeamService.ts +10 -0
- package/Server/Services/KubernetesClusterOwnerUserService.ts +10 -0
- package/Server/Services/KubernetesResourceService.ts +351 -0
- package/Server/Services/MetricPipelineRuleService.ts +10 -0
- package/Server/Services/MetricRecordingRuleService.ts +10 -0
- package/Server/Services/TelegramLogService.ts +15 -0
- package/Server/Services/TelegramService.ts +139 -0
- package/Server/Services/TraceDropFilterService.ts +10 -0
- package/Server/Services/TracePipelineProcessorService.ts +10 -0
- package/Server/Services/TracePipelineService.ts +10 -0
- package/Server/Services/TraceRecordingRuleService.ts +10 -0
- package/Server/Services/TraceScrubRuleService.ts +10 -0
- package/Server/Services/UserNotificationRuleService.ts +350 -1
- package/Server/Services/UserNotificationSettingService.ts +114 -0
- package/Server/Services/UserTelegramService.ts +140 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +71 -9
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +483 -75
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +379 -6
- package/Server/Utils/Monitor/MonitorResource.ts +29 -15
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -16
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +502 -0
- package/Tests/Types/Date.test.ts +158 -0
- package/Tests/Utils/MetricUnitUtil.test.ts +216 -0
- package/Tests/Utils/Metrics/MetricFormulaEvaluator.test.ts +269 -0
- package/Tests/Utils/Metrics/MetricResultUnitConverter.test.ts +231 -0
- package/Tests/Utils/RecordingRuleExpression.test.ts +177 -0
- package/Types/Date.ts +12 -3
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/Kubernetes/KubernetesInventoryExtractor.ts +327 -0
- package/Types/Kubernetes/KubernetesObjectParser.ts +1949 -0
- package/Types/Metrics/MetricDownsamplingRetentionDays.ts +49 -0
- package/Types/Metrics/MetricFormulaConfigData.ts +4 -0
- package/Types/Metrics/MetricPipelineRuleFilterCondition.ts +136 -0
- package/Types/Metrics/MetricPipelineRuleType.ts +27 -0
- package/Types/Metrics/RecordingRuleDefinition.ts +180 -0
- package/Types/Monitor/CriteriaFilter.ts +43 -0
- package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +70 -0
- package/Types/Permission.ts +531 -0
- package/Types/Telegram/TelegramMessage.ts +9 -0
- package/Types/TelegramStatus.ts +14 -0
- package/Types/Trace/TraceAggregationType.ts +17 -0
- package/Types/Trace/TraceDropFilterAction.ts +6 -0
- package/Types/Trace/TracePipelineProcessorType.ts +56 -0
- package/Types/Trace/TraceRecordingRuleDefinition.ts +218 -0
- package/Types/Trace/TraceScrubAction.ts +7 -0
- package/Types/Trace/TraceScrubField.ts +8 -0
- package/Types/Trace/TraceScrubPatternType.ts +10 -0
- package/UI/Components/CardSelect/CardSelect.tsx +9 -1
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +6 -10
- package/UI/Components/Forms/Fields/FormField.tsx +1 -0
- package/UI/Components/Forms/Types/Field.ts +1 -0
- package/UI/Components/Icon/Icon.tsx +15 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +57 -0
- package/UI/Components/Page/Page.tsx +6 -0
- package/Utils/MetricUnitUtil.ts +289 -0
- package/Utils/Metrics/MetricFormulaEvaluator.ts +610 -0
- package/Utils/Metrics/MetricResultUnitConverter.ts +91 -0
- package/Utils/Metrics/RecordingRuleExpression.ts +359 -0
- package/Utils/ValueFormatter.ts +137 -13
- package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js +480 -0
- package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js +479 -0
- package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +59 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +28 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js +480 -0
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js +479 -0
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/KubernetesResource.js +590 -0
- package/build/dist/Models/DatabaseModels/KubernetesResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MetricPipelineRule.js +836 -0
- package/build/dist/Models/DatabaseModels/MetricPipelineRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MetricRecordingRule.js +497 -0
- package/build/dist/Models/DatabaseModels/MetricRecordingRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Monitor.js +2 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +85 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Service.js +79 -0
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelegramLog.js +1056 -0
- package/build/dist/Models/DatabaseModels/TelegramLog.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js +536 -0
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TracePipeline.js +462 -0
- package/build/dist/Models/DatabaseModels/TracePipeline.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TracePipelineProcessor.js +476 -0
- package/build/dist/Models/DatabaseModels/TracePipelineProcessor.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TraceRecordingRule.js +497 -0
- package/build/dist/Models/DatabaseModels/TraceRecordingRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TraceScrubRule.js +575 -0
- package/build/dist/Models/DatabaseModels/TraceScrubRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationRule.js +49 -0
- package/build/dist/Models/DatabaseModels/UserNotificationRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationSetting.js +19 -0
- package/build/dist/Models/DatabaseModels/UserNotificationSetting.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +48 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTelegram.js +331 -0
- package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -0
- package/build/dist/Server/API/KubernetesResourceAPI.js +98 -0
- package/build/dist/Server/API/KubernetesResourceAPI.js.map +1 -0
- package/build/dist/Server/API/UserTelegramAPI.js +99 -0
- package/build/dist/Server/API/UserTelegramAPI.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776504277320-MigrationName.js +144 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776504277320-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776505976155-AddTracePipelineTables.js +82 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776505976155-AddTracePipelineTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776509413763-MigrationName.js +118 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776509413763-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776541018853-MigrationName.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776541018853-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776544084793-MigrationName.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776544084793-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776761171349-MigrationName.js +116 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776761171349-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/DockerHostOwnerUserService.js +9 -0
- package/build/dist/Server/Services/DockerHostOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/Index.js +6 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js +9 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesResourceService.js +237 -0
- package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -0
- package/build/dist/Server/Services/MetricPipelineRuleService.js +9 -0
- package/build/dist/Server/Services/MetricPipelineRuleService.js.map +1 -0
- package/build/dist/Server/Services/MetricRecordingRuleService.js +9 -0
- package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -0
- package/build/dist/Server/Services/TelegramLogService.js +13 -0
- package/build/dist/Server/Services/TelegramLogService.js.map +1 -0
- package/build/dist/Server/Services/TelegramService.js +100 -0
- package/build/dist/Server/Services/TelegramService.js.map +1 -0
- package/build/dist/Server/Services/TraceDropFilterService.js +9 -0
- package/build/dist/Server/Services/TraceDropFilterService.js.map +1 -0
- package/build/dist/Server/Services/TracePipelineProcessorService.js +9 -0
- package/build/dist/Server/Services/TracePipelineProcessorService.js.map +1 -0
- package/build/dist/Server/Services/TracePipelineService.js +9 -0
- package/build/dist/Server/Services/TracePipelineService.js.map +1 -0
- package/build/dist/Server/Services/TraceRecordingRuleService.js +9 -0
- package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -0
- package/build/dist/Server/Services/TraceScrubRuleService.js +9 -0
- package/build/dist/Server/Services/TraceScrubRuleService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js +272 -21
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +94 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserTelegramService.js +133 -0
- package/build/dist/Server/Services/UserTelegramService.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +56 -9
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +335 -53
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +277 -5
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +25 -12
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +24 -12
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.js +407 -0
- package/build/dist/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.js.map +1 -0
- package/build/dist/Tests/Types/Date.test.js +96 -0
- package/build/dist/Tests/Types/Date.test.js.map +1 -1
- package/build/dist/Tests/Utils/MetricUnitUtil.test.js +159 -0
- package/build/dist/Tests/Utils/MetricUnitUtil.test.js.map +1 -0
- package/build/dist/Tests/Utils/Metrics/MetricFormulaEvaluator.test.js +224 -0
- package/build/dist/Tests/Utils/Metrics/MetricFormulaEvaluator.test.js.map +1 -0
- package/build/dist/Tests/Utils/Metrics/MetricResultUnitConverter.test.js +180 -0
- package/build/dist/Tests/Utils/Metrics/MetricResultUnitConverter.test.js.map +1 -0
- package/build/dist/Tests/Utils/RecordingRuleExpression.test.js +142 -0
- package/build/dist/Tests/Utils/RecordingRuleExpression.test.js.map +1 -0
- package/build/dist/Types/Date.js +9 -3
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesInventoryExtractor.js +200 -0
- package/build/dist/Types/Kubernetes/KubernetesInventoryExtractor.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesObjectParser.js +1205 -0
- package/build/dist/Types/Kubernetes/KubernetesObjectParser.js.map +1 -0
- package/build/dist/Types/Metrics/MetricDownsamplingRetentionDays.js +32 -0
- package/build/dist/Types/Metrics/MetricDownsamplingRetentionDays.js.map +1 -0
- package/build/dist/Types/Metrics/MetricPipelineRuleFilterCondition.js +103 -0
- package/build/dist/Types/Metrics/MetricPipelineRuleFilterCondition.js.map +1 -0
- package/build/dist/Types/Metrics/MetricPipelineRuleType.js +27 -0
- package/build/dist/Types/Metrics/MetricPipelineRuleType.js.map +1 -0
- package/build/dist/Types/Metrics/RecordingRuleDefinition.js +110 -0
- package/build/dist/Types/Metrics/RecordingRuleDefinition.js.map +1 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js +22 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MetricMonitor/MetricCriteriaContext.js +2 -0
- package/build/dist/Types/Monitor/MetricMonitor/MetricCriteriaContext.js.map +1 -0
- package/build/dist/Types/Permission.js +464 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telegram/TelegramMessage.js +2 -0
- package/build/dist/Types/Telegram/TelegramMessage.js.map +1 -0
- package/build/dist/Types/TelegramStatus.js +15 -0
- package/build/dist/Types/TelegramStatus.js.map +1 -0
- package/build/dist/Types/Trace/TraceAggregationType.js +18 -0
- package/build/dist/Types/Trace/TraceAggregationType.js.map +1 -0
- package/build/dist/Types/Trace/TraceDropFilterAction.js +7 -0
- package/build/dist/Types/Trace/TraceDropFilterAction.js.map +1 -0
- package/build/dist/Types/Trace/TracePipelineProcessorType.js +10 -0
- package/build/dist/Types/Trace/TracePipelineProcessorType.js.map +1 -0
- package/build/dist/Types/Trace/TraceRecordingRuleDefinition.js +145 -0
- package/build/dist/Types/Trace/TraceRecordingRuleDefinition.js.map +1 -0
- package/build/dist/Types/Trace/TraceScrubAction.js +8 -0
- package/build/dist/Types/Trace/TraceScrubAction.js.map +1 -0
- package/build/dist/Types/Trace/TraceScrubField.js +9 -0
- package/build/dist/Types/Trace/TraceScrubField.js.map +1 -0
- package/build/dist/Types/Trace/TraceScrubPatternType.js +11 -0
- package/build/dist/Types/Trace/TraceScrubPatternType.js.map +1 -0
- package/build/dist/UI/Components/CardSelect/CardSelect.js +3 -1
- package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -9
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +5 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +30 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Page/Page.js +1 -0
- package/build/dist/UI/Components/Page/Page.js.map +1 -1
- package/build/dist/Utils/MetricUnitUtil.js +232 -0
- package/build/dist/Utils/MetricUnitUtil.js.map +1 -0
- package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js +453 -0
- package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js.map +1 -0
- package/build/dist/Utils/Metrics/MetricResultUnitConverter.js +61 -0
- package/build/dist/Utils/Metrics/MetricResultUnitConverter.js.map +1 -0
- package/build/dist/Utils/Metrics/RecordingRuleExpression.js +298 -0
- package/build/dist/Utils/Metrics/RecordingRuleExpression.js.map +1 -0
- package/build/dist/Utils/ValueFormatter.js +123 -13
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/package.json +2 -2
|
@@ -9,6 +9,7 @@ import IncidentSeverityService from "./IncidentSeverityService";
|
|
|
9
9
|
import MailService from "./MailService";
|
|
10
10
|
import ShortLinkService from "./ShortLinkService";
|
|
11
11
|
import SmsService from "./SmsService";
|
|
12
|
+
import TelegramService from "./TelegramService";
|
|
12
13
|
import WhatsAppService from "./WhatsAppService";
|
|
13
14
|
import UserEmailService from "./UserEmailService";
|
|
14
15
|
import UserOnCallLogService from "./UserOnCallLogService";
|
|
@@ -32,6 +33,7 @@ import ObjectID from "../../Types/ObjectID";
|
|
|
32
33
|
import PushDeviceType from "../../Types/PushNotification/PushDeviceType";
|
|
33
34
|
import Phone from "../../Types/Phone";
|
|
34
35
|
import SMS from "../../Types/SMS/SMS";
|
|
36
|
+
import TelegramMessage from "../../Types/Telegram/TelegramMessage";
|
|
35
37
|
import WhatsAppMessage from "../../Types/WhatsApp/WhatsAppMessage";
|
|
36
38
|
import {
|
|
37
39
|
renderWhatsAppTemplate,
|
|
@@ -74,6 +76,7 @@ export interface NotificationMethodDescriptor {
|
|
|
74
76
|
userSmsId?: ObjectID;
|
|
75
77
|
userCallId?: ObjectID;
|
|
76
78
|
userWhatsAppId?: ObjectID;
|
|
79
|
+
userTelegramId?: ObjectID;
|
|
77
80
|
userPushId?: ObjectID;
|
|
78
81
|
}
|
|
79
82
|
|
|
@@ -165,6 +168,11 @@ export class Service extends DatabaseService<Model> {
|
|
|
165
168
|
phone: true,
|
|
166
169
|
isVerified: true,
|
|
167
170
|
},
|
|
171
|
+
userTelegram: {
|
|
172
|
+
telegramChatId: true,
|
|
173
|
+
telegramUserHandle: true,
|
|
174
|
+
isVerified: true,
|
|
175
|
+
},
|
|
168
176
|
userEmail: {
|
|
169
177
|
email: true,
|
|
170
178
|
isVerified: true,
|
|
@@ -896,6 +904,184 @@ export class Service extends DatabaseService<Model> {
|
|
|
896
904
|
});
|
|
897
905
|
}
|
|
898
906
|
|
|
907
|
+
// send Telegram.
|
|
908
|
+
if (
|
|
909
|
+
notificationRuleItem.userTelegram?.telegramChatId &&
|
|
910
|
+
notificationRuleItem.userTelegram?.isVerified
|
|
911
|
+
) {
|
|
912
|
+
if (
|
|
913
|
+
options.userNotificationEventType ===
|
|
914
|
+
UserNotificationEventType.AlertCreated &&
|
|
915
|
+
alert
|
|
916
|
+
) {
|
|
917
|
+
logTimelineItem.status = UserNotificationStatus.Sending;
|
|
918
|
+
logTimelineItem.statusMessage = `Sending Telegram message.`;
|
|
919
|
+
logTimelineItem.userTelegramId = notificationRuleItem.userTelegram.id!;
|
|
920
|
+
|
|
921
|
+
const updatedLog: UserOnCallLogTimeline =
|
|
922
|
+
await UserOnCallLogTimelineService.create({
|
|
923
|
+
data: logTimelineItem,
|
|
924
|
+
props: {
|
|
925
|
+
isRoot: true,
|
|
926
|
+
},
|
|
927
|
+
});
|
|
928
|
+
|
|
929
|
+
const telegramMessage: TelegramMessage = {
|
|
930
|
+
to: notificationRuleItem.userTelegram.telegramChatId,
|
|
931
|
+
body: await this.generateTelegramBodyForAlertCreated(
|
|
932
|
+
alert,
|
|
933
|
+
updatedLog.id!,
|
|
934
|
+
),
|
|
935
|
+
parseMode: "HTML",
|
|
936
|
+
disableWebPagePreview: true,
|
|
937
|
+
};
|
|
938
|
+
|
|
939
|
+
TelegramService.sendTelegramMessage(telegramMessage, {
|
|
940
|
+
projectId: alert.projectId,
|
|
941
|
+
alertId: alert.id!,
|
|
942
|
+
userOnCallLogTimelineId: updatedLog.id!,
|
|
943
|
+
userId: notificationRuleItem.userId!,
|
|
944
|
+
onCallPolicyId: options.onCallPolicyId,
|
|
945
|
+
onCallPolicyEscalationRuleId: options.onCallPolicyEscalationRuleId,
|
|
946
|
+
teamId: options.userBelongsToTeamId,
|
|
947
|
+
onCallDutyPolicyExecutionLogTimelineId:
|
|
948
|
+
options.onCallDutyPolicyExecutionLogTimelineId,
|
|
949
|
+
onCallScheduleId: options.onCallScheduleId,
|
|
950
|
+
}).catch(async (err: Error) => {
|
|
951
|
+
await UserOnCallLogTimelineService.updateOneById({
|
|
952
|
+
id: updatedLog.id!,
|
|
953
|
+
data: {
|
|
954
|
+
status: UserNotificationStatus.Error,
|
|
955
|
+
statusMessage: err.message || "Error sending Telegram message.",
|
|
956
|
+
},
|
|
957
|
+
props: {
|
|
958
|
+
isRoot: true,
|
|
959
|
+
},
|
|
960
|
+
});
|
|
961
|
+
});
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
if (
|
|
965
|
+
options.userNotificationEventType ===
|
|
966
|
+
UserNotificationEventType.IncidentCreated &&
|
|
967
|
+
incident
|
|
968
|
+
) {
|
|
969
|
+
logTimelineItem.status = UserNotificationStatus.Sending;
|
|
970
|
+
logTimelineItem.statusMessage = `Sending Telegram message.`;
|
|
971
|
+
logTimelineItem.userTelegramId = notificationRuleItem.userTelegram.id!;
|
|
972
|
+
|
|
973
|
+
const updatedLog: UserOnCallLogTimeline =
|
|
974
|
+
await UserOnCallLogTimelineService.create({
|
|
975
|
+
data: logTimelineItem,
|
|
976
|
+
props: {
|
|
977
|
+
isRoot: true,
|
|
978
|
+
},
|
|
979
|
+
});
|
|
980
|
+
|
|
981
|
+
const telegramMessage: TelegramMessage = {
|
|
982
|
+
to: notificationRuleItem.userTelegram.telegramChatId,
|
|
983
|
+
body: await this.generateTelegramBodyForIncidentCreated(
|
|
984
|
+
incident,
|
|
985
|
+
updatedLog.id!,
|
|
986
|
+
),
|
|
987
|
+
parseMode: "HTML",
|
|
988
|
+
disableWebPagePreview: true,
|
|
989
|
+
};
|
|
990
|
+
|
|
991
|
+
TelegramService.sendTelegramMessage(telegramMessage, {
|
|
992
|
+
projectId: incident.projectId,
|
|
993
|
+
incidentId: incident.id!,
|
|
994
|
+
userOnCallLogTimelineId: updatedLog.id!,
|
|
995
|
+
userId: notificationRuleItem.userId!,
|
|
996
|
+
onCallPolicyId: options.onCallPolicyId,
|
|
997
|
+
onCallPolicyEscalationRuleId: options.onCallPolicyEscalationRuleId,
|
|
998
|
+
teamId: options.userBelongsToTeamId,
|
|
999
|
+
onCallDutyPolicyExecutionLogTimelineId:
|
|
1000
|
+
options.onCallDutyPolicyExecutionLogTimelineId,
|
|
1001
|
+
onCallScheduleId: options.onCallScheduleId,
|
|
1002
|
+
}).catch(async (err: Error) => {
|
|
1003
|
+
await UserOnCallLogTimelineService.updateOneById({
|
|
1004
|
+
id: updatedLog.id!,
|
|
1005
|
+
data: {
|
|
1006
|
+
status: UserNotificationStatus.Error,
|
|
1007
|
+
statusMessage: err.message || "Error sending Telegram message.",
|
|
1008
|
+
},
|
|
1009
|
+
props: {
|
|
1010
|
+
isRoot: true,
|
|
1011
|
+
},
|
|
1012
|
+
});
|
|
1013
|
+
});
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
if (
|
|
1017
|
+
options.userNotificationEventType ===
|
|
1018
|
+
UserNotificationEventType.AlertEpisodeCreated &&
|
|
1019
|
+
alertEpisode
|
|
1020
|
+
) {
|
|
1021
|
+
logTimelineItem.status = UserNotificationStatus.Sending;
|
|
1022
|
+
logTimelineItem.statusMessage = `Sending Telegram message.`;
|
|
1023
|
+
logTimelineItem.userTelegramId = notificationRuleItem.userTelegram.id!;
|
|
1024
|
+
|
|
1025
|
+
const updatedLog: UserOnCallLogTimeline =
|
|
1026
|
+
await UserOnCallLogTimelineService.create({
|
|
1027
|
+
data: logTimelineItem,
|
|
1028
|
+
props: {
|
|
1029
|
+
isRoot: true,
|
|
1030
|
+
},
|
|
1031
|
+
});
|
|
1032
|
+
|
|
1033
|
+
const telegramMessage: TelegramMessage = {
|
|
1034
|
+
to: notificationRuleItem.userTelegram.telegramChatId,
|
|
1035
|
+
body: await this.generateTelegramBodyForAlertEpisodeCreated(
|
|
1036
|
+
alertEpisode,
|
|
1037
|
+
updatedLog.id!,
|
|
1038
|
+
),
|
|
1039
|
+
parseMode: "HTML",
|
|
1040
|
+
disableWebPagePreview: true,
|
|
1041
|
+
};
|
|
1042
|
+
|
|
1043
|
+
TelegramService.sendTelegramMessage(telegramMessage, {
|
|
1044
|
+
projectId: alertEpisode.projectId,
|
|
1045
|
+
alertEpisodeId: alertEpisode.id!,
|
|
1046
|
+
userOnCallLogTimelineId: updatedLog.id!,
|
|
1047
|
+
userId: notificationRuleItem.userId!,
|
|
1048
|
+
onCallPolicyId: options.onCallPolicyId,
|
|
1049
|
+
onCallPolicyEscalationRuleId: options.onCallPolicyEscalationRuleId,
|
|
1050
|
+
teamId: options.userBelongsToTeamId,
|
|
1051
|
+
onCallDutyPolicyExecutionLogTimelineId:
|
|
1052
|
+
options.onCallDutyPolicyExecutionLogTimelineId,
|
|
1053
|
+
onCallScheduleId: options.onCallScheduleId,
|
|
1054
|
+
}).catch(async (err: Error) => {
|
|
1055
|
+
await UserOnCallLogTimelineService.updateOneById({
|
|
1056
|
+
id: updatedLog.id!,
|
|
1057
|
+
data: {
|
|
1058
|
+
status: UserNotificationStatus.Error,
|
|
1059
|
+
statusMessage: err.message || "Error sending Telegram message.",
|
|
1060
|
+
},
|
|
1061
|
+
props: {
|
|
1062
|
+
isRoot: true,
|
|
1063
|
+
},
|
|
1064
|
+
});
|
|
1065
|
+
});
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
if (
|
|
1070
|
+
notificationRuleItem.userTelegram &&
|
|
1071
|
+
!notificationRuleItem.userTelegram?.isVerified
|
|
1072
|
+
) {
|
|
1073
|
+
logTimelineItem.status = UserNotificationStatus.Error;
|
|
1074
|
+
logTimelineItem.statusMessage = `Telegram message not sent because the Telegram account is not verified.`;
|
|
1075
|
+
logTimelineItem.userTelegramId = notificationRuleItem.userTelegram.id!;
|
|
1076
|
+
|
|
1077
|
+
await UserOnCallLogTimelineService.create({
|
|
1078
|
+
data: logTimelineItem,
|
|
1079
|
+
props: {
|
|
1080
|
+
isRoot: true,
|
|
1081
|
+
},
|
|
1082
|
+
});
|
|
1083
|
+
}
|
|
1084
|
+
|
|
899
1085
|
// send call.
|
|
900
1086
|
if (
|
|
901
1087
|
notificationRuleItem.userCall?.phone &&
|
|
@@ -1680,6 +1866,161 @@ export class Service extends DatabaseService<Model> {
|
|
|
1680
1866
|
return sms;
|
|
1681
1867
|
}
|
|
1682
1868
|
|
|
1869
|
+
private async buildOnCallAcknowledgeShortUrl(
|
|
1870
|
+
userOnCallLogTimelineId: ObjectID,
|
|
1871
|
+
): Promise<URL> {
|
|
1872
|
+
const host: Hostname = await DatabaseConfig.getHost();
|
|
1873
|
+
const httpProtocol: Protocol = await DatabaseConfig.getHttpProtocol();
|
|
1874
|
+
|
|
1875
|
+
const shortUrl: ShortLink = await ShortLinkService.saveShortLinkFor(
|
|
1876
|
+
new URL(
|
|
1877
|
+
httpProtocol,
|
|
1878
|
+
host,
|
|
1879
|
+
new Route(AppApiRoute.toString())
|
|
1880
|
+
.addRoute(new UserOnCallLogTimeline().crudApiPath!)
|
|
1881
|
+
.addRoute("/acknowledge-page/" + userOnCallLogTimelineId.toString()),
|
|
1882
|
+
),
|
|
1883
|
+
);
|
|
1884
|
+
return await ShortLinkService.getShortenedUrl(shortUrl);
|
|
1885
|
+
}
|
|
1886
|
+
|
|
1887
|
+
/*
|
|
1888
|
+
* Telegram's HTML parse_mode supports <b>, <i>, <a>, <code>. Only <, >, and &
|
|
1889
|
+
* need escaping inside those tags' text content.
|
|
1890
|
+
*/
|
|
1891
|
+
private escapeTelegramHtml(value: string): string {
|
|
1892
|
+
return value
|
|
1893
|
+
.replace(/&/g, "&")
|
|
1894
|
+
.replace(/</g, "<")
|
|
1895
|
+
.replace(/>/g, ">");
|
|
1896
|
+
}
|
|
1897
|
+
|
|
1898
|
+
@CaptureSpan()
|
|
1899
|
+
public async generateTelegramBodyForAlertCreated(
|
|
1900
|
+
alert: Alert,
|
|
1901
|
+
userOnCallLogTimelineId: ObjectID,
|
|
1902
|
+
): Promise<string> {
|
|
1903
|
+
const ackUrl: URL = await this.buildOnCallAcknowledgeShortUrl(
|
|
1904
|
+
userOnCallLogTimelineId,
|
|
1905
|
+
);
|
|
1906
|
+
|
|
1907
|
+
const alertIdentifier: string =
|
|
1908
|
+
alert.alertNumber !== undefined
|
|
1909
|
+
? `${alert.alertNumberWithPrefix || "#" + alert.alertNumber} — ${alert.title || "Alert"}`
|
|
1910
|
+
: alert.title || "Alert";
|
|
1911
|
+
|
|
1912
|
+
const lines: Array<string> = [
|
|
1913
|
+
"🚨 <b>New alert assigned to you</b>",
|
|
1914
|
+
"",
|
|
1915
|
+
`📋 <b>${this.escapeTelegramHtml(alertIdentifier)}</b>`,
|
|
1916
|
+
"",
|
|
1917
|
+
"👤 You're getting this because you're on call.",
|
|
1918
|
+
];
|
|
1919
|
+
|
|
1920
|
+
if (alert.projectId && alert.id) {
|
|
1921
|
+
const dashboardUrl: URL = await AlertService.getAlertLinkInDashboard(
|
|
1922
|
+
alert.projectId,
|
|
1923
|
+
alert.id,
|
|
1924
|
+
);
|
|
1925
|
+
lines.push(
|
|
1926
|
+
"",
|
|
1927
|
+
`🔎 <a href="${this.escapeTelegramHtml(dashboardUrl.toString())}">View alert in OneUptime</a>`,
|
|
1928
|
+
);
|
|
1929
|
+
}
|
|
1930
|
+
|
|
1931
|
+
lines.push(
|
|
1932
|
+
"",
|
|
1933
|
+
`✅ <a href="${this.escapeTelegramHtml(ackUrl.toString())}">Tap to acknowledge</a>`,
|
|
1934
|
+
);
|
|
1935
|
+
|
|
1936
|
+
return lines.join("\n");
|
|
1937
|
+
}
|
|
1938
|
+
|
|
1939
|
+
@CaptureSpan()
|
|
1940
|
+
public async generateTelegramBodyForIncidentCreated(
|
|
1941
|
+
incident: Incident,
|
|
1942
|
+
userOnCallLogTimelineId: ObjectID,
|
|
1943
|
+
): Promise<string> {
|
|
1944
|
+
const ackUrl: URL = await this.buildOnCallAcknowledgeShortUrl(
|
|
1945
|
+
userOnCallLogTimelineId,
|
|
1946
|
+
);
|
|
1947
|
+
|
|
1948
|
+
const incidentIdentifier: string =
|
|
1949
|
+
incident.incidentNumber !== undefined
|
|
1950
|
+
? `${incident.incidentNumberWithPrefix || "#" + incident.incidentNumber} — ${incident.title || "Incident"}`
|
|
1951
|
+
: incident.title || "Incident";
|
|
1952
|
+
|
|
1953
|
+
const lines: Array<string> = [
|
|
1954
|
+
"🔥 <b>New incident assigned to you</b>",
|
|
1955
|
+
"",
|
|
1956
|
+
`📋 <b>${this.escapeTelegramHtml(incidentIdentifier)}</b>`,
|
|
1957
|
+
"",
|
|
1958
|
+
"👤 You're getting this because you're on call.",
|
|
1959
|
+
];
|
|
1960
|
+
|
|
1961
|
+
if (incident.projectId && incident.id) {
|
|
1962
|
+
const dashboardUrl: URL =
|
|
1963
|
+
await IncidentService.getIncidentLinkInDashboard(
|
|
1964
|
+
incident.projectId,
|
|
1965
|
+
incident.id,
|
|
1966
|
+
);
|
|
1967
|
+
lines.push(
|
|
1968
|
+
"",
|
|
1969
|
+
`🔎 <a href="${this.escapeTelegramHtml(dashboardUrl.toString())}">View incident in OneUptime</a>`,
|
|
1970
|
+
);
|
|
1971
|
+
}
|
|
1972
|
+
|
|
1973
|
+
lines.push(
|
|
1974
|
+
"",
|
|
1975
|
+
`✅ <a href="${this.escapeTelegramHtml(ackUrl.toString())}">Tap to acknowledge</a>`,
|
|
1976
|
+
);
|
|
1977
|
+
|
|
1978
|
+
return lines.join("\n");
|
|
1979
|
+
}
|
|
1980
|
+
|
|
1981
|
+
@CaptureSpan()
|
|
1982
|
+
public async generateTelegramBodyForAlertEpisodeCreated(
|
|
1983
|
+
alertEpisode: AlertEpisode,
|
|
1984
|
+
userOnCallLogTimelineId: ObjectID,
|
|
1985
|
+
): Promise<string> {
|
|
1986
|
+
const ackUrl: URL = await this.buildOnCallAcknowledgeShortUrl(
|
|
1987
|
+
userOnCallLogTimelineId,
|
|
1988
|
+
);
|
|
1989
|
+
|
|
1990
|
+
const episodeIdentifier: string = alertEpisode.episodeNumberWithPrefix
|
|
1991
|
+
? `${alertEpisode.episodeNumberWithPrefix} — ${alertEpisode.title || "Alert Episode"}`
|
|
1992
|
+
: alertEpisode.episodeNumber !== undefined
|
|
1993
|
+
? `#${alertEpisode.episodeNumber} — ${alertEpisode.title || "Alert Episode"}`
|
|
1994
|
+
: alertEpisode.title || "Alert Episode";
|
|
1995
|
+
|
|
1996
|
+
const lines: Array<string> = [
|
|
1997
|
+
"🔔 <b>New alert episode assigned to you</b>",
|
|
1998
|
+
"",
|
|
1999
|
+
`📋 <b>${this.escapeTelegramHtml(episodeIdentifier)}</b>`,
|
|
2000
|
+
"",
|
|
2001
|
+
"👤 You're getting this because you're on call.",
|
|
2002
|
+
];
|
|
2003
|
+
|
|
2004
|
+
if (alertEpisode.projectId && alertEpisode.id) {
|
|
2005
|
+
const dashboardUrl: URL =
|
|
2006
|
+
await AlertEpisodeService.getEpisodeLinkInDashboard(
|
|
2007
|
+
alertEpisode.projectId,
|
|
2008
|
+
alertEpisode.id,
|
|
2009
|
+
);
|
|
2010
|
+
lines.push(
|
|
2011
|
+
"",
|
|
2012
|
+
`🔎 <a href="${this.escapeTelegramHtml(dashboardUrl.toString())}">View alert episode in OneUptime</a>`,
|
|
2013
|
+
);
|
|
2014
|
+
}
|
|
2015
|
+
|
|
2016
|
+
lines.push(
|
|
2017
|
+
"",
|
|
2018
|
+
`✅ <a href="${this.escapeTelegramHtml(ackUrl.toString())}">Tap to acknowledge</a>`,
|
|
2019
|
+
);
|
|
2020
|
+
|
|
2021
|
+
return lines.join("\n");
|
|
2022
|
+
}
|
|
2023
|
+
|
|
1683
2024
|
@CaptureSpan()
|
|
1684
2025
|
public async generateWhatsAppTemplateForAlertCreated(
|
|
1685
2026
|
to: Phone,
|
|
@@ -2288,12 +2629,14 @@ export class Service extends DatabaseService<Model> {
|
|
|
2288
2629
|
!createBy.data.userSmsId &&
|
|
2289
2630
|
!createBy.data.userWhatsApp &&
|
|
2290
2631
|
!createBy.data.userWhatsAppId &&
|
|
2632
|
+
!createBy.data.userTelegram &&
|
|
2633
|
+
!createBy.data.userTelegramId &&
|
|
2291
2634
|
!createBy.data.userEmailId &&
|
|
2292
2635
|
!createBy.data.userPushId &&
|
|
2293
2636
|
!createBy.data.userPush
|
|
2294
2637
|
) {
|
|
2295
2638
|
throw new BadDataException(
|
|
2296
|
-
"Call, SMS, WhatsApp, Email, or Push notification is required",
|
|
2639
|
+
"Call, SMS, WhatsApp, Telegram, Email, or Push notification is required",
|
|
2297
2640
|
);
|
|
2298
2641
|
}
|
|
2299
2642
|
|
|
@@ -2355,6 +2698,9 @@ export class Service extends DatabaseService<Model> {
|
|
|
2355
2698
|
if (descriptor.userWhatsAppId) {
|
|
2356
2699
|
rule.userWhatsAppId = descriptor.userWhatsAppId;
|
|
2357
2700
|
}
|
|
2701
|
+
if (descriptor.userTelegramId) {
|
|
2702
|
+
rule.userTelegramId = descriptor.userTelegramId;
|
|
2703
|
+
}
|
|
2358
2704
|
if (descriptor.userPushId) {
|
|
2359
2705
|
rule.userPushId = descriptor.userPushId;
|
|
2360
2706
|
}
|
|
@@ -2376,6 +2722,9 @@ export class Service extends DatabaseService<Model> {
|
|
|
2376
2722
|
if (descriptor.userWhatsAppId) {
|
|
2377
2723
|
query["userWhatsAppId"] = descriptor.userWhatsAppId;
|
|
2378
2724
|
}
|
|
2725
|
+
if (descriptor.userTelegramId) {
|
|
2726
|
+
query["userTelegramId"] = descriptor.userTelegramId;
|
|
2727
|
+
}
|
|
2379
2728
|
if (descriptor.userPushId) {
|
|
2380
2729
|
query["userPushId"] = descriptor.userPushId;
|
|
2381
2730
|
}
|
|
@@ -6,10 +6,12 @@ import DatabaseService from "./DatabaseService";
|
|
|
6
6
|
import MailService from "./MailService";
|
|
7
7
|
import SmsService from "./SmsService";
|
|
8
8
|
import TeamMemberService from "./TeamMemberService";
|
|
9
|
+
import TelegramService from "./TelegramService";
|
|
9
10
|
import UserCallService from "./UserCallService";
|
|
10
11
|
import UserEmailService from "./UserEmailService";
|
|
11
12
|
import UserSmsService from "./UserSmsService";
|
|
12
13
|
import PushNotificationService from "./PushNotificationService";
|
|
14
|
+
import UserTelegramService from "./UserTelegramService";
|
|
13
15
|
import UserWhatsAppService from "./UserWhatsAppService";
|
|
14
16
|
import WhatsAppService from "./WhatsAppService";
|
|
15
17
|
import { CallRequestMessage } from "../../Types/Call/CallRequest";
|
|
@@ -21,6 +23,9 @@ import ObjectID from "../../Types/ObjectID";
|
|
|
21
23
|
import PositiveNumber from "../../Types/PositiveNumber";
|
|
22
24
|
import { SMSMessage } from "../../Types/SMS/SMS";
|
|
23
25
|
import PushNotificationMessage from "../../Types/PushNotification/PushNotificationMessage";
|
|
26
|
+
import TelegramMessage, {
|
|
27
|
+
TelegramMessagePayload,
|
|
28
|
+
} from "../../Types/Telegram/TelegramMessage";
|
|
24
29
|
import WhatsAppMessage, {
|
|
25
30
|
WhatsAppMessagePayload,
|
|
26
31
|
} from "../../Types/WhatsApp/WhatsAppMessage";
|
|
@@ -28,6 +33,7 @@ import UserCall from "../../Models/DatabaseModels/UserCall";
|
|
|
28
33
|
import UserEmail from "../../Models/DatabaseModels/UserEmail";
|
|
29
34
|
import UserNotificationSetting from "../../Models/DatabaseModels/UserNotificationSetting";
|
|
30
35
|
import UserSMS from "../../Models/DatabaseModels/UserSMS";
|
|
36
|
+
import UserTelegram from "../../Models/DatabaseModels/UserTelegram";
|
|
31
37
|
import UserWhatsApp from "../../Models/DatabaseModels/UserWhatsApp";
|
|
32
38
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
33
39
|
import { appendRecipientToWhatsAppMessage } from "../Utils/WhatsAppTemplateUtil";
|
|
@@ -47,6 +53,7 @@ export class Service extends DatabaseService<UserNotificationSetting> {
|
|
|
47
53
|
callRequestMessage: CallRequestMessage;
|
|
48
54
|
pushNotificationMessage: PushNotificationMessage;
|
|
49
55
|
whatsAppMessage: WhatsAppMessagePayload;
|
|
56
|
+
telegramMessage?: TelegramMessagePayload | undefined;
|
|
50
57
|
incidentId?: ObjectID | undefined;
|
|
51
58
|
alertId?: ObjectID | undefined;
|
|
52
59
|
alertEpisodeId?: ObjectID | undefined;
|
|
@@ -79,6 +86,7 @@ export class Service extends DatabaseService<UserNotificationSetting> {
|
|
|
79
86
|
alertByEmail: true,
|
|
80
87
|
alertBySMS: true,
|
|
81
88
|
alertByWhatsApp: true,
|
|
89
|
+
alertByTelegram: true,
|
|
82
90
|
alertByCall: true,
|
|
83
91
|
alertByPush: true,
|
|
84
92
|
},
|
|
@@ -239,6 +247,112 @@ export class Service extends DatabaseService<UserNotificationSetting> {
|
|
|
239
247
|
}
|
|
240
248
|
}
|
|
241
249
|
|
|
250
|
+
if (notificationSettings.alertByTelegram) {
|
|
251
|
+
const userTelegrams: Array<UserTelegram> =
|
|
252
|
+
await UserTelegramService.findBy({
|
|
253
|
+
query: {
|
|
254
|
+
userId: data.userId,
|
|
255
|
+
projectId: data.projectId,
|
|
256
|
+
isVerified: true,
|
|
257
|
+
},
|
|
258
|
+
select: {
|
|
259
|
+
telegramChatId: true,
|
|
260
|
+
},
|
|
261
|
+
limit: LIMIT_PER_PROJECT,
|
|
262
|
+
skip: 0,
|
|
263
|
+
props: {
|
|
264
|
+
isRoot: true,
|
|
265
|
+
},
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
/*
|
|
269
|
+
* When the caller did not provide a Telegram-specific message we build a
|
|
270
|
+
* nicely-formatted HTML body from the email subject + SMS body + optional
|
|
271
|
+
* URL from the email envelope, with a 🔔 prefix. If they did provide one,
|
|
272
|
+
* we respect their body/parseMode verbatim.
|
|
273
|
+
*/
|
|
274
|
+
const callerProvidedTelegramBody: boolean = Boolean(
|
|
275
|
+
data.telegramMessage?.body,
|
|
276
|
+
);
|
|
277
|
+
|
|
278
|
+
const escapeHtml: (value: string) => string = (
|
|
279
|
+
value: string,
|
|
280
|
+
): string => {
|
|
281
|
+
return value
|
|
282
|
+
.replace(/&/g, "&")
|
|
283
|
+
.replace(/</g, "<")
|
|
284
|
+
.replace(/>/g, ">");
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
let telegramBody: string = "";
|
|
288
|
+
let telegramParseMode: TelegramMessage["parseMode"] | undefined =
|
|
289
|
+
undefined;
|
|
290
|
+
|
|
291
|
+
if (callerProvidedTelegramBody) {
|
|
292
|
+
telegramBody = data.telegramMessage!.body;
|
|
293
|
+
telegramParseMode = data.telegramMessage!.parseMode;
|
|
294
|
+
} else {
|
|
295
|
+
const subject: string = data.emailEnvelope.subject || "";
|
|
296
|
+
const smsBody: string = data.smsMessage.message || "";
|
|
297
|
+
|
|
298
|
+
if (subject || smsBody) {
|
|
299
|
+
const lines: Array<string> = [];
|
|
300
|
+
if (subject) {
|
|
301
|
+
lines.push(`🔔 <b>${escapeHtml(subject)}</b>`);
|
|
302
|
+
} else {
|
|
303
|
+
lines.push("🔔 <b>OneUptime notification</b>");
|
|
304
|
+
}
|
|
305
|
+
if (smsBody) {
|
|
306
|
+
lines.push("");
|
|
307
|
+
lines.push(escapeHtml(smsBody));
|
|
308
|
+
}
|
|
309
|
+
telegramBody = lines.join("\n");
|
|
310
|
+
telegramParseMode = "HTML";
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (!telegramBody) {
|
|
315
|
+
logger.warn(
|
|
316
|
+
"Skipping Telegram notification because message body is empty.",
|
|
317
|
+
);
|
|
318
|
+
} else {
|
|
319
|
+
for (const userTelegram of userTelegrams) {
|
|
320
|
+
if (!userTelegram.telegramChatId) {
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
const telegramMessage: TelegramMessage = {
|
|
325
|
+
to: userTelegram.telegramChatId,
|
|
326
|
+
body: telegramBody,
|
|
327
|
+
parseMode: telegramParseMode,
|
|
328
|
+
disableWebPagePreview:
|
|
329
|
+
data.telegramMessage?.disableWebPagePreview ?? true,
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
TelegramService.sendTelegramMessage(telegramMessage, {
|
|
333
|
+
projectId: data.projectId,
|
|
334
|
+
incidentId: data.incidentId,
|
|
335
|
+
alertId: data.alertId,
|
|
336
|
+
alertEpisodeId: data.alertEpisodeId,
|
|
337
|
+
incidentEpisodeId: data.incidentEpisodeId,
|
|
338
|
+
monitorId: data.monitorId,
|
|
339
|
+
scheduledMaintenanceId: data.scheduledMaintenanceId,
|
|
340
|
+
statusPageId: data.statusPageId,
|
|
341
|
+
statusPageAnnouncementId: data.statusPageAnnouncementId,
|
|
342
|
+
userId: data.userId,
|
|
343
|
+
teamId: data.teamId,
|
|
344
|
+
onCallPolicyId: data.onCallPolicyId,
|
|
345
|
+
onCallPolicyEscalationRuleId: data.onCallPolicyEscalationRuleId,
|
|
346
|
+
onCallDutyPolicyExecutionLogTimelineId:
|
|
347
|
+
data.onCallDutyPolicyExecutionLogTimelineId,
|
|
348
|
+
onCallScheduleId: data.onCallScheduleId,
|
|
349
|
+
}).catch((err: Error) => {
|
|
350
|
+
logger.error(err);
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
242
356
|
if (notificationSettings.alertByCall) {
|
|
243
357
|
const userCalls: Array<UserCall> = await UserCallService.findBy({
|
|
244
358
|
query: {
|