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