defmodule Spotify.Credentials do @moduledoc """ Provides a struct to hold token credentials from Spotify. These consist of an access token, used to authenticate requests to the Spotify web API, as well as a refresh token, used to request a new access token when it expires. You can use this struct in the place of a `Plug.Conn` struct anywhere in this library's functions with one caveat: If you use a `Plug.Conn`, these tokens will be persisted for you in browser cookies. However, if you choose to use `Spotify.Credentials`, it will be your responsibility to persist this data between uses of the library's functions. This is convenient if your use case involves using this library in a situation where you don't have access to a `Plug.Conn` or a browser/cookie system. ## Example: defmodule SpotifyExample do @moduledoc "This example uses an `Agent` to persist the tokens" @doc "The `Agent` is started with an empty `Credentials` struct" def start_link do Agent.start_link(fn -> %Spotify.Credentials{} end, name: CredStore) end defp get_creds, do: Agent.get(CredStore, &(&1)) defp put_creds(creds), do: Agent.update(CredStore, fn(_) -> creds end) @doc "Used to link the user to Spotify to kick off the auth process" def auth_url, do: Spotify.Authorization.url @doc "`params` are passed to your callback endpoint from Spotify" def authenticate(params) do creds = get_creds() {:ok, new_creds} = Spotify.Authentication.authenticate(creds, params) put_creds(new_creds) # make sure to persist the credentials for later! end @doc "Use the credentials to access the Spotify API through the library" def track(id) do credentials = get_creds() {:ok, track} = Track.get_track(credentials, id) track end end """ alias Spotify.Credentials defstruct [:access_token, :refresh_token] @doc """ Returns a Spotify.Credentials struct from either a Plug.Conn or a Spotify.Credentials struct """ def new(conn_or_credentials) def new(creds = %Credentials{}), do: creds def new(conn = %Plug.Conn{}) do conn = Plug.Conn.fetch_cookies(conn) access_token = conn.cookies["spotify_access_token"] refresh_token = conn.cookies["spotify_refresh_token"] Credentials.new(access_token, refresh_token) end @doc """ Returns a Spotify.Credentials struct given tokens """ def new(access_token, refresh_token) do %Credentials{access_token: access_token, refresh_token: refresh_token} end @doc """ Returns a Spotify.Credentials struct from a parsed response body """ def get_tokens_from_response(map) def get_tokens_from_response(response) do Credentials.new(response["access_token"], response["refresh_token"]) end end