Skip to content
Snippets Groups Projects
init-ghost.js 6.09 KiB
Newer Older
const _ = require('lodash');
const tagsData = require('./ghost/migrations/init/tags.json');
const postsData = require('./ghost/migrations/init/posts.json');
const pagesData = require('./ghost/migrations/init/pages.json');
const path = require('path');
const GhostAdminAPI = require('@tryghost/admin-api');

require('dotenv').config({ path: path.resolve(__dirname, '../.env') });

const api = new GhostAdminAPI({
  url: process.env.GHOST_HOST_AND_PORT,
  key: process.env.GHOST_ADMIN_API_KEY,
});

async function deleteTags(existingTags) {
  return Promise.all(
    _.forEach(existingTags, async (tag) => {
        .delete(_.pick(tag, ['id']))
        .then(() => {
          return null;
        })
        .catch((error) => console.error(error));
    })
  );
}
async function deletePosts(existingPosts) {
  return Promise.all(
    _.forEach(existingPosts, async (tag) => {
        .delete(_.pick(tag, ['id']))
        .then(() => {
          return null;
        })
        .catch((error) => console.error(error));
    })
  );
}
async function deletePages(existingPages) {
  return Promise.all(
    _.forEach(existingPages, async (id) => {
      await api.pages
        .delete(_.pick(id, ['id']))
        .then(() => {
          return null;
        })
        .catch((error) => console.error(error));
    })
  );
}

async function createTags(deleteOnly) {
  // Get existing tags
  await api.tags
    .browse({ limit: 'all' })
    .then(async (existingTags) => {
      // remove 'meta' key
      delete existingTags['meta'];
      if (existingTags.length > 0) {
        console.log('-- Dropping ' + existingTags.length + ' tags... --');
        // Delete existing tags
        await deleteTags(existingTags).then(() => {
          console.log('-- Tags dropped --');
        });
        // wait complete deletion of tags or else slugs are messed up when re created before proper deletion
        await new Promise((r) => setTimeout(r, 1000));
      } else {
        console.log('-- No tag to drop --');
      }

      // Creating new tags
      if (!deleteOnly) {
        console.log('-- Creating ' + tagsData.tags.length + ' tags --');
        _.forEach(tagsData.tags, (tag) => {
          api.tags
            .add(tag)
            .then((res) => {
              console.log('-- Tag `' + res.name + '` created --');
            })
            .catch((error) => console.error(error));
        });
        // wait complete creation of tags, if not posts are missing tags not yet created
        await new Promise((r) => setTimeout(r, 1000));
      }
    })
    .catch((error) => console.error(error));
}

async function uploadPostImage(imagePath) {
  let imagePromise = api.images.upload({
    ref: imagePath,
    file: path.resolve(imagePath),
  });
  return Promise.resolve(imagePromise)
    .then((url) => {
    .catch((error) => {
      console.error(error);
      return null;
    });
async function createPosts(deleteOnly) {
  api.posts
    .browse({ limit: 'all' })
    .then(async (existingPosts) => {
      // remove 'meta' key
      delete existingPosts['meta'];
      if (existingPosts.length > 0) {
        console.log('-- Dropping ' + existingPosts.length + ' posts... --');
        // Delete existing posts
        await deletePosts(existingPosts).then(() => {
          console.log('-- Posts dropped --');
        });
        // wait complete deletion of post or else slugs are messed up when re created before proper deletion
        await new Promise((r) => setTimeout(r, 1000));
      } else {
        console.log('-- No posts to drop --');
      }

      // Creating new posts
      if (!deleteOnly) {
        console.log('-- Creating ' + postsData.length + ' posts --');
        _.forEach(postsData, async (post) => {
          //upload de l'image en featured_image
          if (post.feature_image) {
            post.feature_image = await uploadPostImage(post.feature_image);
          }
          api.posts
            .add(post, { source: 'html' })
            .then((res) => {
              console.log('-- Post `' + res.title + '` created --');
            })
            .catch((error) => console.error(error));
        });
        // wait complete creation of posts
        await new Promise((r) => setTimeout(r, 1000));
      }
    })
    .catch((error) => console.error(error));
}

async function createPages(deleteOnly) {
  api.pages
    .browse({ limit: 'all' })
    .then(async (existingPages) => {
      // remove 'meta' key
      delete existingPages['meta'];
      if (existingPages.length > 0) {
        console.log(`-- Dropping ${existingPages.length} pages... --`);
        // Delete existing pages
        await deletePages(existingPages).then(() => {
          console.log('-- Pages dropped --');
        });
      } else {
        console.log('-- No pages to drop --');
      }
      // wait complete deletion of pages, if not new pages slugs are appended with '_2'
      await new Promise((r) => setTimeout(r, 2000));

      // Creating new pages
      if (!deleteOnly) {
        console.log(`-- Creating ${pagesData.length} pages --`);
        _.forEach(pagesData, async (page) => {
          //upload de l'image en featured_image
          if (page.feature_image) {
            page.feature_image = await uploadPostImage(page.feature_image);
          }
          api.pages
            .add(page, { source: 'html' })
            .then((res) => {
              console.log(`-- Page \`${res.title}\` created --`);
            })
            .catch((error) => console.error(error));
        });
        // wait complete creation of pages
        await new Promise((r) => setTimeout(r, 1000));
async function main(deleteOnly) {
  createTags(deleteOnly)
    .then(() => {
      createPosts(deleteOnly);
    })
    .then(() => {
      createPages(deleteOnly);
    });
const myArgs = process.argv.slice(2);

switch (myArgs[0]) {
  case 'drop':
    console.log('-- Droping data --');
    main(true);
    break;
  case 'up':
    console.log('-- Init db --');
    main(false);
    break;
  default:
    console.error('Unknown cmd');
}