Fix note counting.
[akkoma] / lib / pleroma / user.ex
index 71bdbebeeba1b8800ac75a2c08b48b43f0e6a81b..b33ebb565120966535e088601461f0701b2c540f 100644 (file)
@@ -19,11 +19,11 @@ defmodule Pleroma.User do
     field(:ap_id, :string)
     field(:avatar, :map)
     field(:local, :boolean, default: true)
-    field(:info, :map, default: %{})
     field(:follower_address, :string)
     field(:search_distance, :float, virtual: true)
     field(:last_refreshed_at, :naive_datetime)
     has_many(:notifications, Notification)
+    embeds_one :info, Pleroma.User.Info
 
     timestamps()
   end
@@ -71,10 +71,10 @@ defmodule Pleroma.User do
 
     %{
       following_count: length(user.following) - oneself,
-      note_count: user.info["note_count"] || 0,
-      follower_count: user.info["follower_count"] || 0,
-      locked: user.info["locked"] || false,
-      default_scope: user.info["default_scope"] || "public"
+      note_count: user.info.note_count,
+      follower_count: user.info.follower_count,
+      locked: user.info.locked,
+      default_scope: user.info.default_scope
     }
   end
 
@@ -411,22 +411,19 @@ defmodule Pleroma.User do
   end
 
   def increase_note_count(%User{} = user) do
-    note_count = (user.info["note_count"] || 0) + 1
-    new_info = Map.put(user.info, "note_count", note_count)
-
-    cs = info_changeset(user, %{info: new_info})
+    info_cng = User.Info.add_to_note_count(user.info, 1)
+    cng = change(user)
+    |> put_embed(:info, info_cng)
 
-    update_and_set_cache(cs)
+    update_and_set_cache(cng)
   end
 
   def decrease_note_count(%User{} = user) do
-    note_count = user.info["note_count"] || 0
-    note_count = if note_count <= 0, do: 0, else: note_count - 1
-    new_info = Map.put(user.info, "note_count", note_count)
-
-    cs = info_changeset(user, %{info: new_info})
+    info_cng = User.Info.add_to_note_count(user.info, -1)
+    cng = change(user)
+    |> put_embed(:info, info_cng)
 
-    update_and_set_cache(cs)
+    update_and_set_cache(cng)
   end
 
   def update_note_count(%User{} = user) do
@@ -464,15 +461,15 @@ defmodule Pleroma.User do
     update_and_set_cache(cs)
   end
 
-  def get_notified_from_activity_query(to, false) do
+  def get_users_from_set_query(ap_ids, false) do
     from(
       u in User,
-      where: u.ap_id in ^to
+      where: u.ap_id in ^ap_ids
     )
   end
 
-  def get_notified_from_activity_query(to, true) do
-    query = get_notified_from_activity_query(to, false)
+  def get_users_from_set_query(ap_ids, true) do
+    query = get_users_from_set_query(ap_ids, false)
 
     from(
       u in query,
@@ -480,46 +477,11 @@ defmodule Pleroma.User do
     )
   end
 
-  def get_notified_from_activity(activity, local_only \\ true)
-
-  def get_notified_from_activity(%Activity{data: %{"to" => to} = data}, local_only) do
-    object = Object.normalize(data["object"])
-
-    # somehow, get an AS2 object, preferring the normalized object if we have one
-    object_data =
-      if object do
-        object.data
-      else
-        if is_map(data["object"]) do
-          data["object"]
-        else
-          %{}
-        end
-      end
-
-    # finally extract AS2 mentions from this object
-    tagged_mentions =
-      if object_data["tag"] do
-        object_data["tag"]
-        |> Enum.filter(fn x -> is_map(x) end)
-        |> Enum.filter(fn x -> x["type"] == "Mention" end)
-        |> Enum.map(fn x -> x["href"] end)
-      else
-        []
-      end
-
-    # ensure all mentioned users are unique
-    to =
-      (to ++ tagged_mentions)
-      |> Enum.uniq()
-
-    query = get_notified_from_activity_query(to, local_only)
-
-    Repo.all(query)
+  def get_users_from_set(ap_ids, local_only \\ true) do
+    get_users_from_set_query(ap_ids, local_only)
+    |> Repo.all()
   end
 
-  def get_notified_from_activity(_, _), do: []
-
   def get_recipients_from_activity(%Activity{recipients: to}) do
     query =
       from(
@@ -533,7 +495,7 @@ defmodule Pleroma.User do
     Repo.all(query)
   end
 
-  def search(query, resolve) do
+  def search(query, resolve \\ false) do
     # strip the beginning @ off if there is a query
     query = String.trim_leading(query, "@")
 
@@ -648,9 +610,11 @@ defmodule Pleroma.User do
   end
 
   def deactivate(%User{} = user, status \\ true) do
-    new_info = Map.put(user.info, "deactivated", status)
-    cs = User.info_changeset(user, %{info: new_info})
-    update_and_set_cache(cs)
+    info_cng = User.Info.set_activation_status(user.info, status)
+    cng = change(user)
+    |> put_embed(:info, info_cng)
+
+    update_and_set_cache(cng)
   end
 
   def delete(%User{} = user) do