lib/glific_web/plugs/context_plug.ex

defmodule GlificWeb.ContextPlug do
  @moduledoc """
  Setting the absinthe context, so we can store the current user there
  """
  @behaviour Plug

  @doc false
  @spec init(Plug.opts()) :: Plug.opts()
  def init(opts), do: opts

  @doc false
  @spec call(Plug.Conn.t(), Plug.opts()) :: Plug.Conn.t()
  def call(conn, _) do
    context = build_context(conn)
    Absinthe.Plug.put_options(conn, context: context)
  end

  @doc """
  Return the current user context based on the authorization header
  """
  @spec build_context(Plug.Conn.t()) :: map()
  def build_context(conn) do
    current_user = conn.assigns[:current_user]

    if current_user != nil do
      # Add the current_user to the Process memory
      Glific.Repo.put_current_user(current_user)

      if current_user.language,
        do: Gettext.put_locale(current_user.language.locale)

      %{current_user: current_user}
    else
      %{}
    end
  end
end