logo

pleroma

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

account_controller.ex (4619B)


  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.Web.PleromaAPI.AccountController do
  5. use Pleroma.Web, :controller
  6. import Pleroma.Web.ControllerHelper,
  7. only: [
  8. json_response: 3,
  9. add_link_headers: 2,
  10. embed_relationships?: 1,
  11. assign_account_by_id: 2
  12. ]
  13. alias Pleroma.User
  14. alias Pleroma.Web.ActivityPub.ActivityPub
  15. alias Pleroma.Web.MastodonAPI.StatusView
  16. alias Pleroma.Web.Plugs.OAuthScopesPlug
  17. alias Pleroma.Web.Plugs.RateLimiter
  18. require Pleroma.Constants
  19. plug(
  20. Majic.Plug,
  21. [pool: Pleroma.MajicPool] when action in [:update_avatar, :update_background, :update_banner]
  22. )
  23. plug(
  24. OpenApiSpex.Plug.PutApiSpec,
  25. [module: Pleroma.Web.ApiSpec] when action == :confirmation_resend
  26. )
  27. plug(Pleroma.Web.ApiSpec.CastAndValidate)
  28. plug(:skip_auth when action == :confirmation_resend)
  29. plug(
  30. OAuthScopesPlug,
  31. %{scopes: ["follow", "write:follows"]} when action in [:subscribe, :unsubscribe]
  32. )
  33. plug(
  34. OAuthScopesPlug,
  35. %{scopes: ["read:favourites"], fallback: :proceed_unauthenticated} when action == :favourites
  36. )
  37. plug(
  38. OAuthScopesPlug,
  39. %{fallback: :proceed_unauthenticated, scopes: ["read:accounts"]}
  40. when action == :endorsements
  41. )
  42. plug(
  43. OAuthScopesPlug,
  44. %{scopes: ["read:accounts"]} when action == :birthdays
  45. )
  46. plug(RateLimiter, [name: :account_confirmation_resend] when action == :confirmation_resend)
  47. plug(
  48. :assign_account_by_id
  49. when action in [:favourites, :endorsements, :subscribe, :unsubscribe]
  50. )
  51. defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaAccountOperation
  52. @doc "POST /api/v1/pleroma/accounts/confirmation_resend"
  53. def confirmation_resend(conn, params) do
  54. nickname_or_email = params[:email] || params[:nickname]
  55. with %User{} = user <- User.get_by_nickname_or_email(nickname_or_email),
  56. {:ok, _} <- User.maybe_send_confirmation_email(user) do
  57. json_response(conn, :no_content, "")
  58. end
  59. end
  60. @doc "GET /api/v1/pleroma/accounts/:id/favourites"
  61. def favourites(%{assigns: %{account: %{hide_favorites: true}}} = conn, _params) do
  62. render_error(conn, :forbidden, "Can't get favorites")
  63. end
  64. def favourites(%{assigns: %{user: for_user, account: user}} = conn, params) do
  65. params =
  66. params
  67. |> Map.put(:type, "Create")
  68. |> Map.put(:favorited_by, user.ap_id)
  69. |> Map.put(:blocking_user, for_user)
  70. recipients =
  71. if for_user do
  72. [Pleroma.Constants.as_public()] ++ [for_user.ap_id | User.following(for_user)]
  73. else
  74. [Pleroma.Constants.as_public()]
  75. end
  76. activities =
  77. recipients
  78. |> ActivityPub.fetch_activities(params)
  79. |> Enum.reverse()
  80. conn
  81. |> add_link_headers(activities)
  82. |> put_view(StatusView)
  83. |> render("index.json",
  84. activities: activities,
  85. for: for_user,
  86. as: :activity
  87. )
  88. end
  89. @doc "GET /api/v1/pleroma/accounts/:id/endorsements"
  90. def endorsements(%{assigns: %{user: for_user, account: user}} = conn, params) do
  91. users =
  92. user
  93. |> User.endorsed_users_relation(_restrict_deactivated = true)
  94. |> Pleroma.Repo.all()
  95. conn
  96. |> render("index.json",
  97. for: for_user,
  98. users: users,
  99. as: :user,
  100. embed_relationships: embed_relationships?(params)
  101. )
  102. end
  103. @doc "POST /api/v1/pleroma/accounts/:id/subscribe"
  104. def subscribe(%{assigns: %{user: user, account: subscription_target}} = conn, _params) do
  105. with {:ok, _subscription} <- User.subscribe(user, subscription_target) do
  106. render(conn, "relationship.json", user: user, target: subscription_target)
  107. else
  108. {:error, message} -> json_response(conn, :forbidden, %{error: message})
  109. end
  110. end
  111. @doc "POST /api/v1/pleroma/accounts/:id/unsubscribe"
  112. def unsubscribe(%{assigns: %{user: user, account: subscription_target}} = conn, _params) do
  113. with {:ok, _subscription} <- User.unsubscribe(user, subscription_target) do
  114. render(conn, "relationship.json", user: user, target: subscription_target)
  115. else
  116. {:error, message} -> json_response(conn, :forbidden, %{error: message})
  117. end
  118. end
  119. @doc "GET /api/v1/pleroma/birthdays"
  120. def birthdays(%{assigns: %{user: %User{} = user}} = conn, %{day: day, month: month} = _params) do
  121. birthdays =
  122. User.get_friends_birthdays_query(user, day, month)
  123. |> Pleroma.Repo.all()
  124. conn
  125. |> render("index.json",
  126. for: user,
  127. users: birthdays,
  128. as: :user
  129. )
  130. end
  131. end