Module: ActivityNotification::NotificationApi

Extended by:
ActiveSupport::Concern
Includes:
CascadingNotificationApi
Included in:
ORM::ActiveRecord::Notification, ORM::Dynamoid::Notification, ORM::Mongoid::Notification
Defined in:
lib/activity_notification/apis/notification_api.rb

Overview

Defines API for notification included in Notification model.

Instance Method Summary collapse

Methods included from CascadingNotificationApi

#cascade_in_progress?, #cascade_notify, #validate_cascade_config

Instance Method Details

#after_storeObject

Call after store action with stored notification



647
648
# File 'lib/activity_notification/apis/notification_api.rb', line 647

def after_store
end

#email_subscribed?Boolean

Returns if the target subscribes this notification email.

Returns:

  • (Boolean)

    If the target subscribes the notification



841
842
843
# File 'lib/activity_notification/apis/notification_api.rb', line 841

def email_subscribed?
  target.subscribes_to_notification_email?(key)
end

#group_member?Boolean

Returns if the notification is group member belonging to owner.

Returns:

  • (Boolean)

    If the notification is group member



734
735
736
# File 'lib/activity_notification/apis/notification_api.rb', line 734

def group_member?
  group_owner_id.present?
end

#group_member_count(limit = ActivityNotification.config.opened_index_limit) ⇒ Integer

Returns count of group members of the notification. This method is designed to cache group by query result to avoid N+1 call.

Parameters:

  • limit (Integer) (defaults to: ActivityNotification.config.opened_index_limit)

    Limit to query for opened notifications

Returns:

  • (Integer)

    Count of group members of the notification



763
764
765
# File 'lib/activity_notification/apis/notification_api.rb', line 763

def group_member_count(limit = ActivityNotification.config.opened_index_limit)
  meta_group_member_count(:opened_group_member_count, :unopened_group_member_count, limit)
end

#group_member_exists?(limit = ActivityNotification.config.opened_index_limit) ⇒ Boolean

Returns if group member of the notification exists. This method is designed to cache group by query result to avoid N+1 call.

Parameters:

  • limit (Integer) (defaults to: ActivityNotification.config.opened_index_limit)

    Limit to query for opened notifications

Returns:

  • (Boolean)

    If group member of the notification exists



743
744
745
# File 'lib/activity_notification/apis/notification_api.rb', line 743

def group_member_exists?(limit = ActivityNotification.config.opened_index_limit)
  group_member_count(limit) > 0
end

#group_member_notifier_count(limit = ActivityNotification.config.opened_index_limit) ⇒ Integer

Returns count of group member notifiers of the notification not including group owner notifier. It always returns 0 if group owner notifier is blank. It counts only the member notifier of the same type with group owner notifier. This method is designed to cache group by query result to avoid N+1 call.

Parameters:

  • limit (Integer) (defaults to: ActivityNotification.config.opened_index_limit)

    Limit to query for opened notifications

Returns:

  • (Integer)

    Count of group member notifiers of the notification



783
784
785
# File 'lib/activity_notification/apis/notification_api.rb', line 783

def group_member_notifier_count(limit = ActivityNotification.config.opened_index_limit)
  meta_group_member_count(:opened_group_member_notifier_count, :unopened_group_member_notifier_count, limit)
end

#group_member_notifier_exists?(limit = ActivityNotification.config.opened_index_limit) ⇒ Boolean

Returns if group member notifier except group owner notifier exists. It always returns false if group owner notifier is blank. It counts only the member notifier of the same type with group owner notifier. This method is designed to cache group by query result to avoid N+1 call.

Parameters:

  • limit (Integer) (defaults to: ActivityNotification.config.opened_index_limit)

    Limit to query for opened notifications

Returns:

  • (Boolean)

    If group member of the notification exists



754
755
756
# File 'lib/activity_notification/apis/notification_api.rb', line 754

def group_member_notifier_exists?(limit = ActivityNotification.config.opened_index_limit)
  group_member_notifier_count(limit) > 0
end

#group_notification_count(limit = ActivityNotification.config.opened_index_limit) ⇒ Integer

Returns count of group notifications including owner and members. This method is designed to cache group by query result to avoid N+1 call.

