diff options
| -rw-r--r-- | priv/repo/migrations/20200802170532_fix_legacy_tags.exs | 37 | ||||
| -rw-r--r-- | test/migrations/20200802170532_fix_legacy_tags_test.exs | 24 | 
2 files changed, 61 insertions, 0 deletions
| diff --git a/priv/repo/migrations/20200802170532_fix_legacy_tags.exs b/priv/repo/migrations/20200802170532_fix_legacy_tags.exs new file mode 100644 index 000000000..f7274b44e --- /dev/null +++ b/priv/repo/migrations/20200802170532_fix_legacy_tags.exs @@ -0,0 +1,37 @@ +# Fix legacy tags set by AdminFE that don't align with TagPolicy MRF + +defmodule Pleroma.Repo.Migrations.FixLegacyTags do +  use Ecto.Migration +  alias Pleroma.Repo +  alias Pleroma.User +  import Ecto.Query + +  @old_new_map %{ +    "force_nsfw" => "mrf_tag:media-force-nsfw", +    "strip_media" => "mrf_tag:media-strip", +    "force_unlisted" => "mrf_tag:force-unlisted", +    "sandbox" => "mrf_tag:sandbox", +    "disable_remote_subscription" => "mrf_tag:disable-remote-subscription", +    "disable_any_subscription" => "mrf_tag:disable-any-subscription" +  } + +  def change do +    legacy_tags = Map.keys(@old_new_map) + +    from(u in User, where: fragment("? && ?", u.tags, ^legacy_tags)) +    |> Repo.all() +    |> Enum.each(fn user -> +      fix_tags_changeset(user) +      |> Repo.update() +    end) +  end + +  defp fix_tags_changeset(%User{tags: tags} = user) do +    new_tags = +      Enum.map(tags, fn tag -> +        Map.get(@old_new_map, tag, tag) +      end) + +    Ecto.Changeset.change(user, tags: new_tags) +  end +end diff --git a/test/migrations/20200802170532_fix_legacy_tags_test.exs b/test/migrations/20200802170532_fix_legacy_tags_test.exs new file mode 100644 index 000000000..3b4dee407 --- /dev/null +++ b/test/migrations/20200802170532_fix_legacy_tags_test.exs @@ -0,0 +1,24 @@ +defmodule Pleroma.Repo.Migrations.FixLegacyTagsTest do +  alias Pleroma.User +  use Pleroma.DataCase +  import Pleroma.Factory +  import Pleroma.Tests.Helpers + +  setup_all do: require_migration("20200802170532_fix_legacy_tags") + +  test "change/0 converts legacy user tags into correct values", %{migration: migration} do +    user = insert(:user, tags: ["force_nsfw", "force_unlisted", "verified"]) +    user2 = insert(:user) + +    assert :ok == migration.change() + +    fixed_user = User.get_by_id(user.id) +    fixed_user2 = User.get_by_id(user2.id) + +    assert fixed_user.tags == ["mrf_tag:media-force-nsfw", "mrf_tag:force-unlisted", "verified"] +    assert fixed_user2.tags == [] + +    # user2 should not have been updated +    assert fixed_user2.updated_at == fixed_user2.inserted_at +  end +end | 
