defmodule Rivet.Ident.UserCode.Lib do
alias Rivet.Ident
alias Ident.UserCode
use Rivet.Ecto.Collection.Context, model: UserCode
def generate_code(for_user_id, type, expiration_minutes, meta \\ %{}) when is_atom(type) do
code =
Ecto.UUID.generate()
|> String.replace(~r/[-IO0]+/i, "")
|> String.slice(1..8)
|> String.upcase()
case UserCode.one(code: code) do
{:ok, _} ->
generate_code(for_user_id, type, expiration_minutes)
{:error, _} ->
case UserCode.create(%{
user_id: for_user_id,
code: code,
type: type,
meta: meta,
expires: Timex.now() |> Timex.shift(minutes: expiration_minutes)
}) do
{:ok, code} ->
{:ok, code}
{:error, chgset} ->
IO.inspect(chgset, label: "Cannot generate code?")
{:error, "cannot generate code"}
end
end
end
# housekeeper
def clear_expired_codes() do
now = Timex.now()
from(c in UserCode, where: c.expires < ^now)
|> Ident.UserCode.delete_all()
end
def clear_all_codes(for_user_id, type) do
from(c in UserCode,
where:
c.user_id == ^for_user_id and
c.type == ^type
)
|> Ident.UserCode.delete_all()
end
end