2024-06-14 11:25:19 +01:00
|
|
|
const NotificationProvider = require("./notification-provider");
|
|
|
|
const axios = require("axios");
|
|
|
|
|
|
|
|
class Threema extends NotificationProvider {
|
|
|
|
name = "threema";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @inheritdoc
|
|
|
|
*/
|
|
|
|
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
|
|
|
const url = "https://msgapi.threema.ch/send_simple";
|
|
|
|
|
|
|
|
const config = {
|
|
|
|
headers: {
|
|
|
|
"Accept": "*/*",
|
|
|
|
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
from: notification.threemaSenderIdentity,
|
|
|
|
secret: notification.threemaSecret,
|
|
|
|
text: msg
|
|
|
|
};
|
|
|
|
|
|
|
|
switch (notification.threemaRecipientType) {
|
|
|
|
case "identity":
|
|
|
|
data.to = notification.threemaRecipient;
|
|
|
|
break;
|
|
|
|
case "phone":
|
|
|
|
data.phone = notification.threemaRecipient;
|
|
|
|
break;
|
|
|
|
case "email":
|
|
|
|
data.email = notification.threemaRecipient;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
throw new Error(`Unsupported recipient type: ${notification.threemaRecipientType}`);
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
await axios.post(url, new URLSearchParams(data), config);
|
|
|
|
return "Threema notification sent successfully.";
|
|
|
|
} catch (error) {
|
2024-06-17 07:34:53 +01:00
|
|
|
const errorMessage = this.handleApiError(error);
|
|
|
|
this.throwGeneralAxiosError(errorMessage);
|
2024-06-14 11:25:19 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handle Threema API errors
|
|
|
|
* @param {any} error The error to handle
|
2024-06-17 07:34:53 +01:00
|
|
|
* @returns {string} Additional error context
|
2024-06-14 11:25:19 +01:00
|
|
|
*/
|
|
|
|
handleApiError(error) {
|
2024-06-17 07:34:53 +01:00
|
|
|
if (!error.response) {
|
|
|
|
return error.message;
|
|
|
|
}
|
|
|
|
switch (error.response.status) {
|
|
|
|
case 400:
|
|
|
|
return "Invalid recipient identity or account not set up for basic mode (400).";
|
|
|
|
case 401:
|
|
|
|
return "Incorrect API identity or secret (401).";
|
|
|
|
case 402:
|
|
|
|
return "No credits remaining (402).";
|
|
|
|
case 404:
|
|
|
|
return "Recipient not found (404).";
|
|
|
|
case 413:
|
|
|
|
return "Message is too long (413).";
|
|
|
|
case 500:
|
|
|
|
return "Temporary internal server error (500).";
|
|
|
|
default:
|
|
|
|
return error.message;
|
2024-06-14 11:25:19 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = Threema;
|