Add subscribed status to user view
[akkoma] / lib / pleroma / user.ex
index 5012aef77aa543be08d076e2db3be6a278a51e93..de7ed6e72fb96221ec5a08849a66cfa9b073f999 100644 (file)
@@ -923,6 +923,26 @@ defmodule Pleroma.User do
     update_and_set_cache(cng)
   end
 
+  def subscribe(subscriber, %{ap_id: ap_id}) do
+    info_cng =
+      subscriber.info
+      |> User.Info.add_to_subscriptions(ap_id)
+
+    change(subscriber)
+    |> put_embed(:info, info_cng)
+    |> update_and_set_cache()
+  end
+
+  def unsubscribe(unsubscriber, %{ap_id: ap_id}) do
+    info_cng =
+      unsubscriber.info
+      |> User.Info.remove_from_subscriptions(ap_id)
+
+    change(unsubscriber)
+    |> put_embed(:info, info_cng)
+    |> update_and_set_cache()
+  end
+
   def block(blocker, %User{ap_id: ap_id} = blocked) do
     # sever any follow relationships to prevent leaks per activitypub (Pleroma issue #213)
     blocker =
@@ -979,12 +999,25 @@ defmodule Pleroma.User do
       end)
   end
 
+  def subscribed_to?(user, %{ap_id: ap_id}) do
+    subs = user.info.subscriptions
+    Enum.member?(subs, ap_id)
+  end
+
   def muted_users(user),
     do: Repo.all(from(u in User, where: u.ap_id in ^user.info.mutes))
 
   def blocked_users(user),
     do: Repo.all(from(u in User, where: u.ap_id in ^user.info.blocks))
 
+  def subscribed_users(user),
+    do:
+      Repo.all(
+        from(u in User,
+          where: fragment("?->'subscriptions' @> ?", u.info, ^user.ap_id)
+        )
+      )
+
   def block_domain(user, domain) do
     info_cng =
       user.info