module ActivityNotification::SubscriptionApi

Defines API for subscription included in Subscription model.

Public Class Methods

convert_time_as_hash(time) click to toggle source

Convert Time value to store in database as Hash value. @param [Time] time Time value to store in database as Hash value @return [Time, Object] Converted Time value

# File lib/activity_notification/apis/subscription_api.rb, line 73
def self.convert_time_as_hash(time)
  time
end

Public Instance Methods

as_json(options = {}) click to toggle source

Override as_json method for optional_targets representation

@param [Hash] options Options for as_json method @return [Hash] Hash representing the subscription model

Calls superclass method
# File lib/activity_notification/apis/subscription_api.rb, line 107
def as_json(options = {})
  json = super(options).with_indifferent_access
  optional_targets_json = {}
  optional_target_names.each do |optional_target_name|
    optional_targets_json[optional_target_name] = {
      subscribing:   json[:optional_targets][Subscription.to_optional_target_key(optional_target_name)],
      subscribed_at: json[:optional_targets][Subscription.to_optional_target_subscribed_at_key(optional_target_name)],
      unsubscribed_at: json[:optional_targets][Subscription.to_optional_target_unsubscribed_at_key(optional_target_name)]
    }
  end
  json[:optional_targets] = optional_targets_json
  json
end
optional_target_names() click to toggle source

Returns optional_target names of the subscription from optional_targets field. @return [Array<Symbol>] Array of optional target names

# File lib/activity_notification/apis/subscription_api.rb, line 224
def optional_target_names
  optional_targets.keys.select { |key| key.to_s.start_with?("subscribing_to_") }.map { |key| key.slice(15..-1) }
end
subscribe(options = {}) click to toggle source

Subscribes to the notification and notification email.

@param [Hash] options Options for subscribing to the notification @option options [DateTime] :subscribed_at (Time.current) Time to set to subscribed_at and subscribed_to_email_at of the subscription record @option options [Boolean] :with_email_subscription (true) If the subscriber also subscribes notification email @option options [Boolean] :with_optional_targets (true) If the subscriber also subscribes optional_targets @return [Boolean] If successfully updated subscription instance

# File lib/activity_notification/apis/subscription_api.rb, line 128
def subscribe(options = {})
  subscribed_at = options[:subscribed_at] || Time.current
  with_email_subscription = options.has_key?(:with_email_subscription) ? options[:with_email_subscription] : ActivityNotification.config.subscribe_to_email_as_default
  with_optional_targets   = options.has_key?(:with_optional_targets) ? options[:with_optional_targets] : ActivityNotification.config.subscribe_to_optional_targets_as_default
  new_attributes = { subscribing: true, subscribed_at: subscribed_at, optional_targets: optional_targets }
  new_attributes = new_attributes.merge(subscribing_to_email: true, subscribed_to_email_at: subscribed_at) if with_email_subscription
  if with_optional_targets
    optional_target_names.each do |optional_target_name|
      new_attributes[:optional_targets] = new_attributes[:optional_targets].merge(
        Subscription.to_optional_target_key(optional_target_name) => true,
        Subscription.to_optional_target_subscribed_at_key(optional_target_name) => Subscription.convert_time_as_hash(subscribed_at))
    end
  end
  update(new_attributes)
end
subscribe_to_email(options = {}) click to toggle source

Subscribes to the notification email.

@param [Hash] options Options for subscribing to the notification email @option options [DateTime] :subscribed_to_email_at (Time.current) Time to set to subscribed_to_email_at of the subscription record @return [Boolean] If successfully updated subscription instance

# File lib/activity_notification/apis/subscription_api.rb, line 167
def subscribe_to_email(options = {})
  subscribed_to_email_at = options[:subscribed_to_email_at] || Time.current
  update(subscribing_to_email: true, subscribed_to_email_at: subscribed_to_email_at)
end
subscribe_to_optional_target(optional_target_name, options = {}) click to toggle source

Subscribes to the specified optional target.

@param [String, Symbol] optional_target_name Symbol class name of the optional target implementation (e.g. :amazon_sns, :slack) @param [Hash] options Options for unsubscribing to the specified optional target @option options [DateTime] :subscribed_at (Time.current) Time to set to subscribed__at in optional_targets hash of the subscription record @return [Boolean] If successfully updated subscription instance

# File lib/activity_notification/apis/subscription_api.rb, line 200
def subscribe_to_optional_target(optional_target_name, options = {})
  subscribed_at = options[:subscribed_at] || Time.current
  update(optional_targets: optional_targets.merge(
    Subscription.to_optional_target_key(optional_target_name) => true,
    Subscription.to_optional_target_subscribed_at_key(optional_target_name) => Subscription.convert_time_as_hash(subscribed_at))
  )
end
subscribing_to_optional_target?(optional_target_name, subscribe_as_default = ActivityNotification.config.subscribe_to_optional_targets_as_default) click to toggle source

Returns if the target subscribes to the specified optional target.

@param [Symbol] optional_target_name Symbol class name of the optional target implementation (e.g. :amazon_sns, :slack) @param [Boolean] subscribe_as_default Default subscription value to use when the subscription record does not configured @return [Boolean] If the target subscribes to the specified optional target

# File lib/activity_notification/apis/subscription_api.rb, line 187
def subscribing_to_optional_target?(optional_target_name, subscribe_as_default = ActivityNotification.config.subscribe_to_optional_targets_as_default)
  optional_target_key = Subscription.to_optional_target_key(optional_target_name)
  subscribe_as_default ?
    !optional_targets.has_key?(optional_target_key) || optional_targets[optional_target_key] :
     optional_targets.has_key?(optional_target_key) && optional_targets[optional_target_key]
