82 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
| # Pleroma: A lightweight social networking server
 | |
| # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 | |
| # SPDX-License-Identifier: AGPL-3.0-only
 | |
| 
 | |
| defmodule Pleroma.MigrationHelper.NotificationBackfill do
 | |
|   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 ->
 | |
|       if notification.activity do
 | |
|         type = type_from_activity(notification.activity)
 | |
| 
 | |
|         notification
 | |
|         |> Ecto.Changeset.change(%{type: type})
 | |
|         |> Repo.update()
 | |
|       end
 | |
|     end)
 | |
|   end
 | |
| 
 | |
|   defp get_by_ap_id(ap_id) do
 | |
|     q =
 | |
|       from(u in User,
 | |
|         select: u.id
 | |
|       )
 | |
| 
 | |
|     Repo.get_by(q, ap_id: ap_id)
 | |
|   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 <- get_by_ap_id(activity.data["actor"]),
 | |
|                %User{} = followed <- 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" ->
 | |
|         type_from_activity_object(activity)
 | |
| 
 | |
|       t ->
 | |
|         raise "No notification type for activity type #{t}"
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   defp type_from_activity_object(%{data: %{"type" => "Create"}}), do: "mention"
 | |
| end
 | 
