summaryrefslogtreecommitdiff
path: root/priv/repo/migrations/20200415181818_update_markers.exs
blob: 976363565315478f6ce88493a72c0262ecb8c7b4 (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
defmodule Pleroma.Repo.Migrations.UpdateMarkers do
  use Ecto.Migration
  import Ecto.Query
  alias Pleroma.Repo

  def up do
    update_markers()
  end

  def down do
    :ok
  end

  defp update_markers do
    now = NaiveDateTime.utc_now()

    markers_attrs =
      from(q in "notifications",
        select: %{
          timeline: "notifications",
          user_id: q.user_id,
          last_read_id:
            type(fragment("MAX( CASE WHEN seen = true THEN id ELSE null END )"), :string)
        },
        group_by: [q.user_id]
      )
      |> Repo.all()
      |> Enum.map(fn %{last_read_id: last_read_id} = attrs ->
        attrs
        |> Map.put(:last_read_id, last_read_id || "")
        |> Map.put_new(:inserted_at, now)
        |> Map.put_new(:updated_at, now)
      end)

    Repo.insert_all("markers", markers_attrs,
      on_conflict: {:replace, [:last_read_id]},
      conflict_target: [:user_id, :timeline]
    )
  end
end