87b1e2c8cfea77cd82711810bedb38932bce26ff
[akkoma] / priv / repo / migrations / 20191009154608_copy_users_info_fields_to_users.exs
1 defmodule Pleroma.Repo.Migrations.CopyUsersInfoFieldsToUsers do
2 use Ecto.Migration
3
4 @info_fields [
5 :banner,
6 :background,
7 :source_data,
8 :note_count,
9 :follower_count,
10 :following_count,
11 :locked,
12 :confirmation_pending,
13 :password_reset_pending,
14 :confirmation_token,
15 :default_scope,
16 :blocks,
17 :domain_blocks,
18 :mutes,
19 :muted_reblogs,
20 :muted_notifications,
21 :subscribers,
22 :deactivated,
23 :no_rich_text,
24 :ap_enabled,
25 :is_moderator,
26 :is_admin,
27 :show_role,
28 :settings,
29 :magic_key,
30 :uri,
31 :hide_followers_count,
32 :hide_follows_count,
33 :hide_followers,
34 :hide_follows,
35 :hide_favorites,
36 :unread_conversation_count,
37 :pinned_activities,
38 :email_notifications,
39 :mascot,
40 :emoji,
41 :pleroma_settings_store,
42 :fields,
43 :raw_fields,
44 :discoverable,
45 :invisible,
46 :skip_thread_containment,
47 :notification_settings
48 ]
49
50 @jsonb_fields [
51 :banner,
52 :background,
53 :source_data,
54 :settings,
55 :email_notifications,
56 :mascot,
57 :pleroma_settings_store,
58 :notification_settings
59 ]
60
61 @array_jsonb_fields [:emoji, :fields, :raw_fields]
62
63 @int_fields [:note_count, :follower_count, :following_count, :unread_conversation_count]
64
65 @boolean_fields [
66 :locked,
67 :confirmation_pending,
68 :password_reset_pending,
69 :deactivated,
70 :no_rich_text,
71 :ap_enabled,
72 :is_moderator,
73 :is_admin,
74 :show_role,
75 :hide_followers_count,
76 :hide_follows_count,
77 :hide_followers,
78 :hide_follows,
79 :hide_favorites,
80 :discoverable,
81 :invisible,
82 :skip_thread_containment
83 ]
84
85 @array_text_fields [
86 :blocks,
87 :domain_blocks,
88 :mutes,
89 :muted_reblogs,
90 :muted_notifications,
91 :subscribers,
92 :pinned_activities
93 ]
94
95 def change do
96 alter table(:users) do
97 add(:banner, :map, default: %{})
98 add(:background, :map, default: %{})
99 add(:source_data, :map, default: %{})
100 add(:note_count, :integer, default: 0)
101 add(:follower_count, :integer, default: 0)
102 add(:following_count, :integer, default: nil)
103 add(:locked, :boolean, default: false, null: false)
104 add(:confirmation_pending, :boolean, default: false, null: false)
105 add(:password_reset_pending, :boolean, default: false, null: false)
106 add(:confirmation_token, :text, default: nil)
107 add(:default_scope, :string, default: "public")
108 add(:blocks, {:array, :text}, default: [])
109 add(:domain_blocks, {:array, :text}, default: [])
110 add(:mutes, {:array, :text}, default: [])
111 add(:muted_reblogs, {:array, :text}, default: [])
112 add(:muted_notifications, {:array, :text}, default: [])
113 add(:subscribers, {:array, :text}, default: [])
114 add(:deactivated, :boolean, default: false, null: false)
115 add(:no_rich_text, :boolean, default: false, null: false)
116 add(:ap_enabled, :boolean, default: false, null: false)
117 add(:is_moderator, :boolean, default: false, null: false)
118 add(:is_admin, :boolean, default: false, null: false)
119 add(:show_role, :boolean, default: true, null: false)
120 add(:settings, :map, default: nil)
121 add(:magic_key, :text, default: nil)
122 add(:uri, :text, default: nil)
123 add(:hide_followers_count, :boolean, default: false, null: false)
124 add(:hide_follows_count, :boolean, default: false, null: false)
125 add(:hide_followers, :boolean, default: false, null: false)
126 add(:hide_follows, :boolean, default: false, null: false)
127 add(:hide_favorites, :boolean, default: true, null: false)
128 add(:unread_conversation_count, :integer, default: 0)
129 add(:pinned_activities, {:array, :text}, default: [])
130 add(:email_notifications, :map, default: %{"digest" => false})
131 add(:mascot, :map, default: nil)
132 add(:emoji, {:array, :map}, default: [])
133 add(:pleroma_settings_store, :map, default: %{})
134 add(:fields, {:array, :map}, default: nil)
135 add(:raw_fields, {:array, :map}, default: [])
136 add(:discoverable, :boolean, default: false, null: false)
137 add(:invisible, :boolean, default: false, null: false)
138 add(:notification_settings, :map, default: %{})
139 add(:skip_thread_containment, :boolean, default: false, null: false)
140 end
141
142 if direction() == :up do
143 for f <- @info_fields do
144 set_field = "update users set #{f} ="
145
146 cond do
147 f in @jsonb_fields ->
148 execute("#{set_field} info->'#{f}'")
149
150 f in @array_jsonb_fields ->
151 execute("#{set_field} ARRAY(SELECT jsonb_array_elements(info->'#{f}'))")
152
153 f in @int_fields ->
154 execute("#{set_field} (info->>'#{f}')::int")
155
156 f in @boolean_fields ->
157 execute("#{set_field} coalesce((info->>'#{f}')::boolean, false)")
158
159 f in @array_text_fields ->
160 execute("#{set_field} ARRAY(SELECT jsonb_array_elements_text(info->'#{f}'))")
161
162 true ->
163 execute("#{set_field} info->>'#{f}'")
164 end
165 end
166
167 for index_name <- [
168 :users_deactivated_index,
169 :users_is_moderator_index,
170 :users_is_admin_index,
171 :users_subscribers_index
172 ] do
173 drop_if_exists(index(:users, [], name: index_name))
174 end
175 end
176
177 create_if_not_exists(index(:users, [:deactivated]))
178 create_if_not_exists(index(:users, [:is_moderator]))
179 create_if_not_exists(index(:users, [:is_admin]))
180 create_if_not_exists(index(:users, [:subscribers]))
181 end
182 end