Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

111 satır
3.5KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2020 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: [json_response: 3, add_link_headers: 2, assign_account_by_id: 2]
  8. alias Pleroma.User
  9. alias Pleroma.Web.ActivityPub.ActivityPub
  10. alias Pleroma.Web.MastodonAPI.StatusView
  11. alias Pleroma.Web.Plugs.EnsurePublicOrAuthenticatedPlug
  12. alias Pleroma.Web.Plugs.OAuthScopesPlug
  13. alias Pleroma.Web.Plugs.RateLimiter
  14. require Pleroma.Constants
  15. plug(
  16. OpenApiSpex.Plug.PutApiSpec,
  17. [module: Pleroma.Web.ApiSpec] when action == :confirmation_resend
  18. )
  19. plug(Pleroma.Web.ApiSpec.CastAndValidate)
  20. plug(
  21. :skip_plug,
  22. [OAuthScopesPlug, EnsurePublicOrAuthenticatedPlug] when action == :confirmation_resend
  23. )
  24. plug(
  25. OAuthScopesPlug,
  26. %{scopes: ["follow", "write:follows"]} when action in [:subscribe, :unsubscribe]
  27. )
  28. plug(
  29. OAuthScopesPlug,
  30. %{scopes: ["read:favourites"], fallback: :proceed_unauthenticated} when action == :favourites
  31. )
  32. plug(RateLimiter, [name: :account_confirmation_resend] when action == :confirmation_resend)
  33. plug(:assign_account_by_id when action in [:favourites, :subscribe, :unsubscribe])
  34. plug(:put_view, Pleroma.Web.MastodonAPI.AccountView)
  35. defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaAccountOperation
  36. @doc "POST /api/v1/pleroma/accounts/confirmation_resend"
  37. def confirmation_resend(conn, params) do
  38. nickname_or_email = params[:email] || params[:nickname]
  39. with %User{} = user <- User.get_by_nickname_or_email(nickname_or_email),
  40. {:ok, _} <- User.try_send_confirmation_email(user) do
  41. json_response(conn, :no_content, "")
  42. end
  43. end
  44. @doc "GET /api/v1/pleroma/accounts/:id/favourites"
  45. def favourites(%{assigns: %{account: %{hide_favorites: true}}} = conn, _params) do
  46. render_error(conn, :forbidden, "Can't get favorites")
  47. end
  48. def favourites(%{assigns: %{user: for_user, account: user}} = conn, params) do
  49. params =
  50. params
  51. |> Map.put(:type, "Create")
  52. |> Map.put(:favorited_by, user.ap_id)
  53. |> Map.put(:blocking_user, for_user)
  54. recipients =
  55. if for_user do
  56. [Pleroma.Constants.as_public()] ++ [for_user.ap_id | User.following(for_user)]
  57. else
  58. [Pleroma.Constants.as_public()]
  59. end
  60. activities =
  61. recipients
  62. |> ActivityPub.fetch_activities(params)
  63. |> Enum.reverse()
  64. conn
  65. |> add_link_headers(activities)
  66. |> put_view(StatusView)
  67. |> render("index.json",
  68. activities: activities,
  69. for: for_user,
  70. as: :activity
  71. )
  72. end
  73. @doc "POST /api/v1/pleroma/accounts/:id/subscribe"
  74. def subscribe(%{assigns: %{user: user, account: subscription_target}} = conn, _params) do
  75. with {:ok, _subscription} <- User.subscribe(user, subscription_target) do
  76. render(conn, "relationship.json", user: user, target: subscription_target)
  77. else
  78. {:error, message} -> json_response(conn, :forbidden, %{error: message})
  79. end
  80. end
  81. @doc "POST /api/v1/pleroma/accounts/:id/unsubscribe"
  82. def unsubscribe(%{assigns: %{user: user, account: subscription_target}} = conn, _params) do
  83. with {:ok, _subscription} <- User.unsubscribe(user, subscription_target) do
  84. render(conn, "relationship.json", user: user, target: subscription_target)
  85. else
  86. {:error, message} -> json_response(conn, :forbidden, %{error: message})
  87. end
  88. end
  89. end