Пользовательские поля пустые в почтовом адаптере parse-server server.js - PullRequest
0 голосов
/ 24 апреля 2018

Я использую parse-server-amazon-ses-email-adapter и хотел бы узнать, как локализовать проверочный адрес электронной почты и сбросить пароль электронной почты.

Моя подсказка - проверить поля пользователя, а затем назначить правильный шаблон на server.js или AmazonSESAdapter.js. Проблема в том, что свойства пользователя пусты, кроме электронной почты, имени пользователя.

Например, в приведенном ниже примере firstName не определено.

Спасибо.

emailAdapter: {
      module: 'parse-server-amazon-ses-email-adapter',
      options: {
        // The address that your emails come from
        fromAddress: 'Iron rr',
        accessKeyId: 'gg',
        secretAccessKey: 'gg',
        region: 'eu-west-1',
        // The template section
        templates: {
          passwordResetEmail: {
            subject: 'Redefinir sua senha Iron Trainers',
            pathPlainText: '/opt/bitnami/apps/parse/htdocs/node_modules/parse-server/node_modules/parse-server-amazon-ses-email-adapter/test/email-templates/password_reset_email.txt',
            pathHtml: '/opt/bitnami/apps/parse/htdocs/node_modules/parse-server/node_modules/parse-server-amazon-ses-email-adapter/test/email-templates/password_reset_email.html',
            callback: (user) => {
                return {
                  firstName: user.get('firstName')
                }
              }
              // Now you can use {{firstName}} in your templates
          },
          verificationEmail: {
            subject: 'Confirmar email no Iron Trainers',
            pathPlainText: '/opt/bitnami/apps/parse/htdocs/node_modules/parse-server/node_modules/parse-server-amazon-ses-email-adapter/test/email-templates/verification_email.txt',
            pathHtml: '/opt/bitnami/apps/parse/htdocs/node_modules/parse-server/node_modules/parse-server-amazon-ses-email-adapter/test/email-templates/resendEmailVerification.html',
            callback: (user) => {
                return {
                  firstName: user.get('firstName')
                }
              }
              // Now you can use {{firstName}} in your templates
          },
          customEmailAlert: {
            subject: 'Urgent notification!',
            pathPlainText: '/opt/bitnami/apps/parse/htdocs/node_modules/parse-server/node_modules/parse-server-amazon-ses-email-adapter/test/email-templates/custom_alert.txt',
            pathHtml: '/opt/bitnami/apps/parse/htdocs/node_modules/parse-server/node_modules/parse-server-amazon-ses-email-adapter/test/email-templates/custom_alert.html',
          }
        }

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Насколько я понимаю, это можно сделать, но с помощью изменения кода в плагине.

В строке ниже в коде

https://github.com/ecohealthalliance/parse-server-amazon-ses-email-adapter/blob/0bce9b6c81681c3829a17b208d839d23c846ab05/src/AmazonSESAdapter.js#L90

есть условие if-else

Так как вы не предоставили никакой обратной связи, и у меня нет способа настроить это, я предположил, что другая часть - это то, что выполняется

  const {
    link,
    appName,
    user,
    templateConfig
  } = options;
  const {
    callback
  } = templateConfig;
  let userVars;

  if (callback && typeof callback === 'function') {
    userVars = callback(user);
    // If custom user variables are not packaged in an object, ignore it
    const validUserVars = userVars && userVars.constructor && userVars.constructor.name === 'Object';
    userVars = validUserVars ? userVars : {};
  }

  pathPlainText = templateConfig.pathPlainText;
  pathHtml = templateConfig.pathHtml;

  templateVars = Object.assign({
    link,
    appName,
    username: user.get('username'),
    email: user.get('email')
  }, userVars);

  message = {
    from: this.fromAddress,
    to: user.get('email'),
    subject: templateConfig.subject
  };
}

Теперь в этой части 2 строки решают, что шаблонбыть использованным

pathPlainText = templateConfig.pathPlainText;
pathHtml = templateConfig.pathHtml;

К этому времени, предоставленный вами callback был вызван.Теперь в обратном вызове вы можете установить переменную, предположим, что это имя locale.Таким образом, вы можете обновить код, как показано ниже

pathPlainText = templateConfig.pathPlainText + (userVars["locale"] || "en");
pathHtml = templateConfig.pathHtml + (userVars["locale"] || "en");

И затем вы создадите шаблоны, которые имеют locale в пути к файлу, и с обновленным кодом будет выбран правильный шаблон.

Вы также можете посмотреть ответ @bgran, на первый взгляд, я верю, что это должно сработать

0 голосов
/ 03 мая 2018

Вам необходимо выполнить локализацию в обратном вызове шаблона.

Обратный вызов является синхронным, поэтому вся ваша локализация также должна быть синхронной.

emailTemplate.html

<div>
  {{localizedText}}
</div>

Другие шаблоны для каждой локали:

emailTemplate.en.html

<p>
  Hi {{nome}}...
</p>

Логика электронной почты:

// The same templater used by parse-server-amazon-ses-email-adapter
import template from 'lodash.template'

/* ... */

const TemplatesByLocale = {
  en: fs.readFileSync('./emailTemplate.en.html'),
}

verificationEmail: {
  /* ... */
  pathHtml: './path/to/emailTemplate.html',
  callback: (user) => {
    const locale = getLocaleSomehow(user) // needs to be synchronous
    const localizedTemplate = TemplatesByLocale[locale]

    const compiled = template(localizedTemplate, {
      // same interpolation as parse-server-amazon-ses-email-adapter
      interpolate: /{{([\s\S]+?)}}/g
    })
    const localizedText = compiled({
      nome: user.get('nome'), /* ... */
    })
    return {
      localizedText: localizedText,
    }
  },
  /* ... */
}

Стоит отметить, что parse-server-amazon-ses-email-adapter будет использовать шаблон HTML (указанный с помощью pathHtml), прежде чем использовать шаблон в виде простого текста, поэтому, если вы указали шаблон HTML, вы можете просто пропустить свойство pathPlainText.

...