Repository: louislam/uptime-kuma
File: server/notification-providers/smseagle.js (JavaScript)

Code before:
                        endpoint = "/calls/tts";
                    } else if (notification.smseagleMsgType === "smseagle-tts-advanced") {
                        endpoint = "/calls/tts_advanced";
                        postData["voice_id"] = notification.smseagleTtsModel ? notification.smseagleTtsModel : "1";
                    }
                }

                let resp = await axios.post(notification.smseagleUrl + "/api/v2" + endpoint, postData, config);

                let countAll = resp.data.length;
                let countQueued = resp.data.filter(x => x.status === "queued").length;

                if (resp.status !== 200 || countQueued === 0) {
                    let error = "";
                    if (resp.data.length > 0) {
                        error = `SMSEagle API returned error: ${JSON.stringify(resp.data)}`;
                    } else {
                        error = "SMSEagle API returned an unexpected response";
                    }
                    throw new Error(error);
                }

                if (countAll !== countQueued) {
                    let okWithErrorsMsg = "Sent " + countQueued + "/" + countAll + " Messages Successfully.";
                    return okWithErrorsMsg;
                }

                return okMsg;
            }
        } catch (error) {
            this.throwGeneralAxiosError(error);
        }
    }
}

module.exports = SMSEagle;


Review comment (refactor):
lets simplify this

```suggestion
                const queuedCount = resp.data.filter(x => x.status === "queued").length;
                const unqueuedCount = resp.data.length - queuedCount;

                if (resp.status !== 200 || queuedCount === 0) {
                    if (!resp.data.length) {
                        throw new Error("SMSEagle API returned an empty response");
                    }
                    throw new Error(`SMSEagle API returned error: ${JSON.stringify(resp.data)}`);
                }

                if (unqueuedCount) {
                    return `Sent ${countQueued}/${resp.data.length} Messages Successfully.`;
                }
```

Code after:
const NotificationProvider = require("./notification-provider");
const axios = require("axios");

class SMSEagle extends NotificationProvider {
    name = "SMSEagle";

    /**
     * @inheritdoc
     */
    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
        const okMsg = "Sent Successfully.";

        try {
            if (notification.smseagleApiType === "smseagle-apiv1") { // according to https://www.smseagle.eu/apiv1/
                let config = {
                    headers: {
                        "Content-Type": "application/x-www-form-urlencoded",
                    }
                };

                let sendMethod;
                let recipientType;
                let duration;
                let voiceId;

                if (notification.smseagleRecipientType === "smseagle-contact") {
                    recipientType = "contactname";
                    sendMethod = "/send_tocontact";
                } else if (notification.smseagleRecipientType === "smseagle-group") {
                    recipientType = "groupname";
                    sendMethod = "/send_togroup";
                } else if (notification.smseagleRecipientType === "smseagle-to") {
                    recipientType = "to";
                    sendMethod = "/send_sms";
                    if (notification.smseagleMsgType !== "smseagle-sms") {
                        duration = notification.smseagleDuration ?? 10;

                        if (notification.smseagleMsgType === "smseagle-ring") {
                            sendMethod = "/ring_call";
                        } else if (notification.smseagleMsgType === "smseagle-tts") {
                            sendMethod = "/tts_call";
                        } else if (notification.smseagleMsgType === "smseagle-tts-advanced") {
                            sendMethod = "/tts_adv_call";
                            voiceId = notification.smseagleTtsModel ? notification.smseagleTtsModel : 1;
                        }
                    }
                }

                const url = new URL(notification.smseagleUrl + "/http_api" + sendMethod);

                url.searchParams.append("access_token", notification.smseagleToken);
                url.searchParams.append(recipientType, notification.smseagleRecipient);
                if (!notification.smseagleRecipientType || notification.smseagleRecipientType === "smseagle-sms") {
                    url.searchParams.append("unicode", (notification.smseagleEncoding) ? "1" : "0");
                    url.searchParams.append("highpriority", notification.smseaglePriority ?? "0");
                } else {
                    url.searchParams.append("duration", duration);
                }
                if (notification.smseagleRecipientType !== "smseagle-ring") {
                    url.searchParams.append("message", msg);
                }
                if (voiceId) {
                    url.searchParams.append("voice_id", voiceId);
                }

                let resp = await axios.get(url.toString(), config);

                if (resp.data.indexOf("OK") === -1) {
                    let error = `SMSEagle API returned error: ${resp.data}`;
                    throw new Error(error);
                }

                return okMsg;
            } else if (notification.smseagleApiType === "smseagle-apiv2") { // according to https://www.smseagle.eu/docs/apiv2/
                let config = {
                    headers: {
                        "access-token": notification.smseagleToken,
                        "Content-Type": "application/json",
                    }
                };

                let encoding = (notification.smseagleEncoding) ? "unicode" : "standard";
                let priority = (notification.smseaglePriority) ?? 0;

                let postData = {
                    text: msg,
                    encoding: encoding,
                    priority: priority
                };

                if (notification.smseagleRecipientContact) {
                    postData["contacts"] = notification.smseagleRecipientContact.split(",").map(Number);
                }
                if (notification.smseagleRecipientGroup) {
                    postData["groups"] = notification.smseagleRecipientGroup.split(",").map(Number);
                }
                if (notification.smseagleRecipientTo) {
                    postData["to"] = notification.smseagleRecipientTo.split(",");
                }

                let endpoint = "/messages/sms";

                if (notification.smseagleMsgType !== "smseagle-sms") {

                    postData["duration"] = notification.smseagleDuration ?? 10;

                    if (notification.smseagleMsgType === "smseagle-ring") {
                        endpoint = "/calls/ring";
                    } else if (notification.smseagleMsgType === "smseagle-tts") {
                        endpoint = "/calls/tts";
                    } else if (notification.smseagleMsgType === "smseagle-tts-advanced") {
                        endpoint = "/calls/tts_advanced";
                        postData["voice_id"] = notification.smseagleTtsModel ?? 1;
                    }
                }

                let resp = await axios.post(notification.smseagleUrl + "/api/v2" + endpoint, postData, config);

                const queuedCount = resp.data.filter(x => x.status === "queued").length;
                const unqueuedCount = resp.data.length - queuedCount;

                if (resp.status !== 200 || queuedCount === 0) {
                    if (!resp.data.length) {
                        throw new Error("SMSEagle API returned an empty response");
                    }
                    throw new Error(`SMSEagle API returned error: ${JSON.stringify(resp.data)}`);
                }

                if (unqueuedCount) {
                    return `Sent ${queuedCount}/${resp.data.length} Messages Successfully.`;
                }

                return okMsg;
            }
        } catch (error) {
            this.throwGeneralAxiosError(error);
        }
    }
}

module.exports = SMSEagle;