[#3213] Partially addressed code review points.
authorIvan Tashkinov <ivantashkinov@gmail.com>
Sun, 7 Feb 2021 19:24:12 +0000 (22:24 +0300)
committerIvan Tashkinov <ivantashkinov@gmail.com>
Sun, 7 Feb 2021 19:24:12 +0000 (22:24 +0300)
migration rollback task changes, hashtags-related config handling tweaks, `hashtags.data` deletion (unused).

config/description.exs
lib/mix/tasks/pleroma/database.ex
lib/pleroma/config.ex
lib/pleroma/hashtag.ex
lib/pleroma/migrators/hashtags_table_migrator.ex
lib/pleroma/web/activity_pub/activity_pub.ex
priv/repo/migrations/20201221202251_create_hashtags.exs
priv/repo/migrations/20201221202252_remove_data_from_hashtags.exs [new file with mode: 0644]
test/pleroma/web/activity_pub/activity_pub_test.exs

index ed3a534a034da0a5d4a38c32821732a442e864e4..02cdf2ff3f42566701280103a1b8738b5f3c1ddc 100644 (file)
@@ -495,6 +495,20 @@ config :pleroma, :config_description, [
       }
     ]
   },
+  %{
+    group: :pleroma,
+    key: :database,
+    type: :group,
+    description: "Database-related settings",
+    children: [
+      %{
+        key: :improved_hashtag_timeline,
+        type: :keyword,
+        description:
+          "If `true`, hashtags will be fetched from `hashtags` table for hashtags timeline. When `false`, object-embedded hashtags will be used (slower). Is auto-set to `true` (unless overridden) when HashtagsTableMigrator completes."
+      }
+    ]
+  },
   %{
     group: :pleroma,
     key: :instance,
@@ -941,12 +955,6 @@ config :pleroma, :config_description, [
         key: :show_reactions,
         type: :boolean,
         description: "Let favourites and emoji reactions be viewed through the API."
-      },
-      %{
-        key: :improved_hashtag_timeline,
-        type: :keyword,
-        description:
-          "If `true`, hashtags will be fetched from `hashtags` table for hashtags timeline. When `false`, object-embedded hashtags will be used (slower). Is auto-set to `true` (unless overridden) when HashtagsTableMigrator completes."
       }
     ]
   },
index 30c0d2bf17c467d6f561a3bc46873ae039cd08e0..7c4f54141bc39ce16b43974c653fb5cae750f936 100644 (file)
@@ -20,30 +20,6 @@ defmodule Mix.Tasks.Pleroma.Database do
   @shortdoc "A collection of database related tasks"
   @moduledoc File.read!("docs/administration/CLI_tasks/database.md")
 
-  # Rolls back a specific migration (leaving subsequent migrations applied)
-  # Based on https://stackoverflow.com/a/53825840
-  def run(["rollback", version]) do
-    start_pleroma()
-
-    version = String.to_integer(version)
-    re = ~r/^#{version}_.*\.exs/
-    path = Application.app_dir(:pleroma, Path.join(["priv", "repo", "migrations"]))
-
-    result =
-      with {:find, "" <> file} <- {:find, Enum.find(File.ls!(path), &String.match?(&1, re))},
-           {:compile, [{mod, _} | _]} <- {:compile, Code.compile_file(Path.join(path, file))},
-           {:rollback, :ok} <- {:rollback, Ecto.Migrator.down(Repo, version, mod)} do
-        {:ok, "Reversed migration: #{file}"}
-      else
-        {:find, _} -> {:error, "No migration found with version prefix: #{version}"}
-        {:compile, e} -> {:error, "Problem compiling migration module: #{inspect(e)}"}
-        {:rollback, e} -> {:error, "Problem reversing migration: #{inspect(e)}"}
-        e -> {:error, "Something unexpected happened: #{inspect(e)}"}
-      end
-
-    IO.inspect(result)
-  end
-
   def run(["remove_embedded_objects" | args]) do
     {options, [], []} =
       OptionParser.parse(
@@ -194,4 +170,33 @@ defmodule Mix.Tasks.Pleroma.Database do
     end)
     |> Stream.run()
   end
+
+  # Rolls back a specific migration (leaving subsequent migrations applied).
+  # WARNING: imposes a risk of unrecoverable data loss — proceed at your own responsibility.
+  # Based on https://stackoverflow.com/a/53825840
+  def run(["rollback", version]) do
+    prompt = "SEVERE WARNING: this operation may result in unrecoverable data loss. Continue?"
+
+    if shell_prompt(prompt, "n") in ~w(Yn Y y) do
+      {_, result, _} =
+        Ecto.Migrator.with_repo(Pleroma.Repo, fn repo ->
+          version = String.to_integer(version)
+          re = ~r/^#{version}_.*\.exs/
+          path = Ecto.Migrator.migrations_path(repo)
+
+          with {:find, "" <> file} <- {:find, Enum.find(File.ls!(path), &String.match?(&1, re))},
+               {:compile, [{mod, _} | _]} <- {:compile, Code.compile_file(Path.join(path, file))},
+               {:rollback, :ok} <- {:rollback, Ecto.Migrator.down(repo, version, mod)} do
+            {:ok, "Reversed migration: #{file}"}
+          else
+            {:find, _} -> {:error, "No migration found with version prefix: #{version}"}
+            {:compile, e} -> {:error, "Problem compiling migration module: #{inspect(e)}"}
+            {:rollback, e} -> {:error, "Problem reversing migration: #{inspect(e)}"}
+            e -> {:error, "Something unexpected happened: #{inspect(e)}"}
+          end
+        end)
+
+      IO.inspect(result)
+    end
+  end
 end
