2020-01-26 21:36:50 +01:00
|
|
|
|
defmodule Mobilizon.Web.Email.Checker do
|
2018-11-15 17:35:47 +01:00
|
|
|
|
@moduledoc """
|
2019-09-22 16:26:23 +02:00
|
|
|
|
Provides a function to test emails against a "not so bad" regex.
|
2018-11-15 17:35:47 +01:00
|
|
|
|
"""
|
|
|
|
|
|
2020-01-28 20:15:59 +01:00
|
|
|
|
@email_regex ~r/^[\w.!#$%&’*+\-\/=?\^`{|}~]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$/i
|
2018-11-15 17:35:47 +01:00
|
|
|
|
|
|
|
|
|
@doc """
|
2019-09-22 16:26:23 +02:00
|
|
|
|
Returns whether the email is valid.
|
2018-11-15 17:35:47 +01:00
|
|
|
|
"""
|
2019-09-22 16:26:23 +02:00
|
|
|
|
@spec valid?(String.t()) :: boolean
|
|
|
|
|
def valid?(email), do: email =~ @email_regex
|
2019-12-20 13:04:34 +01:00
|
|
|
|
|
|
|
|
|
@spec validate_changeset(Ecto.Changeset.t(), atom()) :: Ecto.Changeset.t()
|
|
|
|
|
def validate_changeset(%Ecto.Changeset{} = changeset, key \\ :email) do
|
|
|
|
|
changeset = Ecto.Changeset.validate_length(changeset, :email, min: 3, max: 250)
|
|
|
|
|
|
|
|
|
|
case Ecto.Changeset.fetch_change(changeset, key) do
|
|
|
|
|
{:ok, email} ->
|
|
|
|
|
if valid?(email),
|
|
|
|
|
do: changeset,
|
|
|
|
|
else: Ecto.Changeset.add_error(changeset, :email, "Email doesn't fit required format")
|
|
|
|
|
|
|
|
|
|
:error ->
|
|
|
|
|
changeset
|
|
|
|
|
end
|
|
|
|
|
end
|
2018-11-15 17:35:47 +01:00
|
|
|
|
end
|