lib/auth/user.ex

defmodule Legendary.Auth.User do
  @moduledoc """
  The baseline user schema module.
  """
  use Ecto.Schema
  use Pow.Ecto.Schema
  use Pow.Extension.Ecto.Schema,
    extensions: [PowResetPassword, PowEmailConfirmation]

  import Pow.Ecto.Schema.Changeset, only: [new_password_changeset: 3]

  alias Ecto.Changeset

  schema "users" do
    field :roles, {:array, :string}, default: []
    field :display_name, :string
    field :homepage_url, :string

    pow_user_fields()

    timestamps()
  end

  defp parse_roles(list) when is_list(list), do: list
  defp parse_roles(binary) when is_binary(binary), do: Phoenix.json_library().decode!(binary)

  def admin_changeset(user_or_changeset, attrs) do
    role_list = attrs
      |> Map.get("roles", [])
      |> parse_roles()
    attrs = Map.put(attrs, "roles", role_list)

    user_or_changeset
    |> pow_user_id_field_changeset(attrs)
    |> Changeset.cast(attrs, [:roles, :display_name])
    |> pow_extension_changeset(attrs)
  end

  def changeset(user_or_changeset, attrs) do
    user_or_changeset
    |> pow_user_id_field_changeset(attrs)
    |> pow_current_password_changeset(attrs)
    |> new_password_changeset(attrs, @pow_config)
    |> Changeset.cast(attrs, [:roles])
    |> pow_extension_changeset(attrs)
  end

  def reset_password_changeset(%Legendary.Auth.User{} = user, params) do
    user
    |> new_password_changeset(params, @pow_config)
    |> Changeset.validate_required([:password])
  end
end