Ghost/ghost/data-generator/lib/importers/PostsImporter.js
Simon Backx d2cb23c3fa
Wired up Docker setup script and increased data generation performance (#19420)
ref PROD-233

- Stored whether Docker is used in the config files
- When running `yarn setup`, any existing Docker container will be
reset. Run with `-y` to skip the confirmation step.
- `yarn setup` will always init the database and generate fake data
- Increased amount of default generated data to 100,000 members + 500
posts.
- Made lots of performance improvements in the data generator so we can
generate the default data in ±170s
2024-01-05 13:42:30 +00:00

91 lines
3.0 KiB
JavaScript

const {faker} = require('@faker-js/faker');
const {slugify} = require('@tryghost/string');
const {luck} = require('../utils/random');
const TableImporter = require('./TableImporter');
const dateToDatabaseString = require('../utils/database-date');
class PostsImporter extends TableImporter {
static table = 'posts';
static dependencies = ['newsletters'];
defaultQuantity = faker.datatype.number({
min: 80,
max: 120
});
type = 'post';
constructor(knex, transaction) {
super(PostsImporter.table, knex, transaction);
}
async import(quantity = this.defaultQuantity) {
this.newsletters = await this.transaction.select('id').from('newsletters').orderBy('sort_order');
await super.import(quantity);
}
generate() {
const title = faker.lorem.sentence();
const content = faker.lorem.paragraphs(faker.datatype.number({
min: 3,
max: 10
})).split('\n');
const twoYearsAgo = new Date();
twoYearsAgo.setFullYear(twoYearsAgo.getFullYear() - 2);
const twoWeeksFromNow = new Date();
twoWeeksFromNow.setDate(twoWeeksFromNow.getDate() + 14);
const timestamp = faker.date.between(twoYearsAgo, twoWeeksFromNow);
const currentTime = new Date();
let status = 'published';
if (timestamp > currentTime) {
status = 'scheduled';
}
if (luck(5)) {
status = 'draft';
}
if (this.type === 'page') {
status = 'published';
}
const visibility = luck(85) ? 'paid' : luck(10) ? 'members' : 'public';
return {
id: this.fastFakeObjectId(),
created_at: dateToDatabaseString(timestamp),
created_by: '1',
updated_at: dateToDatabaseString(timestamp),
published_at: status === 'published' || status === 'scheduled' ? dateToDatabaseString(faker.date.soon(5, timestamp)) : null,
uuid: faker.datatype.uuid(),
title: title,
type: this.type,
slug: `${slugify(title)}-${faker.random.numeric(3)}`,
status,
visibility,
mobiledoc: JSON.stringify({
version: '0.3.1',
atoms: [],
cards: [],
markups: [['em']],
sections: content.map(paragraph => [
1,
'p',
[
[
0,
[],
0,
paragraph
]
]
])
}),
html: content.map(paragraph => `<p>${paragraph}</p>`).join(''),
email_recipient_filter: 'all',
newsletter_id: this.type === 'post' && status === 'published' && luck(90) ? (visibility === 'paid' ? this.newsletters[0].id : this.newsletters[1].id) : null
};
}
}
module.exports = PostsImporter;