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 />