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
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;