end
to_optional_target_key(optional_target_name) click to toggle source

Returns key of optional_targets hash from symbol class name of the optional target implementation. @param [String, Symbol] optional_target_name Class name of the optional target implementation (e.g. :amazon_sns, :slack) @return [Symbol] Key of optional_targets hash

# File lib/activity_notification/apis/subscription_api.rb, line 84
def to_optional_target_key(optional_target_name)
  ("subscribing_to_" + optional_target_name.to_s).to_sym
end
to_optional_target_subscribed_at_key(optional_target_name) click to toggle source

Returns subscribed_at parameter key of optional_targets hash from symbol class name of the optional target implementation. @param [String, Symbol] optional_target_name Class name of the optional target implementation (e.g. :amazon_sns, :slack) @return [Symbol] Subscribed_at parameter key of optional_targets hash

# File lib/activity_notification/apis/subscription_api.rb, line 91
def to_optional_target_subscribed_at_key(optional_target_name)
  ("subscribed_to_" + optional_target_name.to_s + "_at").to_sym
end
to_optional_target_unsubscribed_at_key(optional_target_name) click to toggle source

Returns unsubscribed_at parameter key of optional_targets hash from symbol class name of the optional target implementation. @param [String, Symbol] optional_target_name Class name of the optional target implementation (e.g. :amazon_sns, :slack) @return [Symbol] Unsubscribed_at parameter key of optional_targets hash

# File lib/activity_notification/apis/subscription_api.rb, line 98
def to_optional_target_unsubscribed_at_key(optional_target_name)
  ("unsubscribed_to_" + optional_target_name.to_s + "_at").to_sym
end
unsubscribe(options = {}) click to toggle source

Unsubscribes to the notification and notification email.

@param [Hash] options Options for unsubscribing to the notification @option options [DateTime] :unsubscribed_at (Time.current) Time to set to unsubscribed_at and unsubscribed_to_email_at of the subscription record @return [Boolean] If successfully updated subscription instance

# File lib/activity_notification/apis/subscription_api.rb, line 149
def unsubscribe(options = {})
  unsubscribed_at = options[:unsubscribed_at] || Time.current
  new_attributes = { subscribing:          false, unsubscribed_at:          unsubscribed_at,
                     subscribing_to_email: false, unsubscribed_to_email_at: unsubscribed_at,
                     optional_targets: optional_targets }
  optional_target_names.each do |optional_target_name|
    new_attributes[:optional_targets] = new_attributes[:optional_targets].merge(
      Subscription.to_optional_target_key(optional_target_name) => false,
      Subscription.to_optional_target_unsubscribed_at_key(optional_target_name) => Subscription.convert_time_as_hash(subscribed_at))
  end
  update(new_attributes)
end
unsubscribe_to_email(options = {}) click to toggle source

Unsubscribes to the notification email.

@param [Hash] options Options for unsubscribing the notification email @option options [DateTime] :subscribed_to_email_at (Time.current) Time to set to subscribed_to_email_at of the subscription record @return [Boolean] If successfully updated subscription instance

# File lib/activity_notification/apis/subscription_api.rb, line 177
def unsubscribe_to_email(options = {})
  unsubscribed_to_email_at = options[:unsubscribed_to_email_at] || Time.current
  update(subscribing_to_email: false, unsubscribed_to_email_at: unsubscribed_to_email_at)
end
unsubscribe_to_optional_target(optional_target_name, options = {}) click to toggle source

Unsubscribes to the specified optional target.

@param [String, Symbol] optional_target_name Class name of the optional target implementation (e.g. :amazon_sns, :slack) @param [Hash] options Options for unsubscribing to the specified optional target @option options [DateTime] :unsubscribed_at (Time.current) Time to set to unsubscribed__at in optional_targets hash of the subscription record @return [Boolean] If successfully updated subscription instance

# File lib/activity_notification/apis/subscription_api.rb, line 214
def unsubscribe_to_optional_target(optional_target_name, options = {})
  unsubscribed_at = options[:unsubscribed_at] || Time.current
  update(optional_targets: optional_targets.merge(
    Subscription.to_optional_target_key(optional_target_name) => false,
    Subscription.to_optional_target_unsubscribed_at_key(optional_target_name) => Subscription.convert_time_as_hash(unsubscribed_at))
  )
end

Protected Instance Methods

subscribing_to_email_cannot_be_true_when_subscribing_is_false() click to toggle source

Validates subscribing_to_email cannot be true when subscribing is false.

# File lib/activity_notification/apis/subscription_api.rb, line 231
def subscribing_to_email_cannot_be_true_when_subscribing_is_false
  if !subscribing && subscribing_to_email?
    errors.add(:subscribing_to_email, "cannot be true when subscribing is false")
  end
end
subscribing_to_optional_target_cannot_be_true_when_subscribing_is_false() click to toggle source

Validates subscribing_to_optional_target cannot be true when subscribing is false.

# File lib/activity_notification/apis/subscription_api.rb, line 238
def subscribing_to_optional_target_cannot_be_true_when_subscribing_is_false
  optional_target_names.each do |optional_target_name|
    if !subscribing && subscribing_to_optional_target?(optional_target_name)
      errors.add(:optional_targets, "#Subscription.to_optional_target_key(optional_target_name) cannot be true when subscribing is false")
    end
  end
end