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.