defmodule Mobilizon.Service.Users.Tools do @moduledoc """ Common functions for actors services """ alias Mobilizon.Users.User @spec we_can_send_email(User.t(), atom()) :: :ok | {:error, :email_too_soon} def we_can_send_email(%User{} = user, key \\ :reset_password_sent_at) do case Map.get(user, key) do nil -> :ok _ -> case Timex.before?( Timex.shift(Map.get(user, key), hours: 1), DateTime.utc_now() |> DateTime.truncate(:second) ) do true -> :ok false -> {:error, :email_too_soon} end end end @spec random_string(integer) :: String.t() def random_string(length) do length |> :crypto.strong_rand_bytes() |> Base.url_encode64() end end defmodule Mobilizon.Users.Guards do @moduledoc """ Guards for users """ defguard is_admin(role) when is_atom(role) and role == :administrator defguard is_moderator(role) when is_atom(role) and role in [:administrator, :moderator] end