logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://anongit.hacktivis.me/git/pleroma.git/

import.ex (3089B)


  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. defmodule Pleroma.User.Import do
  5. use Ecto.Schema
  6. alias Pleroma.Repo
  7. alias Pleroma.User
  8. alias Pleroma.Web.CommonAPI
  9. alias Pleroma.Workers.BackgroundWorker
  10. require Logger
  11. @spec perform(atom(), User.t(), String.t()) :: :ok | {:error, any()}
  12. def perform(:mute_import, %User{} = user, actor) do
  13. with {:ok, %User{} = muted_user} <- User.get_or_fetch(actor),
  14. {_, false} <- {:existing_mute, User.mutes_user?(user, muted_user)},
  15. {:ok, _} <- User.mute(user, muted_user) do
  16. {:ok, muted_user}
  17. else
  18. {:existing_mute, true} -> :ok
  19. error -> handle_error(:mutes_import, actor, error)
  20. end
  21. end
  22. def perform(:block_import, %User{} = user, actor) do
  23. with {:ok, %User{} = blocked} <- User.get_or_fetch(actor),
  24. {_, false} <- {:existing_block, User.blocks_user?(user, blocked)},
  25. {:ok, _block} <- CommonAPI.block(blocked, user) do
  26. {:ok, blocked}
  27. else
  28. {:existing_block, true} -> :ok
  29. error -> handle_error(:blocks_import, actor, error)
  30. end
  31. end
  32. def perform(:follow_import, %User{} = user, actor) do
  33. with {:ok, %User{} = followed} <- User.get_or_fetch(actor),
  34. {_, false} <- {:existing_follow, User.following?(user, followed)},
  35. {:ok, user, followed} <- User.maybe_direct_follow(user, followed),
  36. {:ok, _, _, _} <- CommonAPI.follow(followed, user) do
  37. {:ok, followed}
  38. else
  39. {:existing_follow, true} -> :ok
  40. error -> handle_error(:follow_import, actor, error)
  41. end
  42. end
  43. defp handle_error(op, user_id, error) do
  44. Logger.debug("#{op} failed for #{user_id} with: #{inspect(error)}")
  45. {:error, error}
  46. end
  47. def blocks_import(%User{} = user, [_ | _] = actors) do
  48. jobs =
  49. Repo.checkout(fn ->
  50. Enum.reduce(actors, [], fn actor, acc ->
  51. {:ok, job} =
  52. BackgroundWorker.new(%{
  53. "op" => "block_import",
  54. "user_id" => user.id,
  55. "actor" => actor
  56. })
  57. |> Oban.insert()
  58. acc ++ [job]
  59. end)
  60. end)
  61. {:ok, jobs}
  62. end
  63. def follows_import(%User{} = user, [_ | _] = actors) do
  64. jobs =
  65. Repo.checkout(fn ->
  66. Enum.reduce(actors, [], fn actor, acc ->
  67. {:ok, job} =
  68. BackgroundWorker.new(%{
  69. "op" => "follow_import",
  70. "user_id" => user.id,
  71. "actor" => actor
  72. })
  73. |> Oban.insert()
  74. acc ++ [job]
  75. end)
  76. end)
  77. {:ok, jobs}
  78. end
  79. def mutes_import(%User{} = user, [_ | _] = actors) do
  80. jobs =
  81. Repo.checkout(fn ->
  82. Enum.reduce(actors, [], fn actor, acc ->
  83. {:ok, job} =
  84. BackgroundWorker.new(%{
  85. "op" => "mute_import",
  86. "user_id" => user.id,
  87. "actor" => actor
  88. })
  89. |> Oban.insert()
  90. acc ++ [job]
  91. end)
  92. end)
  93. {:ok, jobs}
  94. end
  95. end