0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-01-27 22:49:56 -05:00

Added --clear-database option to make it easier to use the data generator

no issue
This commit is contained in:
Sam Lord 2023-02-16 12:11:00 +00:00
parent f8e77ad012
commit b8f59f07f2
29 changed files with 121 additions and 56 deletions

View file

@ -9,6 +9,7 @@ module.exports = class DataGeneratorCommand extends Command {
this.argument('--scale', {type: 'string', defaultValue: 'small', desc: 'Scale of the data to generate. `small` for a quick run, `large` for more content'});
this.argument('--single-table', {type: 'string', desc: 'Import a single table'});
this.argument('--quantity', {type: 'number', desc: 'When importing a single table, the quantity to import'});
this.argument('--clear-database', {type: 'boolean', defaultValue: false, desc: 'Clear all entries in the database before importing'});
}
initializeContext(context) {
@ -55,7 +56,8 @@ module.exports = class DataGeneratorCommand extends Command {
debug: this.debug
},
modelQuantities,
baseUrl: config.getSiteUrl()
baseUrl: config.getSiteUrl(),
clearDatabase: argv['clear-database']
});
try {
if (argv['single-table']) {

View file

@ -1,31 +1,32 @@
const tables = require('./tables');
// Order here does not matter
const {
PostsImporter,
NewslettersImporter,
PostsImporter,
UsersImporter,
PostsAuthorsImporter,
TagsImporter,
PostsTagsImporter,
ProductsImporter,
MembersImporter,
BenefitsImporter,
MentionsImporter,
PostsAuthorsImporter,
PostsTagsImporter,
ProductsBenefitsImporter,
MembersProductsImporter,
PostsProductsImporter,
MembersNewslettersImporter,
MembersCreatedEventsImporter,
MembersLoginEventsImporter,
MembersStatusEventsImporter,
StripeProductsImporter,
StripePricesImporter,
SubscriptionsImporter,
EmailsImporter,
MembersCreatedEventsImporter,
MembersLoginEventsImporter,
MembersStatusEventsImporter,
MembersSubscribeEventsImporter,
MembersSubscriptionCreatedEventsImporter,
MembersStripeCustomersImporter,
MembersStripeCustomersSubscriptionsImporter,
MembersPaidSubscriptionEventsImporter,
MembersSubscriptionCreatedEventsImporter,
MembersSubscribeEventsImporter,
MentionsImporter,
EmailsImporter
MembersPaidSubscriptionEventsImporter
} = tables;
const path = require('path');
const fs = require('fs/promises');
@ -41,6 +42,7 @@ const {getProcessRoot} = require('@tryghost/root-utils');
* @property {Object} logger
* @property {Object} modelQuantities
* @property {string} baseUrl
* @property {boolean} clearDatabase
*/
const defaultQuantities = {
@ -66,7 +68,8 @@ class DataGenerator {
schema,
logger,
modelQuantities = {},
baseUrl
baseUrl,
clearDatabase
}) {
this.useBaseData = baseDataPack !== '';
this.baseDataPack = baseDataPack;
@ -75,10 +78,29 @@ class DataGenerator {
this.logger = logger;
this.modelQuantities = Object.assign({}, defaultQuantities, modelQuantities);
this.baseUrl = baseUrl;
this.clearDatabase = clearDatabase;
}
async importData() {
const transaction = await this.knex.transaction();
if (this.clearDatabase) {
this.logger.info('Clearing existing database');
// List of tables ordered to avoid dependencies when deleting
const tableNames = Object.values(tables).map(importer => importer.table).reverse();
for (const table of tableNames) {
this.logger.debug(`Clearing table ${table}`);
if (table === 'users') {
// Avoid deleting the admin user
await transaction(table).del().whereNot('id', '1');
continue;
}
await transaction.raw(`delete from ${table}`);
}
this.logger.info('Finished clearing database');
}
this.logger.info('Starting import process, this has two parts: base data and member data. It can take a while...');
const usersImporter = new UsersImporter(transaction);
@ -111,7 +133,6 @@ class DataGenerator {
const jsonImporter = new JsonImporter(transaction);
// Must have at least 2 in base data set
await transaction('newsletters').delete();
newsletters = await jsonImporter.import({
name: 'newsletters',
data: baseData.newsletters,
@ -119,11 +140,6 @@ class DataGenerator {
});
newsletters.sort((a, b) => a.sort_order - b.sort_order);
await transaction('posts_authors').delete();
await transaction('posts_tags').delete();
await transaction('posts_meta').delete();
await transaction('posts').delete();
const postsImporter = new PostsImporter(transaction, {
newsletters
});
@ -134,13 +150,11 @@ class DataGenerator {
await postsImporter.addNewsletters({posts});
posts = await transaction.select('id', 'newsletter_id', 'published_at', 'slug').from('posts');
await transaction('tags').delete();
tags = await jsonImporter.import({
name: 'tags',
data: baseData.tags
});
await transaction('products').delete();
products = await jsonImporter.import({
name: 'products',
data: baseData.products,

View file

@ -4,8 +4,10 @@ const {slugify} = require('@tryghost/string');
const {blogStartDate} = require('../utils/blog-info');
class BenefitsImporter extends TableImporter {
static table = 'benefits';
constructor(knex) {
super('benefits', knex);
super(BenefitsImporter.table, knex);
}
generate() {

View file

@ -5,8 +5,10 @@ const {luck} = require('../utils/random');
const dateToDatabaseString = require('../utils/database-date');
class EmailsImporter extends TableImporter {
static table = 'emails';
constructor(knex, {newsletters, members, membersSubscribeEvents}) {
super('emails', knex);
super(EmailsImporter.table, knex);
this.newsletters = newsletters;
this.members = members;
this.membersSubscribeEvents = membersSubscribeEvents;

View file

@ -1,28 +1,29 @@
// Order matters! Ordered so that dependant tables are after their dependencies
module.exports = {
PostsImporter: require('./posts'),
NewslettersImporter: require('./newsletters'),
PostsImporter: require('./posts'),
UsersImporter: require('./users'),
PostsAuthorsImporter: require('./posts-authors'),
TagsImporter: require('./tags'),
PostsTagsImporter: require('./posts-tags'),
ProductsImporter: require('./products'),
MembersImporter: require('./members'),
BenefitsImporter: require('./benefits'),
MentionsImporter: require('./mentions'),
PostsAuthorsImporter: require('./posts-authors'),
PostsTagsImporter: require('./posts-tags'),
ProductsBenefitsImporter: require('./products-benefits'),
MembersProductsImporter: require('./members-products'),
PostsProductsImporter: require('./posts-products'),
MembersNewslettersImporter: require('./members-newsletters'),
MembersCreatedEventsImporter: require('./members-created-events'),
MembersLoginEventsImporter: require('./members-login-events'),
MembersStatusEventsImporter: require('./members-status-events'),
StripeProductsImporter: require('./stripe-products'),
StripePricesImporter: require('./stripe-prices'),
SubscriptionsImporter: require('./subscriptions'),
EmailsImporter: require('./emails'),
MembersCreatedEventsImporter: require('./members-created-events'),
MembersLoginEventsImporter: require('./members-login-events'),
MembersStatusEventsImporter: require('./members-status-events'),
MembersStripeCustomersImporter: require('./members-stripe-customers'),
MembersStripeCustomersSubscriptionsImporter: require('./members-stripe-customers-subscriptions'),
MembersPaidSubscriptionEventsImporter: require('./members-paid-subscription-events'),
MembersSubscriptionCreatedEventsImporter: require('./members-subscription-created-events'),
MembersSubscribeEventsImporter: require('./members-subscribe-events'),
MentionsImporter: require('./mentions'),
EmailsImporter: require('./emails')
MembersSubscribeEventsImporter: require('./members-subscribe-events')
};

View file

@ -3,8 +3,10 @@ const {faker} = require('@faker-js/faker');
const {luck} = require('../utils/random');
class MembersCreatedEventsImporter extends TableImporter {
static table = 'members_created_events';
constructor(knex) {
super('members_created_events', knex);
super(MembersCreatedEventsImporter.table, knex);
}
setImportOptions({model}) {

View file

@ -5,8 +5,10 @@ const generateEvents = require('../utils/event-generator');
const dateToDatabaseString = require('../utils/database-date');
class MembersLoginEventsImporter extends TableImporter {
static table = 'members_login_events';
constructor(knex) {
super('members_login_events', knex);
super(MembersLoginEventsImporter.table, knex);
}
setImportOptions({model}) {

View file

@ -2,8 +2,10 @@ const {faker} = require('@faker-js/faker');
const TableImporter = require('./base');
class MembersNewslettersImporter extends TableImporter {
static table = 'members_newsletters';
constructor(knex) {
super('members_newsletters', knex);
super(MembersNewslettersImporter.table, knex);
}
setImportOptions({model}) {

View file

@ -2,8 +2,10 @@ const TableImporter = require('./base');
const {faker} = require('@faker-js/faker');
class MembersPaidSubscriptionEventsImporter extends TableImporter {
static table = 'members_paid_subscription_events';
constructor(knex, {membersStripeCustomersSubscriptions}) {
super('members_paid_subscription_events', knex);
super(MembersPaidSubscriptionEventsImporter.table, knex);
this.membersStripeCustomersSubscriptions = membersStripeCustomersSubscriptions;
}

View file

@ -3,8 +3,9 @@ const TableImporter = require('./base');
const {luck} = require('../utils/random');
class MembersProductsImporter extends TableImporter {
static table = 'members_products';
constructor(knex, {products}) {
super('members_products', knex);
super(MembersProductsImporter.table, knex);
this.products = products;
}

View file

@ -3,8 +3,10 @@ const {faker} = require('@faker-js/faker');
const dateToDatabaseString = require('../utils/database-date');
class MembersStatusEventsImporter extends TableImporter {
static table = 'members_status_events';
constructor(knex) {
super('members_status_events', knex);
super(MembersStatusEventsImporter.table, knex);
}
setImportOptions({model}) {

View file

@ -2,8 +2,10 @@ const {faker} = require('@faker-js/faker');
const TableImporter = require('./base');
class MembersStripeCustomersSubscriptionsImporter extends TableImporter {
static table = 'members_stripe_customers_subscriptions';
constructor(knex, {membersStripeCustomers, products, stripeProducts, stripePrices}) {
super('members_stripe_customers_subscriptions', knex);
super(MembersStripeCustomersSubscriptionsImporter.table, knex);
this.membersStripeCustomers = membersStripeCustomers;
this.products = products;
this.stripeProducts = stripeProducts;

View file

@ -2,8 +2,10 @@ const {faker} = require('@faker-js/faker');
const TableImporter = require('./base');
class MembersStripeCustomersImporter extends TableImporter {
static table = 'members_stripe_customers';
constructor(knex) {
super('members_stripe_customers', knex);
super(MembersStripeCustomersImporter.table, knex);
}
setImportOptions({model}) {

View file

@ -4,8 +4,9 @@ const {luck} = require('../utils/random');
const dateToDatabaseString = require('../utils/database-date');
class MembersSubscribeEventsImporter extends TableImporter {
static table = 'members_subscribe_events';
constructor(knex, {newsletters, subscriptions}) {
super('members_subscribe_events', knex);
super(MembersSubscribeEventsImporter.table, knex);
this.newsletters = newsletters;
this.subscriptions = subscriptions;
}

View file

@ -2,8 +2,10 @@ const TableImporter = require('./base');
const {faker} = require('@faker-js/faker');
class MembersSubscriptionCreatedEventsImporter extends TableImporter {
static table = 'members_subscription_created_events';
constructor(knex, {subscriptions}) {
super('members_subscription_created_events', knex);
super(MembersSubscriptionCreatedEventsImporter.table, knex);
this.subscriptions = subscriptions;
}

View file

@ -7,8 +7,10 @@ const {luck} = require('../utils/random');
const dateToDatabaseString = require('../utils/database-date');
class MembersImporter extends TableImporter {
static table = 'members';
constructor(knex) {
super('members', knex);
super(MembersImporter.table, knex);
}
setImportOptions({amount}) {

View file

@ -5,8 +5,10 @@ const {luck} = require('../utils/random');
const dateToDatabaseString = require('../utils/database-date');
class WebMentionsImporter extends TableImporter {
static table = 'mentions';
constructor(knex, {baseUrl}) {
super('mentions', knex);
super(WebMentionsImporter.table, knex);
this.baseUrl = baseUrl;
}

View file

@ -4,8 +4,10 @@ const {faker} = require('@faker-js/faker');
const {slugify} = require('@tryghost/string');
class NewslettersImporter extends TableImporter {
static table = 'newsletters';
constructor(knex) {
super('newsletters', knex);
super(NewslettersImporter.table, knex);
this.sortOrder = 0;
this.names = ['Regular premium', 'Occasional freebie'];
}

View file

@ -2,8 +2,10 @@ const {faker} = require('@faker-js/faker');
const TableImporter = require('./base');
class PostsAuthorsImporter extends TableImporter {
static table = 'posts_authors';
constructor(knex, {users}) {
super('posts_authors', knex);
super(PostsAuthorsImporter.table, knex);
this.users = users;
this.sortOrder = 0;
}

View file

@ -2,8 +2,10 @@ const {faker} = require('@faker-js/faker');
const TableImporter = require('./base');
class PostsProductsImporter extends TableImporter {
static table = 'posts_products';
constructor(knex, {products}) {
super('posts_products', knex);
super(PostsProductsImporter.table, knex);
this.products = products;
}

View file

@ -2,8 +2,9 @@ const {faker} = require('@faker-js/faker');
const TableImporter = require('./base');
class PostsTagsImporter extends TableImporter {
static table = 'posts_tags';
constructor(knex, {tags}) {
super('posts_tags', knex);
super(PostsTagsImporter.table, knex);
this.tags = tags;
this.sortOrder = 0;
}

View file

@ -5,8 +5,10 @@ const TableImporter = require('./base');
const dateToDatabaseString = require('../utils/database-date');
class PostsImporter extends TableImporter {
static table = 'posts';
constructor(knex, {newsletters}) {
super('posts', knex);
super(PostsImporter.table, knex);
this.newsletters = newsletters;
}

View file

@ -2,8 +2,10 @@ const {faker} = require('@faker-js/faker');
const TableImporter = require('./base');
class ProductsBenefitsImporter extends TableImporter {
static table = 'products_benefits';
constructor(knex, {benefits}) {
super('products_benefits', knex);
super(ProductsBenefitsImporter.table, knex);
this.benefits = benefits;
this.sortOrder = 0;
}

View file

@ -4,8 +4,10 @@ const {slugify} = require('@tryghost/string');
const {blogStartDate} = require('../utils/blog-info');
class ProductsImporter extends TableImporter {
static table = 'products';
constructor(knex) {
super('products', knex);
super(ProductsImporter.table, knex);
}
setImportOptions() {

View file

@ -3,8 +3,10 @@ const TableImporter = require('./base');
const {blogStartDate} = require('../utils/blog-info');
class StripePricesImporter extends TableImporter {
static table = 'stripe_prices';
constructor(knex, {products}) {
super('stripe_prices', knex);
super(StripePricesImporter.table, knex);
this.products = products;
}

View file

@ -3,8 +3,9 @@ const TableImporter = require('./base');
const {blogStartDate} = require('../utils/blog-info');
class StripeProductsImporter extends TableImporter {
static table = 'stripe_products';
constructor(knex) {
super('stripe_products', knex);
super(StripeProductsImporter.table, knex);
}
setImportOptions({model}) {

View file

@ -4,8 +4,10 @@ const TableImporter = require('./base');
const dateToDatabaseString = require('../utils/database-date');
class SubscriptionsImporter extends TableImporter {
static table = 'subscriptions';
constructor(knex, {members, stripeProducts, stripePrices}) {
super('subscriptions', knex);
super(SubscriptionsImporter.table, knex);
this.members = members;
this.stripeProducts = stripeProducts;
this.stripePrices = stripePrices;

View file

@ -4,8 +4,10 @@ const TableImporter = require('./base');
const dateToDatabaseString = require('../utils/database-date');
class TagsImporter extends TableImporter {
static table = 'tags';
constructor(knex, {users}) {
super('tags', knex);
super(TagsImporter.table, knex);
this.users = users;
}

View file

@ -5,8 +5,10 @@ const security = require('@tryghost/security');
const dateToDatabaseString = require('../utils/database-date');
class UsersImporter extends TableImporter {
static table = 'users';
constructor(knex) {
super('users', knex);
super(UsersImporter.table, knex);
}
async generate() {