Diffuser/lib/diffuser_web/plugs/user_auth.ex

38 lines
1.1 KiB
Elixir

defmodule DiffuserWeb.Plugs.UserAuth do
use DiffuserWeb, :controller
import Plug.Conn
alias Diffuser.Accounts
alias Diffuser.Repo
def init(default), do: default
def call(%{remote_ip: remote_ip} = conn, _) do
remote_ip = remote_ip |> :inet_parse.ntoa() |> to_string()
case get_session(conn, :user) do
nil ->
with {:ok, user} <- Accounts.create_user(%{ip_address: remote_ip}) do
put_session(conn, :user, user |> Repo.preload(votes: [:prompt_request]))
else
{:error, _changeset} -> put_session(conn, :user, nil)
end
%Accounts.User{ip_address: user_ip} = user ->
with false <- user_ip == remote_ip,
{:ok, user} <- Accounts.update_user(user, %{ip_address: remote_ip}) do
conn |> put_session(:user, user |> Repo.preload(votes: [:prompt_request]))
else
true ->
put_session(
conn,
:user,
Accounts.get_user!(user.id) |> Repo.preload(votes: [:prompt_request])
)
_ ->
put_session(conn, :user, nil)
end
end
end
end