Add user registration changeset.
authorRoger Braun <roger@rogerbraun.net>
Sat, 15 Apr 2017 14:40:09 +0000 (16:40 +0200)
committerRoger Braun <roger@rogerbraun.net>
Sat, 15 Apr 2017 14:40:09 +0000 (16:40 +0200)
lib/pleroma/user.ex
priv/repo/migrations/20170415141210_add_unique_index_to_email_and_nickname.exs [new file with mode: 0644]
test/user_test.exs

index 0a443d22ac4f08a825bff5611cb8e249e56a3188..ed85447fe3007d816700cce16367f3b7a9acbc93 100644 (file)
@@ -9,6 +9,8 @@ defmodule Pleroma.User do
     field :name, :string
     field :nickname, :string
     field :password_hash, :string
+    field :password, :string, virtual: true
+    field :password_confirmation, :string, virtual: true
     field :following, { :array, :string }, default: []
     field :ap_id, :string
 
@@ -29,6 +31,27 @@ defmodule Pleroma.User do
     |> validate_required([:following])
   end
 
+  def register_changeset(struct, params \\ %{}) do
+    changeset = struct
+    |> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation])
+    |> validate_required([:bio, :email, :name, :nickname, :password, :password_confirmation])
+    |> validate_confirmation(:password)
+    |> unique_constraint(:email)
+    |> unique_constraint(:nickname)
+
+    if changeset.valid? do
+      hashed = Comeonin.Pbkdf2.hashpwsalt(changeset.changes[:password])
+      ap_id = User.ap_id(%User{nickname: changeset.changes[:nickname]})
+      followers = User.ap_followers(%User{nickname: changeset.changes[:nickname]})
+      changeset
+      |> put_change(:password_hash, hashed)
+      |> put_change(:ap_id, ap_id)
+      |> put_change(:following, [followers])
+    else
+      changeset
+    end
+  end
+
   def follow(%User{} = follower, %User{} = followed) do
     ap_followers = User.ap_followers(followed)
     following = [ap_followers | follower.following]
diff --git a/priv/repo/migrations/20170415141210_add_unique_index_to_email_and_nickname.exs b/priv/repo/migrations/20170415141210_add_unique_index_to_email_and_nickname.exs
new file mode 100644 (file)
index 0000000..361ca04
--- /dev/null
@@ -0,0 +1,8 @@
+defmodule Pleroma.Repo.Migrations.AddUniqueIndexToEmailAndNickname do
+  use Ecto.Migration
+
+  def change do
+    create unique_index(:users, [:email])
+    create unique_index(:users, [:nickname])
+  end
+end
index f41063e9c6cb25ea573f9d5265fddec3720d95e5..e7843e1a8914ca6ef490fd0767193cf8bd9da714 100644 (file)
@@ -53,4 +53,35 @@ defmodule Pleroma.UserTest do
     assert User.following?(user, followed)
     refute User.following?(followed, user)
   end
+
+  describe "user registration" do
+    @full_user_data %{
+      bio: "A guy",
+      name: "my name",
+      nickname: "nick",
+      password: "test",
+      password_confirmation: "test",
+      email: "email@example.com"
+    }
+
+    test "it requires a bio, email, name, nickname and password" do
+      @full_user_data
+      |> Map.keys
+      |> Enum.each(fn (key) ->
+        params = Map.delete(@full_user_data, key)
+        changeset = User.register_changeset(%User{}, params)
+        assert changeset.valid? == false
+      end)
+    end
+
+    test "it sets the password_hash, ap_id and following fields" do
+      changeset = User.register_changeset(%User{}, @full_user_data)
+
+      assert changeset.valid?
+
+      assert is_binary(changeset.changes[:password_hash])
+      assert changeset.changes[:ap_id] == User.ap_id(%User{nickname: @full_user_data.nickname})
+      assert changeset.changes[:following] == [User.ap_followers(%User{nickname: @full_user_data.nickname})]
+    end
+  end
 end