Packages
closex
0.5.14
2.1.0
2.0.1
2.0.0
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.0
1.2.0
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.5
1.0.4
1.0.3
1.0.2
1.0.0
0.9.0
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.0
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.0
0.2.0
0.1.0
Close.io HTTP client for Elixir
Current section
Files
Jump to
Current section
Files
lib/closex/caching_client.ex
defmodule Closex.CachingClient do
@behaviour Closex.ClientBehaviour
@moduledoc """
TODO: Add documentation for using CachingClient
"""
@fallback_client Application.get_env(:closex, :fallback_client, Closex.HTTPClient)
defdelegate find_leads(search_term, opts \\ []), to: @fallback_client
defdelegate find_opportunities(search_term, opts \\ []), to: @fallback_client
def get_lead(lead_id, opts \\ []) do
get_cached(lead_id, {:get_lead, [lead_id, opts]})
end
defdelegate create_lead(payload, opts \\ []), to: @fallback_client
def update_lead(lead_id, payload, opts \\ []) do
with {:ok, updated_lead} <- apply(@fallback_client, :update_lead, [lead_id, payload, opts]) do
set_cached(lead_id, {:ok, updated_lead})
end
end
def get_opportunity(opportunity_id, opts \\ []) do
get_cached(opportunity_id, {:get_opportunity, [opportunity_id, opts]})
end
defdelegate create_opportunity(payload, opts \\ []), to: @fallback_client
def update_opportunity(opportunity_id, payload, opts \\ []) do
with {:ok, updated_opportunity} <- apply(@fallback_client, :update_opportunity, [opportunity_id, payload, opts]) do
set_cached(opportunity_id, {:ok, updated_opportunity})
end
end
def get_lead_custom_field(custom_field_id, opts \\ []) do
get_cached(custom_field_id, {:get_lead_custom_field, [custom_field_id, opts]})
end
def get_organization(organization_id, opts \\ []) do
get_cached(organization_id, {:get_organization, [organization_id, opts]})
end
def get_lead_statuses(opts \\ []) do
get_cached(:get_lead_statuses, {:get_lead_statuses, [opts]})
end
def get_opportunity_statuses(opts \\ []) do
get_cached(:get_opportunity_statuses, {:get_opportunity_statuses, [opts]})
end
defdelegate send_email(payload, opts \\ []), to: @fallback_client
def get_users(opts \\ []) do
get_cached(:get_users, {:get_users, [opts]})
end
def clear_cache() do
Cachex.clear(:closex_cache)
end
defp get_cached(key, {fun, args}) do
cache_result = Cachex.get(:closex_cache, key, fallback: fn _key ->
case apply(@fallback_client, fun, args) do
result = {:ok, _} ->
{:commit, result}
error = {:error, _} ->
{:ignore, error}
end
end)
case cache_result do
{:loaded, result} ->
Closex.log fn -> "[Closex.CachingClient] MISS for key: #{key}" end
result
{:ok, result} ->
Closex.log fn -> "[Closex.CachingClient] HIT for key: #{key}" end
result
error ->
Closex.log fn -> "[Closex.CachingClient] ERROR for key: #{key}" end
{:error, error}
end
end
defp set_cached(key, value) do
{:ok, _} = Cachex.set(:closex_cache, key, value)
value
end
end