total rebase
[anni] / priv / repo / migrations / 20200724133313_move_welcome_settings.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.MoveWelcomeSettings do
6   use Ecto.Migration
7
8   alias Pleroma.ConfigDB
9
10   @old_keys [:welcome_user_nickname, :welcome_message]
11
12   def up do
13     with {:ok, config, {keep_values, move_values}} <- get_old_values() do
14       insert_welcome_settings(move_values)
15       update_instance_config(config, keep_values)
16     end
17   end
18
19   def down do
20     with {:ok, welcome_config, revert_values} <- get_revert_values() do
21       revert_instance_config(revert_values)
22       Pleroma.Repo.delete(welcome_config)
23     end
24   end
25
26   defp insert_welcome_settings([_ | _] = values) do
27     unless String.trim(values[:welcome_message]) == "" do
28       config_values = [
29         direct_message: %{
30           enabled: true,
31           sender_nickname: values[:welcome_user_nickname],
32           message: values[:welcome_message]
33         },
34         email: %{
35           enabled: false,
36           sender: nil,
37           subject: "Welcome to <%= instance_name %>",
38           html: "Welcome to <%= instance_name %>",
39           text: "Welcome to <%= instance_name %>"
40         }
41       ]
42
43       {:ok, _} =
44         %ConfigDB{}
45         |> ConfigDB.changeset(%{group: :pleroma, key: :welcome, value: config_values})
46         |> Pleroma.Repo.insert()
47     end
48
49     :ok
50   end
51
52   defp insert_welcome_settings(_), do: :noop
53
54   defp revert_instance_config(%{} = revert_values) do
55     values = [
56       welcome_user_nickname: revert_values[:sender_nickname],
57       welcome_message: revert_values[:message]
58     ]
59
60     ConfigDB.update_or_create(%{group: :pleroma, key: :instance, value: values})
61   end
62
63   defp revert_instance_config(_), do: :noop
64
65   defp update_instance_config(config, values) do
66     {:ok, _} =
67       config
68       |> ConfigDB.changeset(%{value: values})
69       |> Pleroma.Repo.update()
70
71     :ok
72   end
73
74   defp get_revert_values do
75     config = ConfigDB.get_by_params(%{group: :pleroma, key: :welcome})
76
77     cond do
78       is_nil(config) -> {:noop, nil, nil}
79       true -> {:ok, config, config.value[:direct_message]}
80     end
81   end
82
83   defp get_old_values do
84     config = ConfigDB.get_by_params(%{group: :pleroma, key: :instance})
85
86     cond do
87       is_nil(config) ->
88         {:noop, config, {}}
89
90       is_binary(config.value[:welcome_message]) ->
91         {:ok, config,
92          {Keyword.drop(config.value, @old_keys), Keyword.take(config.value, @old_keys)}}
93
94       true ->
95         {:ok, config, {Keyword.drop(config.value, @old_keys), []}}
96     end
97   end
98 end