Packages

Handle Slack slash command and interactive message HTTP requests in Elixir

Current section

Files

Jump to
slack_interactive lib plug fetch_slack_data.ex
Raw

lib/plug/fetch_slack_data.ex

defmodule Slack.Plug.FetchSlackData do
@moduledoc """
Fetches the Slack data from `conn.params` and converts
it to a `Slack` struct stored in `conn.private` as
`slack_data`.
Missing fields will default to `nil`. If no Slack data is
found in `conn.params`, `:slack_data` will be `nil`.
Interactive Messages and Slash Commands are currently supported
Slack request types.
"""
import Plug.Conn
@lint {Credo.Check.Readability.Specs, false}
@doc false
def init(opts), do: opts
@lint {Credo.Check.Readability.Specs, false}
@doc false
def call(conn, _opts),
do: fetch_slack_data(conn)
defp fetch_slack_data(%{params: %{"payload" => json}} = conn) do
with {:ok, payload} <- get_payload(json),
{:ok, slack} <- Slack.create(payload) do
put_slack_data(conn, slack)
else
_ -> put_slack_data(conn, nil)
end
end
defp fetch_slack_data(%{params: params} = conn) do
case Slack.create(params) do
{:ok, slack} -> put_slack_data(conn, slack)
_ -> put_slack_data(conn, nil)
end
end
defp fetch_slack_data(conn) do
put_slack_data(conn, nil)
end
defp get_payload(json),
do: Poison.decode(json)
defp put_slack_data(conn, value),
do: put_private(conn, :slack_data, value)
end