diff --git a/ghost/core/core/server/data/migrations/versions/5.65/2023-09-22-06-42-15-truncate-stale-built-in-collections-posts.js b/ghost/core/core/server/data/migrations/versions/5.65/2023-09-22-06-42-15-truncate-stale-built-in-collections-posts.js new file mode 100644 index 0000000000..f59076b22e --- /dev/null +++ b/ghost/core/core/server/data/migrations/versions/5.65/2023-09-22-06-42-15-truncate-stale-built-in-collections-posts.js @@ -0,0 +1,12 @@ +const logging = require('@tryghost/logging'); +const {createNonTransactionalMigration} = require('../../utils'); + +module.exports = createNonTransactionalMigration( + async function up(knex) { + logging.info('Clearing collections_posts table'); + await knex('collections_posts').truncate(); + }, + async function down() { + logging.info('Not doing anything - collections_posts table has been truncated'); + } +); diff --git a/ghost/core/core/server/data/migrations/versions/5.65/2023-09-22-06-42-55-repopulate-built-in-featured-collection-posts.js b/ghost/core/core/server/data/migrations/versions/5.65/2023-09-22-06-42-55-repopulate-built-in-featured-collection-posts.js new file mode 100644 index 0000000000..fc1d59a1cc --- /dev/null +++ b/ghost/core/core/server/data/migrations/versions/5.65/2023-09-22-06-42-55-repopulate-built-in-featured-collection-posts.js @@ -0,0 +1,49 @@ +const logging = require('@tryghost/logging'); +const {default: ObjectID} = require('bson-objectid'); +const {createTransactionalMigration} = require('../../utils'); + +const insertPostCollections = async (knex, collectionId, postIds) => { + logging.warn(`Batch inserting ${postIds.length} collection posts for collection ${collectionId}`); + + const collectionPosts = postIds.map((postId) => { + return { + id: (new ObjectID()).toHexString(), + collection_id: collectionId, + post_id: postId, + sort_order: 0 + }; + }); + + await knex.batchInsert('collections_posts', collectionPosts, 1000); +}; + +module.exports = createTransactionalMigration( + async function up(knex) { + logging.info('Populating built-in featured collection'); + + const existingFeaturedCollection = await knex('collections') + .where({ + slug: 'featured' + }) + .first(); + + if (!existingFeaturedCollection) { + logging.warn('Featured collection does not exist, skipping'); + } else { + const featuredPostsRows = await knex('posts') + .select('id') + .where({ + featured: true, + type: 'post' + }); + + const featuredPostsIds = featuredPostsRows.map(row => row.id); + + await insertPostCollections(knex, existingFeaturedCollection.id, featuredPostsIds); + } + }, + async function down(knex) { + logging.info('Clearing collections_posts table'); + await knex('collections_posts').truncate(); + } +);