Current section
Files
Jump to
Current section
Files
lib/txpost/plug/payload_deserializer.ex
defmodule Txpost.Plug.PayloadDeserializer do
@moduledoc """
Plug for flattening incoming params decoded from a CBOR request as per BRFC
`c9a2975b3d19` ([CBOR Tx Payload](cbor-tx-payload.md)).
This will only deserialize a payload when the request has a CBOR-parsable
content type.
## Example
plug Txpost.Plug.PayloadDeserializer
"""
import Plug.Conn
@behaviour Plug
@impl true
def init(opts), do: opts
@impl true
def call(conn, _opts) do
content_type = get_req_header(conn, "content-type")
if Enum.any?(content_type, &valid_content_type/1),
do: Map.put(conn, :params, flatten_params(conn.params)),
else: conn
end
defp valid_content_type("application/cbor"), do: true
defp valid_content_type("application/" <> subtype),
do: String.ends_with?(subtype, "cbor")
defp valid_content_type(_content_type), do: false
defp flatten_params(%{"data" => data} = params) when is_map(data) do
params
|> Map.merge(data)
|> Map.delete("data")
end
defp flatten_params(%{"data" => data}) when is_list(data) do
data
end
defp flatten_params(params), do: params
end