2019-11-15 02:08:38 +01:00
|
|
|
defmodule Philomena.UserIps do
|
|
|
|
@moduledoc """
|
|
|
|
The UserIps context.
|
|
|
|
"""
|
|
|
|
|
|
|
|
import Ecto.Query, warn: false
|
|
|
|
alias Philomena.Repo
|
|
|
|
|
|
|
|
alias Philomena.UserIps.UserIp
|
|
|
|
|
|
|
|
@doc """
|
|
|
|
Gets a single user_ip.
|
|
|
|
|
|
|
|
Raises `Ecto.NoResultsError` if the User ip does not exist.
|
|
|
|
|
|
|
|
## Examples
|
|
|
|
|
|
|
|
iex> get_user_ip!(123)
|
|
|
|
%UserIp{}
|
|
|
|
|
|
|
|
iex> get_user_ip!(456)
|
|
|
|
** (Ecto.NoResultsError)
|
|
|
|
|
|
|
|
"""
|
|
|
|
def get_user_ip!(id), do: Repo.get!(UserIp, id)
|
|
|
|
|
2020-09-06 07:30:53 +02:00
|
|
|
@doc """
|
|
|
|
Gets this user's most recent IP address, if the user has one
|
|
|
|
recorded.
|
|
|
|
"""
|
|
|
|
def get_ip_for_user(user_id) do
|
|
|
|
UserIp
|
|
|
|
|> where(user_id: ^user_id)
|
|
|
|
|> order_by(desc: :updated_at)
|
|
|
|
|> limit(1)
|
|
|
|
|> select([u], u.ip)
|
|
|
|
|> Repo.one()
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc """
|
|
|
|
Sets the appropriate netmask for correctly banning an IPv6-enabled
|
|
|
|
client per RFC4941. IPv4 addresses are not changed.
|
|
|
|
"""
|
|
|
|
def masked_ip(%Postgrex.INET{address: {_1, _2, _3, _4}} = ip) do
|
|
|
|
ip
|
|
|
|
end
|
|
|
|
|
|
|
|
def masked_ip(%Postgrex.INET{address: {h1, h2, h3, h4, _5, _6, _7, _8}} = ip) do
|
|
|
|
%{ip | address: {h1, h2, h3, h4, 0, 0, 0, 0}, netmask: 64}
|
|
|
|
end
|
|
|
|
|
2019-11-15 02:08:38 +01:00
|
|
|
@doc """
|
|
|
|
Creates a user_ip.
|
|
|
|
|
|
|
|
## Examples
|
|
|
|
|
|
|
|
iex> create_user_ip(%{field: value})
|
|
|
|
{:ok, %UserIp{}}
|
|
|
|
|
|
|
|
iex> create_user_ip(%{field: bad_value})
|
|
|
|
{:error, %Ecto.Changeset{}}
|
|
|
|
|
|
|
|
"""
|
|
|
|
def create_user_ip(attrs \\ %{}) do
|
|
|
|
%UserIp{}
|
|
|
|
|> UserIp.changeset(attrs)
|
|
|
|
|> Repo.insert()
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc """
|
|
|
|
Updates a user_ip.
|
|
|
|
|
|
|
|
## Examples
|
|
|
|
|
|
|
|
iex> update_user_ip(user_ip, %{field: new_value})
|
|
|
|
{:ok, %UserIp{}}
|
|
|
|
|
|
|
|
iex> update_user_ip(user_ip, %{field: bad_value})
|
|
|
|
{:error, %Ecto.Changeset{}}
|
|
|
|
|
|
|
|
"""
|
|
|
|
def update_user_ip(%UserIp{} = user_ip, attrs) do
|
|
|
|
user_ip
|
|
|
|
|> UserIp.changeset(attrs)
|
|
|
|
|> Repo.update()
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc """
|
|
|
|
Deletes a UserIp.
|
|
|
|
|
|
|
|
## Examples
|
|
|
|
|
|
|
|
iex> delete_user_ip(user_ip)
|
|
|
|
{:ok, %UserIp{}}
|
|
|
|
|
|
|
|
iex> delete_user_ip(user_ip)
|
|
|
|
{:error, %Ecto.Changeset{}}
|
|
|
|
|
|
|
|
"""
|
|
|
|
def delete_user_ip(%UserIp{} = user_ip) do
|
|
|
|
Repo.delete(user_ip)
|
|
|
|
end
|
|
|
|
|
|
|
|
@doc """
|
|
|
|
Returns an `%Ecto.Changeset{}` for tracking user_ip changes.
|
|
|
|
|
|
|
|
## Examples
|
|
|
|
|
|
|
|
iex> change_user_ip(user_ip)
|
|
|
|
%Ecto.Changeset{source: %UserIp{}}
|
|
|
|
|
|
|
|
"""
|
|
|
|
def change_user_ip(%UserIp{} = user_ip) do
|
|
|
|
UserIp.changeset(user_ip, %{})
|
|
|
|
end
|
|
|
|
end
|