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