Web.ActivityPub.ActivityPub: Simplify multi-hashtag, add tests
authorHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Thu, 10 Jan 2019 15:07:32 +0000 (16:07 +0100)
committerHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Sat, 26 Jan 2019 03:46:01 +0000 (04:46 +0100)
lib/pleroma/web/activity_pub/activity_pub.ex
test/web/activity_pub/activity_pub_test.exs

index d414ecc46f4a94b00d91be5ba23e5ed92ca7f266..62f4a33c8f8a4d19ea593666be2bc382f1016c24 100644 (file)
@@ -430,30 +430,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
        when is_list(tag) and tag_reject != [] do
     from(
       activity in query,
-      where:
-        fragment(
-          "? && ARRAY(SELECT jsonb_array_elements_text((? #> '{\"object\",\"tag\"}')))",
-          ^tag,
-          activity.data
-        ),
-      where:
-        fragment(
-          "(not ? && ARRAY(SELECT jsonb_array_elements_text((? #> '{\"object\",\"tag\"}'))))",
-          ^tag_reject,
-          activity.data
-        )
+      where: fragment("(? #> '{\"object\",\"tag\"}') \\?| ?", activity.data, ^tag),
+      where: fragment("(not (? #> '{\"object\",\"tag\"}') \\?| ?)", activity.data, ^tag_reject)
     )
   end
 
   defp restrict_tag(query, %{"tag" => tag}) when is_list(tag) do
     from(
       activity in query,
-      where:
-        fragment(
-          "? && ARRAY(SELECT jsonb_array_elements_text((? #> '{\"object\",\"tag\"}')))",
-          ^tag,
-          activity.data
-        )
+      where: fragment("(? #> '{\"object\",\"tag\"}') \\?| ?", activity.data, ^tag)
     )
   end
 
index d2e54d8049a80e25b50ac400fc435693918ad6a9..acece36f0d3b9a4690b1883de1a33db68622586a 100644 (file)
@@ -64,6 +64,27 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
       assert user.info.ap_enabled
       assert user.follower_address == "http://mastodon.example.org/users/admin/followers"
     end
+
+    test "it fetches the appropriate tag-restricted posts" do
+      user = insert(:user)
+
+      {:ok, status_one} = CommonAPI.post(user, %{"status" => ". #test"})
+      {:ok, status_two} = CommonAPI.post(user, %{"status" => ". #essais"})
+      {:ok, status_three} = CommonAPI.post(user, %{"status" => ". #test #reject"})
+
+      fetch_one = ActivityPub.fetch_activities([], %{"tag" => "test"})
+      fetch_two = ActivityPub.fetch_activities([], %{"tag" => ["test", "essais"]})
+
+      fetch_three =
+        ActivityPub.fetch_activities([], %{
+          "tag" => ["test", "essais"],
+          "tag_reject" => ["reject"]
+        })
+
+      assert fetch_one == [status_one, status_three]
+      assert fetch_two == [status_one, status_two, status_three]
+      assert fetch_three == [status_one, status_two]
+    end
   end
 
   describe "insertion" do