logo

pleroma

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

user_controller.ex (2608B)


  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.Feed.UserController do
  5. use Pleroma.Web, :controller
  6. alias Pleroma.Config
  7. alias Pleroma.User
  8. alias Pleroma.Web.ActivityPub.ActivityPub
  9. alias Pleroma.Web.ActivityPub.ActivityPubController
  10. alias Pleroma.Web.Feed.FeedView
  11. plug(Pleroma.Web.Plugs.SetFormatPlug when action in [:feed_redirect])
  12. action_fallback(:errors)
  13. def feed_redirect(%{assigns: %{format: "html"}} = conn, %{"nickname" => nickname}) do
  14. with {_, %User{} = user} <- {:fetch_user, User.get_cached_by_nickname_or_id(nickname)} do
  15. Pleroma.Web.Fallback.RedirectController.redirector_with_meta(conn, %{user: user})
  16. else
  17. _ -> Pleroma.Web.Fallback.RedirectController.redirector(conn, nil)
  18. end
  19. end
  20. def feed_redirect(%{assigns: %{format: format}} = conn, _params)
  21. when format in ["json", "activity+json"] do
  22. ActivityPubController.call(conn, :user)
  23. end
  24. def feed_redirect(conn, %{"nickname" => nickname}) do
  25. with {_, %User{} = user} <- {:fetch_user, User.get_cached_by_nickname(nickname)} do
  26. redirect(conn, external: "#{Routes.user_feed_url(conn, :feed, user.nickname)}.atom")
  27. end
  28. end
  29. def feed(conn, %{"nickname" => nickname} = params) do
  30. format = get_format(conn)
  31. format =
  32. if format in ["atom", "rss"] do
  33. format
  34. else
  35. "atom"
  36. end
  37. with {_, %User{local: true} = user} <- {:fetch_user, User.get_cached_by_nickname(nickname)},
  38. {_, :visible} <- {:visibility, User.visible_for(user, _reading_user = nil)} do
  39. activities =
  40. %{
  41. type: ["Create"],
  42. actor_id: user.ap_id
  43. }
  44. |> Pleroma.Maps.put_if_present(:max_id, params["max_id"])
  45. |> ActivityPub.fetch_public_or_unlisted_activities()
  46. conn
  47. |> put_resp_content_type("application/#{format}+xml")
  48. |> put_view(FeedView)
  49. |> render("user.#{format}",
  50. user: user,
  51. activities: activities,
  52. feed_config: Config.get([:feed])
  53. )
  54. end
  55. end
  56. def errors(conn, {:error, :not_found}) do
  57. render_error(conn, :not_found, "Not found")
  58. end
  59. def errors(conn, {:fetch_user, %User{local: false}}), do: errors(conn, {:error, :not_found})
  60. def errors(conn, {:fetch_user, nil}), do: errors(conn, {:error, :not_found})
  61. def errors(conn, {:visibility, _}), do: errors(conn, {:error, :not_found})
  62. def errors(conn, _) do
  63. render_error(conn, :internal_server_error, "Something went wrong")
  64. end
  65. end