Module: ActivityNotification::Notifiable

Extended by:
ActiveSupport::Concern
Includes:
ActionDispatch::Routing::PolymorphicRoutes, Common, PolymorphicHelpers
Defined in:
lib/activity_notification/models/concerns/notifiable.rb

Overview

Notifiable implementation included in notifiable model to be notified, like comments or any other user activities.

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Common

#printable_name, #printable_type, #resolve_value, #to_class_name, #to_resource_name, #to_resources_name

Class Method Details

.available_as_notifiable? ⇒ Boolean

Checks if the model includes notifiable and notifiable methods are available.

Returns:

  • (Boolean) —

    Always true



42
43
44
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 42

def available_as_notifiable?
  true
end

.set_notifiable_class_defaults ⇒ NilClass

Sets default values to notifiable class fields.

Returns:

  • (NilClass) —

    nil



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 48

def set_notifiable_class_defaults
  self._notification_targets            = {}
  self._notification_group              = {}
  self._notification_group_expiry_delay = {}
  self._notifier                        = {}
  self._notification_parameters         = {}
  self._notification_email_allowed      = {}
  self._notifiable_path                 = {}
  self._printable_notifiable_name       = {}
  self._optional_targets                = {}
  nil
end

Instance Method Details

#default_notification_key ⇒ String

Returns default key of the notification. This method is able to be overriden. "#Common#to_resource_name.default" is defined as default key.

Returns:

  • (String) —

    Default Key of the notification



282
283
284
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 282

def default_notification_key
  "#{to_resource_name}.default"
end

#default_url_options ⇒ Hash

Returns default_url_options for polymorphic_path.

Returns:

  • (Hash) —

    Rails.application.routes.default_url_options



35
36
37
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 35

def default_url_options
  Rails.application.routes.default_url_options
end

#generated_notifications_as_notifiable ⇒ Array<Notificaion>

Has many notification instances for this notifiable. Dependency for these notifications can be overriden from acts_as_notifiable.

Returns:

  • (Array<Notificaion>) —

    Array or database query of notifications for this notifiable



17
18
19
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 17

has_many :generated_notifications_as_notifiable,
class_name: "::ActivityNotification::Notification",
as: :notifiable

#notifiable_path(target_type, key = nil) ⇒ String

Returns notifiable_path to move after opening notification from configured field or overriden method. This method is able to be overriden.

Parameters:

  • target_type (String) —

    Target type to notify

  • key (String) (defaults to: nil) —

    Key of the notification

Returns:

  • (String) —

    Notifiable path URL to move after opening notification



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 158

def notifiable_path(target_type, key = nil)
  resolved_parameter = resolve_parameter(
    "notifiable_path_for_#{cast_to_resources_name(target_type)}",
    _notifiable_path[cast_to_resources_sym(target_type)],
    nil,
    key)
  unless resolved_parameter
    begin
      resolved_parameter = polymorphic_path(self)
    rescue NoMethodError, ActionController::UrlGenerationError
      raise NotImplementedError, "You have to implement #{self.class}##{__method__}, "\
                                 "set :notifiable_path in acts_as_notifiable or "\
                                 "set polymorphic_path routing for #{self.class}"
    end
  end
  resolved_parameter
end

#notification_email_allowed?(target, key = nil) ⇒ Boolean

Returns if sending notification email is allowed for the notifiable from configured field or overriden method. This method is able to be overriden.

Parameters:

  • target (Object) —

    Target instance to notify

  • key (String) (defaults to: nil) —

    Key of the notification

Returns:

  • (Boolean) —

    If sending notification email is allowed for the notifiable



144
145
146
147
148
149
150
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 144

def notification_email_allowed?(target, key = nil)
  resolve_parameter(
    "notification_email_allowed_for_#{cast_to_resources_name(target.class)}?",
    _notification_email_allowed[cast_to_resources_sym(target.class)],
    ActivityNotification.config.email_enabled,
    target, key)
end

#notification_group(target_type, key = nil) ⇒ Object

Returns group unit of the notifications from configured field or overriden method. This method is able to be overriden.

Parameters:

  • target_type (String) —

    Target type to notify

  • key (String) (defaults to: nil) —

    Key of the notification

