Current section

Files

Jump to
messenger_bot lib messenger_bot webhooks router.ex
Raw

lib/messenger_bot/webhooks/router.ex

defmodule MessengerBot.Webhook.Router do
@moduledoc """
Router for messenger webhooks
"""
use Plug.Router
alias MessengerBot.Webhook.Callback, as: CallbackWebhook
alias MessengerBot.Webhook.Setup, as: SetupWebhook
alias MessengerBot.Config
plug MessengerBot.Plug.Authenticate
plug :match
plug :dispatch
post _ do
call_hooks(conn)
send_ok(conn)
end
get _ do
case SetupWebhook.process(query_params(conn)) do
{:ok, challenge} -> send_resp(conn, :ok, challenge)
{:error, reason} ->
err_resp(conn, :unprocessable_entity, reason)
end
end
match _,
do: err_resp(conn, 404, %{page: "Not found!"})
defp call_hooks(conn) do
spawn(fn ->
body = conn.private[:body]
CallbackWebhook.process(Config.app_id(), body)
end)
end
defp query_params(conn) do
conn
|> fetch_query_params()
|> Map.get(:query_params, %{})
end
defp send_ok(conn) do
conn
|> put_resp_content_type("application/json")
|> send_resp(:ok, "[]")
end
defp err_resp(conn, status, errors) do
conn
|> put_resp_content_type("application/json")
|> send_resp(status, :jiffy.encode(%{errors: errors}))
|> halt()
end
end