2e355d411a8fb1cd69cc653b8738b6e85d6a6477
[anni] / priv / repo / migrations / 20200406100225_users_add_emoji.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Repo.Migrations.UsersPopulateEmoji do
6   use Ecto.Migration
7
8   import Ecto.Query
9
10   alias Pleroma.User
11   alias Pleroma.Repo
12
13   def up do
14     execute("ALTER TABLE users ALTER COLUMN emoji SET DEFAULT '{}'::jsonb")
15     execute("UPDATE users SET emoji = DEFAULT WHERE emoji = '[]'::jsonb")
16
17     from(u in User)
18     |> select([u], struct(u, [:id, :ap_id, :source_data]))
19     |> Repo.stream()
20     |> Enum.each(fn user ->
21       emoji =
22         user.source_data
23         |> Map.get("tag", [])
24         |> Enum.filter(fn
25           %{"type" => "Emoji"} -> true
26           _ -> false
27         end)
28         |> Enum.reduce(%{}, fn %{"icon" => %{"url" => url}, "name" => name}, acc ->
29           Map.put(acc, String.trim(name, ":"), url)
30         end)
31
32       user
33       |> Ecto.Changeset.cast(%{emoji: emoji}, [:emoji])
34       |> Repo.update()
35     end)
36   end
37
38   def down do
39     execute("ALTER TABLE users ALTER COLUMN emoji SET DEFAULT '[]'::jsonb")
40     execute("UPDATE users SET emoji = DEFAULT WHERE emoji = '{}'::jsonb")
41   end
42 end