Current section
Files
Jump to
Current section
Files
lib/mixpanel/client.ex
defmodule Mixpanel.Client do
use GenServer
@moduledoc """
"""
require Logger
@track_endpoint "https://api.mixpanel.com/track"
@engage_endpoint "https://api.mixpanel.com/engage"
def start_link(token, opts \\ []) do
GenServer.start_link(__MODULE__, {:ok, token}, opts)
end
@doc """
Tracks a event
See `Mixpanel.track/3`
"""
@spec track(String.t, Map.t) :: :ok
def track(event, properties \\ %{}) do
GenServer.cast(__MODULE__, {:track, event, properties})
end
@doc """
Updates a user profile.
See `Mixpanel.engage/4`.
"""
@spec engage(Map.t) :: :ok
def engage(event) do
GenServer.cast(__MODULE__, {:engage, event})
end
def init({:ok, token}) do
{:ok, %{token: token}}
end
def handle_cast({:track, event, properties}, %{token: token} = state) do
data = %{event: event,
properties: Map.put(properties, :token, token)}
|> Poison.encode!
|> :base64.encode
case HTTPoison.get(@track_endpoint, [], params: [data: data]) do
{:ok, %HTTPoison.Response{status_code: 200, body: '1'}} ->
:ok
_ ->
Logger.warn("Problem tracking Mixpanel event: #{inspect event}, #{inspect properties}")
end
{:noreply, state}
end
def handle_cast({:engage, event}, %{token: token} = state) do
data = event
|> Map.put(:"$token", token)
|> Poison.encode!
|> :base64.encode
case HTTPoison.get(@engage_endpoint, [], params: [data: data]) do
{:ok, %HTTPoison.Response{status_code: 200, body: '1'}} ->
:ok
_ ->
Logger.warn("Problem tracking Mixpanel profile update: #{inspect event}")
end
{:noreply, state}
end
end