hgmnz/keikokuc

View on GitHub
lib/keikokuc/notification_list.rb

Summary

Maintainability
A
0 mins
Test Coverage
# Public: collection of keikoku notifications
#
# This class encapsulates Keikoku::Notification objects
# as a collection.
#
# It includes the Enumerable module, so `map`, `detect`,
# and friends can be used.
#
# Examples
#
#   notifications = Keikokuc::NotificationList.new(api_key: 'abcd')
#   if notifications.fetch
#     notifications.each do |notification|
#       puts notification.inspect
#     end
#   else
#     # handle error
#   end
class Keikokuc::NotificationList
  include Enumerable

  attr_accessor :api_key

  # Public: Initializes a NotificationList
  #
  # opts - options hash containing attribute values for the object
  #        being constructed accepting the following three keys:
  #  api_key - the heroku account's api_key (required)
  #  client - the client, used for DI in tests
  def initialize(opts)
    @api_key       = opts.fetch(:api_key)
    @client        = opts[:client]
    @notifications = []
  end

  # Public: fetches notifications for the provided user
  #
  # Sets notifications to a set of `Notification` objects
  # accessible via methods in Enumerable
  #
  # Returns a boolean set to true if fetching succeeded
  def fetch
    result, error = client.get_notifications
    if error.nil?
      @notifications = result.map do |attributes|
        attributes.merge!(:client    => client,
                          :remote_id => attributes.delete(:id))
        Keikokuc::Notification.new(attributes)
      end
    end

    error.nil?
  end

  # Public: marks all notifications as read
  #
  # This is a convenience method for marking all underlying notifications
  # as read.
  #
  # Returns a Boolean set to true if all notifications were read successfully.
  def read_all
    self.inject(true) { |result, notification| result && notification.read }
  end

  # Public: the number of notifications
  #
  # Returns an Integer set to the number of notifications
  def size
    @notifications.size
  end

  # Public: yields each Notification
  #
  # Yields every notification in this collection
  def each
    @notifications.each { |n| yield n }
  end

  # Public: wether there are no notifications
  #
  # Returns a Boolean set to true if there is at least one notification
  def empty?
    self.size.zero?
  end

  # Internal: assigns notifications
  #
  # Allows notifications to be injected, useful in tests
  def notifications=(new_notification)
    @notifications = new_notification
  end

private
  def client # :nodoc:
    @client ||= Keikokuc::Client.new(:user    => '',
                                     :api_key => api_key)
  end
end