neiam
/waxx
waxx
public · Issues · Pulls · Labels · Forks · Compare · Actions success · Badges · Packages
⭐
Log in to mark this repository.
Credo: Kanban single-branch conds become ifs; card field set/clear split out
b7432b9 · Gabe Morell · 2026-11-04 20:36
Files changed
modified
lib/waxx/kanban.ex
+79
−82
@@ -836,21 +836,19 @@ defmodule Waxx.Kanban do
| 836 | 836 | invite consumed. Returns `{:ok, board}` or `{:error, reason}`. |
| 837 | 837 | """ |
| 838 | 838 | def redeem_board_invite(%BoardInvite{} = invite, %User{id: user_id} = user) do |
| 839 | − cond do | |
| 840 | − not BoardInvite.active?(invite) -> | |
| 841 | − {:error, :inactive} | |
| 842 | − | |
| 843 | − true -> | |
| 844 | − Repo.transact(fn -> | |
| 845 | − existing = | |
| 846 | − Repo.get_by(Membership, board_id: invite.board_id, user_id: user_id) | |
| 839 | + if BoardInvite.active?(invite) do | |
| 840 | + Repo.transact(fn -> | |
| 841 | + existing = | |
| 842 | + Repo.get_by(Membership, board_id: invite.board_id, user_id: user_id) | |
| 847 | 843 | |
| 848 | − with {:ok, _membership} <- ensure_membership(existing, invite, user_id), | |
| 849 | − {:ok, _invite} <- | |
| 850 | − invite |> BoardInvite.consume_changeset(user) |> Repo.update() do | |
| 851 | − {:ok, Repo.get!(Board, invite.board_id)} | |
| 852 | − end | |
| 853 | − end) | |
| 844 | + with {:ok, _membership} <- ensure_membership(existing, invite, user_id), | |
| 845 | + {:ok, _invite} <- | |
| 846 | + invite |> BoardInvite.consume_changeset(user) |> Repo.update() do | |
| 847 | + {:ok, Repo.get!(Board, invite.board_id)} | |
| 848 | + end | |
| 849 | + end) | |
| 850 | + else | |
| 851 | + {:error, :inactive} | |
| 854 | 852 | end |
| 855 | 853 | end |
| 856 | 854 |
@@ -1673,65 +1671,66 @@ defmodule Waxx.Kanban do
| 1673 | 1671 | Always validates that the field belongs to the card's board. |
| 1674 | 1672 | """ |
| 1675 | 1673 | def set_card_field_value( |
| 1676 | − %Card{id: card_id, board_id: board_id} = card, | |
| 1674 | + %Card{board_id: board_id} = card, | |
| 1677 | 1675 | %BoardField{} = field, |
| 1678 | 1676 | raw_value, |
| 1679 | 1677 | opts \\ [] |
| 1680 | 1678 | ) do |
| 1681 | − cond do | |
| 1682 | − field.board_id != board_id -> | |
| 1683 | − {:error, :invalid_field} | |
| 1684 | − | |
| 1685 | − true -> | |
| 1686 | − case normalize_field_value(field, raw_value) do | |
| 1687 | − {:ok, nil} -> | |
| 1688 | − Repo.delete_all( | |
| 1689 | − from(v in CardFieldValue, | |
| 1690 | − where: v.card_id == ^card_id and v.board_field_id == ^field.id | |
| 1691 | − ) | |
| 1692 | − ) | |
| 1679 | + if field.board_id != board_id do | |
| 1680 | + {:error, :invalid_field} | |
| 1681 | + else | |
| 1682 | + case normalize_field_value(field, raw_value) do | |
| 1683 | + {:ok, nil} -> clear_card_field_value(card, field, opts) | |
| 1684 | + {:ok, value} -> put_card_field_value(card, field, value, opts) | |
| 1685 | + {:error, _} = err -> err | |
| 1686 | + end | |
| 1687 | + end | |
| 1688 | + end | |
| 1693 | 1689 | |
| 1694 | − broadcast_cards_changed(board_id) | |
| 1690 | + defp clear_card_field_value(%Card{id: card_id, board_id: board_id} = card, field, opts) do | |
| 1691 | + Repo.delete_all( | |
| 1692 | + from(v in CardFieldValue, | |
| 1693 | + where: v.card_id == ^card_id and v.board_field_id == ^field.id | |
| 1694 | + ) | |
| 1695 | + ) | |
| 1695 | 1696 | |
| 1696 | − log(board_id, opts[:actor], "card_field_cleared", | |
| 1697 | − card_id: card_id, | |
| 1698 | − meta: %{field_name: field.name} | |
| 1699 | − ) | |
| 1697 | + broadcast_cards_changed(board_id) | |
| 1700 | 1698 | |
| 1701 | − {:ok, card} | |
| 1699 | + log(board_id, opts[:actor], "card_field_cleared", | |
| 1700 | + card_id: card_id, | |
| 1701 | + meta: %{field_name: field.name} | |
| 1702 | + ) | |
| 1702 | 1703 | |
| 1703 | − {:ok, value} -> | |
| 1704 | − existing = | |
| 1705 | − Repo.get_by(CardFieldValue, card_id: card_id, board_field_id: field.id) | |
| 1704 | + {:ok, card} | |
| 1705 | + end | |
| 1706 | 1706 | |
| 1707 | − cs = | |
| 1708 | − if existing, | |
| 1709 | − do: CardFieldValue.changeset(existing, %{value: value}), | |
| 1710 | − else: | |
| 1711 | − CardFieldValue.changeset(%CardFieldValue{}, %{ | |
| 1712 | − card_id: card_id, | |
| 1713 | − board_field_id: field.id, | |
| 1714 | − value: value | |
| 1715 | − }) | |
| 1707 | + defp put_card_field_value(%Card{id: card_id, board_id: board_id}, field, value, opts) do | |
| 1708 | + existing = | |
| 1709 | + Repo.get_by(CardFieldValue, card_id: card_id, board_field_id: field.id) | |
| 1716 | 1710 | |
| 1717 | − case if(existing, do: Repo.update(cs), else: Repo.insert(cs)) do | |
| 1718 | − {:ok, _} = result -> | |
| 1719 | − broadcast_cards_changed(board_id) | |
| 1711 | + cs = | |
| 1712 | + if existing, | |
| 1713 | + do: CardFieldValue.changeset(existing, %{value: value}), | |
| 1714 | + else: | |
| 1715 | + CardFieldValue.changeset(%CardFieldValue{}, %{ | |
| 1716 | + card_id: card_id, | |
| 1717 | + board_field_id: field.id, | |
| 1718 | + value: value | |
| 1719 | + }) | |
| 1720 | 1720 | |
| 1721 | − log(board_id, opts[:actor], "card_field_set", | |
| 1722 | − card_id: card_id, | |
| 1723 | − meta: %{field_name: field.name, value: value} | |
| 1724 | − ) | |
| 1721 | + case if(existing, do: Repo.update(cs), else: Repo.insert(cs)) do | |
| 1722 | + {:ok, _} = result -> | |
| 1723 | + broadcast_cards_changed(board_id) | |
| 1725 | 1724 | |
| 1726 | − result | |
| 1725 | + log(board_id, opts[:actor], "card_field_set", | |
| 1726 | + card_id: card_id, | |
| 1727 | + meta: %{field_name: field.name, value: value} | |
| 1728 | + ) | |
| 1727 | 1729 | |
| 1728 | − other -> | |
| 1729 | − other | |
| 1730 | − end | |
| 1730 | + result | |
| 1731 | 1731 | |
| 1732 | − {:error, _} = err -> | |
| 1733 | − err | |
| 1734 | − end | |
| 1732 | + other -> | |
| 1733 | + other | |
| 1735 | 1734 | end |
| 1736 | 1735 | end |
| 1737 | 1736 |
@@ -1789,33 +1788,31 @@ defmodule Waxx.Kanban do
| 1789 | 1788 | %BoardLabel{} = label, |
| 1790 | 1789 | opts \\ [] |
| 1791 | 1790 | ) do |
| 1792 | − cond do | |
| 1793 | − label.board_id != board_id -> | |
| 1794 | − {:error, :invalid_label} | |
| 1795 | − | |
| 1796 | − true -> | |
| 1797 | − existing = | |
| 1798 | − Repo.get_by(CardLabel, card_id: card_id, board_label_id: label.id) | |
| 1799 | − | |
| 1800 | − result = | |
| 1801 | − if existing do | |
| 1802 | − Repo.delete(existing) | |
| 1803 | − else | |
| 1804 | − %CardLabel{} | |
| 1805 | − |> CardLabel.changeset(%{card_id: card_id, board_label_id: label.id}) | |
| 1806 | − |> Repo.insert() | |
| 1807 | − end | |
| 1791 | + if label.board_id != board_id do | |
| 1792 | + {:error, :invalid_label} | |
| 1793 | + else | |
| 1794 | + existing = | |
| 1795 | + Repo.get_by(CardLabel, card_id: card_id, board_label_id: label.id) | |
| 1796 | + | |
| 1797 | + result = | |
| 1798 | + if existing do | |
| 1799 | + Repo.delete(existing) | |
| 1800 | + else | |
| 1801 | + %CardLabel{} | |
| 1802 | + |> CardLabel.changeset(%{card_id: card_id, board_label_id: label.id}) | |
| 1803 | + |> Repo.insert() | |
| 1804 | + end | |
| 1808 | 1805 | |
| 1809 | − broadcast_cards_changed(board_id) | |
| 1806 | + broadcast_cards_changed(board_id) | |
| 1810 | 1807 | |
| 1811 | − action = if existing, do: "card_label_removed", else: "card_label_added" | |
| 1808 | + action = if existing, do: "card_label_removed", else: "card_label_added" | |
| 1812 | 1809 | |
| 1813 | − log(board_id, opts[:actor], action, | |
| 1814 | − card_id: card_id, | |
| 1815 | − meta: %{label_name: label.name} | |
| 1816 | − ) | |
| 1810 | + log(board_id, opts[:actor], action, | |
| 1811 | + card_id: card_id, | |
| 1812 | + meta: %{label_name: label.name} | |
| 1813 | + ) | |
| 1817 | 1814 | |
| 1818 | − result | |
| 1815 | + result | |
| 1819 | 1816 | end |
| 1820 | 1817 | end |
| 1821 | 1818 |
Parents: 21eaa0a