Test for Mastodon AccountView
[akkoma] / lib / pleroma / user.ex
index d5befa67bb9ee738bcf8adc56eda4ef4fe5286fe..4f5fcab5b549dd58cfdefec2e5a2b9723ec23d93 100644 (file)
@@ -54,18 +54,10 @@ defmodule Pleroma.User do
   end
 
   def user_info(%User{} = user) do
-    note_count_query = from a in Object,
-      where: fragment("? @> ?", a.data, ^%{actor: user.ap_id, type: "Note"}),
-      select: count(a.id)
-
-    follower_count_query = from u in User,
-      where: fragment("? @> ?", u.following, ^user.follower_address),
-      select: count(u.id)
-
     %{
       following_count: length(user.following),
-      note_count: Repo.one(note_count_query),
-      follower_count: Repo.one(follower_count_query)
+      note_count: user.info["note_count"] || 0,
+      follower_count: user.info["follower_count"] || 0
     }
   end
 
@@ -88,6 +80,15 @@ defmodule Pleroma.User do
     end
   end
 
+  def update_changeset(struct, params \\ %{}) do
+    changeset = struct
+    |> cast(params, [:bio, :name])
+    |> unique_constraint(:nickname)
+    |> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
+    |> validate_length(:bio, min: 1, max: 1000)
+    |> validate_length(:name, min: 1, max: 100)
+  end
+
   def register_changeset(struct, params \\ %{}) do
     changeset = struct
     |> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation])
@@ -97,8 +98,8 @@ defmodule Pleroma.User do
     |> unique_constraint(:nickname)
     |> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
     |> validate_format(:email, @email_regex)
-    |> validate_length(:bio, max: 1000)
-    |> validate_length(:name, max: 100)
+    |> validate_length(:bio, min: 1, max: 1000)
+    |> validate_length(:name, min: 1, max: 100)
 
     if changeset.valid? do
       hashed = Pbkdf2.hashpwsalt(changeset.changes[:password])
@@ -127,9 +128,13 @@ defmodule Pleroma.User do
       following = [ap_followers | follower.following]
       |> Enum.uniq
 
-      follower
+      follower = follower
       |> follow_changeset(%{following: following})
       |> Repo.update
+
+      {:ok, followed} = update_follower_count(followed)
+
+      follower
     end
   end
 
@@ -142,7 +147,10 @@ defmodule Pleroma.User do
       { :ok, follower } = follower
       |> follow_changeset(%{following: following})
       |> Repo.update
-      { :ok, follower, Utils.fetch_latest_follow(follower, followed)}
+
+      {:ok, followed} = update_follower_count(followed)
+
+      {:ok, follower, Utils.fetch_latest_follow(follower, followed)}
     else
       {:error, "Not subscribed!"}
     end
@@ -203,4 +211,32 @@ defmodule Pleroma.User do
 
     {:ok, Repo.all(q)}
   end
+
+  def update_note_count(%User{} = user) do
+    note_count_query = from a in Object,
+      where: fragment("? @> ?", a.data, ^%{actor: user.ap_id, type: "Note"}),
+      select: count(a.id)
+
+    note_count = Repo.one(note_count_query)
+
+    new_info = Map.put(user.info, "note_count", note_count)
+
+    cs = info_changeset(user, %{info: new_info})
+
+    Repo.update(cs)
+  end
+
+  def update_follower_count(%User{} = user) do
+    follower_count_query = from u in User,
+      where: fragment("? @> ?", u.following, ^user.follower_address),
+      select: count(u.id)
+
+    follower_count = Repo.one(follower_count_query)
+
+    new_info = Map.put(user.info, "follower_count", follower_count)
+
+    cs = info_changeset(user, %{info: new_info})
+
+    Repo.update(cs)
+  end
 end