|  |  | @ -27,8 +27,92 @@ const Feishu = require("./notification-providers/feishu"); | 
			
		
	
		
			
				
					|  |  |  | const AliyunSms = require("./notification-providers/aliyun-sms"); | 
			
		
	
		
			
				
					|  |  |  | const DingDing = require("./notification-providers/dingding"); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | const MinimalDetailTemplate = "{{monitor.name}}: {{monitor.health}}" | 
			
		
	
		
			
				
					|  |  |  | const LowDetailTemplate = "[{{monitor.name}}] [{{monitor.health}}] {{heartbeat.msg}}" | 
			
		
	
		
			
				
					|  |  |  | const MediumDetailTemplate = `Monitor: {{monitor.name}}
 | 
			
		
	
		
			
				
					|  |  |  | Health: {{monitor.health}} | 
			
		
	
		
			
				
					|  |  |  | Address: {{monitor.url}} | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | {% if heartbeat.status == 1 and monitor.upsideDown -%} | 
			
		
	
		
			
				
					|  |  |  |     Your Upside down {{monitor.type}} monitor is unexpectedly connected | 
			
		
	
		
			
				
					|  |  |  | {%- elsif heartbeat.status == 1 and monitor.upsideDown==false -%} | 
			
		
	
		
			
				
					|  |  |  |     Your {{monitor.type}} monitor is up | 
			
		
	
		
			
				
					|  |  |  | {%- elsif heartbeat.status == 0 and monitor.upsideDown -%} | 
			
		
	
		
			
				
					|  |  |  |     Your Upside down {{monitor.type}} monitor is no longer connected | 
			
		
	
		
			
				
					|  |  |  | {%- elsif heartbeat.status == 0 and monitor.upsideDown == false -%} | 
			
		
	
		
			
				
					|  |  |  |     Your {{monitor.type}} monitor is unexpectedly down. | 
			
		
	
		
			
				
					|  |  |  | {%- endif %} | 
			
		
	
		
			
				
					|  |  |  | Time: {{heartbeat.time}} | 
			
		
	
		
			
				
					|  |  |  | Uptime Message: {{heartbeat.msg}}` | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | const FullDetailTemplate = `Monitor: {{monitor.name}}
 | 
			
		
	
		
			
				
					|  |  |  | Health: {{monitor.health}} | 
			
		
	
		
			
				
					|  |  |  | Address: {{monitor.url}} | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | {% if heartbeat.status == 1 and monitor.upsideDown -%} | 
			
		
	
		
			
				
					|  |  |  |     Your Upside down {{monitor.type}} monitor is unexpectedly connected | 
			
		
	
		
			
				
					|  |  |  | {%- elsif heartbeat.status == 1 and monitor.upsideDown==false -%} | 
			
		
	
		
			
				
					|  |  |  |     Your {{monitor.type}} monitor is up | 
			
		
	
		
			
				
					|  |  |  | {%- elsif heartbeat.status == 0 and monitor.upsideDown -%} | 
			
		
	
		
			
				
					|  |  |  |     Your Upside down {{monitor.type}} monitor is no longer connected | 
			
		
	
		
			
				
					|  |  |  | {%- elsif heartbeat.status == 0 and monitor.upsideDown == false -%} | 
			
		
	
		
			
				
					|  |  |  |     Your {{monitor.type}} monitor is unexpectedly down. | 
			
		
	
		
			
				
					|  |  |  | {%- endif %} | 
			
		
	
		
			
				
					|  |  |  | Time: {{heartbeat.time}} | 
			
		
	
		
			
				
					|  |  |  | Uptime Message: {{heartbeat.msg}} | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | Tags | 
			
		
	
		
			
				
					|  |  |  | ---------------------------------------- | 
			
		
	
		
			
				
					|  |  |  | {% for tag in monitor.tags -%} | 
			
		
	
		
			
				
					|  |  |  |   {{ tag.name }} | 
			
		
	
		
			
				
					|  |  |  |   {%- if tag.value and tag.value != "" -%} | 
			
		
	
		
			
				
					|  |  |  |     : {{tag.value}} | 
			
		
	
		
			
				
					|  |  |  |   {%- endif %} | 
			
		
	
		
			
				
					|  |  |  | {% endfor -%}` | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | class Notification { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     static generateTestHeartbeat(){ | 
			
		
	
		
			
				
					|  |  |  |         return { | 
			
		
	
		
			
				
					|  |  |  |             monitorID: 5, | 
			
		
	
		
			
				
					|  |  |  |             status: 1, | 
			
		
	
		
			
				
					|  |  |  |             time: (new Date()).toLocaleString(), | 
			
		
	
		
			
				
					|  |  |  |             msg: "TEST NOTIFICATION MESSAGE", | 
			
		
	
		
			
				
					|  |  |  |             ping: 278, | 
			
		
	
		
			
				
					|  |  |  |             important: true, | 
			
		
	
		
			
				
					|  |  |  |             duration: 8, | 
			
		
	
		
			
				
					|  |  |  |         }; | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     static generateTestMonitor(){ | 
			
		
	
		
			
				
					|  |  |  |         return { | 
			
		
	
		
			
				
					|  |  |  |             id: 5, | 
			
		
	
		
			
				
					|  |  |  |             name: "Test Notification Monitor", | 
			
		
	
		
			
				
					|  |  |  |             url: "https://www.example.com", | 
			
		
	
		
			
				
					|  |  |  |             method: "Get", | 
			
		
	
		
			
				
					|  |  |  |             body: "OK", | 
			
		
	
		
			
				
					|  |  |  |             headers: null, | 
			
		
	
		
			
				
					|  |  |  |             hostname: "www.example.com", | 
			
		
	
		
			
				
					|  |  |  |             port: 443, | 
			
		
	
		
			
				
					|  |  |  |             maxretries: 2, | 
			
		
	
		
			
				
					|  |  |  |             weight: 2000, | 
			
		
	
		
			
				
					|  |  |  |             active: 1, | 
			
		
	
		
			
				
					|  |  |  |             type: "HTTP", | 
			
		
	
		
			
				
					|  |  |  |             interval: 60, | 
			
		
	
		
			
				
					|  |  |  |             retryInterval: this.retryInterval, | 
			
		
	
		
			
				
					|  |  |  |             keyword: null, | 
			
		
	
		
			
				
					|  |  |  |             ignoreTls: false, | 
			
		
	
		
			
				
					|  |  |  |             upsideDown: false, | 
			
		
	
		
			
				
					|  |  |  |             maxredirects: 10, | 
			
		
	
		
			
				
					|  |  |  |             accepted_statuscodes: ["200-299"], | 
			
		
	
		
			
				
					|  |  |  |             dns_resolve_type: "A", | 
			
		
	
		
			
				
					|  |  |  |             dns_resolve_server: "1.1.1.1", | 
			
		
	
		
			
				
					|  |  |  |             dns_last_result: null, | 
			
		
	
		
			
				
					|  |  |  |             pushToken: null, | 
			
		
	
		
			
				
					|  |  |  |             notificationIDList:{"1":true,"5":true}, | 
			
		
	
		
			
				
					|  |  |  |             tags: [{"id":21,"monitor_id":16,"tag_id":2,"value":"","name":"Internal","color":"#059669"}], | 
			
		
	
		
			
				
					|  |  |  |         }; | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     providerList = {}; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     static init() { | 
			
		
	
	
		
			
				
					|  |  | @ -73,6 +157,7 @@ class Notification { | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |      * | 
			
		
	
		
			
				
					|  |  |  |      * @param notification : BeanModel | 
			
		
	
	
		
			
				
					|  |  | @ -82,34 +167,22 @@ class Notification { | 
			
		
	
		
			
				
					|  |  |  |      * @returns {Promise<string>} Successful msg | 
			
		
	
		
			
				
					|  |  |  |      * Throw Error with fail msg | 
			
		
	
		
			
				
					|  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |     static async send( | 
			
		
	
		
			
				
					|  |  |  |         notification,  | 
			
		
	
		
			
				
					|  |  |  |         msg,  | 
			
		
	
		
			
				
					|  |  |  |         monitorJSON = { | 
			
		
	
		
			
				
					|  |  |  |             id: "this.id", | 
			
		
	
		
			
				
					|  |  |  |             name: "this.name", | 
			
		
	
		
			
				
					|  |  |  |             url: "this.url", | 
			
		
	
		
			
				
					|  |  |  |             hostname: "this.hostname", | 
			
		
	
		
			
				
					|  |  |  |         },  | 
			
		
	
		
			
				
					|  |  |  |         heartbeatJSON = { | 
			
		
	
		
			
				
					|  |  |  |             status: UP, | 
			
		
	
		
			
				
					|  |  |  |             message: "new message", | 
			
		
	
		
			
				
					|  |  |  |             ping: "1ms", | 
			
		
	
		
			
				
					|  |  |  |             duration:"5 seconds", | 
			
		
	
		
			
				
					|  |  |  |             monitor:"asd", | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         }) { | 
			
		
	
		
			
				
					|  |  |  |     static async send(notification, msg, monitorJSON, heartbeatJSON) { | 
			
		
	
		
			
				
					|  |  |  |         if (this.providerList[notification.type]) { | 
			
		
	
		
			
				
					|  |  |  |             //TODO need to check for errors.
 | 
			
		
	
		
			
				
					|  |  |  |             try { | 
			
		
	
		
			
				
					|  |  |  |                 monitorJSON.health = ((heartbeatJSON.status == 1) !== monitorJSON.upsideDown) ? "✅ Healthy": "❌ Unhealthy" | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 let newmsg = await engine.parseandrender("{{msg}}   {{monitor | json}}    {{heartbeat | json}}    {{notification | json}}", { | 
			
		
	
		
			
				
					|  |  |  |                     notification: notification, | 
			
		
	
		
			
				
					|  |  |  |                     msg: msg, | 
			
		
	
		
			
				
					|  |  |  |                 let parseData = { | 
			
		
	
		
			
				
					|  |  |  |                     // I actually dont think that it is necessary to put the notification in the data sent to the template.
 | 
			
		
	
		
			
				
					|  |  |  |                     // notification: notification,
 | 
			
		
	
		
			
				
					|  |  |  |                     monitor: monitorJSON, | 
			
		
	
		
			
				
					|  |  |  |                     heartbeat: heartbeatJSON, | 
			
		
	
		
			
				
					|  |  |  |                 }) | 
			
		
	
		
			
				
					|  |  |  |                 return this.providerList[notification.type].send(notification, newmsg, monitorJSON, heartbeatJSON); | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |                 let template = this.getTemplateFromNotification(notification) | 
			
		
	
		
			
				
					|  |  |  |                 console.log(`Template: (${template})`) | 
			
		
	
		
			
				
					|  |  |  |                 let message = await engine.parseAndRender(template, parseData) | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 return this.providerList[notification.type].send(notification, message, monitorJSON, heartbeatJSON); | 
			
		
	
		
			
				
					|  |  |  |             } catch (e) { | 
			
		
	
		
			
				
					|  |  |  |                 throw e | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
	
		
			
				
					|  |  | @ -119,6 +192,29 @@ class Notification { | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     static getTemplateFromNotification(notification){ | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         let template = notification.template | 
			
		
	
		
			
				
					|  |  |  |         let detail = notification.detail  | 
			
		
	
		
			
				
					|  |  |  |         console.log(`Detail: (${detail}) Template: (${template})`) | 
			
		
	
		
			
				
					|  |  |  |         switch (detail) { | 
			
		
	
		
			
				
					|  |  |  |             case "Minimal Detail": | 
			
		
	
		
			
				
					|  |  |  |                 return MinimalDetailTemplate | 
			
		
	
		
			
				
					|  |  |  |             case "Low Detail": | 
			
		
	
		
			
				
					|  |  |  |                 return LowDetailTemplate | 
			
		
	
		
			
				
					|  |  |  |             case "Medium Detail": | 
			
		
	
		
			
				
					|  |  |  |                 return MediumDetailTemplate | 
			
		
	
		
			
				
					|  |  |  |             case "Full Detail": | 
			
		
	
		
			
				
					|  |  |  |                 return FullDetailTemplate | 
			
		
	
		
			
				
					|  |  |  |             case "Custom Template": | 
			
		
	
		
			
				
					|  |  |  |                 if (template) { | 
			
		
	
		
			
				
					|  |  |  |                     return template | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |                 //returns low in the case of a template being empty string or undefined.
 | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         return LowDetailTemplate | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     static async save(notification, notificationID, userID) { | 
			
		
	
		
			
				
					|  |  |  |         let bean | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | 
 |