Отправить набор снимков экрана по электронной почте

Я написал сценарий, который делает 3 снимка экрана данной страницы, упаковывает их в zip-архив и затем отправляет на указанный адрес электронной почты. Я постарался сделать код максимально понятным и читабельным, поэтому все в отдельных функциях. Интересно, можно ли улучшить приведенный ниже код на основе лучших практик? Есть ли смысл использовать классы?

const webshot = require("node-webshot");
const nodemailer = require("nodemailer");
const AdmZip = require("adm-zip");
const fs = require("fs");

const resolutions = {
  desktop: {
    width: 1920,
    height: 1080,
  },
  tablet: {
    width: 768,
    height: 1024,
  },
  mobile: {
    width: 320,
    height: 480,
  },
};

const nodemailerData = {
  userEmail: {
    service: "gmail",
    auth: {
      user: "yourAdressemail.com",
      pass: "yourPassword",
    },
  },
  mailOptions: {
    from: "yourAdressEmail@gmail.com",
    to: "someAdressEmail@gmail.com",
    subject: "Sending Email using Node.js",
    attachments: [
      {
        filename: "supername.zip",
        path: "./zip_files/supername.zip",
      },
    ],
  },
};

const setOptions = (screenSize) => {
  return {
    screenSize,
    shotSize: {
      width: "window",
      //change line below to  height: "window" if you want to trim the page to the specified height
      height: "all",
    },
    userAgent:
      "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac OS X; en-us)" +
      " AppleWebKit/531.21.20 (KHTML, like Gecko) Mobile/7B298g",
  };
};

const setFileName = (url = site, mediaSize = null) => {
  const domain = new URL(url).hostname.replace("www.", "");
  const fileName = `./screenshots/${domain}-${mediaSize.width}x${mediaSize.height}.jpg`;
  return fileName;
};

const takeScreenshot = async (url) => {
  resolutionsArray = Object.values(resolutions);
  let screenshotsLeft = resolutionsArray.length;
  return new Promise((resolve) => {
    resolutionsArray.forEach((mediaSize) => {
      webshot(
        url,
        setFileName(url, mediaSize),
        setOptions(mediaSize),
        (err) => {
          if (!err) {
            console.log("screenshot taken!");
            screenshotsLeft--;
          }
          if (screenshotsLeft == 0) resolve(url);
        }
      );
    });
  });
};

const makeZip = async (url) => {
  const zip = new AdmZip();
  fs.readdirSync("./screenshots").forEach((file) => {
    zip.addLocalFile(`./screenshots/${file}`);
    //comment out the method below to avoid deleting screensohts from ./screenshots after save into zip
    fs.unlink(`./screenshots/${file}`, function (err) {
      if (err) throw err;
    });
  });
  return new Promise((resolve) => {
    zip.writeZip(`./zip_files/supername.zip`);
    console.log("zip maked!");
    resolve(url);
  });
};

const sendEmail = () => {
  const mail = nodemailer.createTransport(nodemailerData.userEmail);
  return new Promise((resolve, reject) => {
    mail.sendMail(nodemailerData.mailOptions, (err, info) => {
      if (err) {
        reject(err);
      } else {
        console.log("Email sent: " + info.response);
        resolve("mail sended!");
      }
    });
  });
};

module.exports = { takeScreenshot, makeZip, sendEmail };

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *