aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Tashkinov <ivantashkinov@gmail.com>2018-12-18 13:13:57 +0300
committerIvan Tashkinov <ivantashkinov@gmail.com>2018-12-18 17:22:42 +0300
commitb86057cc7f45c79767ff5b83730c2c15ad6bb3bd (patch)
tree392a89776bbe4fa956d54a20dc1216ddee470b44
parent1de0aa2f1025d4a860a11e658ce5fed26fe1c4ad (diff)
downloadpleroma-b86057cc7f45c79767ff5b83730c2c15ad6bb3bd.tar.gz
[#114] Refactored User.register_changeset to init confirmation data.
Introduced User.register/1 to encapsulate User record creation and post-registration actions.
-rw-r--r--lib/pleroma/user.ex25
-rw-r--r--lib/pleroma/web/admin_api/admin_api_controller.ex10
-rw-r--r--lib/pleroma/web/twitter_api/twitter_api.ex41
3 files changed, 41 insertions, 35 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index a38ead81a..234617574 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -170,7 +170,14 @@ defmodule Pleroma.User do
update_and_set_cache(password_update_changeset(user, data))
end
- def register_changeset(struct, params \\ %{}) do
+ def register_changeset(struct, params \\ %{}, opts \\ []) do
+ confirmation_status =
+ if opts[:confirmed] || !Pleroma.Config.get([:instance, :account_activation_required]) do
+ :confirmed
+ else
+ :unconfirmed
+ end
+
changeset =
struct
|> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation])
@@ -182,7 +189,7 @@ defmodule Pleroma.User do
|> validate_format(:email, @email_regex)
|> validate_length(:bio, max: 1000)
|> validate_length(:name, min: 1, max: 100)
- |> put_change(:info, %Pleroma.User.Info{})
+ |> put_change(:info, User.Info.confirmation_update(%User.Info{}, confirmation_status))
if changeset.valid? do
hashed = Pbkdf2.hashpwsalt(changeset.changes[:password])
@@ -199,6 +206,20 @@ defmodule Pleroma.User do
end
end
+ @doc "Inserts provided changeset, performs post-registration actions (confirmation email sending etc.)"
+ def register(%Ecto.Changeset{} = changeset) do
+ with {:ok, user} <- Repo.insert(changeset) do
+ if user.info.confirmation_pending do
+ {:ok, _} =
+ user
+ |> Pleroma.UserEmail.account_confirmation_email()
+ |> Pleroma.Mailer.deliver()
+ end
+
+ {:ok, user}
+ end
+ end
+
def needs_update?(%User{local: true}), do: false
def needs_update?(%User{local: false, last_refreshed_at: nil}), do: true
diff --git a/lib/pleroma/web/admin_api/admin_api_controller.ex b/lib/pleroma/web/admin_api/admin_api_controller.ex
index 4d73cf219..683310168 100644
--- a/lib/pleroma/web/admin_api/admin_api_controller.ex
+++ b/lib/pleroma/web/admin_api/admin_api_controller.ex
@@ -1,6 +1,6 @@
defmodule Pleroma.Web.AdminAPI.AdminAPIController do
use Pleroma.Web, :controller
- alias Pleroma.{User, Repo}
+ alias Pleroma.User
alias Pleroma.Web.ActivityPub.Relay
import Pleroma.Web.ControllerHelper, only: [json_response: 3]
@@ -26,7 +26,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
conn,
%{"nickname" => nickname, "email" => email, "password" => password}
) do
- new_user = %{
+ user_data = %{
nickname: nickname,
name: nickname,
email: email,
@@ -35,11 +35,11 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
bio: "."
}
- User.register_changeset(%User{}, new_user)
- |> Repo.insert!()
+ changeset = User.register_changeset(%User{}, user_data, confirmed: true)
+ {:ok, user} = User.register(changeset)
conn
- |> json(new_user.nickname)
+ |> json(user.nickname)
end
def tag_users(conn, %{"nicknames" => nicknames, "tags" => tags}) do
diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex
index b77761aa4..d8dd7dfa8 100644
--- a/lib/pleroma/web/twitter_api/twitter_api.ex
+++ b/lib/pleroma/web/twitter_api/twitter_api.ex
@@ -161,34 +161,19 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
Repo.get_by(UserInviteToken, %{token: tokenString})
end
- cond do
- registrations_open || (!is_nil(token) && !token.used) ->
- changeset = User.register_changeset(%User{info: %{}}, params)
-
- with {:ok, user} <- Repo.insert(changeset) do
- !registrations_open && UserInviteToken.mark_as_used(token.token)
-
- if Pleroma.Config.get([:instance, :account_activation_required]) do
- info_change = User.Info.confirmation_update(user.info, :unconfirmed)
-
- {:ok, unconfirmed_user} =
- user
- |> Ecto.Changeset.change()
- |> Ecto.Changeset.put_embed(:info, info_change)
- |> Repo.update()
-
- {:ok, _} =
- unconfirmed_user
- |> UserEmail.account_confirmation_email()
- |> Mailer.deliver()
- end
-
- {:ok, user}
- else
- {:error, changeset} ->
- errors =
- Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)
- |> Jason.encode!()
+ cond do
+ registrations_open || (!is_nil(token) && !token.used) ->
+ changeset = User.register_changeset(%User{}, params)
+
+ with {:ok, user} <- User.register(changeset) do
+ !registrations_open && UserInviteToken.mark_as_used(token.token)
+
+ {:ok, user}
+ else
+ {:error, changeset} ->
+ errors =
+ Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)
+ |> Jason.encode!()
{:error, %{error: errors}}
end