Skip to content
Snippets Groups Projects
init-ghost.js 4.36 KiB
Newer Older
  • Learn to ignore specific revisions
  • // eslint-disable-next-line @typescript-eslint/no-var-requires
    const _ = require('lodash');
    // eslint-disable-next-line @typescript-eslint/no-var-requires
    const tagsData = require('./ghost/migrations/init/tags.json');
    // eslint-disable-next-line @typescript-eslint/no-var-requires
    const postsData = require('./ghost/migrations/init/posts.json');
    // eslint-disable-next-line @typescript-eslint/no-var-requires
    const path = require('path');
    // eslint-disable-next-line @typescript-eslint/no-var-requires
    const GhostAdminAPI = require('@tryghost/admin-api');
    
    // eslint-disable-next-line @typescript-eslint/no-var-requires
    require('dotenv').config({ path: path.resolve(__dirname, '../.env') });
    
    var api = new GhostAdminAPI({
      url: process.env.GHOST_HOST_AND_PORT,
      key: process.env.GHOST_ADMIN_API_KEY,
      version: 'v3',
    });
    
    async function deleteTags(existingTags) {
      return await Promise.all(
        _.forEach(existingTags, async (tag) => {
          api.tags
            .delete(_.pick(tag, ['id']))
            .then((res) => {
              return null;
            })
            .catch((error) => console.error(error));
        })
      );
    }
    async function deletePosts(existingPosts) {
      return await Promise.all(
        _.forEach(existingPosts, async (tag) => {
          api.posts
            .delete(_.pick(tag, ['id']))
            .then((res) => {
              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 --');
            });
          } 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));
            });
          }
        })
        .catch((error) => console.error(error));
    }
    
    // Utility function to find and upload any images in an HTML string
    function processImagesInHTML(html) {
      // Find images that Ghost Upload supports
      let imageRegex = /="([^"]*?(?:\.jpg|\.jpeg|\.gif|\.png|\.svg|\.sgvz))"/gim;
      let imagePromises = [];
    
      while ((result = imageRegex.exec(html)) !== null) {
    
        let file = result[1];
        // Upload the image, using the original matched filename as a reference
        imagePromises.push(
          api.images.upload({
            ref: file,
            file: path.resolve(file),
          })
        );
      }
    
      return Promise.all(imagePromises).then((images) => {
        images.forEach((image) => (html = html.replace(image.ref, image.url)));
        return html;
      });
    }
    
    async function createPosts(deleteOnly) {
      // Get existing posts
      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 --');
            });
          } else {
            console.log('-- No posts to drop --');
          }
    
          // Creating new posts
          if (!deleteOnly) {
            console.log('-- Creating ' + postsData.length + ' posts --');
            _.forEach(postsData, (post) => {
              api.posts
                .add(post, { source: 'html' })
                .then((res) => {
                  console.log('-- Post `' + res.title + '` created --');
                })
                .catch((error) => console.error(error));
            });
          }
        })
        .catch((error) => console.error(error));
    }
    
    async function main(deleteOnly) {
      createTags(deleteOnly).then(() => {
        createPosts(deleteOnly);
      });
    }
    
    var 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');
    }