mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-10 23:36:14 -05:00
🐛Fixed image properties to be reset to null after removal (#9432)
closes #9085 Fixes an issue, where the client sets image properties to `""` after deleting the image. This causes problems with the query filter (see https://github.com/TryGhost/GQL/issues/24), as they have to be `null`. Added a check in the model layer saving method to set value to `null`, when the property is empty. Affected models and properties: - `posts`: - `feature_image` - `og_image` - `twitter_image` - `users`: - `profile_image` - `cover_image` - `tags`: - `feature_image`
This commit is contained in:
parent
f692e27a59
commit
1da2eec915
9 changed files with 268 additions and 68 deletions
|
@ -136,6 +136,8 @@ ghostBookshelf.Model = ghostBookshelf.Model.extend({
|
|||
* @returns {*}
|
||||
*/
|
||||
onValidate: function onValidate(model, columns, options) {
|
||||
this.setEmptyValuesToNull();
|
||||
|
||||
return validation.validateSchema(this.tableName, this, options);
|
||||
},
|
||||
|
||||
|
@ -288,6 +290,24 @@ ghostBookshelf.Model = ghostBookshelf.Model.extend({
|
|||
return attrs;
|
||||
},
|
||||
|
||||
// Sets given values to `null`
|
||||
setEmptyValuesToNull: function setEmptyValuesToNull() {
|
||||
var self = this,
|
||||
attr;
|
||||
|
||||
if (!this.emptyStringProperties) {
|
||||
return;
|
||||
}
|
||||
|
||||
attr = this.emptyStringProperties();
|
||||
|
||||
_.each(attr, function (value) {
|
||||
if (self.get(value) === '') {
|
||||
self.set(value, null);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// Get the user from the options object
|
||||
contextUser: function contextUser(options) {
|
||||
options = options || {};
|
||||
|
|
|
@ -302,6 +302,13 @@ Post = ghostBookshelf.Model.extend({
|
|||
return sequence(ops);
|
||||
},
|
||||
|
||||
emptyStringProperties: function emptyStringProperties() {
|
||||
// CASE: the client might send empty image properties with "" instead of setting them to null.
|
||||
// This can cause GQL to fail. We therefore enforce 'null' for empty image properties.
|
||||
// See https://github.com/TryGhost/GQL/issues/24
|
||||
return ['feature_image', 'og_image', 'twitter_image'];
|
||||
},
|
||||
|
||||
onCreating: function onCreating(model, attr, options) {
|
||||
options = options || {};
|
||||
|
||||
|
|
|
@ -49,6 +49,13 @@ Tag = ghostBookshelf.Model.extend({
|
|||
}
|
||||
},
|
||||
|
||||
emptyStringProperties: function emptyStringProperties() {
|
||||
// CASE: the client might send empty image properties with "" instead of setting them to null.
|
||||
// This can cause GQL to fail. We therefore enforce 'null' for empty image properties.
|
||||
// See https://github.com/TryGhost/GQL/issues/24
|
||||
return ['feature_image'];
|
||||
},
|
||||
|
||||
posts: function posts() {
|
||||
return this.belongsToMany('Post');
|
||||
},
|
||||
|
|
|
@ -211,6 +211,13 @@ User = ghostBookshelf.Model.extend({
|
|||
return attrs;
|
||||
},
|
||||
|
||||
emptyStringProperties: function emptyStringProperties() {
|
||||
// CASE: the client might send empty image properties with "" instead of setting them to null.
|
||||
// This can cause GQL to fail. We therefore enforce 'null' for empty image properties.
|
||||
// See https://github.com/TryGhost/GQL/issues/24
|
||||
return ['profile_image', 'cover_image'];
|
||||
},
|
||||
|
||||
format: function format(options) {
|
||||
if (!_.isEmpty(options.website) &&
|
||||
!validator.isURL(options.website, {
|
||||
|
|
42
core/test/unit/models/base/index_spec.js
Normal file
42
core/test/unit/models/base/index_spec.js
Normal file
|
@ -0,0 +1,42 @@
|
|||
'use strict';
|
||||
|
||||
var should = require('should'),
|
||||
sinon = require('sinon'),
|
||||
_ = require('lodash'),
|
||||
models = require('../../../../server/models'),
|
||||
ghostBookshelf,
|
||||
testUtils = require('../../../utils'),
|
||||
|
||||
sandbox = sinon.sandbox.create();
|
||||
|
||||
describe('Models: base', function () {
|
||||
before(function () {
|
||||
models.init();
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
sandbox.restore();
|
||||
});
|
||||
|
||||
describe('setEmptyValuesToNull', function () {
|
||||
it('resets given empty value to null', function () {
|
||||
const base = models.Base.Model.forge({a: '', b: ''});
|
||||
|
||||
base.emptyStringProperties = sandbox.stub();
|
||||
base.emptyStringProperties.returns(['a']);
|
||||
|
||||
base.get('a').should.eql('');
|
||||
base.get('b').should.eql('');
|
||||
base.setEmptyValuesToNull();
|
||||
should.not.exist(base.get('a'));
|
||||
base.get('b').should.eql('');
|
||||
});
|
||||
|
||||
it('does not reset to null if model does\'t provide properties', function () {
|
||||
const base = models.Base.Model.forge({a: ''});
|
||||
base.get('a').should.eql('');
|
||||
base.setEmptyValuesToNull();
|
||||
base.get('a').should.eql('');
|
||||
});
|
||||
});
|
||||
});
|
|
@ -1,16 +1,49 @@
|
|||
'use strict';
|
||||
|
||||
var should = require('should'), // jshint ignore:line
|
||||
sinon = require('sinon'),
|
||||
models = require('../../../server/models'),
|
||||
common = require('../../../server/lib/common'),
|
||||
utils = require('../../utils'),
|
||||
|
||||
testUtils = require('../../utils'),
|
||||
sandbox = sinon.sandbox.create();
|
||||
|
||||
describe('Models: Post', function () {
|
||||
describe('Unit: models/post', function () {
|
||||
before(function () {
|
||||
models.init();
|
||||
});
|
||||
|
||||
after(function () {
|
||||
sandbox.restore();
|
||||
});
|
||||
|
||||
describe('Edit', function () {
|
||||
let knexMock;
|
||||
|
||||
before(function () {
|
||||
knexMock = new testUtils.mocks.knex();
|
||||
knexMock.mock();
|
||||
});
|
||||
|
||||
after(function () {
|
||||
knexMock.unmock();
|
||||
});
|
||||
|
||||
it('resets given empty value to null', function () {
|
||||
return models.Post.findOne({slug: 'html-ipsum'})
|
||||
.then(function (post) {
|
||||
post.get('slug').should.eql('html-ipsum');
|
||||
post.get('feature_image').should.eql('https://example.com/super_photo.jpg');
|
||||
post.set('feature_image', '');
|
||||
post.set('custom_excerpt', '');
|
||||
return post.save();
|
||||
})
|
||||
.then(function (post) {
|
||||
should(post.get('feature_image')).be.null();
|
||||
post.get('custom_excerpt').should.eql('');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('Permissible', function () {
|
||||
describe('As Contributor', function () {
|
||||
describe('Editing', function () {
|
||||
|
@ -29,7 +62,7 @@ describe('Models: Post', function () {
|
|||
'edit',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.contributor,
|
||||
testUtils.permissions.contributor,
|
||||
false,
|
||||
false
|
||||
).then(() => {
|
||||
|
@ -56,7 +89,7 @@ describe('Models: Post', function () {
|
|||
'edit',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.contributor,
|
||||
testUtils.permissions.contributor,
|
||||
false,
|
||||
true
|
||||
).then(() => {
|
||||
|
@ -83,7 +116,7 @@ describe('Models: Post', function () {
|
|||
'edit',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.contributor,
|
||||
testUtils.permissions.contributor,
|
||||
false,
|
||||
true
|
||||
).then(() => {
|
||||
|
@ -110,7 +143,7 @@ describe('Models: Post', function () {
|
|||
'edit',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.contributor,
|
||||
testUtils.permissions.contributor,
|
||||
false,
|
||||
true
|
||||
).then(() => {
|
||||
|
@ -137,7 +170,7 @@ describe('Models: Post', function () {
|
|||
'edit',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.contributor,
|
||||
testUtils.permissions.contributor,
|
||||
false,
|
||||
true
|
||||
).then((result) => {
|
||||
|
@ -161,7 +194,7 @@ describe('Models: Post', function () {
|
|||
'add',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.contributor,
|
||||
testUtils.permissions.contributor,
|
||||
false,
|
||||
true
|
||||
).then(() => {
|
||||
|
@ -185,7 +218,7 @@ describe('Models: Post', function () {
|
|||
'add',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.contributor,
|
||||
testUtils.permissions.contributor,
|
||||
false,
|
||||
true
|
||||
).then(() => {
|
||||
|
@ -209,7 +242,7 @@ describe('Models: Post', function () {
|
|||
'add',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.contributor,
|
||||
testUtils.permissions.contributor,
|
||||
false,
|
||||
true
|
||||
).then((result) => {
|
||||
|
@ -234,7 +267,7 @@ describe('Models: Post', function () {
|
|||
'destroy',
|
||||
context,
|
||||
{},
|
||||
utils.permissions.contributor,
|
||||
testUtils.permissions.contributor,
|
||||
false,
|
||||
true
|
||||
).then(() => {
|
||||
|
@ -260,7 +293,7 @@ describe('Models: Post', function () {
|
|||
'destroy',
|
||||
context,
|
||||
{},
|
||||
utils.permissions.contributor,
|
||||
testUtils.permissions.contributor,
|
||||
false,
|
||||
true
|
||||
).then(() => {
|
||||
|
@ -286,7 +319,7 @@ describe('Models: Post', function () {
|
|||
'destroy',
|
||||
context,
|
||||
{},
|
||||
utils.permissions.contributor,
|
||||
testUtils.permissions.contributor,
|
||||
false,
|
||||
true
|
||||
).then((result) => {
|
||||
|
@ -314,7 +347,7 @@ describe('Models: Post', function () {
|
|||
'edit',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.author,
|
||||
testUtils.permissions.author,
|
||||
false,
|
||||
true
|
||||
).then(() => {
|
||||
|
@ -340,7 +373,7 @@ describe('Models: Post', function () {
|
|||
'edit',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.author,
|
||||
testUtils.permissions.author,
|
||||
false,
|
||||
true
|
||||
).then(() => {
|
||||
|
@ -366,7 +399,7 @@ describe('Models: Post', function () {
|
|||
'edit',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.author,
|
||||
testUtils.permissions.author,
|
||||
false,
|
||||
true
|
||||
).then(() => {
|
||||
|
@ -388,7 +421,7 @@ describe('Models: Post', function () {
|
|||
'add',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.author,
|
||||
testUtils.permissions.author,
|
||||
false,
|
||||
true
|
||||
).then(() => {
|
||||
|
@ -412,7 +445,7 @@ describe('Models: Post', function () {
|
|||
'add',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.author,
|
||||
testUtils.permissions.author,
|
||||
false,
|
||||
true
|
||||
).then(() => {
|
||||
|
@ -437,7 +470,7 @@ describe('Models: Post', function () {
|
|||
'edit',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.editor,
|
||||
testUtils.permissions.editor,
|
||||
false,
|
||||
true
|
||||
).then(() => {
|
||||
|
@ -463,7 +496,7 @@ describe('Models: Post', function () {
|
|||
'edit',
|
||||
context,
|
||||
unsafeAttrs,
|
||||
utils.permissions.editor,
|
||||
testUtils.permissions.editor,
|
||||
true,
|
||||
true
|
||||
).then(() => {
|
||||
|
|
45
core/test/unit/models/tag_spec.js
Normal file
45
core/test/unit/models/tag_spec.js
Normal file
|
@ -0,0 +1,45 @@
|
|||
'use strict';
|
||||
|
||||
var should = require('should'), // jshint ignore:line
|
||||
sinon = require('sinon'),
|
||||
models = require('../../../server/models'),
|
||||
testUtils = require('../../utils'),
|
||||
sandbox = sinon.sandbox.create();
|
||||
|
||||
describe('Unit: models/tags', function () {
|
||||
before(function () {
|
||||
models.init();
|
||||
});
|
||||
|
||||
after(function () {
|
||||
sandbox.restore();
|
||||
});
|
||||
|
||||
describe('Edit', function () {
|
||||
let knexMock;
|
||||
|
||||
before(function () {
|
||||
knexMock = new testUtils.mocks.knex();
|
||||
knexMock.mock();
|
||||
});
|
||||
|
||||
after(function () {
|
||||
knexMock.unmock();
|
||||
});
|
||||
|
||||
it('resets given empty value to null', function () {
|
||||
return models.Tag.findOne({slug: 'kitchen-sink'})
|
||||
.then(function (tag) {
|
||||
tag.get('slug').should.eql('kitchen-sink');
|
||||
tag.get('feature_image').should.eql('https://example.com/super_photo.jpg');
|
||||
tag.set('feature_image', '');
|
||||
tag.set('description', '');
|
||||
return tag.save();
|
||||
})
|
||||
.then(function (tag) {
|
||||
should(tag.get('feature_image')).be.null();
|
||||
tag.get('description').should.eql('');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
|
@ -308,4 +308,40 @@ describe('Unit: models/user', function () {
|
|||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('Edit', function () {
|
||||
let knexMock;
|
||||
|
||||
before(function () {
|
||||
models.init();
|
||||
});
|
||||
|
||||
after(function () {
|
||||
sandbox.restore();
|
||||
});
|
||||
|
||||
before(function () {
|
||||
knexMock = new testUtils.mocks.knex();
|
||||
knexMock.mock();
|
||||
});
|
||||
|
||||
after(function () {
|
||||
knexMock.unmock();
|
||||
});
|
||||
|
||||
it('resets given empty value to null', function () {
|
||||
return models.User.findOne({slug: 'joe-bloggs'})
|
||||
.then(function (user) {
|
||||
user.get('slug').should.eql('joe-bloggs');
|
||||
user.get('profile_image').should.eql('https://example.com/super_photo.jpg');
|
||||
user.set('profile_image', '');
|
||||
user.set('bio', '');
|
||||
return user.save();
|
||||
})
|
||||
.then(function (user) {
|
||||
should(user.get('profile_image')).be.null();
|
||||
user.get('bio').should.eql('');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -28,66 +28,67 @@ DataGenerator.Content = {
|
|||
posts: [
|
||||
{
|
||||
id: ObjectId.generate(),
|
||||
title: "HTML Ipsum",
|
||||
slug: "html-ipsum",
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc("<h1>HTML Ipsum Presents</h1><p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. <em>Aenean ultricies mi vitae est.</em> Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, <code>commodo vitae</code>, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. <a href=\\\"#\\\">Donec non enim</a> in turpis pulvinar facilisis. Ut felis.</p><h2>Header Level 2</h2><ol><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ol><blockquote><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est.</p></blockquote><h3>Header Level 3</h3><ul><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ul><pre><code>#header h1 a{display: block;width: 300px;height: 80px;}</code></pre>"),
|
||||
published_at: new Date("2015-01-01"),
|
||||
custom_excerpt: 'This is my custom excerpt!'
|
||||
title: 'HTML Ipsum',
|
||||
slug: 'html-ipsum',
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc('<h1>HTML Ipsum Presents</h1><p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. <em>Aenean ultricies mi vitae est.</em> Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, <code>commodo vitae</code>, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. <a href=\\\"#\\\">Donec non enim</a> in turpis pulvinar facilisis. Ut felis.</p><h2>Header Level 2</h2><ol><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ol><blockquote><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est.</p></blockquote><h3>Header Level 3</h3><ul><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ul><pre><code>#header h1 a{display: block;width: 300px;height: 80px;}</code></pre>'),
|
||||
published_at: new Date('2015-01-01'),
|
||||
custom_excerpt: 'This is my custom excerpt!',
|
||||
feature_image: 'https://example.com/super_photo.jpg'
|
||||
},
|
||||
{
|
||||
id: ObjectId.generate(),
|
||||
title: "Ghostly Kitchen Sink",
|
||||
slug: "ghostly-kitchen-sink",
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc("<h1>HTML Ipsum Presents</h1><p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. <em>Aenean ultricies mi vitae est.</em> Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, <code>commodo vitae</code>, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. <a href=\\\"#\\\">Donec non enim</a> in turpis pulvinar facilisis. Ut felis.</p><h2>Header Level 2</h2><ol><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ol><blockquote><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est.</p></blockquote><h3>Header Level 3</h3><ul><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ul><pre><code>#header h1 a{display: block;width: 300px;height: 80px;}</code></pre>"),
|
||||
published_at: new Date("2015-01-02")
|
||||
title: 'Ghostly Kitchen Sink',
|
||||
slug: 'ghostly-kitchen-sink',
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc('<h1>HTML Ipsum Presents</h1><p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. <em>Aenean ultricies mi vitae est.</em> Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, <code>commodo vitae</code>, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. <a href=\\\"#\\\">Donec non enim</a> in turpis pulvinar facilisis. Ut felis.</p><h2>Header Level 2</h2><ol><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ol><blockquote><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est.</p></blockquote><h3>Header Level 3</h3><ul><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ul><pre><code>#header h1 a{display: block;width: 300px;height: 80px;}</code></pre>'),
|
||||
published_at: new Date('2015-01-02')
|
||||
},
|
||||
{
|
||||
id: ObjectId.generate(),
|
||||
title: "Short and Sweet",
|
||||
slug: "short-and-sweet",
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc("## testing\n\nmctesters\n\n- test\n- line\n- items"),
|
||||
html: "<div class=\"kg-card-markdown\"><h2 id=\"testing\">testing</h2>\n<p>mctesters</p>\n<ul>\n<li>test</li>\n<li>line</li>\n<li>items</li>\n</ul>\n</div>",
|
||||
feature_image: "http://placekitten.com/500/200",
|
||||
meta_description: "test stuff",
|
||||
published_at: new Date("2015-01-03"),
|
||||
uuid: "2ac6b4f6-e1f3-406c-9247-c94a0496d39d"
|
||||
title: 'Short and Sweet',
|
||||
slug: 'short-and-sweet',
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc('## testing\n\nmctesters\n\n- test\n- line\n- items'),
|
||||
html: '<div class=\"kg-card-markdown\"><h2 id=\"testing\">testing</h2>\n<p>mctesters</p>\n<ul>\n<li>test</li>\n<li>line</li>\n<li>items</li>\n</ul>\n</div>',
|
||||
feature_image: 'http://placekitten.com/500/200',
|
||||
meta_description: 'test stuff',
|
||||
published_at: new Date('2015-01-03'),
|
||||
uuid: '2ac6b4f6-e1f3-406c-9247-c94a0496d39d'
|
||||
},
|
||||
{
|
||||
id: ObjectId.generate(),
|
||||
title: "Not finished yet",
|
||||
slug: "unfinished",
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc("<h1>HTML Ipsum Presents</h1><p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. <em>Aenean ultricies mi vitae est.</em> Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, <code>commodo vitae</code>, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. <a href=\\\"#\\\">Donec non enim</a> in turpis pulvinar facilisis. Ut felis.</p><h2>Header Level 2</h2><ol><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ol><blockquote><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est.</p></blockquote><h3>Header Level 3</h3><ul><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ul><pre><code>#header h1 a{display: block;width: 300px;height: 80px;}</code></pre>"),
|
||||
status: "draft",
|
||||
uuid: "d52c42ae-2755-455c-80ec-70b2ec55c903",
|
||||
title: 'Not finished yet',
|
||||
slug: 'unfinished',
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc('<h1>HTML Ipsum Presents</h1><p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. <em>Aenean ultricies mi vitae est.</em> Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, <code>commodo vitae</code>, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. <a href=\\\"#\\\">Donec non enim</a> in turpis pulvinar facilisis. Ut felis.</p><h2>Header Level 2</h2><ol><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ol><blockquote><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est.</p></blockquote><h3>Header Level 3</h3><ul><li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li><li>Aliquam tincidunt mauris eu risus.</li></ul><pre><code>#header h1 a{display: block;width: 300px;height: 80px;}</code></pre>'),
|
||||
status: 'draft',
|
||||
uuid: 'd52c42ae-2755-455c-80ec-70b2ec55c903',
|
||||
featured: false
|
||||
},
|
||||
{
|
||||
id: ObjectId.generate(),
|
||||
title: "Not so short, bit complex",
|
||||
slug: "not-so-short-bit-complex",
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc("<p><nav><ul><li><a href=\"#nowhere\" title=\"Anchor URL\">Lorem</a></li><li><a href=\"/about#nowhere\" title=\"Relative URL\">Aliquam</a></li><li><a href=\"//somewhere.com/link#nowhere\" title=\"Protocol Relative URL\">Tortor</a></li><li><a href=\"http://somewhere.com/link#nowhere\" title=\"Absolute URL\">Morbi</a></li><li><a href=\"#nowhere\" title=\"Praesent dapibus, neque id cursus faucibus\">Praesent</a></li><li><a href=\"#nowhere\" title=\"Pellentesque fermentum dolor\">Pellentesque</a></li></ul></nav><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p><table><thead><tr><th>1</th><th>2</th><th>3</th><th>4</th></tr></thead><tbody><tr><td>a</td><td>b</td><td>c</td><td>d</td></tr><tr><td>e</td><td>f</td><td>g</td><td>h</td></tr><tr><td>i</td><td>j</td><td>k</td><td>l</td></tr></tbody></table><dl><dt>Definition list</dt><dd>Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</dd><dt>Lorem ipsum dolor sit amet</dt><dd>Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</dd></dl><ul><li>Morbi in sem quis dui placerat ornare. Pellentesque odio nisi, euismod in, pharetra a, ultricies in, diam. Sed arcu. Cras consequat.</li><li>Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus.</li><li>Phasellus ultrices nulla quis nibh. Quisque a lectus. Donec consectetuer ligula vulputate sem tristique cursus. Nam nulla quam, gravida non, commodo a, sodales sit amet, nisi.</li><li>Pellentesque fermentum dolor. Aliquam quam lectus, facilisis auctor, ultrices ut, elementum vulputate, nunc.</li></ul></p>")
|
||||
title: 'Not so short, bit complex',
|
||||
slug: 'not-so-short-bit-complex',
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc('<p><nav><ul><li><a href=\"#nowhere\" title=\"Anchor URL\">Lorem</a></li><li><a href=\"/about#nowhere\" title=\"Relative URL\">Aliquam</a></li><li><a href=\"//somewhere.com/link#nowhere\" title=\"Protocol Relative URL\">Tortor</a></li><li><a href=\"http://somewhere.com/link#nowhere\" title=\"Absolute URL\">Morbi</a></li><li><a href=\"#nowhere\" title=\"Praesent dapibus, neque id cursus faucibus\">Praesent</a></li><li><a href=\"#nowhere\" title=\"Pellentesque fermentum dolor\">Pellentesque</a></li></ul></nav><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p><table><thead><tr><th>1</th><th>2</th><th>3</th><th>4</th></tr></thead><tbody><tr><td>a</td><td>b</td><td>c</td><td>d</td></tr><tr><td>e</td><td>f</td><td>g</td><td>h</td></tr><tr><td>i</td><td>j</td><td>k</td><td>l</td></tr></tbody></table><dl><dt>Definition list</dt><dd>Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</dd><dt>Lorem ipsum dolor sit amet</dt><dd>Consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</dd></dl><ul><li>Morbi in sem quis dui placerat ornare. Pellentesque odio nisi, euismod in, pharetra a, ultricies in, diam. Sed arcu. Cras consequat.</li><li>Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus.</li><li>Phasellus ultrices nulla quis nibh. Quisque a lectus. Donec consectetuer ligula vulputate sem tristique cursus. Nam nulla quam, gravida non, commodo a, sodales sit amet, nisi.</li><li>Pellentesque fermentum dolor. Aliquam quam lectus, facilisis auctor, ultrices ut, elementum vulputate, nunc.</li></ul></p>')
|
||||
},
|
||||
{
|
||||
id: ObjectId.generate(),
|
||||
title: "This is a static page",
|
||||
slug: "static-page-test",
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc("<h1>Static page test is what this is for.</h1><p>Hopefully you don't find it a bore.</p>"),
|
||||
title: 'This is a static page',
|
||||
slug: 'static-page-test',
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc('<h1>Static page test is what this is for.</h1><p>Hopefully you don\'t find it a bore.</p>'),
|
||||
page: 1
|
||||
},
|
||||
{
|
||||
id: ObjectId.generate(),
|
||||
title: "This is a draft static page",
|
||||
slug: "static-page-draft",
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc("<h1>Static page test is what this is for.</h1><p>Hopefully you don't find it a bore.</p>"),
|
||||
title: 'This is a draft static page',
|
||||
slug: 'static-page-draft',
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc('<h1>Static page test is what this is for.</h1><p>Hopefully you don\'t find it a bore.</p>'),
|
||||
page: 1,
|
||||
status: "draft"
|
||||
status: 'draft'
|
||||
},
|
||||
{
|
||||
id: ObjectId.generate(),
|
||||
title: "This is a scheduled post!!",
|
||||
slug: "scheduled-post",
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc("<h1>Welcome to my invisible post!</h1>"),
|
||||
status: "scheduled",
|
||||
title: 'This is a scheduled post!!',
|
||||
slug: 'scheduled-post',
|
||||
mobiledoc: DataGenerator.markdownToMobiledoc('<h1>Welcome to my invisible post!</h1>'),
|
||||
status: 'scheduled',
|
||||
published_at: moment().add(2, 'days').toDate()
|
||||
}
|
||||
],
|
||||
|
@ -95,28 +96,29 @@ DataGenerator.Content = {
|
|||
tags: [
|
||||
{
|
||||
id: ObjectId.generate(),
|
||||
name: "kitchen sink",
|
||||
slug: "kitchen-sink"
|
||||
name: 'kitchen sink',
|
||||
slug: 'kitchen-sink',
|
||||
feature_image: 'https://example.com/super_photo.jpg'
|
||||
},
|
||||
{
|
||||
id: ObjectId.generate(),
|
||||
name: "bacon",
|
||||
slug: "bacon"
|
||||
name: 'bacon',
|
||||
slug: 'bacon'
|
||||
},
|
||||
{
|
||||
id: ObjectId.generate(),
|
||||
name: "chorizo",
|
||||
slug: "chorizo"
|
||||
name: 'chorizo',
|
||||
slug: 'chorizo'
|
||||
},
|
||||
{
|
||||
id: ObjectId.generate(),
|
||||
name: "pollo",
|
||||
slug: "pollo"
|
||||
name: 'pollo',
|
||||
slug: 'pollo'
|
||||
},
|
||||
{
|
||||
id: ObjectId.generate(),
|
||||
name: "injection",
|
||||
slug: "injection"
|
||||
name: 'injection',
|
||||
slug: 'injection'
|
||||
}
|
||||
],
|
||||
|
||||
|
@ -128,7 +130,8 @@ DataGenerator.Content = {
|
|||
name: 'Joe Bloggs',
|
||||
slug: 'joe-bloggs',
|
||||
email: 'jbloggs@example.com',
|
||||
password: '$2b$10$ujPIlqjTsYwfc2/zrqZXZ.yd7cQQm2iOkAFenTAJfveKkc23nwdeS'
|
||||
password: '$2b$10$ujPIlqjTsYwfc2/zrqZXZ.yd7cQQm2iOkAFenTAJfveKkc23nwdeS',
|
||||
profile_image: 'https://example.com/super_photo.jpg'
|
||||
},
|
||||
{
|
||||
// admin
|
||||
|
|
Loading…
Add table
Reference in a new issue