[#114] Refactored User.register_changeset to init confirmation data.

Introduced User.register/1 to encapsulate User record creation and post-registration actions.
This commit is contained in:
Ivan Tashkinov 2018-12-18 13:13:57 +03:00
parent 1de0aa2f10
commit b86057cc7f
3 changed files with 39 additions and 33 deletions

View file

@ -170,7 +170,14 @@ def reset_password(user, data) do
update_and_set_cache(password_update_changeset(user, data)) update_and_set_cache(password_update_changeset(user, data))
end 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 = changeset =
struct struct
|> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation]) |> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation])
@ -182,7 +189,7 @@ def register_changeset(struct, params \\ %{}) do
|> validate_format(:email, @email_regex) |> validate_format(:email, @email_regex)
|> validate_length(:bio, max: 1000) |> validate_length(:bio, max: 1000)
|> validate_length(:name, min: 1, max: 100) |> 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 if changeset.valid? do
hashed = Pbkdf2.hashpwsalt(changeset.changes[:password]) hashed = Pbkdf2.hashpwsalt(changeset.changes[:password])
@ -199,6 +206,20 @@ def register_changeset(struct, params \\ %{}) do
end end
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: true}), do: false
def needs_update?(%User{local: false, last_refreshed_at: nil}), do: true def needs_update?(%User{local: false, last_refreshed_at: nil}), do: true

View file

@ -1,6 +1,6 @@
defmodule Pleroma.Web.AdminAPI.AdminAPIController do defmodule Pleroma.Web.AdminAPI.AdminAPIController do
use Pleroma.Web, :controller use Pleroma.Web, :controller
alias Pleroma.{User, Repo} alias Pleroma.User
alias Pleroma.Web.ActivityPub.Relay alias Pleroma.Web.ActivityPub.Relay
import Pleroma.Web.ControllerHelper, only: [json_response: 3] import Pleroma.Web.ControllerHelper, only: [json_response: 3]
@ -26,7 +26,7 @@ def user_create(
conn, conn,
%{"nickname" => nickname, "email" => email, "password" => password} %{"nickname" => nickname, "email" => email, "password" => password}
) do ) do
new_user = %{ user_data = %{
nickname: nickname, nickname: nickname,
name: nickname, name: nickname,
email: email, email: email,
@ -35,11 +35,11 @@ def user_create(
bio: "." bio: "."
} }
User.register_changeset(%User{}, new_user) changeset = User.register_changeset(%User{}, user_data, confirmed: true)
|> Repo.insert!() {:ok, user} = User.register(changeset)
conn conn
|> json(new_user.nickname) |> json(user.nickname)
end end
def tag_users(conn, %{"nicknames" => nicknames, "tags" => tags}) do def tag_users(conn, %{"nicknames" => nicknames, "tags" => tags}) do

View file

@ -161,34 +161,19 @@ def register_user(params) do
Repo.get_by(UserInviteToken, %{token: tokenString}) Repo.get_by(UserInviteToken, %{token: tokenString})
end end
cond do cond do
registrations_open || (!is_nil(token) && !token.used) -> registrations_open || (!is_nil(token) && !token.used) ->
changeset = User.register_changeset(%User{info: %{}}, params) changeset = User.register_changeset(%User{}, params)
with {:ok, user} <- Repo.insert(changeset) do with {:ok, user} <- User.register(changeset) do
!registrations_open && UserInviteToken.mark_as_used(token.token) !registrations_open && UserInviteToken.mark_as_used(token.token)
if Pleroma.Config.get([:instance, :account_activation_required]) do {:ok, user}
info_change = User.Info.confirmation_update(user.info, :unconfirmed) else
{:error, changeset} ->
{:ok, unconfirmed_user} = errors =
user Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end)
|> Ecto.Changeset.change() |> Jason.encode!()
|> 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!()
{:error, %{error: errors}} {:error, %{error: errors}}
end end