mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-03 23:00:14 -05:00
5f349b3ef7
no issue Email template was incorrectly setting up publication icon url in case of subdirectory setup, leading to missing publication logo from newsletter emails in such cases. This adds the fix to use correct absolute url for publication icons in all setups.
82 lines
2.9 KiB
JavaScript
82 lines
2.9 KiB
JavaScript
const juice = require('juice');
|
|
const template = require('./template');
|
|
const settingsCache = require('../../services/settings/cache');
|
|
const urlUtils = require('../../lib/url-utils');
|
|
const moment = require('moment');
|
|
const cheerio = require('cheerio');
|
|
const api = require('../../api');
|
|
const {URL} = require('url');
|
|
|
|
const getSite = () => {
|
|
const publicSettings = settingsCache.getPublic();
|
|
return Object.assign({}, publicSettings, {
|
|
url: urlUtils.urlFor('home', true),
|
|
iconUrl: publicSettings.icon ? urlUtils.urlFor('image', {image: publicSettings.icon}, true) : null
|
|
});
|
|
};
|
|
|
|
/**
|
|
* createUnsubscribeUrl
|
|
*
|
|
* Takes a member uuid and returns the url that should be used to unsubscribe
|
|
* In case of no member uuid, generates the preview unsubscribe url - `?preview=1`
|
|
*
|
|
* @param {string} uuid
|
|
*/
|
|
const createUnsubscribeUrl = (uuid) => {
|
|
const siteUrl = urlUtils.getSiteUrl();
|
|
const unsubscribeUrl = new URL(siteUrl);
|
|
unsubscribeUrl.pathname = `${unsubscribeUrl.pathname}/unsubscribe/`.replace('//', '/');
|
|
if (uuid) {
|
|
unsubscribeUrl.searchParams.set('uuid', uuid);
|
|
} else {
|
|
unsubscribeUrl.searchParams.set('preview', '1');
|
|
}
|
|
|
|
return unsubscribeUrl.href;
|
|
};
|
|
|
|
// NOTE: serialization is needed to make sure we are using current API and do post transformations
|
|
// such as image URL transformation from relative to absolute
|
|
const serializePostModel = async (model) => {
|
|
const frame = {options: {context: {user: true}, formats: 'html, plaintext'}};
|
|
const apiVersion = model.get('api_version') || 'v3';
|
|
const docName = 'posts';
|
|
|
|
await api.shared
|
|
.serializers
|
|
.handle
|
|
.output(model, {docName: docName, method: 'read'}, api[apiVersion].serializers.output, frame);
|
|
|
|
return frame.response[docName][0];
|
|
};
|
|
|
|
const serialize = async (postModel, options = {isBrowserPreview: false}) => {
|
|
const post = await serializePostModel(postModel);
|
|
post.published_at = post.published_at ? moment(post.published_at).format('DD MMM YYYY') : moment().format('DD MMM YYYY');
|
|
post.authors = post.authors && post.authors.map(author => author.name).join(',');
|
|
post.html = post.html || '';
|
|
if (post.posts_meta) {
|
|
post.email_subject = post.posts_meta.email_subject;
|
|
}
|
|
let htmlTemplate = template({post, site: getSite()});
|
|
if (options.isBrowserPreview) {
|
|
const previewUnsubscribeUrl = createUnsubscribeUrl();
|
|
htmlTemplate = htmlTemplate.replace('%recipient.unsubscribe_url%', previewUnsubscribeUrl);
|
|
}
|
|
let juicedHtml = juice(htmlTemplate);
|
|
// Force all links to open in new tab
|
|
let _cheerio = cheerio.load(juicedHtml);
|
|
_cheerio('a').attr('target','_blank');
|
|
juicedHtml = _cheerio.html();
|
|
return {
|
|
subject: post.email_subject || post.title,
|
|
html: juicedHtml,
|
|
plaintext: post.plaintext
|
|
};
|
|
};
|
|
|
|
module.exports = {
|
|
serialize,
|
|
createUnsubscribeUrl
|
|
};
|