class MnoEnterprise::IntercomEventsListener

Attributes

intercom[RW]

Public Class Methods

new() click to toggle source
# File lib/mno_enterprise/intercom_events_listener.rb, line 9
def initialize
  args = if MnoEnterprise.intercom_token
    {token: MnoEnterprise.intercom_token}
  else
    {app_id: MnoEnterprise.intercom_app_id, api_key: MnoEnterprise.intercom_api_key}
  end
  self.intercom = ::Intercom::Client.new(args)
end

Public Instance Methods

format_company(organization) click to toggle source

Formatting TODO: extract to a CRM service

# File lib/mno_enterprise/intercom_events_listener.rb, line 73
def format_company(organization)
  {
    company_id: organization.id,
    name: organization.name,
    created_at: organization.created_at.to_i,
    custom_attributes: {
      industry: organization.industry,
      size: organization.size,
      credit_card_details: organization.has_credit_card_details?,
      credit_card_expiry: organization.credit_card.expiry_date,
      app_count: organization.app_instances.count,
      app_list: organization.app_instances.map(&:name).sort.to_sentence,
      user_count: organization.users.count
    }
  }
end
info(key, current_user_id, description, subject_type, subject_id, metadata) click to toggle source
# File lib/mno_enterprise/intercom_events_listener.rb, line 18
def info(key, current_user_id, description, subject_type, subject_id, metadata)
  u = User.find(current_user_id)
  data = {created_at: Time.now.to_i, email: u.email, user_id: u.id, event_name: key.tr('_', '-')}
  case key
    when 'user_update', 'organization_update'
      # convert values to string
      data[:metadata] = Hash[ metadata.collect {|k,v| [k, v.to_s] } ]
    when 'user_confirm'
      data[:event_name] = 'finished-sign-up'
    when 'dashboard_create'
      data[:event_name] = 'added-dashboard'
    when 'dashboard_delete'
      data[:event_name] = 'removed-dashboard'
    when 'widget_delete'
      data[:event_name] = 'removed-widget'
    when 'widget_create'
      data[:event_name] = 'added-widget'
      data[:metadata] = {widget: metadata[:name]}
    when 'app_launch'
      data[:event_name] = 'launched-app-' + metadata[:app_nid]
    when 'app_destroy'
      data[:event_name] = 'deleted-app-'  + metadata[:app_nid]
      data[:metadata] = {type: 'single', app_list: metadata[:app_nid]}
    when 'app_add'
      data[:event_name] = 'added-app-' + metadata[:app_nid]
      data[:metadata] = {type: 'single', app_list: metadata[:app_nid]}
  end
  # Update user data in intercom
  # OPTIMIZE: we could fetch the user for intercom and only update fields that have changed
  self.update_intercom_user(u)
  # Push the event to intercom
  self.intercom.events.create(data)

rescue Intercom::IntercomError => e
  Rails.logger.tagged('Intercom') { Rails.logger.warn 'Error while calling intercom ' + e.message}
end
tag_user(user) click to toggle source

If a source is set, tag the user with it

# File lib/mno_enterprise/intercom_events_listener.rb, line 65
def tag_user(user)
  if user.meta_data && user.meta_data[:source].present?
    intercom.tags.tag(name: user.meta_data[:source], users: [{user_id: user.id}])
  end
end
update_intercom_user(user, update_last_request_at = true) click to toggle source
# File lib/mno_enterprise/intercom_events_listener.rb, line 55
def update_intercom_user(user, update_last_request_at = true)
  data = user.intercom_data(update_last_request_at)
  data[:companies] = user.organizations.map do |organization|
    format_company(organization)
  end
  intercom.users.create(data)
  tag_user(user)
end