mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-03-11 02:12:21 -05:00
Added newsletter
param to email preview endpoint (#14820)
refs https://github.com/TryGhost/Team/issues/1621 We want to allow previewing emails based on the selected newsletter. The post model doesn't get a newsletter attached until a publish occurs so we can't use `post.newsletter` and need to give the option of specifying which newsletter to preview via query params. - added support for `newsletter` query param on the `GET /email_previews/posts/:id/` endpoint where the value is a newsletter slug - updated `generateEmailContent()` signature to use an options object because the order of memberSegment/newsletter arguments doesn't matter and is difficult to reason about if not named - adjusted `generateEmailContent()` to fetch the newsletter matching the provided slug, falling back to the default newsletter if no slug is provided
This commit is contained in:
parent
3f0172e755
commit
27337e5f00
3 changed files with 54 additions and 8 deletions
|
@ -15,7 +15,8 @@ module.exports = {
|
|||
read: {
|
||||
options: [
|
||||
'fields',
|
||||
'memberSegment'
|
||||
'memberSegment',
|
||||
'newsletter'
|
||||
],
|
||||
validation: {
|
||||
options: {
|
||||
|
@ -39,7 +40,10 @@ module.exports = {
|
|||
});
|
||||
}
|
||||
|
||||
return emailPreview.generateEmailContent(model, frame.options.memberSegment);
|
||||
return emailPreview.generateEmailContent(model, {
|
||||
newsletter: frame.options.newsletter,
|
||||
memberSegment: frame.options.memberSegment
|
||||
});
|
||||
}
|
||||
},
|
||||
sendTestEmail: {
|
||||
|
|
|
@ -4,16 +4,22 @@ const models = require('../../models');
|
|||
class EmailPreview {
|
||||
/**
|
||||
* @param {Object} post - Post model object instance
|
||||
* @param {String} memberSegment - member segment filter
|
||||
* @param {Object} options
|
||||
* @param {String} options.newsletter - newsletter slug
|
||||
* @param {String} options.memberSegment - member segment filter
|
||||
* @returns {Promise<Object>}
|
||||
*/
|
||||
async generateEmailContent(post, memberSegment) {
|
||||
let newsletter = post.relations.newsletter ?? await post.related('newsletter').fetch();
|
||||
if (!newsletter) {
|
||||
newsletter = await models.Newsletter.getDefaultNewsletter();
|
||||
async generateEmailContent(post, {newsletter, memberSegment} = {}) {
|
||||
let newsletterModel = post.relations.newsletter ?? await post.related('newsletter').fetch();
|
||||
if (!newsletterModel) {
|
||||
if (newsletter) {
|
||||
newsletterModel = await models.Newsletter.findOne({slug: newsletter});
|
||||
} else {
|
||||
newsletterModel = await models.Newsletter.getDefaultNewsletter();
|
||||
}
|
||||
}
|
||||
|
||||
let emailContent = await postEmailSerializer.serialize(post, newsletter, {
|
||||
let emailContent = await postEmailSerializer.serialize(post, newsletterModel, {
|
||||
isBrowserPreview: true
|
||||
});
|
||||
|
||||
|
|
|
@ -164,6 +164,42 @@ describe('Email Preview API', function () {
|
|||
const [preview] = jsonResponse.email_previews;
|
||||
preview.html.should.containEql(testUtils.DataGenerator.Content.newsletters[0].name);
|
||||
});
|
||||
|
||||
it('uses the newsletter provided through ?newsletter=slug', async function () {
|
||||
const defaultNewsletter = await models.Newsletter.getDefaultNewsletter();
|
||||
const selectedNewsletter = testUtils.DataGenerator.Content.newsletters[0];
|
||||
|
||||
selectedNewsletter.id.should.not.eql(defaultNewsletter.id, 'Should use a non-default newsletter for this test');
|
||||
|
||||
const post = testUtils.DataGenerator.forKnex.createPost({
|
||||
id: ObjectId().toHexString(),
|
||||
title: 'Post with email-only card',
|
||||
slug: 'email-only-card',
|
||||
mobiledoc: '{"version":"0.3.1","atoms":[],"cards":[],"markups":[["a",["href","https://ghost.org"]]],"sections":[[1,"p",[[0,[],0,"Testing "],[0,[0],1,"links"],[0,[],0," in email excerpt and apostrophes \'"]]]]}',
|
||||
html: '<p>This is the actual post content...</p>',
|
||||
plaintext: 'This is the actual post content...',
|
||||
status: 'draft',
|
||||
uuid: 'd52c42ae-2755-455c-80ec-70b2ec55c904'
|
||||
});
|
||||
|
||||
await models.Post.add(post, {context: {internal: true}});
|
||||
|
||||
const res = await request
|
||||
.get(localUtils.API.getApiQuery(`email_previews/posts/${post.id}/?newsletter=${selectedNewsletter.slug}`))
|
||||
.set('Origin', config.get('url'))
|
||||
.set('Accept', 'application/json')
|
||||
.expect('Content-Type', /json/)
|
||||
.expect('Cache-Control', testUtils.cacheRules.private)
|
||||
.expect(200);
|
||||
|
||||
should.not.exist(res.headers['x-cache-invalidate']);
|
||||
const jsonResponse = res.body;
|
||||
should.exist(jsonResponse);
|
||||
should.exist(jsonResponse.email_previews);
|
||||
|
||||
const [preview] = jsonResponse.email_previews;
|
||||
preview.html.should.containEql(testUtils.DataGenerator.Content.newsletters[0].name);
|
||||
});
|
||||
});
|
||||
|
||||
describe('As Owner', function () {
|
||||
|
|
Loading…
Add table
Reference in a new issue