1 # frozen_string_literal: true
3 class AccountsController
< ApplicationController
7 include AccountControllerConcern
8 include SignatureAuthentication
10 before_action
:require_signature!
, if: -> { request
.format
== :json && authorized_fetch_mode
? }
11 before_action
:set_cache_headers
12 before_action
:set_body_classes
14 skip_around_action
:set_locale, if: -> { [:json, :rss].include?(request
.format
&.to_sym
) }
15 skip_before_action
:require_functional!
, unless: :whitelist_mode?
18 respond_to
do |format
|
21 expires_in
0, public
: true unless user_signed_in
?
24 @endorsed_accounts = @account.endorsed_accounts
.to_a
.sample(4)
25 @featured_hashtags = @account.featured_tags
.order(statuses_count
: :desc)
27 if current_account
&& @account.blocking
?(current_account
)
32 @pinned_statuses = cached_filtered_status_pins
if show_pinned_statuses
?
33 @statuses = cached_filtered_status_page
36 unless @statuses.empty
?
37 @older_url = older_url
if @statuses.last
.id
> filtered_statuses
.last
.id
38 @newer_url = newer_url
if @statuses.first
.id
< filtered_statuses
.first
.id
43 expires_in
1.minute
, public
: true
45 limit
= params
[:limit].present
? ? [params
[:limit].to_i
, PAGE_SIZE_MAX
].min
: PAGE_SIZE
46 @statuses = filtered_statuses
.without_reblogs
.limit(limit
)
47 @statuses = cache_collection(@statuses, Status
)
48 render xml
: RSS
::AccountSerializer.render(@account, @statuses, params
[:tag])
52 expires_in
3.minutes
, public
: !
(authorized_fetch_mode
? && signed_request_account
.present
?)
53 render_with_cache json
: @account, content_type
: 'application/activity+json
', serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter
61 @body_classes = 'with-modals
'
64 def show_pinned_statuses?
65 [replies_requested?, media_requested?, tag_requested?, params[:max_id].present?, params[:min_id].present?].none?
68 def filtered_pinned_statuses
69 @account.pinned_statuses.not_local_only.where(visibility: [:public, :unlisted])
73 default_statuses.tap do |statuses|
74 statuses.merge!(hashtag_scope
) if tag_requested
?
75 statuses
.merge!
(only_media_scope
) if media_requested
?
76 statuses
.merge!
(no_replies_scope
) unless replies_requested
?
81 @account.statuses
.not_local_only
.where(visibility
: [:public, :unlisted])
85 Status
.joins(:media_attachments).merge(@account.media_attachments
.reorder(nil)).group(:id)
89 Status
.without_replies
93 tag
= Tag
.find_normalized(params
[:tag])
96 Status
.tagged_with(tag
.id
)
106 def skip_temporary_suspension_response
?
107 request
.format
== :json
112 short_account_tag_url(@account, params
[:tag], format
: 'rss')
114 short_account_url(@account, format
: 'rss')
119 pagination_url(max_id
: @statuses.last
.id
)
123 pagination_url(min_id
: @statuses.first
.id
)
126 def pagination_url(max_id
: nil, min_id
: nil)
128 short_account_tag_url(@account, params
[:tag], max_id
: max_id
, min_id
: min_id
)
129 elsif media_requested
?
130 short_account_media_url(@account, max_id
: max_id
, min_id
: min_id
)
131 elsif replies_requested
?
132 short_account_with_replies_url(@account, max_id
: max_id
, min_id
: min_id
)
134 short_account_url(@account, max_id
: max_id
, min_id
: min_id
)
139 request
.path
.split('.').first
.end_with
?('/media') && !tag_requested
?
142 def replies_requested
?
143 request
.path
.split('.').first
.end_with
?('/with_replies') && !tag_requested
?
147 request
.path
.split('.').first
.end_with
?(Addressable
::URI.parse("/tagged/#{params[:tag]}").normalize
)
150 def cached_filtered_status_pins
152 filtered_pinned_statuses
,
157 def cached_filtered_status_page
158 cache_collection_paginated_by_id(
162 params_slice(:max_id, :min_id, :since_id)
166 def params_slice(*keys
)
167 params
.slice(*keys
).permit(*keys
)