summaryrefslogtreecommitdiff
path: root/priv/repo/migrations/20200724133313_move_welcome_settings.exs
blob: 323a8fcee51eb4354d4949594e9ae70af2b1847e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
defmodule Pleroma.Repo.Migrations.MoveWelcomeSettings do
  use Ecto.Migration

  alias Pleroma.ConfigDB

  @old_keys [:welcome_user_nickname, :welcome_message]

  def up do
    with {:ok, config, {keep_values, move_values}} <- get_old_values() do
      insert_welcome_settings(move_values)
      update_instance_config(config, keep_values)
    end
  end

  def down do
    with {:ok, welcome_config, revert_values} <- get_revert_values() do
      revert_instance_config(revert_values)
      Pleroma.Repo.delete(welcome_config)
    end
  end

  defp insert_welcome_settings([_ | _] = values) do
    unless String.trim(values[:welcome_message]) == "" do
      config_values = [
        direct_message: %{
          enabled: true,
          sender_nickname: values[:welcome_user_nickname],
          message: values[:welcome_message]
        },
        email: %{
          enabled: false,
          sender: nil,
          subject: "Welcome to <%= instance_name %>",
          html: "Welcome to <%= instance_name %>",
          text: "Welcome to <%= instance_name %>"
        }
      ]

      {:ok, _} =
        %ConfigDB{}
        |> ConfigDB.changeset(%{group: :pleroma, key: :welcome, value: config_values})
        |> Pleroma.Repo.insert()
    end

    :ok
  end

  defp insert_welcome_settings(_), do: :noop

  defp revert_instance_config(%{} = revert_values) do
    values = [
      welcome_user_nickname: revert_values[:sender_nickname],
      welcome_message: revert_values[:message]
    ]

    ConfigDB.update_or_create(%{group: :pleroma, key: :instance, value: values})
  end

  defp revert_instance_config(_), do: :noop

  defp update_instance_config(config, values) do
    {:ok, _} =
      config
      |> ConfigDB.changeset(%{value: values})
      |> Pleroma.Repo.update()

    :ok
  end

  defp get_revert_values do
    config = ConfigDB.get_by_params(%{group: :pleroma, key: :welcome})

    cond do
      is_nil(config) -> {:noop, nil, nil}
      true -> {:ok, config, config.value[:direct_message]}
    end
  end

  defp get_old_values do
    config = ConfigDB.get_by_params(%{group: :pleroma, key: :instance})

    cond do
      is_nil(config) ->
        {:noop, config, {}}

      is_binary(config.value[:welcome_message]) ->
        {:ok, config,
         {Keyword.drop(config.value, @old_keys), Keyword.take(config.value, @old_keys)}}

      true ->
        {:ok, config, {Keyword.drop(config.value, @old_keys), []}}
    end
  end
end