Parameters:

  • limit (Integer) (defaults to: ActivityNotification.config.opened_index_limit)

    Limit to query for opened notifications

Returns:

  • (Integer)

    Count of group notifications including owner and members



772
773
774
# File 'lib/activity_notification/apis/notification_api.rb', line 772

def group_notification_count(limit = ActivityNotification.config.opened_index_limit)
  group_member_count(limit) + 1
end

#group_notifier_count(limit = ActivityNotification.config.opened_index_limit) ⇒ Integer

Returns count of group member notifiers including group owner notifier. It always returns 0 if group owner notifier is blank. This method is designed to cache group by query result to avoid N+1 call.

Parameters:

  • limit (Integer) (defaults to: ActivityNotification.config.opened_index_limit)

    Limit to query for opened notifications

Returns:

  • (Integer)

    Count of group notifications including owner and members



793
794
795
796
# File 'lib/activity_notification/apis/notification_api.rb', line 793

def group_notifier_count(limit = ActivityNotification.config.opened_index_limit)
  notification = group_member? && group_owner.present? ? group_owner : self
  notification.notifier.present? ? group_member_notifier_count(limit) + 1 : 0
end

#group_owner?Boolean

Returns if the notification is group owner.

Returns:

  • (Boolean)

    If the notification is group owner



727
728
729
# File 'lib/activity_notification/apis/notification_api.rb', line 727

def group_owner?
  !group_member?
end

#latest_group_memberNotification

Returns the latest group member notification instance of this notification. If this group owner has no group members, group owner instance self will be returned.

Returns:

  • (Notification)

    Notification instance of the latest group member notification



802
803
804
805
# File 'lib/activity_notification/apis/notification_api.rb', line 802

def latest_group_member
  notification = group_member? && group_owner.present? ? group_owner : self
  notification.group_member_exists? ? notification.group_members.latest : self
end

#notifiable_pathString

Returns notifiable_path to move after opening notification with notifiable.notifiable_path.

Returns:

  • (String)

    Notifiable path URL to move after opening notification



822
823
824
825
# File 'lib/activity_notification/apis/notification_api.rb', line 822

def notifiable_path
  notifiable.blank? and raise ActivityNotification::NotifiableNotFoundError.new("Couldn't find associated notifiable (#{notifiable_type}) of #{self.class.name} with 'id'=#{id}")
  notifiable.notifiable_path(target_type, key)
end

#open!(options = {}) ⇒ Integer

Opens the notification.

Parameters:

  • options (Hash) (defaults to: {})

    Options for opening notifications

Options Hash (options):

  • :opened_at (DateTime) — default: Time.current

    Time to set to opened_at of the notification record

  • :with_members (Boolean) — default: true

    If it opens notifications including group members

  • :skip_validation (Boolean) — default: true

    If it skips validation of the notification record

Returns:

  • (Integer)

    Number of opened notification records



700
701
702
703
704
705
706
707
708
# File 'lib/activity_notification/apis/notification_api.rb', line 700

def open!(options = {})
  opened? and return 0
  opened_at    = options[:opened_at] || Time.current
  with_members = options.has_key?(:with_members) ? options[:with_members] : true
  unopened_member_count = with_members ? group_members.unopened_only.count : 0
  group_members.update_all(opened_at: opened_at) if with_members
  options[:skip_validation] ? update_attribute(:opened_at, opened_at) : update(opened_at: opened_at)
  unopened_member_count + 1
end

#opened?Boolean

Returns if the notification is opened.

Returns:

  • (Boolean)

    If the notification is opened



720
721
722
# File 'lib/activity_notification/apis/notification_api.rb', line 720

def opened?
  opened_at.present?
end

#optional_target_namesArray<Symbol>

Returns optional_target names of the notification from configured field or overridden method.

Returns:

  • (Array<Symbol>)

    Array of optional target names



860
861
862
# File 'lib/activity_notification/apis/notification_api.rb', line 860

def optional_target_names
  notifiable.optional_target_names(target.to_resources_name, key)
end

#optional_target_subscribed?(optional_target_name) ⇒ Boolean

Returns if the target subscribes this notification email.

