The list ↔ contact join (PhoenixKitCRM.Lists), carrying a denormalized
email snapshot taken at add-time and its own status/source.
email is deliberately not in the public changeset's castable fields —
it is only ever set by the context from the contact's current email
(PhoenixKitCRM.Lists.add_contact_to_list/3), so a list survives a later
change to the contact's own email and a crafted form payload can't forge a
membership's email. It may be nil (the contact just isn't sendable).
Summary
Functions
Changeset for creating/updating a membership. email is NOT castable — see moduledoc.
Types
@type t() :: %PhoenixKitCRM.Schemas.ListMember{ __meta__: term(), contact: PhoenixKitCRM.Schemas.Contact.t() | Ecto.Association.NotLoaded.t() | nil, contact_uuid: UUIDv7.t() | nil, email: String.t() | nil, inserted_at: DateTime.t() | nil, list: PhoenixKitCRM.Schemas.ContactList.t() | Ecto.Association.NotLoaded.t() | nil, list_uuid: UUIDv7.t() | nil, metadata: map(), source: String.t() | nil, status: String.t() | nil, subscribed_at: DateTime.t() | nil, unsubscribed_at: DateTime.t() | nil, updated_at: DateTime.t() | nil, uuid: UUIDv7.t() | nil }
Functions
@spec changeset(t() | Ecto.Changeset.t(t()), map()) :: Ecto.Changeset.t(t())
Changeset for creating/updating a membership. email is NOT castable — see moduledoc.
@spec sources() :: [String.t()]
@spec statuses() :: [String.t()]