csblogs/feed-downloader

View on GitHub
src/aggregator/filter-existing-posts.js

Summary

Maintainability
A
0 mins
Test Coverage
import { BlogPost } from 'csblogs-common';
import log from '../log';

function isNewBlogPost(post, existingPosts) {
  const existingBlogsMatchingLink = existingPosts.filter(existingPost => existingPost.link === post.link);
  return (existingBlogsMatchingLink.length === 0);
}

function isModifiedBlogPost(post, existingPosts) {
  const existingBlogsMatchingLink = existingPosts.filter(existingPost => existingPost.link === post.link);
  if (existingBlogsMatchingLink.length === 0) {
    return false;
  }

  if (existingBlogsMatchingLink.length === 1) {
    return false;
    // TODO: Check for modification properly
    // return (existingBlogsMatchingLink[0].dateUpdated !== post.dateUpdated);
  }

  // More than one post in database with same link. Dodgy?
  log.warn({ post }, 'More than one post in database with this link already');
  return true;
}

export default function filterExistingPosts(blogPostsFromFeed, authorId) {
  return new Promise((resolve, reject) => {
    BlogPost.findAll({
      where: {
        authorId
      },
      order: [
        ['dateUpdated', 'DESC'] // Most recent first
      ]
    })
      .then((blogPostsFromDatabase) => {
        // log.info({ authorId, blogPostsFromDatabase }, 'Retrieved blog posts for author from Database');
        const newBlogPosts = blogPostsFromFeed.filter(post => isNewBlogPost(post, blogPostsFromDatabase));
        const modifiedBlogPosts = blogPostsFromFeed.filter(post => isModifiedBlogPost(post, blogPostsFromDatabase));
        resolve({
          newPosts: newBlogPosts,
          modifiedPosts: modifiedBlogPosts
        });
      })
      .catch((error) => {
        log.error({ error, authorId }, 'Error occured querying database for authors existing posts');
        reject(error);
      });
  });
}