Current section
Files
Jump to
Current section
Files
lib/segment/server.ex
defmodule Segment.Server do
@moduledoc """
Provides the api for sending data to Segment.io.
All functions are implemented as Genserver casts so that they are out-of-band
for clients.
"""
use GenServer
alias Segment.Http
alias Segment.{Track, Identify, Screen, Alias, Group, Page, Context}
require Logger
@impl true
def init(config) do
Logger.log(:debug, "Segment.Server: Started!")
{:ok, %{config: config}}
end
def start_link(args) do
GenServer.start_link(__MODULE__, args, [name: __MODULE__])
end
def track(t = %Track{}) do
GenServer.cast(__MODULE__, t)
end
def track(user_id, event, properties \\ %{}, context \\ Context.new()) do
t = %Track{userId: user_id, event: event, properties: properties, context: context}
track(t)
end
def identify(i = %Identify{}) do
GenServer.cast(__MODULE__, i)
end
def identify(user_id, traits \\ %{}, context \\ Context.new()) do
i = %Identify{userId: user_id, traits: traits, context: context}
identify(i)
end
def screen(s = %Screen{}) do
GenServer.cast(__MODULE__, s)
end
def screen(user_id, name \\ "", properties \\ %{}, context \\ Context.new()) do
s = %Screen{userId: user_id, name: name, properties: properties, context: context}
screen(s)
end
def alias_user(a = %Alias{}) do
GenServer.cast(__MODULE__, a)
end
def alias_user(user_id, previous_id, context \\ Context.new()) do
a = %Alias{userId: user_id, previousId: previous_id, context: context}
alias_user(a)
end
def group(g = %Group{}) do
GenServer.cast(__MODULE__, g)
end
def group(user_id, group_id, traits \\ %{}, context \\ Context.new()) do
g = %Group{userId: user_id, groupId: group_id, traits: traits, context: context}
group(g)
end
def page(p = %Page{}) do
GenServer.cast(__MODULE__, p)
end
def page(user_id, name \\ "", properties \\ %{}, context \\ Context.new()) do
p = %Page{userId: user_id, name: name, properties: properties, context: context}
page(p)
end
@impl true
def handle_cast(%Track{} = t, state) do
resp = Http.post!(t.method, Jason.encode!(t))
Logger.debug fn -> "#{inspect resp}" end
{:noreply, state}
end
def handle_cast(%Identify{} = i, state) do
resp = Http.post!(i.method, Jason.encode!(i))
Logger.debug fn -> "#{inspect resp}" end
{:noreply, state}
end
def handle_cast(%Screen{} = s, state) do
resp = Http.post!(s.method, Jason.encode!(s))
Logger.debug fn -> "#{inspect resp}" end
{:noreply, state}
end
def handle_cast(%Alias{} = a, state) do
resp = Http.post!(a.method, Jason.encode!(a))
Logger.debug fn -> "#{inspect resp}" end
{:noreply, state}
end
def handle_cast(%Group{} = g, state) do
resp = Http.post!(g.method, Jason.encode!(g))
Logger.debug fn -> "#{inspect resp}" end
{:noreply, state}
end
def handle_cast(%Page{} = p, state) do
resp = Http.post!(p.method, Jason.encode!(p))
Logger.debug fn -> "#{inspect resp}" end
{:noreply, state}
end
end