namchey/linkpreview

View on GitHub
modules/application/services/mailer.js

Summary

Maintainability
A
3 hrs
Test Coverage
'use strict';

const nodemailer = require('nodemailer'),
    path = require('path'),
    config = require(path.resolve('./server/config')),
    utmTrackingService = require(path.resolve('modules/application/services/utm-tracking')),
    Promise = require('promise'),
    _ = require('lodash'),
    fs = require('fs'),
    swig = require('swig'),
    i18n = require('i18n');

//donot show err self signed certificate

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

let transportConfig = config.mailer.options;

//returns jsonMessage in test mode
if(config.isTest) {
  transportConfig = { jsonTransport: true }
}

const transport = nodemailer.createTransport(transportConfig);
/**
 * Sends a mail
 *
 * @param mail
 * @returns {Promise}
 */

exports.sendMail = function(mail) {
  mail = _.extend({
    from: config.mailer.from
  }, mail);

  //If (!mail.from) mail.from = config.mailer.from;

  return new Promise(function(resolve, reject) {
    transport.sendMail(mail, function(error) {
      if (error) return reject(error);

      resolve(mail);
    });
  });
};

/**
 * Sends HTML mail
 *
 * @param subject
 * @param template
 * @param variables
 * @param to
 * @param options
 * @returns {Promise}
 */
exports.send = function(subject, template, variables, to, options) {
  let _this = this;

  if (!options) options = {};
  options = _.extend({
    translateSubject: true,
    companyTitle: 'namchey',
    dualLang: false, // Whether use both language in translation
    language: 'en'
  }, options);

  variables = _.extend({
    appName: config.app.title,
    mailTitle: 'title.default_mail_title',
    site: config.app.site,
    logo: '',
    favicon: '',
    fluidIcon: '',
    iosIcon: '',
    //social icons
    fbLogo: '',
    mediumLogo: '',
    ytLogo: '',
    igLogo: '',
    twitterLogo: '',

    fbLink: '',
    mediumLink: '',
    ytLink: '',
    igLink: '',
    twitterLink: '',
    language: options.language
  }, variables);



  // Try to prepare translated subject
  if (options.dualLang) {
    const subjects = {
      en: i18n.__({phrase: subject, locale: 'en'}),
      np: i18n.__({phrase: subject, locale: 'np'})
    };
    if (subjects.en !== subjects.np) {
      subject = subjects.en + ' ' + subjects.np;
    } else {
      subject = subjects[options.language];
    }
  } else {
    if(options.translateSubject) {
      subject = i18n.__({phrase: subject, locale: options.language});
    }

  }

  return new Promise(function(resolve, reject) {
    swig.renderFile(template, variables, function(err, emailHtml) {
      if (err) return reject(err);
      const mail = {
        subject: subject,
        html: emailHtml
      };

      if(to) {
        mail.to = to;
      }

      if(options.bcc) {
        mail.bcc = options.bcc;
      }
      if (options.from) mail.from = options.from;
      return resolve(_this.sendMail(mail));
    });
  });
};