dsql-admin/dsql-app/package-shared/functions/api/users/api-send-email-code.js
Benjamin Toby 8b7ea057d0 Updates
2024-12-06 14:24:26 +01:00

122 lines
3.5 KiB
JavaScript

// @ts-check
const LOCAL_DB_HANDLER = require("../../../utils/backend/global-db/LOCAL_DB_HANDLER");
const varDatabaseDbHandler = require("../../backend/varDatabaseDbHandler");
const nodemailer = require("nodemailer");
/**
* # Send Email Login Code
*
* @param {object} param
* @param {string} param.email
* @param {string} param.database
* @param {string} [param.email_login_field]
* @param {string} [param.mail_domain]
* @param {number} [param.mail_port]
* @param {string} [param.sender]
* @param {string} [param.mail_username]
* @param {string} [param.mail_password]
* @param {string} param.html
* @param {boolean} [param.useLocal]
*
* @returns {Promise<{success: boolean, msg?: string}>}
*/
module.exports = async function apiSendEmailCode({
email,
database,
email_login_field,
mail_domain,
mail_port,
sender,
mail_username,
mail_password,
html,
useLocal,
}) {
if (email?.match(/ /)) {
return {
success: false,
msg: "Invalid Email/Password format",
};
}
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
const foundUserQuery = `SELECT * FROM users WHERE email = ?`;
const foundUserValues = [email];
let foundUser = useLocal
? await LOCAL_DB_HANDLER(foundUserQuery, foundUserValues)
: await varDatabaseDbHandler({
queryString: foundUserQuery,
queryValuesArray: foundUserValues,
database,
});
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
if (!foundUser || !foundUser[0]) {
return {
success: false,
msg: "No user found",
};
}
function generateCode() {
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
let code = "";
for (let i = 0; i < 8; i++) {
code += chars[Math.floor(Math.random() * chars.length)];
}
return code;
}
if (foundUser && foundUser[0] && email_login_field) {
const tempCode = generateCode();
let transporter = nodemailer.createTransport({
host: mail_domain || process.env.DSQL_MAIL_HOST,
port: mail_port || 465,
secure: true,
auth: {
user: mail_username || process.env.DSQL_MAIL_EMAIL,
pass: mail_password || process.env.DSQL_MAIL_PASSWORD,
},
});
let mailObject = {};
mailObject["from"] = `"Datasquirel SSO" <${
sender || "support@datasquirel.com"
}>`;
mailObject["sender"] = sender || "support@datasquirel.com";
mailObject["to"] = email;
mailObject["subject"] = "One Time Login Code";
mailObject["html"] = html.replace(/{{code}}/, tempCode);
const info = await transporter.sendMail(mailObject);
if (!info?.accepted) throw new Error("Mail not Sent!");
const setTempCodeQuery = `UPDATE users SET ${email_login_field} = ? WHERE email = ?`;
const setTempCodeValues = [tempCode + `-${Date.now()}`, email];
let setTempCode = useLocal
? await LOCAL_DB_HANDLER(setTempCodeQuery, setTempCodeValues)
: await varDatabaseDbHandler({
queryString: setTempCodeQuery,
queryValuesArray: setTempCodeValues,
database: database,
});
}
return {
success: true,
msg: "Success",
};
};