Skip to content

Commit d4e4bfa

Browse files
author
Matteo Centenaro
committed
NEW: add get_object and get_object_edge
Add two new functions to work with generic objects from the Facebook Graph. This is joint work with @bugduino
1 parent caf4435 commit d4e4bfa

3 files changed

Lines changed: 154 additions & 12 deletions

File tree

lib/facebook.ex

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,58 @@ defmodule Facebook do
372372
page(page_id, access_token, ["fan_count"])
373373
end
374374

375+
@doc """
376+
Basic Graph object information by object ID
377+
378+
## Example
379+
iex> Facebook.get_object("1234567", "<Access Token>")
380+
{:ok, %{"id" => id}}
381+
"""
382+
@spec get_object(object_id :: String.t, access_token) :: resp
383+
def get_object(object_id, access_token) do
384+
get_object(object_id, access_token, [])
385+
end
386+
387+
@doc """
388+
Get Graph object information for the specified params for the provided object ID
389+
390+
## Example
391+
iex> Facebook.get_object("1234567", "<Access Token>", [fields: "id,name"])
392+
{:ok, %{"id" => id, "name" => name}
393+
394+
See: https://developers.facebook.com/docs/graph-api/reference/page
395+
"""
396+
@spec get_object(object_id, access_token, params) :: resp
397+
def get_object(object_id, access_token, params) do
398+
params = params
399+
|> add_app_secret(access_token)
400+
|> add_access_token(access_token)
401+
402+
~s(/#{object_id})
403+
|> GraphAPI.get([], params: params)
404+
|> ResponseFormatter.format_response
405+
end
406+
407+
@doc """
408+
Gets an object edge for a specific object ID
409+
410+
## Examples
411+
iex> Facebook.get_object_edge(:adlabels, "act_12345", "<Access Token>")
412+
iex> Facebook.page_feed(:leads, "1223344332", "<Access Token>", [fields: "created_time,id,ad_id,form_id,field_data"])
413+
{:ok, %{"data" => [...]}}
414+
415+
"""
416+
@spec get_object_edge(edge :: atom | String.t, object_id :: String.t, access_token, params) :: resp
417+
def get_object_edge(edge, object_id, access_token, params \\ []) do
418+
params = params
419+
|> add_app_secret(access_token)
420+
|> add_access_token(access_token)
421+
422+
~s(/#{object_id}/#{edge})
423+
|> GraphAPI.get([], params: params)
424+
|> ResponseFormatter.format_response
425+
end
426+
375427
@doc """
376428
Basic page information for the provided `t:page_id/0`
377429
@@ -398,12 +450,7 @@ defmodule Facebook do
398450
@spec page(page_id, access_token, fields) :: resp
399451
def page(page_id, access_token, fields) do
400452
params = [fields: Enum.join(fields, ",")]
401-
|> add_app_secret(access_token)
402-
|> add_access_token(access_token)
403-
404-
~s(/#{page_id})
405-
|> GraphAPI.get([], params: params)
406-
|> ResponseFormatter.format_response
453+
get_object(page_id, access_token, params)
407454
end
408455

409456
@doc """
@@ -435,12 +482,7 @@ defmodule Facebook do
435482
@spec page_feed(scope, page_id, access_token, limit, fields :: String.t) :: resp
436483
def page_feed(scope, page_id, access_token, limit \\ 25, fields \\ "") when limit <= 100 do
437484
params = [limit: limit, fields: fields]
438-
|> add_app_secret(access_token)
439-
|> add_access_token(access_token)
440-
441-
~s(/#{page_id}/#{scope})
442-
|> GraphAPI.get([], params: params)
443-
|> ResponseFormatter.format_response
485+
get_object_edge(scope, page_id, access_token, params)
444486
end
445487

446488
@doc """

test/facebook_test.exs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,87 @@ defmodule FacebookTest do
258258
end
259259
end
260260

261+
describe "get_object" do
262+
test "success", %{app_access_token: app_access_token} do
263+
with_mock :hackney, GraphMock.mock_options(
264+
fn(_) -> GraphMock.get_object(:success) end
265+
) do
266+
assert {:ok, %{
267+
"id" => id
268+
}} = Facebook.get_object("1234567", app_access_token)
269+
270+
assert(String.length(id) > 0)
271+
end
272+
end
273+
274+
test "error", %{invalid_access_token: invalid_access_token} do
275+
with_mock :hackney, GraphMock.mock_options(
276+
fn(_) -> GraphMock.error() end
277+
) do
278+
assert {:error, _} = Facebook.get_object("1234567", invalid_access_token)
279+
end
280+
end
281+
end
282+
283+
describe "get_object with fields" do
284+
test "success", %{app_access_token: app_access_token} do
285+
with_mock :hackney, GraphMock.mock_options(
286+
fn(_) -> GraphMock.get_object(:success, :with_fields) end
287+
) do
288+
assert {:ok, %{
289+
"id" => id,
290+
"name" => name
291+
}} = Facebook.get_object("1234567", app_access_token, [fields: "name"])
292+
293+
assert(String.length(id) > 0)
294+
assert(String.length(name) > 0)
295+
end
296+
end
297+
298+
test "error", %{invalid_access_token: invalid_access_token} do
299+
with_mock :hackney, GraphMock.mock_options(
300+
fn(_) -> GraphMock.error() end
301+
) do
302+
assert {:error, _} = Facebook.get_object(
303+
"1234567",
304+
invalid_access_token,
305+
[fields: "name"]
306+
)
307+
end
308+
end
309+
end
310+
311+
describe "get_object_edge" do
312+
test "success", %{app_access_token: app_access_token} do
313+
with_mock :hackney, GraphMock.mock_options(
314+
fn(_) -> GraphMock.get_object_edge(:success) end
315+
) do
316+
assert {:ok, %{"data" => [data | _]}} = Facebook.get_object_edge(
317+
:adlabels,
318+
"act_123456",
319+
app_access_token
320+
)
321+
322+
assert %{
323+
"id" => _,
324+
"name" => _
325+
} = data
326+
end
327+
end
328+
329+
test "error", %{invalid_access_token: invalid_access_token} do
330+
with_mock :hackney, GraphMock.mock_options(
331+
fn(_) -> GraphMock.error() end
332+
) do
333+
assert {:error, _} = Facebook.get_object_edge(
334+
:adlabels,
335+
"act_123456",
336+
invalid_access_token
337+
)
338+
end
339+
end
340+
end
341+
261342
describe "page" do
262343
test "success", %{app_access_token: app_access_token} do
263344
with_mock :hackney, GraphMock.mock_options(

test/graph_mock.ex

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,25 @@ defmodule Facebook.GraphMock do
5555
})
5656
end
5757

58+
def get_object(:success) do
59+
JSON.encode(%{
60+
"id": "1234567"
61+
})
62+
end
63+
64+
def get_object(:success, :with_fields) do
65+
JSON.encode(%{
66+
"id": "1234567",
67+
"name": "name"
68+
})
69+
end
70+
71+
def get_object_edge(:success) do
72+
JSON.encode(%{"data": [
73+
%{"id": "1234567", "name": "label1"}
74+
]})
75+
end
76+
5877
def page(:success) do
5978
JSON.encode(%{
6079
"id": "19292868552", "name": "Facebook for Developers"

0 commit comments

Comments
 (0)