defmodule LineDrive do
@moduledoc """
This is the entrypoint for making requests to pipedrive via LineDrive.
"""
use Tesla
defdelegate add_activity(client, activity), to: LineDrive.Activities
defdelegate list_activity_types(client), to: LineDrive.ActivityTypes
defdelegate get_deal(client, deal_id), to: LineDrive.Deals
defdelegate search_deals(client, term, opts), to: LineDrive.Deals
defdelegate get_person(client, person_id), to: LineDrive.Persons
defdelegate create_person(client, person), to: LineDrive.Persons
defdelegate search_persons(client, term, opts), to: LineDrive.Persons
defdelegate list_pipelines(client), to: LineDrive.Pipelines
defdelegate list_pipeline_deals(client, pipeline_id), to: LineDrive.Pipelines
defdelegate find_users_by_name(client, term, opts \\ []), to: LineDrive.Users
def client(api_token, base_url) do
base_url = process_base(base_url)
middleware = [
{Tesla.Middleware.BaseUrl, base_url},
{Tesla.Middleware.JSON, engine: Jason, engine_opts: [keys: :atoms]},
{Tesla.Middleware.Query, api_token: api_token},
Tesla.Middleware.PathParams
]
Tesla.client(middleware)
end
def build_client(refresh_token, client_id, client_secret, base_url) do
base_url = process_base(base_url)
case LineDrive.Oauth.refresh_access_token(refresh_token, client_id, client_secret) do
{:ok, access_token} ->
middleware = [
{Tesla.Middleware.BaseUrl, base_url},
{Tesla.Middleware.BearerAuth, token: access_token},
{Tesla.Middleware.JSON, engine: Jason, engine_opts: [keys: :atoms]},
Tesla.Middleware.PathParams
]
{:ok, Tesla.client(middleware)}
{:error, error} ->
{:error, error}
end
end
defp process_base(base_url) do
if Regex.match?(~r/^https?:\/\//i, base_url) do
base_url
else
"https://" <> base_url
end
end
end