Class: Optimizely::NotificationCenter

Inherits:
Object
  • Object
show all
Defined in:
lib/optimizely/notification_center.rb

Constant Summary collapse

NOTIFICATION_TYPES =
{
  # DEPRECATED: ACTIVATE notification type is deprecated since relase 3.1.0.
  ACTIVATE: 'ACTIVATE: experiment, user_id, attributes, variation, event',
  DECISION: 'DECISION: type, user_id, attributes, decision_info',
  LOG_EVENT: 'LOG_EVENT: type, log_event',
  OPTIMIZELY_CONFIG_UPDATE: 'optimizely_config_update',
  TRACK: 'TRACK: event_key, user_id, attributes, event_tags, event'
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(logger, error_handler) ⇒ NotificationCenter



32
33
34
35
36
37
38
# File 'lib/optimizely/notification_center.rb', line 32

def initialize(logger, error_handler)
  @notification_id = 1
  @notifications = {}
  NOTIFICATION_TYPES.each_value { |value| @notifications[value] = [] }
  @logger = logger
  @error_handler = error_handler
end

Instance Attribute Details

#notification_idObject (readonly)



21
22
23
# File 'lib/optimizely/notification_center.rb', line 21

def notification_id
  @notification_id
end

#notificationsObject (readonly)



21
22
23
# File 'lib/optimizely/notification_center.rb', line 21

def notifications
  @notifications
end

Instance Method Details

#add_notification_listener(notification_type, notification_callback = nil) { ... } ⇒ notification ID

Adds notification callback to the notification center

Yields:

  • Block to be used as callback if callback omitted.



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/optimizely/notification_center.rb', line 48

def add_notification_listener(notification_type, notification_callback = nil, &block)
  return nil unless notification_type_valid?(notification_type)

  if notification_callback && block_given?
    @logger.log Logger::ERROR, 'Callback and block are mutually exclusive.'
    return nil
  end

  notification_callback ||= block

  unless notification_callback
    @logger.log Logger::ERROR, 'Callback can not be empty.'
    return nil
  end

  unless notification_callback.respond_to? :call
    @logger.log Logger::ERROR, 'Invalid notification callback given.'
    return nil
  end

  @notifications[notification_type].each do |notification|
    return -1 if notification[:callback] == notification_callback
  end
  @notifications[notification_type].push(notification_id: @notification_id, callback: notification_callback)
  notification_id = @notification_id
  @notification_id += 1
  notification_id
end

#clean_all_notificationsObject

Deprecated.


117
118
119
120
# File 'lib/optimizely/notification_center.rb', line 117

def clean_all_notifications
  @logger.log Logger::WARN, "'clean_all_notifications' is deprecated. Call 'clear_all_notification_listeners' instead."
  clear_all_notification_listeners
end

#clear_all_notification_listenersObject

Removes all notifications



123
124
125
# File 'lib/optimizely/notification_center.rb', line 123

def clear_all_notification_listeners
  @notifications.each_key { |key| @notifications[key] = [] }
end

#clear_notification_listeners(notification_type) ⇒ Object

Removes notifications for a certain notification type



109
110
111
112
113
114
# File 'lib/optimizely/notification_center.rb', line 109

def clear_notification_listeners(notification_type)
  return nil unless notification_type_valid?(notification_type)

  @notifications[notification_type] = []
  @logger.log Logger::INFO, "All callbacks for notification type #{notification_type} have been removed."
end

#clear_notifications(notification_type) ⇒ Object

Deprecated.


100
101
102
103
# File 'lib/optimizely/notification_center.rb', line 100

def clear_notifications(notification_type)
  @logger.log Logger::WARN, "'clear_notifications' is deprecated. Call 'clear_notification_listeners' instead."
  clear_notification_listeners(notification_type)
end

#notification_count(notification_type) ⇒ Object



147
148
149
# File 'lib/optimizely/notification_center.rb', line 147

def notification_count(notification_type)
  @notifications.include?(notification_type) ? @notifications[notification_type].count : 0
end

#remove_notification_listener(notification_id) ⇒ Boolean

Removes previously added notification callback



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/optimizely/notification_center.rb', line 83

def remove_notification_listener(notification_id)
  unless notification_id
    @logger.log Logger::ERROR, 'Notification ID can not be empty.'
    return nil
  end
  @notifications.each_key do |key|
    @notifications[key].each do |notification|
      if notification_id == notification[:notification_id]
        @notifications[key].delete(notification_id: notification_id, callback: notification[:callback])
        return true
      end
    end
  end
  false
end

#send_notifications(notification_type, *args) ⇒ Object

Sends off the notification for the specific event. Uses var args to pass in a arbitrary list of parameters according to which notification type was sent



134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/optimizely/notification_center.rb', line 134

def send_notifications(notification_type, *args)
  return nil unless notification_type_valid?(notification_type)

  @notifications[notification_type].each do |notification|
    notification_callback = notification[:callback]
    notification_callback.call(*args)
    @logger.log Logger::INFO, "Notification #{notification_type} sent successfully."
  rescue => e
    @logger.log(Logger::ERROR, "Problem calling notify callback. Error: #{e}")
    return nil
  end
end