Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
424
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'use strict';
  2.  
  3. /**
  4.  * Core library
  5.  */
  6. const Core = require('nodejs-lib');
  7.  
  8. /**
  9.  * Core mailer
  10.  *
  11.  * @type {*}
  12.  */
  13. const mailer = new Core.MailerSendPulse();
  14.  
  15. /**
  16.  * Application constants
  17.  * @type {*|exports|module.exports}
  18.  */
  19. const c = require('../constants');
  20.  
  21. /**
  22.  * SWIG template library
  23.  *
  24.  * @type {*|exports|module.exports}
  25.  */
  26. const swig = require('swig-templates');
  27.  
  28. /**
  29.  * Path core module
  30.  *
  31.  * @type {posix|exports|module.exports}
  32.  */
  33. const path = require('path');
  34.  
  35. /**
  36.  * Async library
  37.  *
  38.  * @type {async|exports|module.exports}
  39.  */
  40. const async = require('async');
  41.  
  42. /**
  43.  * RandomString library
  44.  * @type {*|exports|module.exports}
  45.  */
  46. const randomString = require('random-string');
  47.  
  48. const fromName  = 'Realza.ru';
  49. const fromEmail = 'mail@realza.ru';
  50. const baseUrl   = Core.ApplicationFacade.instance.config.env.BASE_URL;
  51.  
  52. class Mailer {
  53.  
  54.     /**
  55.      * Send prepared message to user
  56.      *
  57.      * @param messageOptions
  58.      * @param [messageOptions.toEmail] string - specify E-mail address for this message (will overwrite user.email address)
  59.      * @param messageOptions.subject
  60.      * @param messageOptions.html
  61.      * @param messageOptions.token
  62.      * @param user
  63.      * @param callback
  64.      */
  65.     static doSendMail(messageOptions, user, callback) {
  66.  
  67.         let emailModel = require('../models/email');
  68.         let toEmail    = messageOptions.toEmail || user.email;
  69.  
  70.         let email = new emailModel.model({
  71.             toEmail: toEmail,
  72.             subject: messageOptions.subject,
  73.             html: messageOptions.html,
  74.             token: messageOptions.token,
  75.             user: user.id
  76.         });
  77.  
  78.         email.save(err => {
  79.             if (err) Core.ApplicationFacade.instance.logger.error(`Mailer::sendMail: ${err.message}`);
  80.         });
  81.  
  82.         // uncomment for local testing
  83.         if (Core.ApplicationFacade.instance.config.isDev) {
  84.             Core.ApplicationFacade.instance.logger.debug('Mailer::doSendMail Do not send mail in Dev environment');
  85.  
  86.             return callback();
  87.         }
  88.  
  89.         Core.ApplicationFacade.instance.logger.debug('Mailer::doSendMail "' + messageOptions.subject + '" to user.email');
  90.  
  91.         mailer.send([{name: user.firstName, email: toEmail}], messageOptions.html, {
  92.             subject: messageOptions.subject,
  93.             fromName: fromName,
  94.             fromEmail: fromEmail
  95.         }, callback);
  96.     }
  97.  
  98.     /**
  99.      * Send E-mail message
  100.      *
  101.      * @param options
  102.      * @param options.toUserId
  103.      * @param options.type
  104.      * @param [options.data]
  105.      * @param [options.toEmail] string - specify E-mail address for this message (will overwrite user.email address)
  106.      *
  107.      * @param callback
  108.      */
  109.     static sendMail(options, callback) {
  110.         if (typeof callback != 'function') callback = function (err) {
  111.             if (err) Core.ApplicationFacade.instance.logger.error(`Mailer::sendMail: ${err.message}`);
  112.         };
  113.  
  114.         if (!options.toUserId) return callback(new Error('sendMail: options.toUserId is required'));
  115.         if (!options.type) return callback(new Error('sendMail: options.type is required'));
  116.  
  117.         let message = Mailer.getMessage(options.type);
  118.  
  119.         if (!message.template) {
  120.             Core.ApplicationFacade.instance.logger.error(`Mailer::sendMail: template was not found for ${options.type}`);
  121.             return callback(new Error('sendMail: template was not found'));
  122.         }
  123.  
  124.         async.waterfall([callback => {
  125.  
  126.             let userModel = require('../models/user');
  127.  
  128.             userModel.findById(options.toUserId, (err, user) => {
  129.                 if (err) return callback(err);
  130.                 if (!user) return callback(new Error('User not found'));
  131.  
  132.                 // TODO: Check subscription
  133.  
  134.                 callback(null, user);
  135.             });
  136.  
  137.         }, (user, callback) => {
  138.  
  139.             let token = randomString({
  140.                 length: 20,
  141.                 numeric: true,
  142.                 letters: true,
  143.                 special: false
  144.             });
  145.  
  146.             let html = message.template({
  147.                 user: user,
  148.                 baseUrl: baseUrl,
  149.                 token: token,
  150.                 data: options.data ? options.data : {}
  151.             });
  152.  
  153.             Mailer.doSendMail({
  154.                 toEmail: options.toEmail,
  155.                 subject: message.subject,
  156.                 html: html,
  157.                 token: token
  158.             }, user, err => {
  159.                 if (err) {
  160.                     Core.ApplicationFacade.instance.logger.error(`Mailer::sendMail: ${err.message}`);
  161.                 }
  162.  
  163.                 console.log('sent!');
  164.                 callback();
  165.             });
  166.  
  167.         }], callback);
  168.     }
  169.  
  170.     /**
  171.      * Load template file
  172.      *
  173.      * @param type
  174.      * @returns {*}
  175.      */
  176.     static getMessage(type) {
  177.         let templateName;
  178.         let subject;
  179.  
  180.         switch (type) {
  181.             case c.EMAIL_TYPE_REGISTER:
  182.                 subject      = 'Спасибо за регистрацию!';
  183.                 templateName = 'thanks-for-sign-up.swig';
  184.                 break;
  185.             case c.EMAIL_TYPE_EMAIL_CHANGE_REQUEST_FROM:
  186.                 subject      = 'Запрос на изменение E-mail адреса';
  187.                 templateName = 'change-email-request-from.swig';
  188.                 break;
  189.             case c.EMAIL_TYPE_EMAIL_CHANGE_REQUEST_TO:
  190.                 subject      = 'Запрос на изменение E-mail адреса';
  191.                 templateName = 'change-email-request-to.swig';
  192.                 break;
  193.             default:
  194.                 break;
  195.         }
  196.  
  197.         if (templateName == null) {
  198.             return null;
  199.         }
  200.  
  201.         return {
  202.             subject: subject,
  203.             template: swig.compileFile(path.resolve(__dirname, '../views/email', templateName))
  204.         };
  205.     }
  206. }
  207.  
  208. module.exports = Mailer;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement