Current section
Files
Jump to
Current section
Files
lib/idempotency_key/idempotency_key.ex
defmodule ElixirTools.IdempotencyKey do
@moduledoc """
Provides functionality for idempotent controllers. Extract, verify format of idempotency keys.
"""
import Plug.Conn
alias Plug.Conn
@type idempotency_key :: Ecto.UUID.t() | nil
@typep error_format_check :: {:error, :wrong_idempotency_key}
@doc """
Extract idempotency key from header
"""
@spec get(Conn.t()) :: {:ok, idempotency_key} | error_format_check
def get(conn) do
case get_req_header(conn, "idempotency-key") do
[idempotency_key] -> check_format(idempotency_key)
[] -> {:ok, nil}
end
end
@spec check_format(idempotency_key) :: {:ok, idempotency_key} | error_format_check
defp check_format(idempotency_key) do
case Ecto.UUID.cast(idempotency_key) do
:error -> {:error, :wrong_format_idempotency_key}
{:ok, value} -> {:ok, value}
end
end
end