Class: OpenPanel::SDK::Tracker

Inherits:
Object
  • Object
show all
Defined in:
lib/openpanel/sdk/tracker.rb

Overview

OpenPanel SDK tracker class. Use this class to track events in OpenPanel by using the OpenPanel backend API.

Constant Summary collapse

TRACKING_TYPE_IDENTIFY =
'identify'
TRACKING_TYPE_TRACK =
'track'
TRACKING_TYPE_INCREMENT =
'increment'
TRACKING_TYPE_DECREMENT =
'decrement'
TRACKING_TYPE_GROUP =
'group'
TRACKING_TYPE_ASSIGN_GROUP =
'assign_group'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(global_props, disabled: false) ⇒ Tracker

Initialize OpenPanel tracker

Parameters:

  • global_props (Hash)

    global properties to send with every ‘track` and `identify` event

  • disabled (Boolean) (defaults to: false)

    disable sending tracking events, defaults to false



24
25
26
27
28
29
30
31
32
# File 'lib/openpanel/sdk/tracker.rb', line 24

def initialize(global_props, disabled: false)
  @headers = {
    'Content-Type' => 'application/json',
    'openpanel-client-id' => ENV['OPENPANEL_CLIENT_ID'],
    'openpanel-client-secret' => ENV['OPENPANEL_CLIENT_SECRET']
  }
  @disabled = disabled
  @global_properties = global_props
end

Instance Attribute Details

#global_propertiesObject (readonly)

Returns the value of attribute global_properties.



19
20
21
# File 'lib/openpanel/sdk/tracker.rb', line 19

def global_properties
  @global_properties
end

#headersObject (readonly)

Returns the value of attribute headers.



19
20
21
# File 'lib/openpanel/sdk/tracker.rb', line 19

def headers
  @headers
end

Instance Method Details

#decrement_property(user, property = 'visits', value = 1) ⇒ Object

Decrement property in OpenPanel

Parameters:

  • user (OpenPanel::SDK::IdentifyUser)

    user to identify

  • property (String) (defaults to: 'visits')

    property to increment

  • value (Integer) (defaults to: 1)

    value to decrement by



91
92
93
94
95
96
# File 'lib/openpanel/sdk/tracker.rb', line 91

def decrement_property(user, property = 'visits', value = 1)
  payload = { profileId: user.profile_id, property: property, value: value }
  payload = { type: TRACKING_TYPE_DECREMENT, payload: payload }

  send_request payload: payload
end

#fetch_device_idObject



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/openpanel/sdk/tracker.rb', line 137

def fetch_device_id
  return if @disabled

  url = "#{ENV['OPENPANEL_TRACK_URL']}/device-id"
  response = Faraday.get url, {}, @headers

  case response.status
  when 401
    raise OpenPanel::SDK::OpenPanelError, 'Unauthorized'
  when 429
    raise OpenPanel::SDK::OpenPanelError, 'Too many requests'
  when 500
    raise OpenPanel::SDK::OpenPanelError, 'Internal server error'
  else
    JSON.parse(response.body, symbolize_names: true)[:deviceId]
  end
rescue StandardError => e
  raise OpenPanel::SDK::OpenPanelError, e.message
end

#identify(user) ⇒ Object

Identify user in OpenPanel openpanel.dev/docs/api/track

Parameters:



67
68
69
70
71
72
73
74
# File 'lib/openpanel/sdk/tracker.rb', line 67

def identify(user)
  properties = user.properties.merge(global_properties) unless global_properties.empty?
  payload = { profileId: user.profile_id, firstName: user.first_name, lastName: user.last_name,
              email: user.email, properties: properties }
  payload = { type: TRACKING_TYPE_IDENTIFY, payload: payload }

  send_request payload: payload
end

#increment_property(user, property = 'visits', value = 1) ⇒ Object

Decrement property in OpenPanel

Parameters:

  • user (OpenPanel::SDK::IdentifyUser)

    user to identify

  • property (String) (defaults to: 'visits')

    property to increment

  • value (Integer) (defaults to: 1)

    value to increment by



80
81
82
83
84
85
# File 'lib/openpanel/sdk/tracker.rb', line 80

def increment_property(user, property = 'visits', value = 1)
  payload = { profileId: user.profile_id, property: property, value: value }
  payload = { type: TRACKING_TYPE_INCREMENT, payload: payload }

  send_request payload: payload
end

#revenue(user:, amount:, properties: {}) ⇒ Object

Track revenue in OpenPanel

Parameters:

  • user (OpenPanel::SDK::IdentifyUser)

    user to identify

  • amount (Integer)

    amount of revenue

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

    additional properties to track



102
103
104
105
106
# File 'lib/openpanel/sdk/tracker.rb', line 102

def revenue(user:, amount:, properties: {})
  payload = { __revenue: amount }.merge(properties)

  track 'revenue', profile_id: user.profile_id, payload: payload
end

#set_group(profile_id, group_id) ⇒ Object

Assign user to a group in OpenPanel

Parameters:

  • profile_id (String)

    user profile ID

  • group_id (String)

    group ID



120
121
122
123
124
125
# File 'lib/openpanel/sdk/tracker.rb', line 120

def set_group(profile_id, group_id)
  payload = { profileId: profile_id, groupIds: [group_id] }
  payload = { type: TRACKING_TYPE_ASSIGN_GROUP, payload: payload }

  send_request payload: payload
end

#set_groups(profile_id, group_ids) ⇒ Object

Assign user to multiple groups in OpenPanel

Parameters:

  • profile_id (String)

    user profile ID

  • group_ids (Array<String>)

    list of group IDs



130
131
132
133
134
135
# File 'lib/openpanel/sdk/tracker.rb', line 130

def set_groups(profile_id, group_ids)
  payload = { profileId: profile_id, groupIds: group_ids }
  payload = { type: TRACKING_TYPE_ASSIGN_GROUP, payload: payload }

  send_request payload: payload
end

#set_header(key, value) ⇒ Object

Set custom header for OpenPanel request

Parameters:

  • key (String)

    header key

  • value (String)

    header value



37
38
39
# File 'lib/openpanel/sdk/tracker.rb', line 37

def set_header(key, value)
  @headers[key] = value
end

#track(event, profile_id: '', tracking_type: TRACKING_TYPE_TRACK, payload: {}, groups: nil, filter: ->(_payload) { false }) ⇒ Faraday::Response | nil

Track events in OpenPanel openpanel.dev/docs/api/track

Parameters:

  • event (String)

    name of event

  • profile_id (String) (defaults to: '')

    (optional) user profile ID

  • tracking_type (String) (defaults to: TRACKING_TYPE_TRACK)
  • payload (Hash) (defaults to: {})

    event payload

  • groups (Array<String>) (defaults to: nil)

    (optional) list of group IDs

  • filter (Lambda) (defaults to: ->(_payload) { false })

    pass in a lambda to filter events. If the lambda returns true, the event won’t be tracked.

Returns:

  • (Faraday::Response | nil)

    The Faraday plain response object or nil, if the event was filtered out

Raises:



51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/openpanel/sdk/tracker.rb', line 51

def track(event, profile_id: '', tracking_type: TRACKING_TYPE_TRACK, payload: {}, groups: nil, filter: ->(_payload) { false })
  return if filter.call(payload)

  payload = global_properties.merge(payload) unless global_properties.empty?
  payload = { name: event, profileId: profile_id, properties: payload }
  payload[:groups] = Array(groups) if groups
  payload = { type: tracking_type, payload: payload }

  send_request payload: payload
rescue StandardError => e
  raise OpenPanel::SDK::OpenPanelError, e.message
end

#upsert_group(group) ⇒ Object

Create or update a group in OpenPanel

Parameters:



110
111
112
113
114
115
# File 'lib/openpanel/sdk/tracker.rb', line 110

def upsert_group(group)
  payload = { id: group.id, type: group.type, name: group.name, properties: group.properties }
  payload = { type: TRACKING_TYPE_GROUP, payload: payload }

  send_request payload: payload
end