diff --git a/core/server/api/canary/invites.js b/core/server/api/canary/invites.js index 2d598cbbda..152df218bd 100644 --- a/core/server/api/canary/invites.js +++ b/core/server/api/canary/invites.js @@ -1,7 +1,7 @@ const Promise = require('bluebird'); const {i18n} = require('../../lib/common'); const errors = require('@tryghost/errors'); -const invites = require('../../services/invites/invites'); +const invites = require('../../services/invites'); const models = require('../../models'); const api = require('./index'); const ALLOWED_INCLUDES = []; diff --git a/core/server/api/v2/invites.js b/core/server/api/v2/invites.js index 2d598cbbda..152df218bd 100644 --- a/core/server/api/v2/invites.js +++ b/core/server/api/v2/invites.js @@ -1,7 +1,7 @@ const Promise = require('bluebird'); const {i18n} = require('../../lib/common'); const errors = require('@tryghost/errors'); -const invites = require('../../services/invites/invites'); +const invites = require('../../services/invites'); const models = require('../../models'); const api = require('./index'); const ALLOWED_INCLUDES = []; diff --git a/core/server/services/invites/index.js b/core/server/services/invites/index.js new file mode 100644 index 0000000000..0655725d5e --- /dev/null +++ b/core/server/services/invites/index.js @@ -0,0 +1,14 @@ +const settingsCache = require('../settings/cache'); +const {i18n} = require('../../lib/common'); +const mailService = require('../../services/mail'); +const logging = require('../../../shared/logging'); +const urlUtils = require('../../../shared/url-utils'); +const Invites = require('./invites'); + +module.exports = new Invites({ + settingsCache, + i18n, + logging, + mailService, + urlUtils +}); diff --git a/core/server/services/invites/invites.js b/core/server/services/invites/invites.js index edff87088e..edb90b5035 100644 --- a/core/server/services/invites/invites.js +++ b/core/server/services/invites/invites.js @@ -1,77 +1,82 @@ const security = require('@tryghost/security'); -const mailService = require('../../services/mail'); -const urlUtils = require('../../../shared/url-utils'); -const settingsCache = require('../../services/settings/cache'); -const logging = require('../../../shared/logging'); -const {i18n} = require('../../lib/common'); -const add = ({api, InviteModel, invites, options, user}) => { - let invite; - let emailData; +class Invites { + constructor({settingsCache, i18n, logging, mailService, urlUtils}) { + this.settingsCache = settingsCache; + this.i18n = i18n; + this.logging = logging; + this.mailService = mailService; + this.urlUtils = urlUtils; + } - return InviteModel.findOne({email: invites[0].email}, options) - .then((existingInvite) => { - if (!existingInvite) { - return; - } + add({api, InviteModel, invites, options, user}) { + let invite; + let emailData; - return existingInvite.destroy(options); - }) - .then(() => { - return InviteModel.add(invites[0], options); - }) - .then((createdInvite) => { - invite = createdInvite; + return InviteModel.findOne({email: invites[0].email}, options) + .then((existingInvite) => { + if (!existingInvite) { + return; + } - const adminUrl = urlUtils.urlFor('admin', true); + return existingInvite.destroy(options); + }) + .then(() => { + return InviteModel.add(invites[0], options); + }) + .then((createdInvite) => { + invite = createdInvite; - emailData = { - blogName: settingsCache.get('title'), - invitedByName: user.name, - invitedByEmail: user.email, - resetLink: urlUtils.urlJoin(adminUrl, 'signup', security.url.encodeBase64(invite.get('token')), '/') - }; + const adminUrl = this.urlUtils.urlFor('admin', true); - return mailService.utils.generateContent({data: emailData, template: 'invite-user'}); - }) - .then((emailContent) => { - const payload = { - mail: [{ - message: { - to: invite.get('email'), - subject: i18n.t('common.api.users.mail.invitedByName', { - invitedByName: emailData.invitedByName, - blogName: emailData.blogName - }), - html: emailContent.html, - text: emailContent.text - }, - options: {} - }] - }; + emailData = { + blogName: this.settingsCache.get('title'), + invitedByName: user.name, + invitedByEmail: user.email, + resetLink: this.urlUtils.urlJoin(adminUrl, 'signup', security.url.encodeBase64(invite.get('token')), '/') + }; - return api.mail.send(payload, {context: {internal: true}}); - }) - .then(() => { - return InviteModel.edit({ - status: 'sent' - }, Object.assign({id: invite.id}, options)); - }) - .then((editedInvite) => { - return editedInvite; - }) - .catch((err) => { - if (err && err.errorType === 'EmailError') { - const errorMessage = i18n.t('errors.api.invites.errorSendingEmail.error', { - message: err.message - }); - const helpText = i18n.t('errors.api.invites.errorSendingEmail.help'); - err.message = `${errorMessage} ${helpText}`; - logging.warn(err.message); - } + return this.mailService.utils.generateContent({data: emailData, template: 'invite-user'}); + }) + .then((emailContent) => { + const payload = { + mail: [{ + message: { + to: invite.get('email'), + subject: this.i18n.t('common.api.users.mail.invitedByName', { + invitedByName: emailData.invitedByName, + blogName: emailData.blogName + }), + html: emailContent.html, + text: emailContent.text + }, + options: {} + }] + }; - return Promise.reject(err); - }); -}; + return api.mail.send(payload, {context: {internal: true}}); + }) + .then(() => { + return InviteModel.edit({ + status: 'sent' + }, Object.assign({id: invite.id}, options)); + }) + .then((editedInvite) => { + return editedInvite; + }) + .catch((err) => { + if (err && err.errorType === 'EmailError') { + const errorMessage = this.i18n.t('errors.api.invites.errorSendingEmail.error', { + message: err.message + }); + const helpText = this.i18n.t('errors.api.invites.errorSendingEmail.help'); + err.message = `${errorMessage} ${helpText}`; + this.logging.warn(err.message); + } -module.exports.add = add; + return Promise.reject(err); + }); + } +} + +module.exports = Invites;