From 6fc0bf8cb81951afc104b0b97f8b47d0df1fe6d5 Mon Sep 17 00:00:00 2001 From: jaronoff97 Date: Sat, 3 Aug 2024 17:37:56 -0400 Subject: [PATCH 1/3] Allow updating via custom context --- .../email_confirmation/ecto/context.ex | 2 +- lib/extensions/invitation/ecto/context.ex | 2 +- lib/extensions/reset_password/ecto/context.ex | 5 +++-- lib/pow/operations.ex | 16 +++++++++++++++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/extensions/email_confirmation/ecto/context.ex b/lib/extensions/email_confirmation/ecto/context.ex index 34b57026..ad775d93 100644 --- a/lib/extensions/email_confirmation/ecto/context.ex +++ b/lib/extensions/email_confirmation/ecto/context.ex @@ -37,7 +37,7 @@ defmodule PowEmailConfirmation.Ecto.Context do def confirm_email(%user_mod{} = user, params, config) do user |> user_mod.confirm_email_changeset(params) - |> Context.do_update(config) + |> Operations.do_update(config) end # TODO: Remove by 1.1.0 diff --git a/lib/extensions/invitation/ecto/context.ex b/lib/extensions/invitation/ecto/context.ex index a6854ca2..044872eb 100644 --- a/lib/extensions/invitation/ecto/context.ex +++ b/lib/extensions/invitation/ecto/context.ex @@ -28,7 +28,7 @@ defmodule PowInvitation.Ecto.Context do def update(%user_mod{} = user, params, config) do user |> user_mod.accept_invitation_changeset(params) - |> Context.do_update(config) + |> Operations.do_update(config) end @doc """ diff --git a/lib/extensions/reset_password/ecto/context.ex b/lib/extensions/reset_password/ecto/context.ex index afe83310..d3e8ecf8 100644 --- a/lib/extensions/reset_password/ecto/context.ex +++ b/lib/extensions/reset_password/ecto/context.ex @@ -6,11 +6,12 @@ defmodule PowResetPassword.Ecto.Context do @spec get_by_email(binary(), Config.t()) :: Context.user() | nil def get_by_email(email, config), do: Operations.get_by([email: email], config) - @spec update_password(Context.user(), map(), Config.t()) :: {:ok, Context.user()} | {:error, Context.changeset()} + @spec update_password(Context.user(), map(), Config.t()) :: + {:ok, Context.user()} | {:error, Context.changeset()} def update_password(%user_mod{} = user, params, config) do user |> user_mod.reset_password_changeset(params) - |> Context.do_update(config) + |> Operations.do_update(config) end # TODO: Remove by 1.1.0 diff --git a/lib/pow/operations.ex b/lib/pow/operations.ex index 1fca213e..db342d1f 100644 --- a/lib/pow/operations.ex +++ b/lib/pow/operations.ex @@ -58,7 +58,7 @@ defmodule Pow.Operations do module -> module.create(params) end end - + @doc """ Update an existing user. @@ -72,6 +72,20 @@ defmodule Pow.Operations do module -> module.update(user, params) end end + + @doc """ + Update the database given a changeset. + + This calls `Pow.Ecto.Context.do_update/2` or `do_update/1` on a custom context + module. + """ + @spec do_update(Context.changeset(), Config.t()) :: {:ok, map()} | {:error, map()} + def do_update(changeset, config) do + case context_module(config) do + Context -> Context.do_update(changeset, config) + module -> module.do_update(changeset) + end + end @doc """ Delete an existing user. From eccc24f2fc8be0db0fac296bd9f1ce1ec8b94f56 Mon Sep 17 00:00:00 2001 From: jaronoff97 Date: Sat, 3 Aug 2024 17:39:40 -0400 Subject: [PATCH 2/3] space --- lib/pow/operations.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pow/operations.ex b/lib/pow/operations.ex index db342d1f..5542d4d0 100644 --- a/lib/pow/operations.ex +++ b/lib/pow/operations.ex @@ -58,7 +58,7 @@ defmodule Pow.Operations do module -> module.create(params) end end - + @doc """ Update an existing user. From 343b8507f1fcbea88d9649e173d869d8f545e261 Mon Sep 17 00:00:00 2001 From: jaronoff97 Date: Sat, 3 Aug 2024 18:11:29 -0400 Subject: [PATCH 3/3] Don't forget the spec --- lib/pow/context.ex | 1 + lib/pow/ecto/context.ex | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/lib/pow/context.ex b/lib/pow/context.ex index 17f825fb..75525d89 100644 --- a/lib/pow/context.ex +++ b/lib/pow/context.ex @@ -8,6 +8,7 @@ defmodule Pow.Context do @callback authenticate(map()) :: user() | nil @callback create(map()) :: {:ok, user()} | {:error, changeset()} @callback update(user(), map()) :: {:ok, user()} | {:error, changeset()} + @callback do_update(changeset()) :: {:ok, map()} | {:error, changeset()} @callback delete(user()) :: {:ok, user()} | {:error, changeset()} @callback get_by(Keyword.t() | map()) :: user() | nil end diff --git a/lib/pow/ecto/context.ex b/lib/pow/ecto/context.ex index 110c5038..d1881515 100644 --- a/lib/pow/ecto/context.ex +++ b/lib/pow/ecto/context.ex @@ -26,6 +26,7 @@ defmodule Pow.Ecto.Context do * `pow_authenticate/1` * `pow_create/1` * `pow_update/2` + * `pow_do_update/1` * `pow_delete/1` * `pow_get_by/1` @@ -50,6 +51,7 @@ defmodule Pow.Ecto.Context do def authenticate(params), do: pow_authenticate(params) def create(params), do: pow_create(params) def update(user, params), do: pow_update(user, params) + def do_update(changeset), do: pow_do_update(changeset) def delete(user), do: pow_delete(user) def get_by(clauses), do: pow_get_by(clauses) @@ -65,6 +67,10 @@ defmodule Pow.Ecto.Context do unquote(__MODULE__).update(user, params, @pow_config) end + def pow_do_update(changeset) do + unquote(__MODULE__).do_update(changeset, @pow_config) + end + def pow_delete(user) do unquote(__MODULE__).delete(user, @pow_config) end