lib/patreon_ex.ex

defmodule PatreonEx do
  alias PatreonEx.Impl.Wrapper

  @moduledoc """
  This module contains functions that access the Patreon API V2 endpoints and
  functions that generate OAuth URLs and authenticate responses.
  """

  @doc """
  This function generates a OAuth2 redirect URL that takes your users to a
  Patreon login page. After logging in your users will be redirected to a
  page of your choosing.

  Returns `string`

  ## Examples
      authorize_url([identity, campaigns], "https://google.com", "your_client_id")

  """

  @spec authorize_url(list(binary), binary, binary) :: binary

  defdelegate authorize_url(scope, redirect_uri, client_id), to: Wrapper

  @doc """
  This function is the same as `authorize_url/3` but generates a URL that asks
  users for permission for all scopes.

  Returns `string`

  ## Examples
      authorize_url("https://google.com", "your_client_id")

  """

  @spec authorize_url(list(binary), binary, binary) :: binary

  defdelegate authorize_url(redirect_uri, client_id), to: Wrapper


  @doc """
  This function is validates the URL parameter `code` that the user is
  redirected to after logging in. Your application needs to retrieve the
  `code` from the URL and pass it to this command.

  If validation is successful, then Patreon will return an access token
  that you can use to make API calls.

  Returns `map`

  ## Examples
      validate_code("your code param from url", "https://google.com", "your client id", "your client secret")

  """
  @spec validate_code(binary, binary, binary, binary) :: map

  defdelegate validate_code(validation_code, redirect_uri, client_id, client_secret), to: Wrapper

  @doc """
  This function is wraps a request to the `identity` endpoint.

  Returns `map`

  ## Examples
      get_user(
        "access_token_here",
        %{
          "include" => "memberships.currently_entitled_tiers",
          "fields[user]" => Enum.join(["about", "hide_pledges", "full_name", "image_url", "thumb_url", "url"], ","),
          "fields[tier]" => Enum.join(["title", "description"], ",")
        }
        )
  """

  @spec get_user(binary, map) :: map

  defdelegate get_user(token, params), to: Wrapper

  @doc """
  This function is wraps a request to the `identity` endpoint.

  Returns `map`

  ## Examples
      get_campaigns(
        "access_token_here",
        %{
          "include" => "tiers",
          "fields[campaign]" => Enum.join(["vanity", "creation_name", "discord_server_id", "image_url", "is_nsfw", "url"], ","),
          "fields[tier]" => Enum.join(["title", "description"], ",")
        }
        )
  """

  @spec get_campaigns(binary, map) :: map

  defdelegate get_campaigns(token, params), to: Wrapper

end