5c0e1039ce
Long-term we want that migration to be done entirely in SQL, but for now this is a hotfix to not cause OOMs on large databases. This is using a homegrown version of `Repo.stream`, it's worse in terms of performance than the upstream since it doesn't use the same prepared query for chunk queries, but unlike the upstream it supports preloads.
85 lines
2.1 KiB
Elixir
85 lines
2.1 KiB
Elixir
# Pleroma: A lightweight social networking server
|
|
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
defmodule Pleroma.MigrationHelper.NotificationBackfill do
|
|
alias Pleroma.Notification
|
|
alias Pleroma.Object
|
|
alias Pleroma.Repo
|
|
alias Pleroma.User
|
|
|
|
import Ecto.Query
|
|
|
|
def fill_in_notification_types do
|
|
query =
|
|
from(n in Pleroma.Notification,
|
|
where: is_nil(n.type),
|
|
preload: :activity
|
|
)
|
|
|
|
query
|
|
|> Repo.chunk_stream(100)
|
|
|> Enum.each(fn notification ->
|
|
type =
|
|
notification.activity
|
|
|> type_from_activity()
|
|
|
|
notification
|
|
|> Notification.changeset(%{type: type})
|
|
|> Repo.update()
|
|
end)
|
|
end
|
|
|
|
# This is copied over from Notifications to keep this stable.
|
|
defp type_from_activity(%{data: %{"type" => type}} = activity) do
|
|
case type do
|
|
"Follow" ->
|
|
accepted_function = fn activity ->
|
|
with %User{} = follower <- User.get_by_ap_id(activity.data["actor"]),
|
|
%User{} = followed <- User.get_by_ap_id(activity.data["object"]) do
|
|
Pleroma.FollowingRelationship.following?(follower, followed)
|
|
end
|
|
end
|
|
|
|
if accepted_function.(activity) do
|
|
"follow"
|
|
else
|
|
"follow_request"
|
|
end
|
|
|
|
"Announce" ->
|
|
"reblog"
|
|
|
|
"Like" ->
|
|
"favourite"
|
|
|
|
"Move" ->
|
|
"move"
|
|
|
|
"EmojiReact" ->
|
|
"pleroma:emoji_reaction"
|
|
|
|
# Compatibility with old reactions
|
|
"EmojiReaction" ->
|
|
"pleroma:emoji_reaction"
|
|
|
|
"Create" ->
|
|
activity
|
|
|> type_from_activity_object()
|
|
|
|
t ->
|
|
raise "No notification type for activity type #{t}"
|
|
end
|
|
end
|
|
|
|
defp type_from_activity_object(%{data: %{"type" => "Create", "object" => %{}}}), do: "mention"
|
|
|
|
defp type_from_activity_object(%{data: %{"type" => "Create"}} = activity) do
|
|
object = Object.get_by_ap_id(activity.data["object"])
|
|
|
|
case object && object.data["type"] do
|
|
"ChatMessage" -> "pleroma:chat_mention"
|
|
_ -> "mention"
|
|
end
|
|
end
|
|
end
|