Current section

Files

Jump to
google_ads lib google_ads.ex
Raw

lib/google_ads.ex

defmodule GoogleAds do
@moduledoc """
Documentation for `GoogleAds`.
"""
@type developer_token :: String.t()
@type access_token :: String.t()
@type customer_id :: String.t()
@type request_body :: map()
@type options :: [{:pageToken, String.t()}, {:loginCustomerId, String.t()}]
@type error_response :: {:error, :invalid_credentials | :invalid_permissions | any()}
@type search_response :: {:ok, map()} | error_response()
@type append_lead_conversation_response :: {:ok, map()} | error_response()
@type paginated_function :: (options() -> {:ok, map()} | error_response())
@type pagination_result :: {:ok, list()} | error_response()
@doc """
Returns all rows that match the search query.
https://developers.google.com/google-ads/api/rest/reference/rest/v18/customers.googleAds/search
"""
@spec search(developer_token(), access_token(), customer_id(), request_body()) ::
search_response()
def search(developer_token, access_token, customer_id, request_body) do
client().search(developer_token, access_token, customer_id, request_body)
end
@spec search(
developer_token(),
access_token(),
customer_id(),
request_body(),
options()
) :: search_response()
def search(developer_token, access_token, customer_id, request_body, options) do
client().search(developer_token, access_token, customer_id, request_body, options)
end
@doc """
Append Local Services Lead Conversation resources to Local Services Lead resources.
https://developers.google.com/google-ads/api/rest/reference/rest/v18/customers.localServices/appendLeadConversation
"""
@spec append_lead_conversation(
developer_token(),
access_token(),
customer_id(),
request_body()
) :: append_lead_conversation_response()
def append_lead_conversation(developer_token, access_token, customer_id, request_body) do
client().append_lead_conversation(developer_token, access_token, customer_id, request_body)
end
@spec append_lead_conversation(
developer_token(),
access_token(),
customer_id(),
request_body(),
options()
) :: append_lead_conversation_response()
def append_lead_conversation(developer_token, access_token, customer_id, request_body, options) do
client().append_lead_conversation(
developer_token,
access_token,
customer_id,
request_body,
options
)
end
@doc """
Paginates the results of a paginated function.
Example:
GoogleAds.paginate(fn pagination_options ->
GoogleAds.search(developer_token, token, customer_id, request_body, pagination_options)
end)
"""
@spec paginate(paginated_function()) :: pagination_result()
def paginate(fun) when is_function(fun, 1) do
do_paginate(fun, [], [])
end
defp do_paginate(fun, pagination_options, acc) do
case fun.(pagination_options) do
{:ok, %{"results" => entries, "nextPageToken" => next_page_token}} ->
do_paginate(
fun,
Keyword.put(pagination_options, :pageToken, next_page_token),
acc ++ entries
)
{:ok, %{"results" => entries}} ->
{:ok, acc ++ entries}
{:ok, _response} ->
{:ok, acc}
{:error, error} ->
{:error, error}
end
end
defp client, do: Application.fetch_env!(:google_ads, :client)
end