Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
touchto-core / lib / sendmail.js
Size: Mime:
import config from 'config';
import path from 'path';
import nunjucks from 'nunjucks';
import swig from 'swig';
import _ from 'lodash';
import debugModule from 'debug';
import Mailgun from 'mailgun-js';
import Mailcomposer from 'mailcomposer';

const debug = debugModule( 'touchto:sendmail' );
const basepath = process.cwd();
const env = process.env.NODE_ENV;

/* ********Templating engines config******** */

const njkconfig = {
    autoescape: true,
    watch: env === 'development',
    noCache: env === 'development',
};

const viewpath = path.resolve( path.join( basepath, 'server', 'views' ) );

const njkenv = nunjucks.configure( viewpath, njkconfig );

const swigdefaults = {
    autoescape: true,
    loader: swig.loaders.fs( path.resolve( path.join( basepath, 'server', 'views' ) ) ),
    cache: env === 'development' ? false : 'memory',
};

swig.setDefaults( swigdefaults );

/* ********Mailgun config******** */

let mailgun = {};
let from = '';

if ( config.has( 'mailgun.enabled' ) && config.get( 'mailgun.enabled' ) === true ) {
    const mailgunConfig = {
        apiKey: config.get( 'mailgun.key' ),
        domain: config.get( 'mailgun.domain' ),
    };
    mailgun = Mailgun( mailgunConfig );
    from = config.get( 'mailgun.from' );
}

/* ********Sendmail Function******** */
/* eslint-disable no-new */

const sendmail = (
  user,
  text,
  html,
  locals,
  subject,
  f = '',
  cc = '',
  bcc = ''
) => {
    const rendered = {
        text: '',
        html: '',
    };

    let ext = html.split( '.' );
    ext = _.last( ext );

    return new Promise( ( resolve, reject ) => {
        if ( !text ) return resolve( '' );
        njkenv.render( text, locals, ( err, output ) => {
            err ? reject( err ) : resolve( output );
        } );
        return undefined;
    } )
    .then( ( output ) => {
        rendered.text = output;
    } )
    .catch( ( err ) => {
        debug( 'Error parsing plain-text template: ', err );
    } )
    .then( () => {
        const renderHtml = new Promise( ( resolve, reject ) => {
            if ( !html ) {
                resolve( '' );
            } else if ( ext === 'njk' ) {
                njkenv.render( html, locals, ( err, output ) => {
                    err ? reject( err ) : resolve( output );
                } );
            } else {
                debug( 'No Nunjucks template found. SWIG taking over.' );
                swig.renderFile( html, locals, ( err, output ) => {
                    err ? reject( err ) : resolve( output );
                } );
            }
        } );
        return renderHtml;
    } )
    .then( ( output ) => {
        rendered.html = output;
    } )
    .then( () => {
        const sendEmail = new Promise( ( resolve, reject ) => {
        // List for mailgun object with all recipients
            const toList = [user.get( 'mail' )];
            from = f !== '' ? f : undefined;
            if ( cc ) toList.push( cc );
            if ( bcc ) toList.push( bcc );

            const mail = Mailcomposer( {
                from,
                to: user.get( 'mail' ),
                text: rendered.text,
                html: rendered.html,
                subject,
                cc,
                bcc,
            } );

            mail.build( ( err, message ) => {
                if ( err ) {
                    reject( err );
                } else {
                    const mailgunObject = {
                        to: toList,
                        message: message.toString( 'ascii' ),
                    };
                    mailgun.messages().sendMime( mailgunObject, ( error ) => {
                        if ( error ) {
                            reject( error );
                        } else {
                            resolve( mailgunObject.message );
                        }
                    } );
                }
            } );
        } );
        return sendEmail;
    } )
    .catch( ( err ) => {
        debug( `Now that's an error... ${err}` );
        return Promise.reject( err );
    } );
};

export default sendmail;