Returns:

  • (Object) —

    Group unit of the notifications



88
89
90
91
92
93
94
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 88

def notification_group(target_type, key = nil)
  resolve_parameter(
    "notification_group_for_#{cast_to_resources_name(target_type)}",
    _notification_group[cast_to_resources_sym(target_type)],
    nil,
    key)
end

#notification_group_expiry_delay(target_type, key = nil) ⇒ Object

Returns group expiry period of the notifications from configured field or overriden method. This method is able to be overriden.

Parameters:

  • target_type (String) —

    Target type to notify

  • key (String) (defaults to: nil) —

    Key of the notification

Returns:

  • (Object) —

    Group expiry period of the notifications



102
103
104
105
106
107
108
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 102

def notification_group_expiry_delay(target_type, key = nil)
  resolve_parameter(
    "notification_group_expiry_delay_for_#{cast_to_resources_name(target_type)}",
    _notification_group_expiry_delay[cast_to_resources_sym(target_type)],
    nil,
    key)
end

#notification_parameters(target_type, key = nil) ⇒ Hash

Returns additional notification parameters from configured field or overriden method. This method is able to be overriden.

Parameters:

  • target_type (String) —

    Target type to notify

  • key (String) (defaults to: nil) —

    Key of the notification

Returns:

  • (Hash) —

    Additional notification parameters



116
117
118
119
120
121
122
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 116

def notification_parameters(target_type, key = nil)
  resolve_parameter(
    "notification_parameters_for_#{cast_to_resources_name(target_type)}",
    _notification_parameters[cast_to_resources_sym(target_type)],
    {},
    key)
end

#notification_targets(target_type, key = nil) ⇒ Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>

Returns notification targets from configured field or overriden method. This method is able to be overriden.

Parameters:

  • target_type (String) —

    Target type to notify

  • key (String) (defaults to: nil) —

    Key of the notification

Returns:

  • (Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>) —

    Array or database query of the notification targets



68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 68

def notification_targets(target_type, key = nil)
  target_typed_method_name = "notification_#{cast_to_resources_name(target_type)}"
  resolved_parameter = resolve_parameter(
    target_typed_method_name,
    _notification_targets[cast_to_resources_sym(target_type)],
    nil,
    key)
  unless resolved_parameter
    raise NotImplementedError, "You have to implement #{self.class}##{target_typed_method_name} "\
                               "or set :targets in acts_as_notifiable"
  end
  resolved_parameter
end

#notifier(target_type, key = nil) ⇒ Object

Returns notifier of the notification from configured field or overriden method. This method is able to be overriden.

Parameters:

  • target_type (String) —

    Target type to notify

  • key (String) (defaults to: nil) —

    Key of the notification

Returns:

  • (Object) —

    Notifier of the notification



130
131
132
133
134
135
136
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 130

def notifier(target_type, key = nil)
  resolve_parameter(
    "notifier_for_#{cast_to_resources_name(target_type)}",
    _notifier[cast_to_resources_sym(target_type)],
    nil,
    key)
end

#notify(target_type, options = {}) ⇒ Array<Notificaion>

Generates notifications to configured targets with notifiable model. This method calls NotificationApi#notify internally with self notifiable instance.

Parameters:

  • target_type (Symbol, String, Class) —

    Type of target

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

    Options for notifications

Options Hash (options):

  • :key (String) — default: notifiable.default_notification_key —

    Key of the notification

  • :group (Object) — default: nil —

    Group unit of the notifications

  • :group_expiry_delay (ActiveSupport::Duration) — default: nil —

    Expiry period of a notification group

  • :notifier (Object) — default: nil —

    Notifier of the notifications

  • :parameters (Hash) — default: {} —

    Additional parameters of the notifications

  • :send_email (Boolean) — default: true —

    Whether it sends notification email

  • :send_later (Boolean) — default: true —

    Whether it sends notification email asynchronously

  • :publish_optional_targets (Boolean) — default: true —

    Whether it publishes notification to optional targets

  • :optional_targets (Hash<String, Hash>) — default: {} —

    Options for optional targets, keys are optional target name (:amazon_sns or :slack etc) and values are options

Returns:

  • (Array<Notificaion>) —

    Array of generated notifications

See Also:



233
234
235
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 233

