First
[anni] / priv / repo / migrations / 20200831114918_remove_unread_conversation_count_from_user.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.RemoveUnreadConversationCountFromUser do
6   use Ecto.Migration
7   import Ecto.Query
8   alias Pleroma.Repo
9
10   def up do
11     alter table(:users) do
12       remove_if_exists(:unread_conversation_count, :integer)
13     end
14   end
15
16   def down do
17     alter table(:users) do
18       add_if_not_exists(:unread_conversation_count, :integer, default: 0)
19     end
20
21     flush()
22     recalc_unread_conversation_count()
23   end
24
25   defp recalc_unread_conversation_count do
26     participations_subquery =
27       from(
28         p in "conversation_participations",
29         where: p.read == false,
30         group_by: p.user_id,
31         select: %{user_id: p.user_id, unread_conversation_count: count(p.id)}
32       )
33
34     from(
35       u in "users",
36       join: p in subquery(participations_subquery),
37       on: p.user_id == u.id,
38       update: [set: [unread_conversation_count: p.unread_conversation_count]]
39     )
40     |> Repo.update_all([])
41   end
42 end