Skip to content

Instantly share code, notes, and snippets.

@mazz
Created December 21, 2022 02:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mazz/682464fdfc7a3d3fee9dc5d082b9f2db to your computer and use it in GitHub Desktop.
Save mazz/682464fdfc7a3d3fee9dc5d082b9f2db to your computer and use it in GitHub Desktop.
why :membership_type and :role are not added to the changeset
def update_changeset(membership, attrs) do
dbg(membership)
dbg(attrs)
# attrs #=> %{is_paid: false, membership_type: "personal", role: "admin"}
to_atom_attrs =
Enum.map(attrs, fn {k, v} ->
if is_atom(v) do
{k, v}
else
{k, String.to_existing_atom(v)}
end
end)
|> Enum.into(%{})
dbg(to_atom_attrs)
# to_atom_attrs #=> %{is_paid: false, membership_type: :personal, role: :admin}
membership
|> cast(to_atom_attrs, [:role, :is_paid, :membership_type])
|> validate_required([:role])
|> validate_inclusion(:role, @role_options)
|> prepare_changes(fn changeset ->
current_role = membership.role
new_role = get_change(changeset, :role)
dbg(new_role)
# new_role #=> nil
# changeset #=> #Ecto.Changeset<
# action: :update,
# changes: %{is_paid: false},
# errors: [],
# data: #Markably.Orgs.Membership<>,
# valid?: true
# >
if current_role == @admin_role && new_role != current_role do
validate_at_least_one_admin(changeset)
else
changeset
end
end)
@mazz
Copy link
Author

mazz commented Dec 21, 2022

defmodule Markably.Orgs.Membership do
  use Markably.Schema
  # use Ecto.Schema
  # import Ecto.Changeset
  import Ecto.Query
  import MarkablyWeb.Gettext

  alias Markably.Orgs.Org
  alias Markably.Accounts.User

  @role_options ~w(admin member)a
  @default_role :member
  @admin_role :admin

  schema "orgs_memberships" do
    field :role, Ecto.Enum, values: @role_options
    # , default: false
    field :is_paid, :boolean
    field :membership_type, Ecto.Enum, values: [:personal, :enterprise], default: :personal

    # field :billing_subscription, Ecto.Enum, values: [:personal_free, :personal_monthly, :personal_quarterly, :personal_biannually, :personal_yearly, :enterprise], default: :personal_free

    belongs_to :user, User
    belongs_to :org, Org

    timestamps()
  end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment