tokumei v0.5.0 Tokumei.Flash.Query

Store flash messages as part of a url’s query.

See Tokumei.Flash for documentation on reading and writing flash messages.

Tokumei.Flash.Query can be added as a middleware.

defmodule MyApp do
  use Elixir.Tokumei.Flash.Query
end

Inbound messages will automatically be extracted from request queries. Outbound messages will be embedded in the response location.

N.B. A location header must be on a response to embed flash messages.

Summary

Functions

Embed messages within a redirection query

Extract all query transfered flash messages from a request

Functions

embed(response, messages, opts \\ [])

Embed messages within a redirection query

Examples

# Flash message will be embedded in query
iex> {:ok, %{query: query}} = Response.see_other()
...> |> Raxx.Location.set("/")
...> |> Flash.Query.embed(warning: "Hold it")
...> |> Raxx.Location.fetch()
...> query
"_flash%5B%5D=warning%3AHold+it"

iex> {:ok, %{query: query}} = Response.see_other()
...> |> Raxx.Location.set("/")
...> |> Flash.Query.embed(warning: "Hold it", info: "It's Sunday")
...> |> Raxx.Location.fetch()
...> query
"_flash%5B%5D=warning%3AHold+it&_flash%5B%5D=info%3AIt%27s+Sunday"

# Flash messages can be embedded under custom key
iex> {:ok, %{query: query}} = Response.see_other()
...> |> Raxx.Location.set("/")
...> |> Flash.Query.embed([warning: "Hold it"], key: "_notices")
...> |> Raxx.Location.fetch()
...> query
"_notices%5B%5D=warning%3AHold+it"

# Flash messages are dropped if embed is silent and no location is provided.
iex> response = Response.see_other()
...> response == Flash.Query.embed(response, [warning: "Hold it"], silent: true)
true

# Flash messages are dropped if embed is silent and no location is provided.
iex> response = Response.see_other()
...> try do
...>   Flash.Query.embed(response, [warning: "Hold it"])
...> rescue
...>   e -> e
...> end
%Flash.Query.NoLocationError{}
extract(map, opts \\ [])

Extract all query transfered flash messages from a request

Examples

# Flash messages are extracted from query
iex> Request.get("/?_flash[]=danger%3ABad+times&_flash[]=success%3AHooray")
...> |> Flash.Query.extract()
...> |> elem(0)
[danger: "Bad times", success: "Hooray"]

# Request is returned with flash removed
iex> Request.get("/?_flash[]=danger%3Amessage+here&foo=bar")
...> |> Flash.Query.extract()
...> |> elem(1)
...> |> Map.get(:query)
%{"foo" => "bar"}

# Single message is returned as a list
iex> Request.get("/?_flash=info%3ABeeTeeDubs")
...> |> Flash.Query.extract()
...> |> elem(0)
[info: "BeeTeeDubs"]

# Empty list is returned if no query
iex> Request.get("/")
...> |> Flash.Query.extract()
...> |> elem(0)
[]

# query parameter to use for flash can be configured
iex> Request.get("/?_notices[]=info%3AOla")
...> |> Flash.Query.extract(key: "_notices")
...> |> elem(0)
[info: "Ola"]