defmodule AuthN.Plugs.AssignCurrentUser do @moduledoc ~S""" This plug fetches the current user by the user token stored in session and stores the user in `conn.assigns`. The user is fetched by a function provided through the mandatory `:get_user_by_session_token_fun` option; the function receives the user ID as argument. In case no user token is stored in session, this plug does nothing (just returns the `conn` received). In case a user token is stored in session, but no user can be found for that token, the plug clears the session. """ def init(opts) do Keyword.fetch!(opts, :get_user_by_session_token_fun) opts end def call(conn, opts) do get_user_by_session_token_fun = Keyword.fetch!(opts, :get_user_by_session_token_fun) {user_token, conn} = AuthN.SessionStorage.get_user_token(conn) if user_token do assign_user(conn, get_user_by_session_token_fun.(user_token)) else conn end end defp assign_user(conn, nil) do AuthN.SessionStorage.delete_user_token(conn) end defp assign_user(conn, user) do Plug.Conn.assign(conn, :current_user, user) end end