Parameters:

  • optional_target_name (String, Symbol)

    Class name of the optional target implementation (e.g. :amazon_sns, :slack)

Returns:

  • (Boolean)

    If the target subscribes the specified optional target of the notification



848
849
850
# File 'lib/activity_notification/apis/notification_api.rb', line 848

def optional_target_subscribed?(optional_target_name)
  target.subscribes_to_optional_target?(key, optional_target_name)
end

#optional_targetsArray<ActivityNotification::OptionalTarget::Base>

Returns optional_targets of the notification from configured field or overridden method.

Returns:



854
855
856
# File 'lib/activity_notification/apis/notification_api.rb', line 854

def optional_targets
  notifiable.optional_targets(target.to_resources_name, key)
end

#prepare_to_storeObject

:nocov: Returns prepared notification object to store

Returns:

  • (Object)

    prepared notification object to store



642
643
644
# File 'lib/activity_notification/apis/notification_api.rb', line 642

def prepare_to_store
  self
end

#printable_notifiable_nameString

Returns printable notifiable model name to show in view or email.

Returns:

  • (String)

    Printable notifiable model name



829
830
831
# File 'lib/activity_notification/apis/notification_api.rb', line 829

def printable_notifiable_name
  notifiable.printable_notifiable_name(target, key)
end

#publish_to_optional_targets(options = {}) ⇒ Hash

Publishes notification to the optional targets.

Parameters:

  • options (Hash) (defaults to: {})

    Options for optional targets

Returns:

  • (Hash)

    Result of publishing to optional target



672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
# File 'lib/activity_notification/apis/notification_api.rb', line 672

def publish_to_optional_targets(options = {})
  notifiable.optional_targets(target.to_resources_name, key).map { |optional_target|
    optional_target_name = optional_target.to_optional_target_name
    if optional_target_subscribed?(optional_target_name)
      begin
        optional_target.notify(self, options[optional_target_name] || {})
        [optional_target_name, true]
      rescue => e
        Rails.logger.error(e)
        if ActivityNotification.config.rescue_optional_target_errors
          [optional_target_name, e]
        else
          raise e
        end
      end
    else
      [optional_target_name, false]
    end
  }.to_h
end

#remove_from_groupNotification

Remove from notification group and make a new group owner.

Returns:

  • (Notification)

    New group owner instance of the notification group



810
811
812
813
814
815
816
817
# File 'lib/activity_notification/apis/notification_api.rb', line 810

def remove_from_group
  new_group_owner = group_members.earliest
  if new_group_owner.present?
    new_group_owner.update(group_owner_id: nil)
    group_members.update_all(group_owner_id: new_group_owner.id)
  end
  new_group_owner
end

#send_notification_email(options = {}) ⇒ Mail::Message, ...

Sends notification email to the target.

Parameters:

  • options (Hash) (defaults to: {})

    Options for notification email

Options Hash (options):

  • :send_later (Boolean)

    If it sends notification email asynchronously

  • :fallback (String, Symbol) — default: :default

    Fallback template to use when MissingTemplate is raised

Returns:

  • (Mail::Message, ActionMailer::DeliveryJob, NilClass)

    Email message, its delivery job, or nil if notification not found



657
658
659
660
661
662
663
664
665
666
# File 'lib/activity_notification/apis/notification_api.rb', line 657

def send_notification_email(options = {})
  if target.notification_email_allowed?(notifiable, key) &&
     notifiable.notification_email_allowed?(target, key) &&
     email_subscribed?
    send_later = options.has_key?(:send_later) ? options[:send_later] : true
    send_later ?
      @@notification_mailer.send_notification_email(self, options).deliver_later :
      @@notification_mailer.send_notification_email(self, options).deliver_now
  end
end

#subscribed?Boolean

Returns if the target subscribes this notification.

Returns:

  • (Boolean)

    If the target subscribes the notification



835
836
837
# File 'lib/activity_notification/apis/notification_api.rb', line 835

def subscribed?
  target.subscribes_to_notification?(key)
end

#unopened?Boolean

Returns if the notification is unopened.

Returns:

  • (Boolean)

    If the notification is unopened



713
714
715
# File 'lib/activity_notification/apis/notification_api.rb', line 713

def unopened?
  !opened?
end