From 22fc271e23a5dd1570ea7429b563f6edc42613c4 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Fri, 6 Dec 2019 09:32:29 +0300 Subject: init tag feed --- lib/pleroma/emails/admin_email.ex | 2 +- lib/pleroma/web/feed/feed_controller.ex | 64 ----------------------- lib/pleroma/web/feed/tag_controller.ex | 36 +++++++++++++ lib/pleroma/web/feed/user_controller.ex | 66 ++++++++++++++++++++++++ lib/pleroma/web/metadata/feed.ex | 2 +- lib/pleroma/web/router.ex | 6 ++- lib/pleroma/web/templates/feed/feed/feed.xml.eex | 24 --------- lib/pleroma/web/templates/feed/feed/tag.xml.eex | 10 ++++ lib/pleroma/web/templates/feed/feed/user.xml.eex | 24 +++++++++ 9 files changed, 142 insertions(+), 92 deletions(-) delete mode 100644 lib/pleroma/web/feed/feed_controller.ex create mode 100644 lib/pleroma/web/feed/tag_controller.ex create mode 100644 lib/pleroma/web/feed/user_controller.ex delete mode 100644 lib/pleroma/web/templates/feed/feed/feed.xml.eex create mode 100644 lib/pleroma/web/templates/feed/feed/tag.xml.eex create mode 100644 lib/pleroma/web/templates/feed/feed/user.xml.eex (limited to 'lib') diff --git a/lib/pleroma/emails/admin_email.ex b/lib/pleroma/emails/admin_email.ex index b15e4041b..d7dd4b2e0 100644 --- a/lib/pleroma/emails/admin_email.ex +++ b/lib/pleroma/emails/admin_email.ex @@ -17,7 +17,7 @@ defmodule Pleroma.Emails.AdminEmail do end defp user_url(user) do - Helpers.feed_url(Pleroma.Web.Endpoint, :feed_redirect, user.id) + Helpers.user_feed_url(Pleroma.Web.Endpoint, :feed_redirect, user.id) end def report(to, reporter, account, statuses, comment) do diff --git a/lib/pleroma/web/feed/feed_controller.ex b/lib/pleroma/web/feed/feed_controller.ex deleted file mode 100644 index d0e23007d..000000000 --- a/lib/pleroma/web/feed/feed_controller.ex +++ /dev/null @@ -1,64 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors -# 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 - activities = - %{ - "type" => ["Create"], - "whole_db" => true, - "actor_id" => user.ap_id - } - |> Map.merge(Map.take(params, ["max_id"])) - |> ActivityPub.fetch_public_activities() - - conn - |> put_resp_content_type("application/atom+xml") - |> render("feed.xml", - user: user, - activities: activities, - feed_config: Pleroma.Config.get([:feed]) - ) - 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/tag_controller.ex b/lib/pleroma/web/feed/tag_controller.ex new file mode 100644 index 000000000..66abc186b --- /dev/null +++ b/lib/pleroma/web/feed/tag_controller.ex @@ -0,0 +1,36 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Feed.TagController do + use Pleroma.Web, :controller + + alias Pleroma.Config + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.Feed.FeedView + + def feed(conn, %{"tag" => tag} = params) do + activities = + %{ + "type" => ["Create"], + "whole_db" => true, + "tag" => parse_tag(tag) + } + |> Map.merge(Map.take(params, ["max_id"])) + |> ActivityPub.fetch_public_activities() + + conn + |> put_resp_content_type("application/atom+xml") + |> put_view(FeedView) + |> render("tag.xml", activities: activities, feed_config: Config.get([:feed])) + end + + defp parse_tag(raw_tag) when is_binary(raw_tag) do + case Enum.reverse(String.split(raw_tag, ".")) do + [format | tag] when format in ["atom", "rss"] -> Enum.join(tag, ".") + _ -> raw_tag + end + end + + defp parse_tag(raw_tag), do: raw_tag +end diff --git a/lib/pleroma/web/feed/user_controller.ex b/lib/pleroma/web/feed/user_controller.ex new file mode 100644 index 000000000..e5d8427ce --- /dev/null +++ b/lib/pleroma/web/feed/user_controller.ex @@ -0,0 +1,66 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Feed.UserController do + use Pleroma.Web, :controller + + alias Fallback.RedirectController + alias Pleroma.User + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.ActivityPubController + alias Pleroma.Web.Feed.FeedView + + 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: "#{user_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 + activities = + %{ + "type" => ["Create"], + "whole_db" => true, + "actor_id" => user.ap_id + } + |> Map.merge(Map.take(params, ["max_id"])) + |> ActivityPub.fetch_public_activities() + + conn + |> put_resp_content_type("application/atom+xml") + |> put_view(FeedView) + |> render("user.xml", + user: user, + activities: activities, + feed_config: Pleroma.Config.get([:feed]) + ) + 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/metadata/feed.ex b/lib/pleroma/web/metadata/feed.ex index 8043e6c54..ee48913a7 100644 --- a/lib/pleroma/web/metadata/feed.ex +++ b/lib/pleroma/web/metadata/feed.ex @@ -16,7 +16,7 @@ defmodule Pleroma.Web.Metadata.Providers.Feed do [ rel: "alternate", type: "application/atom+xml", - href: Helpers.feed_path(Endpoint, :feed, user.nickname) <> ".atom" + href: Helpers.user_feed_path(Endpoint, :feed, user.nickname) <> ".atom" ], []} ] end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index e6c4f6f14..871f3bf85 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -526,8 +526,10 @@ defmodule Pleroma.Web.Router do get("/notice/:id", OStatus.OStatusController, :notice) get("/notice/:id/embed_player", OStatus.OStatusController, :notice_player) - get("/users/:nickname/feed", Feed.FeedController, :feed) - get("/users/:nickname", Feed.FeedController, :feed_redirect) + get("/users/:nickname/feed", Feed.UserController, :feed, as: :user_feed) + get("/users/:nickname", Feed.UserController, :feed_redirect, as: :user_feed) + + get("/tags/:tag", Feed.TagController, :feed, as: :tag_feed) get("/mailer/unsubscribe/:token", Mailer.SubscriptionController, :unsubscribe) end diff --git a/lib/pleroma/web/templates/feed/feed/feed.xml.eex b/lib/pleroma/web/templates/feed/feed/feed.xml.eex deleted file mode 100644 index 5ae36d345..000000000 --- a/lib/pleroma/web/templates/feed/feed/feed.xml.eex +++ /dev/null @@ -1,24 +0,0 @@ - - - - <%= feed_url(@conn, :feed, @user.nickname) <> ".atom" %> - <%= @user.nickname <> "'s timeline" %> - <%= most_recent_update(@activities, @user) %> - <%= logo(@user) %> - - - <%= render @view_module, "_author.xml", assigns %> - - <%= if last_activity(@activities) do %> - - <% end %> - - <%= for activity <- @activities do %> - <%= render @view_module, "_activity.xml", Map.merge(assigns, prepare_activity(activity)) %> - <% end %> - diff --git a/lib/pleroma/web/templates/feed/feed/tag.xml.eex b/lib/pleroma/web/templates/feed/feed/tag.xml.eex new file mode 100644 index 000000000..52b1d7b7d --- /dev/null +++ b/lib/pleroma/web/templates/feed/feed/tag.xml.eex @@ -0,0 +1,10 @@ + + + + TAGS + diff --git a/lib/pleroma/web/templates/feed/feed/user.xml.eex b/lib/pleroma/web/templates/feed/feed/user.xml.eex new file mode 100644 index 000000000..d274c08ae --- /dev/null +++ b/lib/pleroma/web/templates/feed/feed/user.xml.eex @@ -0,0 +1,24 @@ + + + + <%= user_feed_url(@conn, :feed, @user.nickname) <> ".atom" %> + <%= @user.nickname <> "'s timeline" %> + <%= most_recent_update(@activities, @user) %> + <%= logo(@user) %> + + + <%= render @view_module, "_author.xml", assigns %> + + <%= if last_activity(@activities) do %> + + <% end %> + + <%= for activity <- @activities do %> + <%= render @view_module, "_activity.xml", Map.merge(assigns, prepare_activity(activity)) %> + <% end %> + -- cgit v1.2.3