lib/line_drive.ex

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 add_note(client, note), to: LineDrive.Notes
  defdelegate create_lead(client, lead), to: LineDrive.Leads
  defdelegate create_organization(client, org), to: LineDrive.Organizations
  defdelegate create_person(client, person), to: LineDrive.Persons
  defdelegate find_users_by_name(client, term, opts \\ []), to: LineDrive.Users
  defdelegate get_all_org_notes(client, org_id, opts), to: LineDrive.Notes
  defdelegate get_deal(client, deal_id), to: LineDrive.Deals
  defdelegate get_lead(client, lead_id), to: LineDrive.Leads
  defdelegate get_organization(client, org_id), to: LineDrive.Organizations
  defdelegate get_person(client, person_id), to: LineDrive.Persons
  defdelegate list_activity_types(client), to: LineDrive.ActivityTypes
  defdelegate list_deals(client, opts), to: LineDrive.Deals
  defdelegate list_deal_fields(client, opts), to: LineDrive.DealFields
  defdelegate list_organizations(client, opts), to: LineDrive.Organizations
  defdelegate list_organization_fields(client, opts), to: LineDrive.OrganizationFields
  defdelegate list_person_fields(client, opts), to: LineDrive.PersonFields
  defdelegate list_persons(client, opts), to: LineDrive.Persons
  defdelegate list_pipeline_deals(client, pipeline_id), to: LineDrive.Pipelines
  defdelegate list_pipelines(client), to: LineDrive.Pipelines
  defdelegate search_deals(client, term, opts), to: LineDrive.Deals
  defdelegate search_leads(client, term, opts), to: LineDrive.Leads
  defdelegate search_organizations(client, term, opts), to: LineDrive.Organizations
  defdelegate search_persons(client, term, opts), to: LineDrive.Persons
  defdelegate update_organization(client, org_id, data), to: LineDrive.Organizations

  def client(api_token, base_url) do
    base_url = process_base(base_url)

    middleware = [
      {Tesla.Middleware.BaseUrl, base_url},
      {Tesla.Middleware.JSON, engine: Jason},
      {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