Fix the logic in multi-hashtag TLs
authorHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Thu, 10 Jan 2019 15:44:28 +0000 (16:44 +0100)
committerHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Sat, 26 Jan 2019 03:46:02 +0000 (04:46 +0100)
lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
test/web/activity_pub/activity_pub_test.exs
test/web/mastodon_api/mastodon_api_controller_test.exs

index 62f4a33c8f8a4d19ea593666be2bc382f1016c24..d94ad97482f8a0f60d8179da49207dfd46538dc9 100644 (file)
@@ -426,15 +426,26 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
 
   defp restrict_since(query, _), do: query
 
-  defp restrict_tag(query, %{"tag" => tag, "tag_reject" => tag_reject})
-       when is_list(tag) and tag_reject != [] do
+  defp restrict_tag_reject(query, %{"tag_reject" => tag_reject})
+       when is_list(tag_reject) and tag_reject != [] do
     from(
       activity in query,
-      where: fragment("(? #> '{\"object\",\"tag\"}') \\?| ?", activity.data, ^tag),
       where: fragment("(not (? #> '{\"object\",\"tag\"}') \\?| ?)", activity.data, ^tag_reject)
     )
   end
 
+  defp restrict_tag_reject(query, _), do: query
+
+  defp restrict_tag_all(query, %{"tag_all" => tag_all})
+       when is_list(tag_all) and tag_all != [] do
+    from(
+      activity in query,
+      where: fragment("(? #> '{\"object\",\"tag\"}') \\?& ?", activity.data, ^tag_all)
+    )
+  end
+
+  defp restrict_tag_all(query, _), do: query
+
   defp restrict_tag(query, %{"tag" => tag}) when is_list(tag) do
     from(
       activity in query,
@@ -591,6 +602,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
     base_query
     |> restrict_recipients(recipients, opts["user"])
     |> restrict_tag(opts)
+    |> restrict_tag_reject(opts)
+    |> restrict_tag_all(opts)
     |> restrict_since(opts)
     |> restrict_local(opts)
     |> restrict_limit(opts)
index 6811f827eb1587f30e219bd4468888a117ba12a3..4c5f1e7a9aee11a7de823efd1092148f6b04c89a 100644 (file)
@@ -541,11 +541,16 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     local_only = params["local"] in [true, "True", "true", "1"]
 
     tags =
-      ([params["tag"]] ++ (params["all"] || []) ++ (params["any"] || []))
+      ([params["tag"]] ++ (params["any"] || []))
       |> Enum.uniq()
       |> Enum.filter(& &1)
       |> Enum.map(&String.downcase(&1))
 
+    tag_all =
+      params["all"] ||
+        []
+        |> Enum.map(&String.downcase(&1))
+
     tag_reject =
       params["none"] ||
         []
@@ -557,6 +562,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
       |> Map.put("local_only", local_only)
       |> Map.put("blocking_user", user)
       |> Map.put("tag", tags)
+      |> Map.put("tag_all", tag_all)
       |> Map.put("tag_reject", tag_reject)
 
     activities =
index acece36f0d3b9a4690b1883de1a33db68622586a..48eed3f135e25654b36d7b2edfeafc631322f0cf 100644 (file)
@@ -81,9 +81,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
           "tag_reject" => ["reject"]
         })
 
+      fetch_four =
+        ActivityPub.fetch_activities([], %{
+          "tag" => ["test"],
+          "tag_all" => ["test", "reject"]
+        })
+
       assert fetch_one == [status_one, status_three]
       assert fetch_two == [status_one, status_two, status_three]
       assert fetch_three == [status_one, status_two]
+      assert fetch_four == [status_three]
     end
   end
 
index be868c08192944a3c2fbd0a1ed7d27f221f277dc..b4870e0b2a198716c97e8c7dc6d911c512075ecb 100644 (file)
@@ -1051,11 +1051,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     {:ok, activity_test1} = CommonAPI.post(user, %{"status" => "#test1"})
     {:ok, activity_none} = CommonAPI.post(user, %{"status" => "#test #none"})
 
-    all_test =
+    any_test =
       conn
-      |> get("/api/v1/timelines/tag/test", %{"all" => ["test1"]})
+      |> get("/api/v1/timelines/tag/test", %{"any" => ["none"]})
 
-    assert [status_none, status_test1, status_test] = json_response(all_test, 200)
+    [status_none, status_test1, status_test] = json_response(any_test, 200)
 
     assert to_string(activity_test.id) == status_test["id"]
     assert to_string(activity_test1.id) == status_test1["id"]
@@ -1066,6 +1066,10 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
       |> get("/api/v1/timelines/tag/test", %{"all" => ["test1"], "none" => ["none"]})
 
     assert [status_test1, status_test] == json_response(restricted_test, 200)
+
+    all_test = conn |> get("/api/v1/timelines/tag/test", %{"all" => ["none"]})
+
+    assert [status_none] == json_response(all_test, 200)
   end
 
   test "getting followers", %{conn: conn} do