Merge branch 'fix/732-password-align' into 'develop'
[akkoma] / lib / pleroma / web / activity_pub / utils.ex
index 3959e9bd9db2ec8338f9409eb6198a2b6c6a11ab..0b53f71c3acc25471a9c531a0e9edfdb138e9475 100644 (file)
@@ -99,7 +99,10 @@ defmodule Pleroma.Web.ActivityPub.Utils do
     %{
       "@context" => [
         "https://www.w3.org/ns/activitystreams",
-        "#{Web.base_url()}/schemas/litepub-0.1.jsonld"
+        "#{Web.base_url()}/schemas/litepub-0.1.jsonld",
+        %{
+          "@language" => "und"
+        }
       ]
     }
   end
@@ -176,35 +179,46 @@ defmodule Pleroma.Web.ActivityPub.Utils do
   also adds it to an included object
   """
   def lazy_put_activity_defaults(map, fake \\ false) do
-    unless fake do
-      %{data: %{"id" => context}, id: context_id} = create_context(map["context"])
+    map =
+      unless fake do
+        %{data: %{"id" => context}, id: context_id} = create_context(map["context"])
 
-      map =
         map
         |> Map.put_new_lazy("id", &generate_activity_id/0)
         |> Map.put_new_lazy("published", &make_date/0)
         |> Map.put_new("context", context)
         |> Map.put_new("context_id", context_id)
-
-      if is_map(map["object"]) do
-        object = lazy_put_object_defaults(map["object"], map)
-        %{map | "object" => object}
       else
         map
+        |> Map.put_new("id", "pleroma:fakeid")
+        |> Map.put_new_lazy("published", &make_date/0)
+        |> Map.put_new("context", "pleroma:fakecontext")
+        |> Map.put_new("context_id", -1)
       end
+
+    if is_map(map["object"]) do
+      object = lazy_put_object_defaults(map["object"], map, fake)
+      %{map | "object" => object}
     else
       map
-      |> Map.put_new("id", "pleroma:fakeid")
-      |> Map.put_new_lazy("published", &make_date/0)
-      |> Map.put_new("context", "pleroma:fakecontext")
-      |> Map.put_new("context_id", -1)
     end
   end
 
   @doc """
   Adds an id and published date if they aren't there.
   """
-  def lazy_put_object_defaults(map, activity \\ %{}) do
+  def lazy_put_object_defaults(map, activity \\ %{}, fake)
+
+  def lazy_put_object_defaults(map, activity, true = _fake) do
+    map
+    |> Map.put_new_lazy("published", &make_date/0)
+    |> Map.put_new("id", "pleroma:fake_object_id")
+    |> Map.put_new("context", activity["context"])
+    |> Map.put_new("fake", true)
+    |> Map.put_new("context_id", activity["context_id"])
+  end
+
+  def lazy_put_object_defaults(map, activity, _fake) do
     map
     |> Map.put_new_lazy("id", &generate_object_id/0)
     |> Map.put_new_lazy("published", &make_date/0)
@@ -362,7 +376,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do
         [state, actor, object]
       )
 
-      activity = Repo.get(Activity, activity.id)
+      activity = Activity.get_by_id(activity.id)
       {:ok, activity}
     rescue
       e ->
@@ -412,13 +426,15 @@ defmodule Pleroma.Web.ActivityPub.Utils do
             activity.data
           ),
         where: activity.actor == ^follower_id,
+        # this is to use the index
         where:
           fragment(
-            "? @> ?",
+            "coalesce((?)->'object'->>'id', (?)->>'object') = ?",
             activity.data,
-            ^%{object: followed_id}
+            activity.data,
+            ^followed_id
           ),
-        order_by: [desc: :id],
+        order_by: [fragment("? desc nulls last", activity.id)],
         limit: 1
       )
 
@@ -575,13 +591,15 @@ defmodule Pleroma.Web.ActivityPub.Utils do
             activity.data
           ),
         where: activity.actor == ^blocker_id,
+        # this is to use the index
         where:
           fragment(
-            "? @> ?",
+            "coalesce((?)->'object'->>'id', (?)->>'object') = ?",
+            activity.data,
             activity.data,
-            ^%{object: blocked_id}
+            ^blocked_id
           ),
-        order_by: [desc: :id],
+        order_by: [fragment("? desc nulls last", activity.id)],
         limit: 1
       )