Improve exception handling
parent
04965790e9
commit
156124101a
|
@ -8,68 +8,69 @@ defmodule Hunter.Api.HTTPClient do
|
||||||
@behaviour Hunter.Api
|
@behaviour Hunter.Api
|
||||||
|
|
||||||
def verify_credentials(conn) do
|
def verify_credentials(conn) do
|
||||||
:get
|
"/api/v1/accounts/verify_credentials"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/verify_credentials"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:account)
|
|> request!(:account, :get, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_credentials(conn, data) do
|
def update_credentials(conn, data) do
|
||||||
:patch
|
"/api/v1/accounts/update_credentials"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/update_credentials"), data, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:account)
|
|> request!(:account, :patch, data, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def account(conn, id) do
|
def account(conn, id) do
|
||||||
:get
|
"/api/v1/accounts/#{id}"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/#{id}"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:account)
|
|> request!(:account, :get, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def followers(conn, id, options) do
|
def followers(conn, id, options) do
|
||||||
:get
|
"/api/v1/accounts/#{id}/followers"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/#{id}/followers"), options, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:accounts)
|
|> request!(:accounts, :get, options, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def following(conn, id, options) do
|
def following(conn, id, options) do
|
||||||
:get
|
"/api/v1/accounts/#{id}/following"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/#{id}/following"), options, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:accounts)
|
|> request!(:accounts, :get, options, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def follow_by_uri(conn, uri) do
|
def follow_by_uri(conn, uri) do
|
||||||
:post
|
"/api/v1/follows"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/follows"), %{uri: uri}, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:account)
|
|> request!(:account, :post, %{uri: uri}, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def search_account(conn, options) do
|
def search_account(conn, options) do
|
||||||
:get
|
"/api/v1/accounts/search"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/search"), options, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:accounts)
|
|> request!(:accounts, :get, options, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def blocks(conn, options) do
|
def blocks(conn, options) do
|
||||||
:get
|
"/api/v1/blocks"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/blocks"), options, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:accounts)
|
|> request!(:accounts, :get, options, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def follow_requests(conn, options) do
|
def follow_requests(conn, options) do
|
||||||
:get
|
"/api/v1/follow_requests"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/follow_requests"), options, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:accounts)
|
|> request!(:accounts, :get, options, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def mutes(conn, options) do
|
def mutes(conn, options) do
|
||||||
:get
|
"/api/v1/mutes"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/mutes"), options, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:accounts)
|
|> request!(:accounts, :get, options, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def follow_request_action(conn, id, action) when action in [:authorize, :reject] do
|
def follow_request_action(conn, id, action) when action in [:authorize, :reject] do
|
||||||
Request.request!(:post, process_url(conn, "/api/v1/follow_requests/#{action}"), %{id: id}, get_headers(conn))
|
"/api/v1/follow_requests/#{action}"
|
||||||
true
|
|> process_url(conn)
|
||||||
|
|> request!(nil, :post, %{id: id}, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_app(name, redirect_uri, scopes, website, base_url) do
|
def create_app(name, redirect_uri, scopes, website, base_url) do
|
||||||
|
@ -80,134 +81,132 @@ defmodule Hunter.Api.HTTPClient do
|
||||||
website: website,
|
website: website,
|
||||||
}
|
}
|
||||||
|
|
||||||
:post
|
"/api/v1/apps"
|
||||||
|> Request.request!(process_url(base_url, "/api/v1/apps"), payload)
|
|> process_url(base_url)
|
||||||
|> transform(:application)
|
|> request!(:application, :post, payload)
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: Review this function
|
# TODO: Review this function
|
||||||
def upload_media(conn, file) do
|
def upload_media(conn, file) do
|
||||||
:post
|
"/api/v1/media"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/media"), {:file, file}, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:attachment)
|
|> request!(:attachment, :post, {:file, file}, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def relationships(conn, ids) do
|
def relationships(conn, ids) do
|
||||||
:get
|
"/api/v1/accounts/relationships"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/relationships"), %{id: ids}, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:relationships)
|
|> request!(:relationships, :get, %{id: ids}, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def follow(conn, id) do
|
def follow(conn, id) do
|
||||||
:post
|
"/api/v1/accounts/#{id}/follow"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/#{id}/follow"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:relationship)
|
|> request!(:relationship, :post, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def unfollow(conn, id) do
|
def unfollow(conn, id) do
|
||||||
:post
|
"/api/v1/accounts/#{id}/unfollow"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/#{id}/unfollow"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:relationship)
|
|> request!(:relationship, :post, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def block(conn, id) do
|
def block(conn, id) do
|
||||||
:post
|
"/api/v1/accounts/#{id}/block"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/#{id}/block"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:relationship)
|
|> request!(:relationship, :post, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def unblock(conn, id) do
|
def unblock(conn, id) do
|
||||||
:post
|
"/api/v1/accounts/#{id}/unblock"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/#{id}/unblock"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:relationship)
|
|> request!(:relationship, :post, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def mute(conn, id) do
|
def mute(conn, id) do
|
||||||
:post
|
"/api/v1/accounts/#{id}/mute"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/#{id}/mute"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:relationship)
|
|> request!(:relationship, :post, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def unmute(conn, id) do
|
def unmute(conn, id) do
|
||||||
:post
|
"/api/v1/accounts/#{id}/unmute"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/#{id}/unmute"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:relationship)
|
|> request!(:relationship, :post, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def search(conn, query, options) do
|
def search(conn, query, options) do
|
||||||
options = options |> Keyword.merge([q: query]) |> Map.new()
|
options = options |> Keyword.merge([q: query]) |> Map.new()
|
||||||
|
"/api/v1/search"
|
||||||
:get
|
|> process_url(conn)
|
||||||
|> Request.request!(process_url(conn, "/api/v1/search"), options, get_headers(conn))
|
|> request!(:result, :get, options, get_headers(conn))
|
||||||
|> transform(:result)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_status(conn, status, options) do
|
def create_status(conn, status, options) do
|
||||||
body = Map.put(options, :status, status)
|
body = Map.put(options, :status, status)
|
||||||
|
"/api/v1/statuses"
|
||||||
:post
|
|> process_url(conn)
|
||||||
|> Request.request!(process_url(conn, "/api/v1/statuses"), body, get_headers(conn))
|
|> request!(:status, :post, body, get_headers(conn))
|
||||||
|> transform(:status)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def status(conn, id) do
|
def status(conn, id) do
|
||||||
:get!
|
"/api/v1/statuses/#{id}"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/statuses/#{id}"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:status)
|
|> request!(conn, :status, :get!, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy_status(conn, id) do
|
def destroy_status(conn, id) do
|
||||||
Request.request!(:delete, process_url(conn, "/api/v1/statuses/#{id}"), [], get_headers(conn))
|
"/api/v1/statuses/#{id}"
|
||||||
|
|> process_url(conn)
|
||||||
true
|
|> request!(nil, :delete, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def reblog(conn, id) do
|
def reblog(conn, id) do
|
||||||
:post
|
"/api/v1/statuses/#{id}/reblog"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/statuses/#{id}/reblog"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:status)
|
|> request!(:status, :post, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def unreblog(conn, id) do
|
def unreblog(conn, id) do
|
||||||
:post
|
"/api/v1/statuses/#{id}/unreblog"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/statuses/#{id}/unreblog"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:status)
|
|> request!(:status, :post, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def reblogged_by(conn, id, options) do
|
def reblogged_by(conn, id, options) do
|
||||||
:get
|
"/api/v1/statuses/#{id}/reblogged_by"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/statuses/#{id}/reblogged_by"), options, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:accounts)
|
|> request!(:accounts, :get, options, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def favourite(conn, id) do
|
def favourite(conn, id) do
|
||||||
:post
|
"/api/v1/statuses/#{id}/favourite"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/statuses/#{id}/favourite"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:status)
|
|> request!(:status, :post, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def unfavourite(conn, id) do
|
def unfavourite(conn, id) do
|
||||||
:post
|
"/api/v1/statuses/#{id}/unfavourite"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/statuses/#{id}/unfavourite"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:status)
|
|> request!(:status, :post, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def favourites(conn, options) do
|
def favourites(conn, options) do
|
||||||
:get
|
"/api/v1/favourites"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/favourites"), options, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:statuses)
|
|> request!(:statuses, :get, options, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def favourited_by(conn, id, options) do
|
def favourited_by(conn, id, options) do
|
||||||
:get
|
"/api/v1/statuses/#{id}/favourited_by"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/statuses/#{id}/favourited_by"), options, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:accounts)
|
|> request!(:accounts, :get, options, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def statuses(conn, account_id, options) do
|
def statuses(conn, account_id, options) do
|
||||||
:get
|
"/api/v1/accounts/#{account_id}/statuses"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/accounts/#{account_id}/statuses"), options, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:statuses)
|
|> request!(:statuses, :get, options, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def home_timeline(conn, options) do
|
def home_timeline(conn, options) do
|
||||||
|
@ -222,45 +221,46 @@ defmodule Hunter.Api.HTTPClient do
|
||||||
retrieve_timeline(conn, "/api/v1/timelines/tag/#{hashtag}", options)
|
retrieve_timeline(conn, "/api/v1/timelines/tag/#{hashtag}", options)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp retrieve_timeline(conn, url, options) do
|
defp retrieve_timeline(conn, endpoint, options) do
|
||||||
:get
|
endpoint
|
||||||
|> Request.request!(process_url(conn, url), options, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:statuses)
|
|> request!(:statuses, :get, options, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def instance_info(conn) do
|
def instance_info(conn) do
|
||||||
:get
|
"/api/v1/instance"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/instance"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:instance)
|
|> request!(:instance, :get, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def notifications(conn, options) do
|
def notifications(conn, options) do
|
||||||
:get
|
"/api/v1/notifications"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/notifications"), options, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:notifications)
|
|> request!(:notifications, :get, options, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def notification(conn, id) do
|
def notification(conn, id) do
|
||||||
:get
|
"/api/v1/notifications/#{id}"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/notifications/#{id}"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:notification)
|
|> request!(:notification, :get, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def clear_notifications(conn) do
|
def clear_notifications(conn) do
|
||||||
Request.request!(:post, process_url(conn, "/api/v1/notifications/clear"), [], get_headers(conn))
|
"/api/v1/notifications/clear"
|
||||||
true
|
|> process_url(conn)
|
||||||
|
|> request!(nil, :post, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def clear_notification(conn, id) do
|
def clear_notification(conn, id) do
|
||||||
Request.request!(:post, process_url(conn, "/api/v1/notifications/dismiss/#{id}"), [], get_headers(conn))
|
"/api/v1/notifications/dismiss/#{id}"
|
||||||
true
|
|> process_url(conn)
|
||||||
|
|> request!(nil, :post, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def reports(conn) do
|
def reports(conn) do
|
||||||
:get
|
"/api/v1/reports"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/reports"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:reports)
|
|> request!(:reports, :get, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def report(conn, account_id, status_ids, comment) do
|
def report(conn, account_id, status_ids, comment) do
|
||||||
|
@ -270,21 +270,21 @@ defmodule Hunter.Api.HTTPClient do
|
||||||
comment: comment
|
comment: comment
|
||||||
}
|
}
|
||||||
|
|
||||||
:post
|
"/api/v1/reports"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/reports"), payload, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:report)
|
|> request!(:report, :post, payload, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def status_context(conn, id) do
|
def status_context(conn, id) do
|
||||||
:get
|
"/api/v1/statuses/#{id}/context"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/statuses/#{id}/context"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:context)
|
|> request!(:context, :get, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def card_by_status(conn, id) do
|
def card_by_status(conn, id) do
|
||||||
:get
|
"/api/v1/statuses/#{id}/card"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/statuses/#{id}/card"), [], get_headers(conn))
|
|> process_url(conn)
|
||||||
|> transform(:card)
|
|> request!(:card, :get, [], get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_in(%Hunter.Application{client_id: client_id, client_secret: client_secret}, username, password, base_url) do
|
def log_in(%Hunter.Application{client_id: client_id, client_secret: client_secret}, username, password, base_url) do
|
||||||
|
@ -297,42 +297,51 @@ defmodule Hunter.Api.HTTPClient do
|
||||||
}
|
}
|
||||||
|
|
||||||
response =
|
response =
|
||||||
:post
|
"/oauth/token"
|
||||||
|> Request.request!(process_url(base_url, "/oauth/token"), payload)
|
|> process_url(base_url)
|
||||||
|> Poison.decode!()
|
|> request!(nil, :post, payload)
|
||||||
|
|
||||||
%Hunter.Client{base_url: base_url, bearer_token: response["access_token"]}
|
%Hunter.Client{base_url: base_url, bearer_token: response["access_token"]}
|
||||||
end
|
end
|
||||||
|
|
||||||
def blocked_domains(conn, options) do
|
def blocked_domains(conn, options) do
|
||||||
:get
|
"/api/v1/domain_blocks"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/domain_blocks"), options, get_headers(conn))
|
|> process_url(conn)
|
||||||
|> Poison.decode!()
|
|> request!(nil, :get, options, get_headers(conn))
|
||||||
end
|
end
|
||||||
|
|
||||||
def block_domain(conn, domain) do
|
def block_domain(conn, domain) do
|
||||||
:post
|
"/api/v1/domain_blocks"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/domain_blocks"), %{domain: domain})
|
|> process_url(conn)
|
||||||
|> Poison.decode!()
|
|> request!(nil, :post, %{domain: domain})
|
||||||
end
|
end
|
||||||
|
|
||||||
def unblock_domain(conn, domain) do
|
def unblock_domain(conn, domain) do
|
||||||
:delete
|
"/api/v1/domain_blocks"
|
||||||
|> Request.request!(process_url(conn, "/api/v1/domain_blocks"), %{domain: domain})
|
|> process_url(conn)
|
||||||
|> Poison.decode!()
|
|> request!(nil, :delete, %{domain: domain})
|
||||||
end
|
end
|
||||||
|
|
||||||
## Helpers
|
## Helpers
|
||||||
|
defp request!(url, to, method, payload, headers \\ [], options \\ []) do
|
||||||
|
with {:ok, body} <- Request.request(method, url, payload, headers, options) do
|
||||||
|
transform(body, to)
|
||||||
|
else
|
||||||
|
{:error, reason} ->
|
||||||
|
raise Hunter.Error, reason: reason
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp get_headers(%Hunter.Client{bearer_token: token}) do
|
defp get_headers(%Hunter.Client{bearer_token: token}) do
|
||||||
["Authorization": "Bearer #{token}"]
|
["Authorization": "Bearer #{token}"]
|
||||||
end
|
end
|
||||||
|
|
||||||
defp process_url(%Hunter.Client{base_url: base_url}, url) do
|
defp process_url(endpoint, %Hunter.Client{base_url: base_url}) do
|
||||||
process_url(base_url, url)
|
process_url(endpoint, base_url)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp process_url(base_url, url) when is_binary(base_url) do
|
defp process_url(endpoint, base_url) when is_binary(base_url) do
|
||||||
base_url <> url
|
base_url <> endpoint
|
||||||
end
|
end
|
||||||
|
|
||||||
defp transform(body, :account) do
|
defp transform(body, :account) do
|
||||||
|
@ -399,6 +408,10 @@ defmodule Hunter.Api.HTTPClient do
|
||||||
Poison.decode!(body, as: %Hunter.Result{accounts: [%Hunter.Account{}], statuses: [%Hunter.Status{}]})
|
Poison.decode!(body, as: %Hunter.Result{accounts: [%Hunter.Account{}], statuses: [%Hunter.Status{}]})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp transform(body, _) do
|
||||||
|
Poison.decode!(body)
|
||||||
|
end
|
||||||
|
|
||||||
defp status_nested_struct do
|
defp status_nested_struct do
|
||||||
%Hunter.Status{
|
%Hunter.Status{
|
||||||
account: %Hunter.Account{},
|
account: %Hunter.Account{},
|
||||||
|
|
Loading…
Reference in New Issue