From 063d64eec8d9aba488f4cd8f72f46ab327d06ed3 Mon Sep 17 00:00:00 2001 From: Willian Rodrigues Barbosa Date: Sun, 12 Sep 2021 14:46:59 -0300 Subject: [PATCH] feat: add microsoft teams notification provider --- server/notification-providers/teams.js | 118 +++++++++++++++++++++++++ server/notification.js | 2 + src/components/NotificationDialog.vue | 5 ++ src/components/notifications/Teams.vue | 29 ++++++ 4 files changed, 154 insertions(+) create mode 100644 server/notification-providers/teams.js create mode 100644 src/components/notifications/Teams.vue diff --git a/server/notification-providers/teams.js b/server/notification-providers/teams.js new file mode 100644 index 000000000..2cd5a36c5 --- /dev/null +++ b/server/notification-providers/teams.js @@ -0,0 +1,118 @@ +const NotificationProvider = require("./notification-provider"); +const axios = require("axios"); +const { DOWN, UP } = require("../../src/util"); + +class Teams extends NotificationProvider { + name = "teams"; + + _statusMessageFactory = (status, monitorName) => { + if (status === DOWN) { + return `🔴 Application [${monitorName}] went down`; + } else if (status === UP) { + return `✅ Application [${monitorName}] is back online`; + } + return "Notification test"; + }; + + _getThemeColor = (status) => { + if (status === DOWN) { + return "ff0000"; + } + if (status === UP) { + return "00e804"; + } + return "008cff"; + }; + + _notificationPayloadFactory = ({ + status, + monitorMessage, + monitorName, + monitorUrl, + }) => { + const notificationMessage = this._statusMessageFactory( + status, + monitorName + ); + return { + "@context": "https://schema.org/extensions", + "@type": "MessageCard", + themeColor: this._getThemeColor(status), + summary: notificationMessage, + sections: [ + { + activityImage: + "https://raw.githubusercontent.com/louislam/uptime-kuma/master/public/icon.png", + activityTitle: "**Uptime Kuma**", + }, + { + activityTitle: notificationMessage, + }, + { + activityTitle: "**Description**", + text: monitorMessage, + facts: [ + { + name: "Monitor", + value: monitorName, + }, + { + name: "URL", + value: monitorUrl, + }, + ], + }, + ], + }; + }; + + _sendNotification = async (webhookUrl, payload) => { + await axios.post(webhookUrl, payload); + }; + + _handleTestNotification = (webhookUrl) => { + const payload = this._notificationPayloadFactory({ + monitorMessage: "Just a test", + monitorName: "Test Notification", + monitorUrl: "http://localhost:3000", + }); + + return this._sendNotification(webhookUrl, payload); + }; + + async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + let okMsg = "Sent Successfully. "; + + try { + if (heartbeatJSON == null) { + await this._handleTestNotification(notification.webhookUrl); + return okMsg; + } + + let url; + + if (monitorJSON["type"] === "port") { + url = monitorJSON["hostname"]; + if (monitorJSON["port"]) { + url += ":" + monitorJSON["port"]; + } + } else { + url = monitorJSON["url"]; + } + + const payload = this._notificationPayloadFactory({ + monitorMessage: heartbeatJSON.msg, + monitorName: monitorJSON.name, + monitorUrl: url, + status: heartbeatJSON.status, + }); + + await this._sendNotification(notification.webhookUrl, payload); + return okMsg; + } catch (error) { + this.throwGeneralAxiosError(error); + } + } +} + +module.exports = Teams; diff --git a/server/notification.js b/server/notification.js index 83dabc537..134472410 100644 --- a/server/notification.js +++ b/server/notification.js @@ -13,6 +13,7 @@ const RocketChat = require("./notification-providers/rocket-chat"); const Signal = require("./notification-providers/signal"); const Slack = require("./notification-providers/slack"); const SMTP = require("./notification-providers/smtp"); +const Teams = require("./notification-providers/teams"); const Telegram = require("./notification-providers/telegram"); const Webhook = require("./notification-providers/webhook"); @@ -28,6 +29,7 @@ class Notification { const list = [ new Apprise(), new Discord(), + new Teams(), new Gotify(), new Line(), new LunaSea(), diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue index ffb7ba71d..a83fa81c0 100644 --- a/src/components/NotificationDialog.vue +++ b/src/components/NotificationDialog.vue @@ -17,6 +17,7 @@ + @@ -395,6 +396,8 @@ + +
@@ -444,6 +447,7 @@ import { ucfirst } from "../util.ts" import Confirm from "./Confirm.vue"; import HiddenInput from "./HiddenInput.vue"; import Telegram from "./notifications/Telegram.vue"; +import Teams from "./notifications/Teams.vue"; import SMTP from "./notifications/SMTP.vue"; export default { @@ -451,6 +455,7 @@ export default { Confirm, HiddenInput, Telegram, + Teams, SMTP, }, props: {}, diff --git a/src/components/notifications/Teams.vue b/src/components/notifications/Teams.vue new file mode 100644 index 000000000..e28db2444 --- /dev/null +++ b/src/components/notifications/Teams.vue @@ -0,0 +1,29 @@ + + +