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: faker.database.mongodbObjectId(), created_at: dateToDatabaseString(timestamp), created_by: '1', updated_at: dateToDatabaseString(timestamp), published_at: status === 'published' ? 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 => `

${paragraph}

`).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;