Wrapping functionalities up*

Acum că am pregătit atât funcțiile necesare pentru traducerea de texte folosind Google Platform, cât și pentru trimiterea de mail-uri cu Sendgrid, putem crea un endpoint pe care să-l apelăm din Front-end.

For the sake of example, ne dorim un endpoint care să primească pe metoda POST informațiile necesare trimiterii unui mail - mailEmitator, mailReceptor, mesaj - dar și o limbă în care să fie tradus acest mesaj (sau o opțiune pentru toate limbile disponibile).

Aplicația va stoca mesajul original în baza de date, va recunoaște limba inițială a mesajului, îl va traduce în limba / limbile precizate și va trimite un mail către adresa precizată cu conținutul tradus.

  • În fișierul messagesRouter.js vom importa funcțiile și dicționarele de care avem nevoie

// messageRouter.js
const { detectLanguage, translateText, } = require("../utils/translateFunctions.js");
const { LANGUAGE_ISO_CODE } = require("../utils/dictionaries.js");
const { sendMail } = require("../utils/mailFunctions.js");
  • Extindem calea routerului cu /foreign. Astfel, noul endpoint va fi POST /messages/foreign

// messageRouter.js
router.post("/foreign", async (req, res) => {
   
});
  • Fast-forward, adăugăm logica de traducere și trimitere mail-uri. În final, excluzând endpoint-urile pe care le aveam deja, fișierul messagesRouter.js va contine codul urmator

// messagesRouter.js
const connection = require("../db.js");
const mysql = require("mysql");
const express = require("express");
const { detectLanguage, translateText, } = require("../utils/translateFunctions.js");
const { LANGUAGE_ISO_CODE } = require("../utils/dictionaries.js");
const { sendMail } = require("../utils/mailFunctions.js");

const buildInsertQueryString = (senderName, senderMail, receiverMail, messageContent) => {
    const queryString = `INSERT INTO messages (senderName, senderMail, receiverMail, messageContent) 
        VALUES (${mysql.escape(senderName)}, ${mysql.escape(senderMail)}, ${mysql.escape(receiverMail)}, ${mysql.escape(messageContent)})`;
    return queryString;
};

const router = express.Router();

// Already existing routes

// ...

router.post("/foreign", async (req, res) => {
    const { senderName, senderMail, receiverMail, messageContent, language } =
        req.body;
        
    if (!senderName || !senderMail || !receiverMail || !messageContent || !language) {
        // send bad request error
        return res.status(400).send("Bad request. Missing parametres.");
    }
    let translationData = {};

    const queryString = buildInsertQueryString(senderName, senderMail, receiverMail, messageContent);

    try {
        //Translate the message in one or more languages
        if (language === "ALL") {
            const originalLanguageResponse = await detectLanguage(messageContent);
            translationData.originalLanguage = originalLanguageResponse[0]?.language;
            const availableLanguages = Object.values(LANGUAGE_ISO_CODE);

            const translatedAnswersArray = await Promise.all(
                availableLanguages.map(async (language) => {
                    const translatedTextResponse = await translateText(messageContent, language);
                    return translatedTextResponse[0];
                })
            );
            translationData.translatedText = translatedAnswersArray.reduce(
                (acc, curr) => {
                    return acc + curr + "\n";
                },
                ""
            );
        }
        else if (LANGUAGE_ISO_CODE[language]) {
            const originalLanguageResponse = await detectLanguage(messageContent);
            translationData.originalLanguage = originalLanguageResponse[0]?.language;

            const translatedTextResponse = await translateText(
                messageContent,
                LANGUAGE_ISO_CODE[language]
            );
            translationData.translatedText = translatedTextResponse[0];
        }
        else {
            return res.send("Language not supported");
        }

        //Send the message through the mail service
        const sendMailResponse = await sendMail(
            receiverMail,
            senderMail,
            senderName + "" + " sent you a message",
            translationData.translatedText
        );

        // Store original message in database
        connection.query(queryString, (err, results) => {
            if (err) {
                return res.send(err);
            }

            return res.json({
                data: results,
                translationData,
            });
        });
    } catch (err) {
        console.log(err);
        return res.send("Something went wrong");
    }
});

module.exports = router;

Last updated