UNPKG

ghost

Version:

The professional publishing platform

160 lines (143 loc) 5.85 kB
const debug = require('@tryghost/debug')('i18n'); const logging = require('@tryghost/logging'); const url = require('../../api/endpoints/utils/serializers/output/utils/url'); const events = require('../../lib/common/events'); class EmailServiceWrapper { getPostUrl(post) { const jsonModel = post.toJSON(); url.forPost(post.id, jsonModel, {options: {}}); return jsonModel.url; } init() { if (this.service) { return; } const EmailService = require('./EmailService'); const EmailController = require('./EmailController'); const EmailRenderer = require('./EmailRenderer'); const SendingService = require('./SendingService'); const BatchSendingService = require('./BatchSendingService'); const EmailSegmenter = require('./EmailSegmenter'); const MailgunEmailProvider = require('./MailgunEmailProvider'); const {Post, Newsletter, Email, EmailBatch, EmailRecipient, Member} = require('../../models'); const MailgunClient = require('../lib/MailgunClient'); const configService = require('../../../shared/config'); const settingsCache = require('../../../shared/settings-cache'); const settingsHelpers = require('../settings-helpers'); const jobsService = require('../jobs'); const membersService = require('../members'); const db = require('../../data/db'); const sentry = require('../../../shared/sentry'); const membersRepository = membersService.api.members; const limitService = require('../limits'); const labs = require('../../../shared/labs'); const emailAddressService = require('../email-address'); const i18nLib = require('@tryghost/i18n'); const mobiledocLib = require('../../lib/mobiledoc'); const lexicalLib = require('../../lib/lexical'); const urlUtils = require('../../../shared/url-utils'); const memberAttribution = require('../member-attribution'); const linkReplacer = require('../lib/link-replacer'); const linkTracking = require('../link-tracking'); const audienceFeedback = require('../audience-feedback'); const storageUtils = require('../../adapters/storage/utils'); const emailAnalyticsJobs = require('../email-analytics/jobs'); const {imageSize} = require('../../lib/image'); // capture errors from mailgun client and log them in sentry const errorHandler = (error) => { logging.info(`Capturing error for mailgun email provider service`); sentry.captureException(error); }; // Mailgun client instance for email provider const mailgunClient = new MailgunClient({ config: configService, settings: settingsCache }); const i18nLanguage = labs.isSet('i18n') ? settingsCache.get('locale') || 'en' : 'en'; const i18n = i18nLib(i18nLanguage, 'ghost'); events.on('settings.labs.edited', () => { if (labs.isSet('i18n')) { debug('labs i18n enabled, updating i18n to', settingsCache.get('locale')); i18n.changeLanguage(settingsCache.get('locale')); } else { debug('labs i18n disabled, updating i18n to en'); i18n.changeLanguage('en'); } }); events.on('settings.locale.edited', (model) => { if (labs.isSet('i18n')) { debug('locale changed, updating i18n to', model.get('value')); i18n.changeLanguage(model.get('value')); } }); const mailgunEmailProvider = new MailgunEmailProvider({ mailgunClient, errorHandler }); const emailRenderer = new EmailRenderer({ settingsCache, settingsHelpers, renderers: { mobiledoc: mobiledocLib, lexical: lexicalLib }, imageSize, urlUtils, storageUtils, getPostUrl: this.getPostUrl, linkReplacer, linkTracking, memberAttributionService: memberAttribution.service, audienceFeedbackService: audienceFeedback.service, outboundLinkTagger: memberAttribution.outboundLinkTagger, emailAddressService: emailAddressService.service, labs, models: {Post}, t: i18n.t }); const sendingService = new SendingService({ emailProvider: mailgunEmailProvider, emailRenderer }); const emailSegmenter = new EmailSegmenter({ membersRepository }); const batchSendingService = new BatchSendingService({ sendingService, models: { EmailBatch, EmailRecipient, Email, Member }, jobsService, emailSegmenter, emailRenderer, db, sentry, debugStorageFilePath: configService.getContentPath('data') }); this.renderer = emailRenderer; this.service = new EmailService({ batchSendingService, sendingService, models: { Email }, settingsCache, emailRenderer, emailSegmenter, limitService, membersRepository, verificationTrigger: membersService.verificationTrigger, emailAnalyticsJobs }); this.controller = new EmailController(this.service, { models: { Post, Newsletter, Email } }); } } module.exports = EmailServiceWrapper;