Current section
Files
Jump to
Current section
Files
lib/api.ex
defmodule Exfacebook.Api do
require Poison
require Logger
alias Exfacebook.Http
alias Exfacebook.Config
alias Exfacebook.Params
alias Exfacebook.Error
@type name :: String.t | binary
@type id :: String.t | binary
@type success :: {:ok, Map.t}
@type error :: {:error, Error.t}
@moduledoc ~S"""
Basic functions for accessing Facebook API.
"""
@doc """
Use get_connections to read feed, home collections.
"""
@spec get_connections(id, name, Params.t) :: success | error
def get_connections(id, name, params), do: _request(id, name, params)
@doc """
Pagination `next_page` is using response from calls of `get_connections`.
Example:
page0 = get_connections(...)
page1 = page0 |> next_page
page0 = page1 |> prev_page
"""
@spec next_page(success | error) :: success | error
def next_page({:error, _error} = state), do: state
def next_page({:ok, %{"paging" => %{"next" => url}}}), do: _request(url)
def next_page({:ok, _response}), do: {:ok, %{"data" => []}}
@doc false
@spec prev_page(success | error) :: success | error
def prev_page({:error, _error} = state), do: state
def prev_page({:ok, %{"paging" => %{"previous" => url}}}), do: _request(url)
def prev_page({:ok, _response}), do: {:ok, %{"data" => []}}
@doc false
@spec get_object(id, Params.t) :: success | error
def get_object(id, params) do
params = Map.delete(params, :limit)
_request(id, params)
end
defp _request(id, params), do: id |> _make_url(params) |> _request
defp _request(id, name, params), do: _request(~s(#{id}/#{name}), params)
defp _request(url), do: Http.get(url)
defp _auth(params), do: _encrypt(params, Config.id, Config.secret)
defp _make_url(path, params) do
params = params |> _auth |> Map.delete(:__struct__) |> Map.to_list
path = "#{Config.api_version}/#{path}"
:hackney_url.make_url("https://graph.facebook.com", path, params)
end
defp _encrypt(%Params{access_token: nil} = params, _, nil), do: params
defp _encrypt(%Params{access_token: nil} = params, id, secret) do
%Params{params | access_token: "#{id}|#{secret}"}
end
defp _encrypt(%Params{access_token: access_token} = params, _, secret) do
access_token = :crypto.hmac(:sha256, secret, access_token)
appsecret_proof = Base.encode16(access_token, case: :lower)
Map.put(params, :appsecret_proof, appsecret_proof)
end
end