diff --git a/.credo.exs b/.credo.exs index f806174..5526a45 100644 --- a/.credo.exs +++ b/.credo.exs @@ -89,7 +89,7 @@ # If you don't want TODO comments to cause `mix credo` to fail, just # set this value to 0 (zero). # - {Credo.Check.Design.TagTODO, [exit_status: 2]}, + {Credo.Check.Design.TagTODO, [exit_status: 0]}, # ## Readability Checks diff --git a/lib/spazio_solazzo/accounts/user.ex b/lib/spazio_solazzo/accounts/user.ex index 23d7d3b..27af03c 100644 --- a/lib/spazio_solazzo/accounts/user.ex +++ b/lib/spazio_solazzo/accounts/user.ex @@ -83,7 +83,7 @@ defmodule SpazioSolazzo.Accounts.User do change AshAuthentication.Strategy.MagicLink.SignInChange # Conditionally validate name and phone_number for new users - change SpazioSolazzo.Accounts.User.Changes.ValidateRegistrationFields + change SpazioSolazzo.Accounts.User.Changes.ParseRegistrationFields change {AshAuthentication.Strategy.RememberMe.MaybeGenerateTokenChange, strategy_name: :remember_me} @@ -149,7 +149,7 @@ defmodule SpazioSolazzo.Accounts.User do end attribute :phone_number, :string do - allow_nil? false + allow_nil? true public? true end end diff --git a/lib/spazio_solazzo/accounts/user/changes/validate_registration_fields.ex b/lib/spazio_solazzo/accounts/user/changes/validate_registration_fields.ex index 80466bc..88501ea 100644 --- a/lib/spazio_solazzo/accounts/user/changes/validate_registration_fields.ex +++ b/lib/spazio_solazzo/accounts/user/changes/validate_registration_fields.ex @@ -1,4 +1,4 @@ -defmodule SpazioSolazzo.Accounts.User.Changes.ValidateRegistrationFields do +defmodule SpazioSolazzo.Accounts.User.Changes.ParseRegistrationFields do @moduledoc """ Conditionally validates that name and phone_number are present for new user registrations. For existing users (upserts), these fields are not required. @@ -11,28 +11,53 @@ defmodule SpazioSolazzo.Accounts.User.Changes.ValidateRegistrationFields do case SpazioSolazzo.Accounts.get_user_by_email(email, authorize?: false) do {:ok, %{phone_number: phone, name: name}} -> + # User is already registered, we'll just set the same values it had changeset |> Ash.Changeset.force_change_attribute(:name, name) |> Ash.Changeset.force_change_attribute(:phone_number, phone) _ -> + # User is not yet registered, we'll parse & validate the new values name = Ash.Changeset.get_argument(changeset, :name) phone = Ash.Changeset.get_argument(changeset, :phone_number) changeset - |> validate_required_for_registration(:name, name) - |> validate_required_for_registration(:phone_number, phone) + |> parse_name(name) + |> parse_phone_number(phone) end end - defp validate_required_for_registration(changeset, field, value) do - if is_nil(value) || value == "" do - Ash.Changeset.add_error( - changeset, - Ash.Error.Changes.Required.exception(field: field, type: :argument) - ) + defp parse_name(changeset, nil) do + Ash.Changeset.add_error( + changeset, + Ash.Error.Changes.Required.exception(field: :name, type: :argument) + ) + end + + defp parse_name(changeset, value) do + value = String.trim(value) + + if value == "" do + parse_name(changeset, nil) else - Ash.Changeset.change_attribute(changeset, field, value) + Ash.Changeset.change_attribute(changeset, :name, value) + end + end + + defp parse_phone_number(changeset, nil) do + # The phone number is nullable, this is fine + Ash.Changeset.change_attribute(changeset, :phone_number, nil) + end + + defp parse_phone_number(changeset, value) do + value = String.trim(value) + + if value == "" do + # Instead of returning an error, we'll consider an empty phone number + # as if the user didn't want to set one, which is valid. + parse_name(changeset, nil) + else + Ash.Changeset.change_attribute(changeset, :phone_number, value) end end end diff --git a/lib/spazio_solazzo/booking_system/booking.ex b/lib/spazio_solazzo/booking_system/booking.ex index 8e99b58..8545d94 100644 --- a/lib/spazio_solazzo/booking_system/booking.ex +++ b/lib/spazio_solazzo/booking_system/booking.ex @@ -52,7 +52,7 @@ defmodule SpazioSolazzo.BookingSystem.Booking do argument :date, :date, allow_nil?: false argument :customer_name, :string, allow_nil?: false argument :customer_email, :string, allow_nil?: false - argument :customer_phone, :string, allow_nil?: false + argument :customer_phone, :string, allow_nil?: true argument :customer_comment, :string, allow_nil?: true change manage_relationship(:time_slot_template_id, :time_slot_template, @@ -167,7 +167,7 @@ defmodule SpazioSolazzo.BookingSystem.Booking do attribute :customer_email, :string, allow_nil?: false attribute :start_time, :time, allow_nil?: false attribute :end_time, :time, allow_nil?: false - attribute :customer_phone, :string, allow_nil?: false + attribute :customer_phone, :string, allow_nil?: true attribute :customer_comment, :string, allow_nil?: true attribute :state, :atom do diff --git a/lib/spazio_solazzo_web/emails/email_templates/admin_notification.html.heex b/lib/spazio_solazzo_web/emails/email_templates/admin_notification.html.heex index 0747713..5a52af4 100644 --- a/lib/spazio_solazzo_web/emails/email_templates/admin_notification.html.heex +++ b/lib/spazio_solazzo_web/emails/email_templates/admin_notification.html.heex @@ -3,7 +3,12 @@