def notify(target_type, options = {})
  Notification.notify(target_type, self, options)
end

#notify_all(targets, options = {}) ⇒ Array<Notificaion>

Generates notifications to one target. This method calls NotificationApi#notify_all internally with self notifiable instance.

Parameters:

  • targets (Array<Object>) —

    Targets to send notifications

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

    Options for notifications

Options Hash (options):

  • :key (String) — default: notifiable.default_notification_key —

    Key of the notification

  • :group (Object) — default: nil —

    Group unit of the notifications

  • :group_expiry_delay (ActiveSupport::Duration) — default: nil —

    Expiry period of a notification group

  • :notifier (Object) — default: nil —

    Notifier of the notifications

  • :parameters (Hash) — default: {} —

    Additional parameters of the notifications

  • :send_email (Boolean) — default: true —

    Whether it sends notification email

  • :send_later (Boolean) — default: true —

    Whether it sends notification email asynchronously

  • :publish_optional_targets (Boolean) — default: true —

    Whether it publishes notification to optional targets

  • :optional_targets (Hash<String, Hash>) — default: {} —

    Options for optional targets, keys are optional target name (:amazon_sns or :slack etc) and values are options

Returns:

  • (Array<Notificaion>) —

    Array of generated notifications

See Also:



253
254
255
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 253

def notify_all(targets, options = {})
  Notification.notify_all(targets, self, options)
end

#notify_to(target, options = {}) ⇒ Notification

Generates notifications to one target. This method calls NotificationApi#notify_to internally with self notifiable instance.

Parameters:

  • target (Object) —

    Target to send notifications

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

    Options for notifications

Options Hash (options):

  • :key (String) — default: notifiable.default_notification_key —

    Key of the notification

  • :group (Object) — default: nil —

    Group unit of the notifications

  • :group_expiry_delay (ActiveSupport::Duration) — default: nil —

    Expiry period of a notification group

  • :notifier (Object) — default: nil —

    Notifier of the notifications

  • :parameters (Hash) — default: {} —

    Additional parameters of the notifications

  • :send_email (Boolean) — default: true —

    Whether it sends notification email

  • :send_later (Boolean) — default: true —

    Whether it sends notification email asynchronously

  • :publish_optional_targets (Boolean) — default: true —

    Whether it publishes notification to optional targets

  • :optional_targets (Hash<String, Hash>) — default: {} —

    Options for optional targets, keys are optional target name (:amazon_sns or :slack etc) and values are options

Returns:

See Also:



273
274
275
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 273

def notify_to(target, options = {})
  Notification.notify_to(target, self, options)
end

#optional_target_names(target_type, key = nil) ⇒ Array<Symbol>

Returns optional_target names of the notification from configured field or overriden method. This method is able to be overriden.

Parameters:

  • target_type (String) —

    Target type to notify

  • key (String) (defaults to: nil) —

    Key of the notification

Returns:

  • (Array<Symbol>) —

    Array of optional target names



206
207
208
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 206

def optional_target_names(target_type, key = nil)
  optional_targets(target_type, key).map { |optional_target| optional_target.to_optional_target_name }
end

#optional_targets(target_type, key = nil) ⇒ Array<ActivityNotification::OptionalTarget::Base>

Returns optional_targets of the notification from configured field or overriden method. This method is able to be overriden.

Parameters:

  • target_type (String) —

    Target type to notify

  • key (String) (defaults to: nil) —

    Key of the notification

Returns:



192
193
194
195
196
197
198
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 192

def optional_targets(target_type, key = nil)
  resolve_parameter(
    "optional_targets_for_#{cast_to_resources_name(target_type)}",
    _optional_targets[cast_to_resources_sym(target_type)],
    [],
    key)
end

#printable_notifiable_name(target, key = nil) ⇒ String

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

Returns:

  • (String) —

    Printable notifiable model name



178
179
180
181
182
183
184
# File 'lib/activity_notification/models/concerns/notifiable.rb', line 178

def printable_notifiable_name(target, key = nil)
  resolve_parameter(
    "printable_notifiable_name_for_#{cast_to_resources_name(target.class)}?",
    _printable_notifiable_name[cast_to_resources_sym(target.class)],
    printable_name,
    target, key)
end