logo

pleroma

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

static_fe_controller.ex (5699B)


  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.StaticFE.StaticFEController do
  5. use Pleroma.Web, :controller
  6. alias Pleroma.Activity
  7. alias Pleroma.Object
  8. alias Pleroma.User
  9. alias Pleroma.Web.ActivityPub.ActivityPub
  10. alias Pleroma.Web.ActivityPub.Visibility
  11. alias Pleroma.Web.Metadata
  12. alias Pleroma.Web.Router.Helpers
  13. plug(:assign_id)
  14. @page_keys ["max_id", "min_id", "limit", "since_id", "order"]
  15. @doc "Renders requested local public activity or public activities of requested user"
  16. def show(%{assigns: %{notice_id: notice_id}} = conn, _params) do
  17. with %Activity{local: true} = activity <-
  18. Activity.get_by_id_with_object(notice_id),
  19. true <- Visibility.public?(activity.object),
  20. {_, true} <- {:visible?, Visibility.visible_for_user?(activity, _reading_user = nil)},
  21. %User{} = user <- User.get_by_ap_id(activity.object.data["actor"]) do
  22. url = Helpers.url(conn) <> conn.request_path
  23. meta =
  24. Metadata.build_tags(%{
  25. activity_id: notice_id,
  26. object: activity.object,
  27. user: user,
  28. url: url
  29. })
  30. timeline =
  31. activity.object.data["context"]
  32. |> ActivityPub.fetch_activities_for_context(%{})
  33. |> Enum.reverse()
  34. |> Enum.map(&represent(&1, &1.object.id == activity.object.id))
  35. render(conn, "conversation.html", %{activities: timeline, meta: meta})
  36. else
  37. %Activity{object: %Object{data: data}} ->
  38. conn
  39. |> put_status(:found)
  40. |> redirect(external: data["url"] || data["external_url"] || data["id"])
  41. _ ->
  42. not_found(conn, "Post not found.")
  43. end
  44. end
  45. def show(%{assigns: %{username_or_id: username_or_id}} = conn, params) do
  46. with {_, %User{local: true} = user} <-
  47. {:fetch_user, User.get_cached_by_nickname_or_id(username_or_id)},
  48. {_, :visible} <- {:visibility, User.visible_for(user, _reading_user = nil)} do
  49. meta = Metadata.build_tags(%{user: user})
  50. params =
  51. params
  52. |> Map.take(@page_keys)
  53. |> Map.new(fn {k, v} -> {String.to_existing_atom(k), v} end)
  54. timeline =
  55. user
  56. |> ActivityPub.fetch_user_activities(_reading_user = nil, params)
  57. |> Enum.map(&represent/1)
  58. prev_page_id =
  59. (params["min_id"] || params["max_id"]) &&
  60. List.first(timeline) && List.first(timeline).id
  61. next_page_id = List.last(timeline) && List.last(timeline).id
  62. render(conn, "profile.html", %{
  63. user: User.sanitize_html(user),
  64. timeline: timeline,
  65. prev_page_id: prev_page_id,
  66. next_page_id: next_page_id,
  67. meta: meta
  68. })
  69. else
  70. _ ->
  71. not_found(conn, "User not found.")
  72. end
  73. end
  74. def show(%{assigns: %{object_id: _}} = conn, _params) do
  75. url = Helpers.url(conn) <> conn.request_path
  76. case Activity.get_create_by_object_ap_id_with_object(url) do
  77. %Activity{} = activity ->
  78. to = Helpers.o_status_path(Pleroma.Web.Endpoint, :notice, activity)
  79. redirect(conn, to: to)
  80. _ ->
  81. not_found(conn, "Post not found.")
  82. end
  83. end
  84. def show(%{assigns: %{activity_id: _}} = conn, _params) do
  85. url = Helpers.url(conn) <> conn.request_path
  86. case Activity.get_by_ap_id(url) do
  87. %Activity{} = activity ->
  88. to = Helpers.o_status_path(Pleroma.Web.Endpoint, :notice, activity)
  89. redirect(conn, to: to)
  90. _ ->
  91. not_found(conn, "Post not found.")
  92. end
  93. end
  94. defp get_title(%Object{data: %{"name" => name}}) when is_binary(name),
  95. do: name
  96. defp get_title(%Object{data: %{"summary" => summary}}) when is_binary(summary),
  97. do: summary
  98. defp get_title(_), do: nil
  99. defp not_found(conn, message) do
  100. conn
  101. |> put_status(404)
  102. |> render("error.html", %{message: message, meta: ""})
  103. end
  104. defp get_counts(%Activity{} = activity) do
  105. %Object{data: data} = Object.normalize(activity, fetch: false)
  106. %{
  107. likes: data["like_count"] || 0,
  108. replies: data["repliesCount"] || 0,
  109. announces: data["announcement_count"] || 0
  110. }
  111. end
  112. defp represent(%Activity{} = activity), do: represent(activity, false)
  113. defp represent(%Activity{object: %Object{data: data}} = activity, selected) do
  114. {:ok, user} = User.get_or_fetch(activity.object.data["actor"])
  115. link =
  116. case user.local do
  117. true -> Helpers.o_status_url(Pleroma.Web.Endpoint, :notice, activity)
  118. _ -> data["url"] || data["external_url"] || data["id"]
  119. end
  120. content =
  121. if data["content"] do
  122. data["content"]
  123. |> Pleroma.HTML.filter_tags()
  124. |> Pleroma.Emoji.Formatter.emojify(Map.get(data, "emoji", %{}))
  125. else
  126. nil
  127. end
  128. %{
  129. user: User.sanitize_html(user),
  130. title: get_title(activity.object),
  131. content: content,
  132. attachment: data["attachment"],
  133. link: link,
  134. published: data["published"],
  135. sensitive: data["sensitive"],
  136. selected: selected,
  137. counts: get_counts(activity),
  138. id: activity.id
  139. }
  140. end
  141. defp assign_id(%{path_info: ["notice", notice_id]} = conn, _opts),
  142. do: assign(conn, :notice_id, notice_id)
  143. defp assign_id(%{path_info: ["users", user_id]} = conn, _opts),
  144. do: assign(conn, :username_or_id, user_id)
  145. defp assign_id(%{path_info: ["objects", object_id]} = conn, _opts),
  146. do: assign(conn, :object_id, object_id)
  147. defp assign_id(%{path_info: ["activities", activity_id]} = conn, _opts),
  148. do: assign(conn, :activity_id, activity_id)
  149. defp assign_id(conn, _opts), do: conn
  150. end