lib/activity_notification/models/concerns/notifiable.rb in activity_notification-0.0.10 vs lib/activity_notification/models/concerns/notifiable.rb in activity_notification-1.0.0
- old
+ new
@@ -7,58 +7,68 @@
included do
include Common
include ActionDispatch::Routing::PolymorphicRoutes
include Rails.application.routes.url_helpers
+
+ # Has many notification instances for this notifiable.
+ # Dependency for these notifications can be overriden from acts_as_notifiable.
+ # @scope instance
+ # @return [Array<Notificaion>] Array or database query of notifications for this notifiable
+ has_many :generated_notifications_as_notifiable,
+ class_name: "::ActivityNotification::Notification",
+ as: :notifiable
+
class_attribute :_notification_targets,
:_notification_group,
:_notifier,
:_notification_parameters,
:_notification_email_allowed,
- :_notifiable_path
+ :_notifiable_path,
+ :_printable_notifiable_name
set_notifiable_class_defaults
end
-
+
# Returns default_url_options for polymorphic_path.
# @return [Hash] Rails.application.routes.default_url_options
def default_url_options
Rails.application.routes.default_url_options
end
-
+
class_methods do
# Checks if the model includes notifiable and notifiable methods are available.
# @return [Boolean] Always true
def available_as_notifiable?
true
end
# Sets default values to notifiable class fields.
- # @return [Nil] nil
+ # @return [NilClass] nil
def set_notifiable_class_defaults
self._notification_targets = {}
self._notification_group = {}
self._notifier = {}
self._notification_parameters = {}
self._notification_email_allowed = {}
self._notifiable_path = {}
+ self._printable_notifiable_name = {}
nil
end
end
# Returns notification targets from configured field or overriden method.
# This method is able to be overriden.
#
# @param [String] target_type Target type to notify
# @param [String] key Key of the notification
# @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of the notification targets
- def notification_targets(target_type, key)
- target_typed_method_name = "notification_#{target_type.to_s.to_resources_name}"
+ 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[target_type.to_s.to_resources_name.to_sym],
- nil,
- key)
+ _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
@@ -68,72 +78,68 @@
# This method is able to be overriden.
#
# @param [String] target_type Target type to notify
# @param [String] key Key of the notification
# @return [Object] Group owner of the notification
- def notification_group(target_type, key)
+ def notification_group(target_type, key = nil)
resolve_parameter(
- "notification_group_for_#{target_type.to_s.to_resources_name}",
- _notification_group[target_type.to_s.to_resources_name.to_sym],
- nil,
- key)
+ "notification_group_for_#{cast_to_resources_name(target_type)}",
+ _notification_group[cast_to_resources_sym(target_type)],
+ nil, key)
end
# Returns additional notification parameters from configured field or overriden method.
# This method is able to be overriden.
#
# @param [String] target_type Target type to notify
# @param [String] key Key of the notification
# @return [Hash] Additional notification parameters
- def notification_parameters(target_type, key)
+ def notification_parameters(target_type, key = nil)
resolve_parameter(
- "notification_parameters_for_#{target_type.to_s.to_resources_name}",
- _notification_parameters[target_type.to_s.to_resources_name.to_sym],
- {},
- key)
+ "notification_parameters_for_#{cast_to_resources_name(target_type)}",
+ _notification_parameters[cast_to_resources_sym(target_type)],
+ {}, key)
end
# Returns notifier of the notification from configured field or overriden method.
# This method is able to be overriden.
#
# @param [String] target_type Target type to notify
# @param [String] key Key of the notification
# @return [Object] Notifier of the notification
- def notifier(target_type, key)
+ def notifier(target_type, key = nil)
resolve_parameter(
- "notifier_for_#{target_type.to_s.to_resources_name}",
- _notifier[target_type.to_s.to_resources_name.to_sym],
- nil,
- key)
+ "notifier_for_#{cast_to_resources_name(target_type)}",
+ _notifier[cast_to_resources_sym(target_type)],
+ nil, key)
end
# Returns if sending notification email is allowed for the notifiable from configured field or overriden method.
# This method is able to be overriden.
#
# @param [Object] target Target instance to notify
# @param [String] key Key of the notification
# @return [Boolean] If sending notification email is allowed for the notifiable
- def notification_email_allowed?(target, key)
+ def notification_email_allowed?(target, key = nil)
resolve_parameter(
- "notification_email_allowed_for_#{target.class.to_s.to_resources_name}?",
- _notification_email_allowed[target.class.to_s.to_resources_name.to_sym],
+ "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
# Returns notifiable_path to move after opening notification from configured field or overriden method.
# This method is able to be overriden.
#
# @param [String] target_type Target type to notify
# @param [String] key Key of the notification
# @return [String] Notifiable path URL to move after opening notification
- def notifiable_path(target_type, key)
+ def notifiable_path(target_type, key = nil)
resolved_parameter = resolve_parameter(
- "notifiable_path_for_#{target_type.to_s.to_resources_name}",
- _notifiable_path[target_type.to_s.to_resources_name.to_sym],
- nil,
- key)
+ "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__}, "\
@@ -142,10 +148,20 @@
end
end
resolved_parameter
end
+ # Returns printable notifiable model name to show in view or email.
+ # @return [String] Printable notifiable model name
+ 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
+
# overriding_notification_email_key is the method to override key definition for Mailer
# When respond_to?(overriding_notification_email_key) returns true,
# Mailer uses overriding_notification_email_key instead of original key.
#
# overriding_notification_email_key(target, key)
@@ -227,8 +243,20 @@
elsif parameter_field
resolve_value(parameter_field, *args)
else
default_value
end
+ end
+
+ # Casts to resources name.
+ # @api private
+ def cast_to_resources_name(target_type)
+ target_type.to_s.to_resources_name
+ end
+
+ # Casts to symbol of resources name.
+ # @api private
+ def cast_to_resources_sym(target_type)
+ target_type.to_s.to_resources_name.to_sym
end
end
end
\ No newline at end of file