index 0a6ac0ad083062ee9fb71368af74a6f5c531727b..f17e141282883d7c29e876a253003556a66a7747 100644 (file)
@@ -96,9 +96,6 @@ defmodule Pleroma.Config do
     end
   end
 
-  def improved_hashtag_timeline_path, do: [:instance, :improved_hashtag_timeline]
-  def improved_hashtag_timeline, do: get(improved_hashtag_timeline_path())
-
   def oauth_consumer_strategies, do: get([:auth, :oauth_consumer_strategies], [])
 
   def oauth_consumer_enabled?, do: oauth_consumer_strategies() != []
index b05927563d0f312c51851fa7696629cd2416bd64..9e4c6c89446cdc998655b613359efea1d68189ab 100644 (file)
@@ -10,11 +10,8 @@ defmodule Pleroma.Hashtag do
   alias Pleroma.Hashtag
   alias Pleroma.Repo
 
-  @derive {Jason.Encoder, only: [:data]}
-
   schema "hashtags" do
     field(:name, :string)
-    field(:data, :map, default: %{})
 
     many_to_many(:objects, Pleroma.Object, join_through: "hashtags_objects", on_replace: :delete)
 
@@ -50,7 +47,7 @@ defmodule Pleroma.Hashtag do
 
   def changeset(%Hashtag{} = struct, params) do
     struct
-    |> cast(params, [:name, :data])
+    |> cast(params, [:name])
     |> update_change(:name, &String.downcase/1)
     |> validate_required([:name])
     |> unique_constraint(:name)
index 07b42a7f4d946ede09fc0813c884c34846009ece..9a036e0b298506d8d0652184a1cad2c1888c6a0a 100644 (file)
@@ -239,11 +239,11 @@ defmodule Pleroma.Migrators.HashtagsTableMigrator do
       data_migration.feature_lock ->
         :noop
 
-      not is_nil(Config.improved_hashtag_timeline()) ->
+      not is_nil(Config.get([:database, :improved_hashtag_timeline])) ->
         :noop
 
       true ->
-        Config.put(Config.improved_hashtag_timeline_path(), true)
+        Config.put([:database, :improved_hashtag_timeline], true)
         :ok
     end
   end
index 573b4243c4d516e458dfe491847b4fab56e8cf0e..7ac18e5c5767c8dece635ac31807ad36a23073e3 100644 (file)
@@ -1227,7 +1227,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
       |> exclude_invisible_actors(opts)
       |> exclude_visibility(opts)
 
-    if Config.improved_hashtag_timeline() do
+    if Config.get([:database, :improved_hashtag_timeline]) do
       query
       |> restrict_hashtag_any(opts)
       |> restrict_hashtag_all(opts)
index afc522002e57fbed683864632d549a5f0b5ca3ce..8d2e9ae663aa48e09ebe053fc82aa87b0eed1d3e 100644 (file)
@@ -4,7 +4,6 @@ defmodule Pleroma.Repo.Migrations.CreateHashtags do
   def change do
     create_if_not_exists table(:hashtags) do
       add(:name, :citext, null: false)
-      add(:data, :map, default: %{})
 
       timestamps()
     end
diff --git a/priv/repo/migrations/20201221202252_remove_data_from_hashtags.exs b/priv/repo/migrations/20201221202252_remove_data_from_hashtags.exs
new file mode 100644 (file)
index 0000000..0442c3b
--- /dev/null
@@ -0,0 +1,15 @@
+defmodule Pleroma.Repo.Migrations.RemoveDataFromHashtags do
+  use Ecto.Migration
+
+  def up do
+    alter table(:hashtags) do
+      remove_if_exists(:data, :map)
+    end
+  end
+
+  def down do
+    alter table(:hashtags) do
+      add_if_not_exists(:data, :map, default: %{})
+    end
+  end
+end
index 04fd1def3a95cffd0d5c53a7fd7a9c6973a58410..bab5a199cb2927f988b9fb04c3ec206a5128ce70 100644 (file)
@@ -221,7 +221,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
     {:ok, status_five} = CommonAPI.post(user, %{status: ". #any2 #any1"})
 
     for hashtag_timeline_strategy <- [true, false] do
-      clear_config([:instance, :improved_hashtag_timeline], hashtag_timeline_strategy)
+      clear_config([:database, :improved_hashtag_timeline], hashtag_timeline_strategy)
 
       fetch_one = ActivityPub.fetch_activities([], %{type: "Create", tag: "test"})