38 lines
1.1 KiB
Elixir
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
|