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:
parent
f8e77ad012
commit
b8f59f07f2
29 changed files with 121 additions and 56 deletions
|
@ -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']) {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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')
|
||||
};
|
||||
|
|
|
@ -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}) {
|
||||
|
|
|
@ -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}) {
|
||||
|
|
|
@ -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}) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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}) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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}) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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}) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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'];
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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}) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Add table
Reference in a new issue