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(config, opts \\ []) do
GenServer.start_link(__MODULE__, {:ok, config}, 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, config}) do
{:ok, Enum.into(config, %{})}
end
def handle_cast({:track, event, properties}, %{token: token, active: true} = 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
other ->
Logger.warn(
"Problem tracking Mixpanel event: #{inspect(event)}, #{inspect(properties)} Got: #{
inspect(other)
}"
)
end
{:noreply, state}
end
def handle_cast({:engage, event}, %{token: token, active: true} = 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
other ->
Logger.warn(
"Problem tracking Mixpanel profile update: #{inspect(event)} Got: #{inspect(other)}"
)
end
{:noreply, state}
end
# No events submitted when env configuration is set to false.
def handle_cast(_request, %{active: false} = state) do
{:noreply, state}
end
end