From 9e1d28f48e8197690ab4ec9ff02d981f408bf875 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Mon, 19 Aug 2019 03:54:36 +0900 Subject: [PATCH] Add an RSS feed tagged to a public profile page (#10502) * Add featured tag support to rss feed on public account page * fix codeing style --- app/controllers/accounts_controller.rb | 16 +++++++++++++--- app/serializers/rss/account_serializer.rb | 8 ++++---- app/views/accounts/show.html.haml | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 19e8a9bc7..0f6f5e3a6 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -28,6 +28,7 @@ class AccountsController < ApplicationController @pinned_statuses = cache_collection(@account.pinned_statuses, Status) if show_pinned_statuses? @statuses = filtered_status_page(params) @statuses = cache_collection(@statuses, Status) + @rss_url = rss_url unless @statuses.empty? @older_url = older_url if @statuses.last.id > filtered_statuses.last.id @@ -38,8 +39,9 @@ class AccountsController < ApplicationController format.rss do expires_in 0, public: true - @statuses = cache_collection(default_statuses.without_reblogs.without_replies.limit(PAGE_SIZE), Status) - render xml: RSS::AccountSerializer.render(@account, @statuses) + @statuses = filtered_statuses.without_reblogs.without_replies.limit(PAGE_SIZE) + @statuses = cache_collection(@statuses, Status) + render xml: RSS::AccountSerializer.render(@account, @statuses, params[:tag]) end format.json do @@ -97,6 +99,14 @@ class AccountsController < ApplicationController params[:username] end + def rss_url + if tag_requested? + short_account_tag_url(@account, params[:tag], format: 'rss') + else + short_account_url(@account, format: 'rss') + end + end + def older_url pagination_url(max_id: @statuses.last.id) end @@ -126,7 +136,7 @@ class AccountsController < ApplicationController end def tag_requested? - request.path.ends_with?(Addressable::URI.parse("/tagged/#{params[:tag]}").normalize) + request.path.split('.').first.ends_with?(Addressable::URI.parse("/tagged/#{params[:tag]}").normalize) end def filtered_status_page(params) diff --git a/app/serializers/rss/account_serializer.rb b/app/serializers/rss/account_serializer.rb index 278affe13..680d9de6f 100644 --- a/app/serializers/rss/account_serializer.rb +++ b/app/serializers/rss/account_serializer.rb @@ -5,12 +5,12 @@ class RSS::AccountSerializer include StatusesHelper include RoutingHelper - def render(account, statuses) + def render(account, statuses, tag) builder = RSSBuilder.new builder.title("#{display_name(account)} (@#{account.local_username_and_domain})") .description(account_description(account)) - .link(ActivityPub::TagManager.instance.url_for(account)) + .link(tag.present? ? short_account_tag_url(account, tag) : short_account_url(account)) .logo(full_pack_url('media/images/logo.svg')) .accent_color('2b90d9') @@ -33,7 +33,7 @@ class RSS::AccountSerializer builder.to_xml end - def self.render(account, statuses) - new.render(account, statuses) + def self.render(account, statuses, tag) + new.render(account, statuses, tag) end end diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml index b63bbc0c3..9c26dbabc 100644 --- a/app/views/accounts/show.html.haml +++ b/app/views/accounts/show.html.haml @@ -7,7 +7,7 @@ - if @account.user&.setting_noindex %meta{ name: 'robots', content: 'noindex, noarchive' }/ - %link{ rel: 'alternate', type: 'application/rss+xml', href: account_url(@account, format: 'rss') }/ + %link{ rel: 'alternate', type: 'application/rss+xml', href: @rss_url }/ %link{ rel: 'alternate', type: 'application/activity+json', href: ActivityPub::TagManager.instance.uri_for(@account) }/ - if @older_url