Custom UserIdentity belongs_to type

Hi guys,

I’m using the Exnowflake library to generate my user ids. The Exnowflake uses custom Ecto types in its implementation. I need to be able to customize the pow_assent_user_identity_fields to specify the belongs_to user type.

For example, something like:

belongs_to(name, @pow_user_mod, type: Dealfy.Types.Exnowflake)

How can I do that? Or what would be the best way to do this?

Here is my code:

Codes:

user_identity.ex

defmodule Dealfy.UserIdentities.UserIdentity do
  use Ecto.Schema
  use PowAssent.Ecto.UserIdentities.Schema, user: Dealfy.Users.User

  schema "user_identities" do
    pow_assent_user_identity_fields()
    # belongs_to :user, Dealfy.Users.User, type:  Dealfy.Types.Exnowflake

    timestamps()
  end
end

user.ex

defmodule Dealfy.Users.User do
  use Ecto.Schema
  use Pow.Ecto.Schema
  use PowAssent.Ecto.Schema

  use Pow.Extension.Ecto.Schema,
    extensions: [PowResetPassword]

  @primary_key {:id, Dealfy.Types.Exnowflake, autogenerate: true}
  @foreign_key_type Dealfy.Types.Exnowflake
  schema "users" do
    field :name, :string

    pow_user_fields()

    timestamps()
  end

  def changeset(user_or_changeset, attrs) do
    user_or_changeset
    |> pow_changeset(attrs)
    |> Ecto.Changeset.cast(attrs, [:name])
    |> Ecto.Changeset.validate_required([:name])
    |> pow_extension_changeset(attrs)
  end

  def user_identity_changeset(user_or_changeset, user_identity, attrs, user_id_attrs) do
    user_or_changeset
    |> Ecto.Changeset.cast(attrs, [:name])
    |> pow_assent_user_identity_changeset(user_identity, attrs, user_id_attrs)
  end
end

exnowflake.ex

defmodule Dealfy.Types.Exnowflake do
  @moduledoc """
  A custom Ecto type to generate Exnowflake IDs.
  """
  @behaviour Ecto.Type
  require Logger

  @type t :: integer()

  @doc """
  Generates a new ID.
  """
  @spec generate() :: t()
  def generate do
    {:ok, id} = Exnowflake.generate()
    id
  rescue
    exeption ->
      Logger.error("Ecto type Exnowflake failed: #{inspect(exeption)}")
  end

  def autogenerate, do: generate()

  def type, do: :integer

  def cast(term) when is_integer(term), do: {:ok, term}
  def cast(_), do: :error

  def dump(term) when is_integer(term), do: {:ok, term}
  def dump(_), do: :error

  def load(term), do: {:ok, term}

  def equal?(term, term), do: true
  def equal?(_, _), do: false

  def embed_as(_format) do
    :self
  end
end

Right now I’m getting this error:



The error says the record is not found, but they exists when I try run the query in the iex console.