aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/web/feed
diff options
context:
space:
mode:
authorSergey Suprunenko <suprunenko.s@gmail.com>2019-10-07 12:20:41 +0000
committerkaniini <ariadne@dereferenced.org>2019-10-07 12:20:41 +0000
commit4b3f77a99ff849f7593f63f7dccd206683b34d97 (patch)
treeee7ef95d8a9f017a79d22310e86b713ee2e924c4 /lib/pleroma/web/feed
parent5c32e6ee91b99200c33570017f6dc04bca8c1523 (diff)
downloadpleroma-4b3f77a99ff849f7593f63f7dccd206683b34d97.tar.gz
Extract RSS Feed functionality from OStatus
Diffstat (limited to 'lib/pleroma/web/feed')
-rw-r--r--lib/pleroma/web/feed/feed_controller.ex63
-rw-r--r--lib/pleroma/web/feed/feed_view.ex77
2 files changed, 140 insertions, 0 deletions
diff --git a/lib/pleroma/web/feed/feed_controller.ex b/lib/pleroma/web/feed/feed_controller.ex
new file mode 100644
index 000000000..d91ecef9c
--- /dev/null
+++ b/lib/pleroma/web/feed/feed_controller.ex
@@ -0,0 +1,63 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.Feed.FeedController do
+ use Pleroma.Web, :controller
+
+ alias Fallback.RedirectController
+ alias Pleroma.User
+ alias Pleroma.Web.ActivityPub.ActivityPub
+ alias Pleroma.Web.ActivityPub.ActivityPubController
+
+ plug(Pleroma.Plugs.SetFormatPlug when action in [:feed_redirect])
+
+ action_fallback(:errors)
+
+ def feed_redirect(%{assigns: %{format: "html"}} = conn, %{"nickname" => nickname}) do
+ with {_, %User{} = user} <- {:fetch_user, User.get_cached_by_nickname_or_id(nickname)} do
+ RedirectController.redirector_with_meta(conn, %{user: user})
+ end
+ end
+
+ def feed_redirect(%{assigns: %{format: format}} = conn, _params)
+ when format in ["json", "activity+json"] do
+ ActivityPubController.call(conn, :user)
+ end
+
+ def feed_redirect(conn, %{"nickname" => nickname}) do
+ with {_, %User{} = user} <- {:fetch_user, User.get_cached_by_nickname(nickname)} do
+ redirect(conn, external: "#{feed_url(conn, :feed, user.nickname)}.atom")
+ end
+ end
+
+ def feed(conn, %{"nickname" => nickname} = params) do
+ with {_, %User{} = user} <- {:fetch_user, User.get_cached_by_nickname(nickname)} do
+ query_params =
+ params
+ |> Map.take(["max_id"])
+ |> Map.put("type", ["Create"])
+ |> Map.put("whole_db", true)
+ |> Map.put("actor_id", user.ap_id)
+
+ activities =
+ query_params
+ |> ActivityPub.fetch_public_activities()
+ |> Enum.reverse()
+
+ conn
+ |> put_resp_content_type("application/atom+xml")
+ |> render("feed.xml", user: user, activities: activities)
+ end
+ end
+
+ def errors(conn, {:error, :not_found}) do
+ render_error(conn, :not_found, "Not found")
+ end
+
+ def errors(conn, {:fetch_user, nil}), do: errors(conn, {:error, :not_found})
+
+ def errors(conn, _) do
+ render_error(conn, :internal_server_error, "Something went wrong")
+ end
+end
diff --git a/lib/pleroma/web/feed/feed_view.ex b/lib/pleroma/web/feed/feed_view.ex
new file mode 100644
index 000000000..5eef1e757
--- /dev/null
+++ b/lib/pleroma/web/feed/feed_view.ex
@@ -0,0 +1,77 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.Feed.FeedView do
+ use Phoenix.HTML
+ use Pleroma.Web, :view
+
+ alias Pleroma.Object
+ alias Pleroma.User
+ alias Pleroma.Web.MediaProxy
+
+ require Pleroma.Constants
+
+ def most_recent_update(activities, user) do
+ (List.first(activities) || user).updated_at
+ |> NaiveDateTime.to_iso8601()
+ end
+
+ def logo(user) do
+ user
+ |> User.avatar_url()
+ |> MediaProxy.url()
+ end
+
+ def last_activity(activities) do
+ List.last(activities)
+ end
+
+ def activity_object(activity) do
+ Object.normalize(activity)
+ end
+
+ def activity_object_data(activity) do
+ activity
+ |> activity_object()
+ |> Map.get(:data)
+ end
+
+ def activity_content(activity) do
+ content = activity_object_data(activity)["content"]
+
+ content
+ |> String.replace(~r/[\n\r]/, "")
+ |> escape()
+ end
+
+ def activity_context(activity) do
+ activity.data["context"]
+ end
+
+ def attachment_href(attachment) do
+ attachment["url"]
+ |> hd()
+ |> Map.get("href")
+ end
+
+ def attachment_type(attachment) do
+ attachment["url"]
+ |> hd()
+ |> Map.get("mediaType")
+ end
+
+ def get_href(id) do
+ with %Object{data: %{"external_url" => external_url}} <- Object.get_cached_by_ap_id(id) do
+ external_url
+ else
+ _e -> id
+ end
+ end
+
+ def escape(html) do
+ html
+ |> html_escape()
+ |> safe_to_string()
+ end
+end