Customer: {@customer_name}

Email: {@customer_email}

-

Phone: {@customer_phone}

+ + <%= if @customer_phone && String.trim(@customer_phone) != "" do %> +

Phone: {@customer_phone}

+ <% else %> +

Phone: N/A

+ <% end %>
<.details_list> diff --git a/lib/spazio_solazzo_web/emails/email_templates/customer_confirmation.html.heex b/lib/spazio_solazzo_web/emails/email_templates/customer_confirmation.html.heex index 4e6bab4..436db04 100644 --- a/lib/spazio_solazzo_web/emails/email_templates/customer_confirmation.html.heex +++ b/lib/spazio_solazzo_web/emails/email_templates/customer_confirmation.html.heex @@ -7,7 +7,7 @@ <.detail_item label="Date">{@date} <.detail_item label="Time">{@start_time} - {@end_time} <.detail_item label="Email">{@customer_email} - <.detail_item label="Phone">{@customer_phone} + <.detail_item label="Phone">{@customer_phone || "N/A"} <.detail_item label="Note">{@customer_comment || "N/A"} diff --git a/lib/spazio_solazzo_web/live/auth/auth_callback_live.ex b/lib/spazio_solazzo_web/live/auth/auth_callback_live.ex index 6e0190d..937d8dc 100644 --- a/lib/spazio_solazzo_web/live/auth/auth_callback_live.ex +++ b/lib/spazio_solazzo_web/live/auth/auth_callback_live.ex @@ -74,12 +74,17 @@ defmodule SpazioSolazzoWeb.AuthCallbackLive do ) do %{token: token} = socket.assigns remember_me = Map.get(args, "remember_me") == "on" + name = String.trim(name) + phone_number = String.trim(phone_number) - {:noreply, - redirect(socket, - to: - ~p"/auth/magic/sign-in?token=#{token}&name=#{name}&phone_number=#{phone_number}&remember_me=#{remember_me}" - )} + url = + if phone_number == "" do + ~p"/auth/magic/sign-in?token=#{token}&name=#{name}&remember_me=#{remember_me}" + else + ~p"/auth/magic/sign-in?token=#{token}&name=#{name}&phone_number=#{phone_number}&remember_me=#{remember_me}" + end + + {:noreply, redirect(socket, to: url)} end defp extract_email_from_token(token) do diff --git a/lib/spazio_solazzo_web/live/auth/auth_callback_live.html.heex b/lib/spazio_solazzo_web/live/auth/auth_callback_live.html.heex index 85f2aae..7644a33 100644 --- a/lib/spazio_solazzo_web/live/auth/auth_callback_live.html.heex +++ b/lib/spazio_solazzo_web/live/auth/auth_callback_live.html.heex @@ -98,21 +98,23 @@ for="phone_number" class="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2" > - Phone Number * + Phone Number (Optional)
<.icon name="hero-phone" class="size-5 text-slate-400 dark:text-slate-500" />
+

+ Your number will only be used to contact you personally about booking issues, never for marketing. +