lolibrarian/nypl-tweetwall

View on GitHub
app/models/content_item.rb

Summary

Maintainability
A
0 mins
Test Coverage
# A delegator to all content item classes.
class ContentItem
  # Returns all known content item classes.
  def self.classes
    [
      BlogContentItem,
      DigitalGalleryContentItem,
      DigitalCollectionsContentItem,
      ProgramContentItem,
      ExhibitionContentItem,
      AvContentItem,
      EncoreTitleContentItem
    ]
  end

  # Returns all records from each of the given content item classes, including
  # (and sorted by) their associated Tweets.
  def self.all_including_and_sorted_by_tweets(classes, limit = 100)
    content_items = Array(classes).map do |klass|
      klass.includes(:tweets).order("tweets.tweet_created_at DESC").includes(:thumbnail)
    end.flatten
    exclude_without_tweets!(content_items)
    sort_by_first_tweet!(content_items)
    content_items.take(limit)
  end

  # Excludes content items without any associated Tweets.
  def self.exclude_without_tweets!(content_items)
    content_items.select! { |content_item| content_item.tweets.any? }
  end

  # Sorts content items by their first Tweet.
  def self.sort_by_first_tweet!(content_items)
    content_items.sort_by! { |content_item| -1 * content_item.tweets.first.tweet_created_at.to_i }
  end

  # Deletes all expired content items.
  def self.delete_expired
    classes.each do |klass|
      klass.expired.destroy_all
    end
  end

  # Deletes all "overflow" Tweets to help to conserve resources for
  # exceptionally popular content.
  def self.delete_overflow_tweets
    classes.each do |klass|
      klass.find_each do |content_item|
        content_item.tweets.overflow.destroy_all
      end
    end
  end
end