Revert "Merge branch 'features/hashtag-column' into 'develop'"
authorHaelwenn <contact+git.pleroma.social@hacktivis.me>
Mon, 28 Dec 2020 12:02:16 +0000 (12:02 +0000)
committerHaelwenn <contact+git.pleroma.social@hacktivis.me>
Mon, 28 Dec 2020 12:02:16 +0000 (12:02 +0000)
This reverts merge request !2824

24 files changed:
CHANGELOG.md
docs/administration/CLI_tasks/database.md
lib/mix/tasks/pleroma/database.ex
lib/pleroma/activity/ir/topics.ex
lib/pleroma/constants.ex
lib/pleroma/object.ex
lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/activity_pub/mrf/simple_policy.ex
lib/pleroma/web/activity_pub/transmogrifier.ex
lib/pleroma/web/common_api/utils.ex
lib/pleroma/web/feed/feed_view.ex
lib/pleroma/web/mastodon_api/views/status_view.ex
lib/pleroma/web/templates/feed/feed/_activity.atom.eex
lib/pleroma/web/templates/feed/feed/_activity.rss.eex
lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex
priv/repo/migrations/20200731165800_add_hashtags_index_to_objects.exs [deleted file]
test/pleroma/activity/ir/topics_test.exs
test/pleroma/web/activity_pub/mrf/simple_policy_test.exs
test/pleroma/web/activity_pub/transmogrifier/note_handling_test.exs
test/pleroma/web/activity_pub/transmogrifier_test.exs
test/pleroma/web/common_api/utils_test.exs
test/pleroma/web/common_api_test.exs
test/pleroma/web/mastodon_api/views/status_view_test.exs
test/support/factory.ex

index 38972067c820b56422a3ac073050003e70e7a21a..e1604ab3a9e1888999738c442b8d2199961efdd8 100644 (file)
@@ -8,7 +8,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
 ### Changed
 
-- **Breaking:** Changed storage of hashtags in plain-text to `object->hashtags`, run [`pleroma.database fill_old_hashtags` mix task](docs/administration/CLI_tasks/database.md) for old objects (works while pleroma is running).
 - Polls now always return a `voters_count`, even if they are single-choice.
 - Admin Emails: The ap id is used as the user link in emails now.
 - Improved registration workflow for email confirmation and account approval modes.
@@ -444,6 +443,7 @@ switched to a new configuration mechanism, however it was not officially removed
 - Static-FE: Fix remote posts not being sanitized
 
 ### Fixed
+=======
 - Rate limiter crashes when there is no explicitly specified ip in the config
 - 500 errors when no `Accept` header is present if Static-FE is enabled
 - Instance panel not being updated immediately due to wrong `Cache-Control` headers
