lib/line_drive/pipelines.ex

defmodule LineDrive.Pipelines do
  @moduledoc """
  This module encapsulates calls to the pipedrive pipelines resource API
  """
  use Tesla

  alias LineDrive.{
    Deal,
    Pipeline
  }

  alias Tesla.Client

  @callback list_pipelines(Client.t()) :: {:ok, Pipeline.t()}

  def list_pipelines(%Client{} = client) do
    client
    |> get("/api/v1/pipelines")
    |> case do
      {:ok, %Tesla.Env{status: 200, body: %{data: pipeline_data}}} ->
        pipelines =
          pipeline_data
          |> Enum.map(&Pipeline.new/1)

        {:ok, pipelines}

      {:error, env} ->
        {:error, env}
    end
  end

  def list_pipeline_deals(%Client{} = client, pipeline_id) do
    client
    |> get("/api/v1/pipelines/#{pipeline_id}/deals")
    |> case do
      {:ok, %Tesla.Env{status: 200, body: %{data: deal_data}}} ->
        deals =
          deal_data
          |> Enum.map(&Deal.new/1)

        {:ok, deals}

      {:error, env} ->
        {:error, env}
    end
  end
end