From 04c38be41c340db1408166d9ca062db08d10df06 Mon Sep 17 00:00:00 2001 From: David Leal <293+david@users.noreply.github.com> Date: Sat, 2 Aug 2025 09:29:31 +0100 Subject: [PATCH 01/11] refactor(prayer_requests): Inline change_request --- lib/cms/prayers.ex | 4 ++-- lib/cms/prayers/prayer_request.ex | 8 +------- lib/cms_web/live/prayer_request_live/form.ex | 8 +------- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/lib/cms/prayers.ex b/lib/cms/prayers.ex index bff8aa0..383aeb4 100644 --- a/lib/cms/prayers.ex +++ b/lib/cms/prayers.ex @@ -50,8 +50,8 @@ defmodule CMS.Prayers do @doc """ Returns an `%Ecto.Changeset{}` for tracking prayer_request changes. """ - def change_prayer_request(%PrayerRequest{} = prayer_request, attrs \\ %{}) do - PrayerRequest.changeset(prayer_request, attrs) + def change_prayer_request(%Scope{} = scope, %PrayerRequest{} = prayer_request, attrs \\ %{}) do + PrayerRequest.changeset(prayer_request, attrs, scope) end @doc """ diff --git a/lib/cms/prayers/prayer_request.ex b/lib/cms/prayers/prayer_request.ex index 34b8008..e81bdbb 100644 --- a/lib/cms/prayers/prayer_request.ex +++ b/lib/cms/prayers/prayer_request.ex @@ -15,16 +15,10 @@ defmodule CMS.Prayers.PrayerRequest do timestamps() end - @doc false - def changeset(prayer_request, attrs) do + def changeset(prayer_request, attrs, %Scope{} = scope) do prayer_request |> cast(attrs, [:body, :user_id]) |> validate_required([:body]) - end - - def changeset(prayer_request, attrs, %Scope{} = scope) do - prayer_request - |> changeset(attrs) |> put_assoc(:created_by, scope.user) |> put_assoc(:organization, scope.organization) |> assign_user_if_not_present(scope.user) diff --git a/lib/cms_web/live/prayer_request_live/form.ex b/lib/cms_web/live/prayer_request_live/form.ex index c4a1d99..0474c62 100644 --- a/lib/cms_web/live/prayer_request_live/form.ex +++ b/lib/cms_web/live/prayer_request_live/form.ex @@ -20,13 +20,7 @@ defmodule CMSWeb.PrayerRequestLive.Form do end defp apply_action(socket, :new, _params) do - changeset = - %PrayerRequest{} - |> Prayers.change_prayer_request() - # Initialize the form fields for the autocomplete component. - # The `:user_name` is the visible text field, and `:user_id` is the hidden value field. - |> Ecto.Changeset.put_change(:user_name, nil) - |> Ecto.Changeset.put_change(:user_id, nil) + changeset = Prayers.change_prayer_request(socket.assigns.current_scope, %PrayerRequest{}) socket |> assign(:form, to_form(changeset)) From bc15b11d6e056ea7f4bbc2c03066b5a9e5ce845c Mon Sep 17 00:00:00 2001 From: David Leal <293+david@users.noreply.github.com> Date: Sat, 2 Aug 2025 11:36:05 +0100 Subject: [PATCH 02/11] refactor: Remove created_by from prayer_requests --- lib/cms/prayers.ex | 16 +-------- lib/cms/prayers/prayer_request.ex | 19 ++--------- lib/cms_web/live/prayer_request_live/form.ex | 21 +----------- ...remove_created_by_from_prayer_requests.exs | 9 +++++ priv/repo/seeds.exs | 2 -- priv/repo/structure.sql | 12 ++----- test/cms/prayers_test.exs | 23 ------------- .../live/prayer_request_live/form_test.exs | 34 ------------------- test/support/fixtures/prayers_fixtures.ex | 8 ++--- 9 files changed, 18 insertions(+), 126 deletions(-) create mode 100644 priv/repo/migrations/20250802102134_remove_created_by_from_prayer_requests.exs diff --git a/lib/cms/prayers.ex b/lib/cms/prayers.ex index 383aeb4..7ddc2b6 100644 --- a/lib/cms/prayers.ex +++ b/lib/cms/prayers.ex @@ -22,8 +22,7 @@ defmodule CMS.Prayers do from(p in PrayerRequest, where: p.organization_id == ^scope.organization.id, order_by: [desc: p.inserted_at], - # Preload `created_by` to display the name of the user who created the prayer request. - preload: [:organization, :user, :created_by] + preload: [:organization, :user] ) |> Repo.all() end @@ -69,19 +68,6 @@ defmodule CMS.Prayers do def create_prayer_request(%Scope{} = scope, attrs) do %PrayerRequest{} |> PrayerRequest.changeset(attrs, scope) - |> ensure_user_in_organization(scope) |> Repo.insert() end - - defp ensure_user_in_organization(changeset, %Scope{} = scope) do - if user_id = Ecto.Changeset.get_field(changeset, :user_id) do - user = CMS.Accounts.get_user(scope, user_id) - - if is_nil(user) || user.organization_id != scope.organization.id do - raise "user #{user_id} is not in organization #{scope.organization.id}" - end - end - - changeset - end end diff --git a/lib/cms/prayers/prayer_request.ex b/lib/cms/prayers/prayer_request.ex index e81bdbb..e59922c 100644 --- a/lib/cms/prayers/prayer_request.ex +++ b/lib/cms/prayers/prayer_request.ex @@ -10,30 +10,15 @@ defmodule CMS.Prayers.PrayerRequest do field :user_name, :string, virtual: true belongs_to :user, CMS.Accounts.User belongs_to :organization, CMS.Accounts.Organization - belongs_to :created_by, CMS.Accounts.User, foreign_key: :created_by_id timestamps() end def changeset(prayer_request, attrs, %Scope{} = scope) do prayer_request - |> cast(attrs, [:body, :user_id]) + |> cast(attrs, [:body]) |> validate_required([:body]) - |> put_assoc(:created_by, scope.user) + |> put_assoc(:user, scope.user) |> put_assoc(:organization, scope.organization) - |> assign_user_if_not_present(scope.user) - |> validate_required([:user_id]) - end - - defp assign_user_if_not_present(changeset, user) do - if get_field(changeset, :user_id) do - changeset - else - changeset - # `put_assoc` is used here because we are associating an existing user, - # not creating or updating one. - |> put_assoc(:user, user) - |> put_change(:user_id, user.id) - end end end diff --git a/lib/cms_web/live/prayer_request_live/form.ex b/lib/cms_web/live/prayer_request_live/form.ex index 0474c62..ce2f827 100644 --- a/lib/cms_web/live/prayer_request_live/form.ex +++ b/lib/cms_web/live/prayer_request_live/form.ex @@ -1,7 +1,6 @@ defmodule CMSWeb.PrayerRequestLive.Form do use CMSWeb, :live_view - alias CMS.Accounts alias CMS.Prayers alias CMS.Prayers.PrayerRequest @@ -9,18 +8,11 @@ defmodule CMSWeb.PrayerRequestLive.Form do def mount(params, _session, socket) do {:ok, socket - |> assign_users() |> apply_action(socket.assigns.live_action, params)} end - defp assign_users(socket) do - scope = socket.assigns.current_scope - users = if scope.user.role == :admin, do: Accounts.list_users(scope), else: [] - assign(socket, :users, users) - end - defp apply_action(socket, :new, _params) do - changeset = Prayers.change_prayer_request(socket.assigns.current_scope, %PrayerRequest{}) + changeset = Prayers.change_prayer_request(socket.assigns.current_scope, %PrayerRequest{}) socket |> assign(:form, to_form(changeset)) @@ -39,17 +31,6 @@ defmodule CMSWeb.PrayerRequestLive.Form do <.form for={@form} id="prayer-request-form" phx-submit="save"> -
- <.autocomplete - id="user-id-autocomplete" - label="Membro" - text_field={@form[:user_name]} - value_field={@form[:user_id]} - suggestions={@users} - suggestion_label={:name} - /> -
- <.input field={@form[:body]} type="textarea" label="Pedido de Oração" required />