index eb85381ffa779eb49af9f72cf6ac7fa04391fd04..6dca8316729079c80ca997fe24f9b84b479c4795 100644 (file)
@@ -91,18 +91,6 @@ Can be safely re-run
     mix pleroma.database fix_likes_collections
     ```
 
-## Fill hashtags for old objects
-
-Migrate hashags fields for old objects, from now to `months_limit` months.
-
-```sh tab="OTP"
-./bin/pleroma_ctl database fill_old_hashtags <months_limit>
-```
-
-```sh tab="From Source"
-mix pleroma.database fill_old_hashtags <months_limit>
-```
-
 ## Vacuum the database
 
 ### Analyze
index a098525038e008b77fcadbfa6fce1aa651295e24..22151ce08e4d6fef4c42c23f04490d15837656d3 100644 (file)
@@ -128,57 +128,6 @@ defmodule Mix.Tasks.Pleroma.Database do
     |> Stream.run()
   end
 
-  def run(["fill_old_hashtags", month_limit]) do
-    import Ecto.Query
-
-    start_pleroma()
-
-    month_limit = String.to_integer(month_limit)
-
-    if month_limit < 1 do
-      shell_error("Invalid `month_limit` argument, needs to be greater than 1")
-    else
-      time_limit = DateTime.utc_now() |> Timex.shift(months: -month_limit)
-
-      from(
-        o in Object,
-        where: fragment("(?)->>'hashtags' is null", o.data),
-        where: fragment("(?)->>'tag' != '[]'", o.data),
-        where: o.inserted_at < ^time_limit,
-        select: %{id: o.id, tag: fragment("(?)->>'tag'", o.data)}
-      )
-      |> Pleroma.Repo.chunk_stream(200, :batches)
-      |> Stream.each(fn objects ->
-        Repo.transaction(fn ->
-          objects_first = objects |> List.first()
-          objects_last = objects |> List.last()
-
-          Logger.info(
-            "fill_old_hashtags: #{objects_first.id} (#{objects_first.inserted_at}) -- #{
-              objects_last.id
-            } (#{objects_last.inserted_at})"
-          )
-
-          objects
-          |> Enum.map(fn object ->
-            tags =
-              object.tag
-              |> Jason.decode!()
-              |> Enum.filter(&is_bitstring(&1))
-
-            Object
-            |> where([o], o.id == ^object.id)
-            |> update([o],
-              set: [data: fragment("safe_jsonb_set(?, '{hashtags}', ?, true)", o.data, ^tags)]
-            )
-            |> Repo.update_all([], timeout: :infinity)
-          end)
-        end)
-      end)
-      |> Stream.run()
-    end
-  end
-
   def run(["vacuum", args]) do
     start_pleroma()
 
index b7553c72857a70549ee61e910ddd4d1d33b3cea4..fe2e8cb5c900d7b84f0e92bc1ba42a74c85d685b 100644 (file)
@@ -48,12 +48,14 @@ defmodule Pleroma.Activity.Ir.Topics do
     tags
   end
 
-  defp hashtags_to_topics(object) do
-    object
-    |> Object.hashtags()
+  defp hashtags_to_topics(%{data: %{"tag" => tags}}) do
+    tags
+    |> Enum.filter(&is_bitstring(&1))
     |> Enum.map(fn tag -> "hashtag:" <> tag end)
   end
 
+  defp hashtags_to_topics(_), do: []
+
   defp remote_topics(%{local: true}), do: []
 
   defp remote_topics(%{actor: actor}) when is_binary(actor),
index 8f265715c3c2e6f0778aa4941c750ba78c304204..cf8182d55a2d11486ca99716edb48b151f3b6dab 100644 (file)
@@ -18,8 +18,7 @@ defmodule Pleroma.Constants do
       "emoji",
       "context_id",
       "deleted_activity_id",
-      "pleroma_internal",
-      "hashtags"
+      "pleroma_internal"
     ]
   )
 
index 8836beaac8f55c635c27af434c424ea9943d6801..b4a994da98320256d54759d1d08e482ecb3231a3 100644 (file)
@@ -346,8 +346,4 @@ defmodule Pleroma.Object do
 
   def self_replies(object, opts \\ []),
     do: replies(object, Keyword.put(opts, :self_only, true))
-
-  def hashtags(%Object{data: %{"hashtags" => hashtags}}), do: hashtags || []
-  def hashtags(%Object{data: %{"tag" => tags}}), do: Enum.filter(tags, &is_bitstring(&1))
-  def hashtags(_), do: []
 end
index 07a23b09bff1a29691350c0492193e9a700fa001..5059bff03b3d88dc1b377ece8e1a2b05c8037058 100644 (file)
@@ -669,7 +669,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
   defp restrict_tag_reject(query, %{tag_reject: [_ | _] = tag_reject}) do
     from(
       [_activity, object] in query,
-      where: fragment("not (?)->'hashtags' \\?| (?)", object.data, ^tag_reject)
+      where: fragment("not (?)->'tag' \\?| (?)", object.data, ^tag_reject)
     )
   end
 
@@ -682,7 +682,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
   defp restrict_tag_all(query, %{tag_all: [_ | _] = tag_all}) do
     from(
       [_activity, object] in query,
-      where: fragment("(?)->'hashtags' \\?& (?)", object.data, ^tag_all)
+      where: fragment("(?)->'tag' \\?& (?)", object.data, ^tag_all)
     )
   end
 
@@ -695,14 +695,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
   defp restrict_tag(query, %{tag: tag}) when is_list(tag) do
     from(
       [_activity, object] in query,
-      where: fragment("(?)->'hashtags' \\?| (?)", object.data, ^tag)
+      where: fragment("(?)->'tag' \\?| (?)", object.data, ^tag)
     )
   end
 
   defp restrict_tag(query, %{tag: tag}) when is_binary(tag) do
     from(
       [_activity, object] in query,
-      where: fragment("(?)->'hashtags' \\? (?)", object.data, ^tag)
+      where: fragment("(?)->'tag' \\? (?)", object.data, ^tag)
     )
   end
 
index 94933ce99f6bb982f96ab7c988f7c6a5c0ef33d6..6cd91826db178ba72f9cc0859fe7eac5c7397eca 100644 (file)
@@ -8,7 +8,6 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do
 
   alias Pleroma.Config
   alias Pleroma.FollowingRelationship
-  alias Pleroma.Object
   alias Pleroma.User
   alias Pleroma.Web.ActivityPub.MRF
 
@@ -75,11 +74,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do
 
     object =
       if MRF.subdomain_match?(media_nsfw, actor_host) do
-        child_object =
-          child_object
-          |> Map.put("hashtags", Object.hashtags(%Object{data: child_object}) ++ ["nsfw"])
-          |> Map.put("sensitive", true)
-
+        tags = (child_object["tag"] || []) ++ ["nsfw"]
+        child_object = Map.put(child_object, "tag", tags)
+        child_object = Map.put(child_object, "sensitive", true)
         Map.put(object, "object", child_object)
       else
         object
index 109f03641815c301bb2a32c5532aac27d5b26d06..565d324330b751ca35bc65dfbdb3589e993f6a4c 100644 (file)
@@ -312,15 +312,16 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
   def fix_emoji(object), do: object
 
   def fix_tag(%{"tag" => tag} = object) when is_list(tag) do
-    hashtags =
+    tags =
       tag
       |> Enum.filter(fn data -> data["type"] == "Hashtag" and data["name"] end)
-      |> Enum.map(fn
-        %{"name" => "#" <> hashtag} -> String.downcase(hashtag)
-        %{"name" => hashtag} -> String.downcase(hashtag)
+      |> Enum.map(fn %{"name" => name} ->
+        name
+        |> String.slice(1..-1)
+        |> String.downcase()
       end)
 
-    Map.put(object, "hashtags", hashtags)
+    Map.put(object, "tag", tag ++ tags)
   end
 
   def fix_tag(%{"tag" => %{} = tag} = object) do
@@ -863,18 +864,23 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
   def maybe_fix_object_url(data), do: data
 
   def add_hashtags(object) do
-    hashtags =
-      %Object{data: object}
-      |> Object.hashtags()
-      |> Enum.map(fn tag ->
-        %{
-          "href" => Pleroma.Web.Endpoint.url() <> "/tags/#{tag}",
-          "name" => "##{tag}",
-          "type" => "Hashtag"
-        }
+    tags =
+      (object["tag"] || [])
+      |> Enum.map(fn
+        # Expand internal representation tags into AS2 tags.
+        tag when is_binary(tag) ->
+          %{
+            "href" => Pleroma.Web.Endpoint.url() <> "/tags/#{tag}",
+            "name" => "##{tag}",
+            "type" => "Hashtag"
+          }
+
+        # Do not process tags which are already AS2 tag objects.
+        tag when is_map(tag) ->
+          tag
       end)
 
-    Map.put(object, "tag", hashtags ++ (object["tag"] || []))
+    Map.put(object, "tag", tags)
   end
 
   # TODO These should be added on our side on insertion, it doesn't make much
@@ -930,7 +936,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
   end
 
   def set_sensitive(object) do
-    tags = object["hashtags"] || object["tag"] || []
+    tags = object["tag"] || []
     Map.put(object, "sensitive", "nsfw" in tags)
   end
 
index 880b5d78f86965b617323960a31c2585696fbe2b..1c74ea7875760355cbfc4baf7c0a58bf7bfb69a2 100644 (file)
@@ -310,16 +310,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do
       "context" => draft.context,
       "attachment" => draft.attachments,
       "actor" => draft.user.ap_id,
-      "tag" => Enum.filter(draft.tags, &is_map(&1)) |> Enum.uniq(),
-      "hashtags" =>
-        draft.tags
-        |> Enum.reduce([], fn
-          # Why so many formats
-          {:name, x}, acc -> if is_bitstring(x), do: [x | acc], else: acc
-          {"#" <> _, x}, acc -> if is_bitstring(x), do: [x | acc], else: acc
-          x, acc -> if is_bitstring(x), do: [x | acc], else: acc
-        end)
-        |> Enum.uniq()
+      "tag" => Keyword.values(draft.tags) |> Enum.uniq()
     }
     |> add_in_reply_to(draft.in_reply_to)
     |> Map.merge(draft.extra)
index 1155c6a398e6db0ce183a7dcf07ee95588cf48db..30e0a2a55b69228b470ed0a35a8111ff80c6149e 100644 (file)
@@ -32,7 +32,6 @@ defmodule Pleroma.Web.Feed.FeedView do
 
     %{
       activity: activity,
-      object: object,
       data: Map.get(object, :data),
       actor: actor
     }
index 3ba453d1fe05ecffce614300b565228b4ded1c3e..2301e21cfaf2d56b760fe35fa733dd2be502eeba 100644 (file)
@@ -347,7 +347,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
       media_attachments: attachments,
       poll: render(PollView, "show.json", object: object, for: opts[:for]),
       mentions: mentions,
-      tags: build_tags(Object.hashtags(object)),
+      tags: build_tags(tags),
       application: %{
         name: "Web",
         website: nil
index 4a1a3e9938d0359883953ec6481f8b8db8d05efe..3fd150c4e7570b6d54e449a87ffac7d1adc74d7a 100644 (file)
@@ -22,8 +22,8 @@
     <link type="text/html" href='<%= @data["external_url"] %>' rel="alternate"/>
   <% end %>
 
-  <%= for hashtag <- Object.hashtags(@object) do %>
-    <category term="<%= hashtag %>"></category>
+  <%= for tag <- @data["tag"] || [] do %>
+    <category term="<%= tag %>"></category>
   <% end %>
 
   <%= for attachment <- @data["attachment"] || [] do %>
index 9ebaa3300d78f74357144db83f909d5f4ec673f4..42960de7d45f58926546a23145a8d1db60ad108f 100644 (file)
@@ -21,8 +21,8 @@
     <link><%= @data["external_url"] %></link>
   <% end %>
 
-  <%= for hashtag <- Object.hashtags(@object) do %>
-    <category term="<%= hashtag %>"></category>
+  <%= for tag <- @data["tag"] || [] do %>
+    <category term="<%= tag %>"></category>
   <% end %>
 
   <%= for attachment <- @data["attachment"] || [] do %>
index 8d78520cf56b52d1f653cee6dddd2e4ae8e7da9f..cf5874a91341cb8108631829aa150ec9fd70e15b 100644 (file)
@@ -41,8 +41,8 @@
       <% end %>
     <% end %>
 
-    <%= for hashtag <- Object.hashtags(@object) do %>
-      <category term="<%= hashtag %>"></category>
+    <%= for tag <- @data["tag"] || [] do %>
+      <category term="<%= tag %>"></category>
     <% end %>
 
     <%= for {emoji, file} <- @data["emoji"] || %{} do %>
diff --git a/priv/repo/migrations/20200731165800_add_hashtags_index_to_objects.exs b/priv/repo/migrations/20200731165800_add_hashtags_index_to_objects.exs
deleted file mode 100644 (file)
index b786828..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-defmodule Pleroma.Repo.Migrations.AddHashtagsIndexToObjects do
-  use Ecto.Migration
-
-  def change do
-    drop_if_exists(index(:objects, ["(data->'tag')"], using: :gin, name: :objects_tags))
-
-    create_if_not_exists(
-      index(:objects, ["(data->'hashtags')"], using: :gin, name: :objects_hashtags)
-    )
-  end
-end
index dd1611bbe64f63120f45f90663e11a2b1f7c718a..b464822d9c21274cf9afa435c22d2d967861746f 100644 (file)
@@ -78,7 +78,7 @@ defmodule Pleroma.Activity.Ir.TopicsTest do
     end
 
     test "converts tags to hash tags", %{activity: %{object: %{data: data} = object} = activity} do
-      tagged_data = Map.put(data, "hashtags", ["foo", "bar"])
+      tagged_data = Map.put(data, "tag", ["foo", "bar"])
       activity = %{activity | object: %{object | data: tagged_data}}
 
       topics = Topics.get_activity_topics(activity)
index 9777fcde1b0d8a2e98c319b7f643bd2170911d03..d7dde62c40c8643bf2fbafc3b4fc7c08f6b17ec9 100644 (file)
@@ -78,7 +78,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
       assert SimplePolicy.filter(media_message) ==
                {:ok,
                 media_message
-                |> put_in(["object", "hashtags"], ["foo", "nsfw"])
+                |> put_in(["object", "tag"], ["foo", "nsfw"])
                 |> put_in(["object", "sensitive"], true)}
 
       assert SimplePolicy.filter(local_message) == {:ok, local_message}
@@ -92,7 +92,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
       assert SimplePolicy.filter(media_message) ==
                {:ok,
                 media_message
-                |> put_in(["object", "hashtags"], ["foo", "nsfw"])
+                |> put_in(["object", "tag"], ["foo", "nsfw"])
                 |> put_in(["object", "sensitive"], true)}
 
       assert SimplePolicy.filter(local_message) == {:ok, local_message}
@@ -105,7 +105,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
       "type" => "Create",
       "object" => %{
         "attachment" => [%{}],
-        "hashtags" => ["foo"],
+        "tag" => ["foo"],
         "sensitive" => false
       }
     }
index 528636f04b797d0c4491651eb05029a9a6e40b6a..b4a006aec7f75048b26d17b64a184f90fb2b5837 100644 (file)
@@ -39,7 +39,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do
       {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
       object = Object.normalize(data["object"])
 
-      assert ["test"] == object.data["hashtags"]
+      assert "test" in object.data["tag"]
     end
 
     test "it cleans up incoming notices which are not really DMs" do
@@ -220,7 +220,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.NoteHandlingTest do
       {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
       object = Object.normalize(data["object"])
 
-      assert object.data["hashtags"] == ["moo"]
+      assert Enum.at(object.data["tag"], 2) == "moo"
     end
 
     test "it works for incoming notices with contentMap" do
index d0bd00b58dda8c162e9f4b9da1a2c3f8f8d1b9af..66ea7664aff340a9135158e9cc9be64e853ded31 100644 (file)
@@ -204,37 +204,30 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
 
       {:ok, activity} = CommonAPI.post(user, %{status: "#2hu :firefox:"})
 
-      {:ok, %{"object" => modified_object}} = Transmogrifier.prepare_outgoing(activity.data)
-
-      assert [
-               %{"name" => "#2hu", "type" => "Hashtag"},
-               %{"name" => ":firefox:", "type" => "Emoji"}
-             ] = modified_object["tag"]
-
-      refute Map.has_key?(modified_object, "hashtags")
-      refute Map.has_key?(modified_object, "emoji")
-      refute Map.has_key?(modified_object, "like_count")
-      refute Map.has_key?(modified_object, "announcements")
-      refute Map.has_key?(modified_object, "announcement_count")
-      refute Map.has_key?(modified_object, "context_id")
+      {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data)
+
+      assert length(modified["object"]["tag"]) == 2
+
+      assert is_nil(modified["object"]["emoji"])
+      assert is_nil(modified["object"]["like_count"])
+      assert is_nil(modified["object"]["announcements"])
+      assert is_nil(modified["object"]["announcement_count"])
+      assert is_nil(modified["object"]["context_id"])
     end
 
     test "it strips internal fields of article" do
       activity = insert(:article_activity)
 
-      {:ok, %{"object" => modified_object}} = Transmogrifier.prepare_outgoing(activity.data)
+      {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data)
 
-      assert [
-               %{"name" => "#2hu", "type" => "Hashtag"},
-               %{"name" => ":2hu:", "type" => "Emoji"}
-             ] = modified_object["tag"]
+      assert length(modified["object"]["tag"]) == 2
 
-      refute Map.has_key?(modified_object, "hashtags")
-      refute Map.has_key?(modified_object, "emoji")
-      refute Map.has_key?(modified_object, "like_count")
-      refute Map.has_key?(modified_object, "announcements")
-      refute Map.has_key?(modified_object, "announcement_count")
-      refute Map.has_key?(modified_object, "context_id")
+      assert is_nil(modified["object"]["emoji"])
+      assert is_nil(modified["object"]["like_count"])
+      assert is_nil(modified["object"]["announcements"])
+      assert is_nil(modified["object"]["announcement_count"])
+      assert is_nil(modified["object"]["context_id"])
+      assert is_nil(modified["object"]["likes"])
     end
 
     test "the directMessage flag is present" do
index 2110421927ccc60620f7082e76ef964b2fc73f26..4d6c9ea2610786def850afffaecec5bef223ecf2 100644 (file)
@@ -591,8 +591,7 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do
                "context" => "2hu",
                "sensitive" => false,
                "summary" => "test summary",
-               "hashtags" => ["jimm"],
-               "tag" => [],
+               "tag" => ["jimm"],
                "to" => [user2.ap_id],
                "type" => "Note",
                "custom_tag" => "test"
index 3b7ac20336ddc6909ba264e50b32ab364770d8a0..585b2c174c9564c4aa2ccb408c7847f39374b671 100644 (file)
@@ -493,8 +493,7 @@ defmodule Pleroma.Web.CommonAPITest do
 
     object = Object.normalize(activity)
 
-    assert object.data["tag"] == []
-    assert object.data["hashtags"] == ["2hu"]
+    assert object.data["tag"] == ["2hu"]
   end
 
   test "it adds emoji in the object" do
index d4378ccbc39b6457cbc32e010aa8718c478fad63..fa90667168762f79ae5bcff029b13fc9f132037a 100644 (file)
@@ -262,8 +262,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
       mentions: [],
       tags: [
         %{
-          name: "2hu",
-          url: "/tag/2hu"
+          name: "#{object_data["tag"]}",
+          url: "/tag/#{object_data["tag"]}"
         }
       ],
       application: %{
index a709d0daeda313e70fed92d4034d986c05d12623..8eb07dc3c19e4f54d24f5372a8a46a58147a29d3 100644 (file)
@@ -93,7 +93,7 @@ defmodule Pleroma.Factory do
       "like_count" => 0,
       "context" => "2hu",
       "summary" => "2hu",
-      "hashtags" => ["2hu"],
+      "tag" => ["2hu"],
       "emoji" => %{
         "2hu" => "corndog.png"
       }