mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-04-08 02:52:39 -05:00
🐛 Fixed cache invalidation for published posts with no content
closes #12015
refs 95880dddeb
- The bug was caused by falsy plaintext field assignment to empty string `''` when the html content was `null`. Because of the `setEmptyValuesToNull` function (referenced commit), there is no sense to assign empty string value to plaintext property, because it would still end up being `null`
- The `''` -> `null` conversion was confusing the model layer to think that some fields were changed, where in reality none did. This in turn lead to a bug with falsy cache invalidation
This commit is contained in:
parent
a75e1e27db
commit
ced3e28d60
3 changed files with 102 additions and 8 deletions
|
@ -429,14 +429,20 @@ Post = ghostBookshelf.Model.extend({
|
|||
}
|
||||
|
||||
if (this.hasChanged('html') || !this.get('plaintext')) {
|
||||
const plaintext = htmlToText.fromString(this.get('html'), {
|
||||
wordwrap: 80,
|
||||
ignoreImage: true,
|
||||
hideLinkHrefIfSameAsText: true,
|
||||
preserveNewlines: true,
|
||||
returnDomByDefault: true,
|
||||
uppercaseHeadings: false
|
||||
});
|
||||
let plaintext;
|
||||
|
||||
if (this.get('html') === null) {
|
||||
plaintext = null;
|
||||
} else {
|
||||
plaintext = htmlToText.fromString(this.get('html'), {
|
||||
wordwrap: 80,
|
||||
ignoreImage: true,
|
||||
hideLinkHrefIfSameAsText: true,
|
||||
preserveNewlines: true,
|
||||
returnDomByDefault: true,
|
||||
uppercaseHeadings: false
|
||||
});
|
||||
}
|
||||
|
||||
// CASE: html is e.g. <p></p>
|
||||
// @NOTE: Otherwise we will always update the resource to `plaintext: ''` and Bookshelf thinks that this
|
||||
|
|
|
@ -395,6 +395,50 @@ describe('Posts API', function () {
|
|||
should.equal(res.body.posts[0].meta_title, 'changed meta title');
|
||||
});
|
||||
});
|
||||
|
||||
it('saving post with no modbiledoc content doesn\t trigger cache invalidation', function () {
|
||||
return request
|
||||
.post(localUtils.API.getApiQuery('posts/'))
|
||||
.set('Origin', config.get('url'))
|
||||
.send({
|
||||
posts: [{
|
||||
title: 'Has a title by no other content',
|
||||
status: 'published'
|
||||
}]
|
||||
})
|
||||
.expect('Content-Type', /json/)
|
||||
.expect('Cache-Control', testUtils.cacheRules.private)
|
||||
.expect(201)
|
||||
.then((res) => {
|
||||
should.exist(res.body.posts);
|
||||
should.exist(res.body.posts[0].title);
|
||||
res.body.posts[0].title.should.equal('Has a title by no other content');
|
||||
should.equal(res.body.posts[0].html, undefined);
|
||||
should.equal(res.body.posts[0].plaintext, undefined);
|
||||
|
||||
return request
|
||||
.put(localUtils.API.getApiQuery(`posts/${res.body.posts[0].id}/`))
|
||||
.set('Origin', config.get('url'))
|
||||
.send({
|
||||
posts: [{
|
||||
title: res.body.posts[0].title,
|
||||
mobilecdoc: res.body.posts[0].mobilecdoc,
|
||||
updated_at: res.body.posts[0].updated_at
|
||||
}]
|
||||
})
|
||||
.expect('Content-Type', /json/)
|
||||
.expect('Cache-Control', testUtils.cacheRules.private)
|
||||
.expect(200);
|
||||
})
|
||||
.then((res) => {
|
||||
should.not.exist(res.headers['x-cache-invalidate']);
|
||||
|
||||
should.exist(res.body.posts);
|
||||
res.body.posts[0].title.should.equal('Has a title by no other content');
|
||||
should.equal(res.body.posts[0].html, undefined);
|
||||
should.equal(res.body.posts[0].plaintext, undefined);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('Destroy', function () {
|
||||
|
|
|
@ -369,6 +369,50 @@ describe('Posts API (v3)', function () {
|
|||
should.equal(res.body.posts[0].meta_title, 'changed meta title');
|
||||
});
|
||||
});
|
||||
|
||||
it('saving post with no modbiledoc content doesn\t trigger cache invalidation', function () {
|
||||
return request
|
||||
.post(localUtils.API.getApiQuery('posts/'))
|
||||
.set('Origin', config.get('url'))
|
||||
.send({
|
||||
posts: [{
|
||||
title: 'Has a title by no other content',
|
||||
status: 'published'
|
||||
}]
|
||||
})
|
||||
.expect('Content-Type', /json/)
|
||||
.expect('Cache-Control', testUtils.cacheRules.private)
|
||||
.expect(201)
|
||||
.then((res) => {
|
||||
should.exist(res.body.posts);
|
||||
should.exist(res.body.posts[0].title);
|
||||
res.body.posts[0].title.should.equal('Has a title by no other content');
|
||||
should.equal(res.body.posts[0].html, undefined);
|
||||
should.equal(res.body.posts[0].plaintext, undefined);
|
||||
|
||||
return request
|
||||
.put(localUtils.API.getApiQuery(`posts/${res.body.posts[0].id}/`))
|
||||
.set('Origin', config.get('url'))
|
||||
.send({
|
||||
posts: [{
|
||||
title: res.body.posts[0].title,
|
||||
mobilecdoc: res.body.posts[0].mobilecdoc,
|
||||
updated_at: res.body.posts[0].updated_at
|
||||
}]
|
||||
})
|
||||
.expect('Content-Type', /json/)
|
||||
.expect('Cache-Control', testUtils.cacheRules.private)
|
||||
.expect(200);
|
||||
})
|
||||
.then((res) => {
|
||||
should.not.exist(res.headers['x-cache-invalidate']);
|
||||
|
||||
should.exist(res.body.posts);
|
||||
res.body.posts[0].title.should.equal('Has a title by no other content');
|
||||
should.equal(res.body.posts[0].html, undefined);
|
||||
should.equal(res.body.posts[0].plaintext, undefined);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('Destroy', function () {
|
||||
|
|
Loading…
Add table
Reference in a new issue