|
|
|
@ -18,6 +18,7 @@ class StatusesController < ApplicationController |
|
|
|
|
before_action :redirect_to_original, only: [:show] |
|
|
|
|
before_action :set_referrer_policy_header, only: [:show] |
|
|
|
|
before_action :set_cache_headers |
|
|
|
|
before_action :set_replies, only: [:replies] |
|
|
|
|
|
|
|
|
|
content_security_policy only: :embed do |p| |
|
|
|
|
p.frame_ancestors(false) |
|
|
|
@ -63,8 +64,37 @@ class StatusesController < ApplicationController |
|
|
|
|
render 'stream_entries/embed', layout: 'embedded' |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def replies |
|
|
|
|
skip_session! |
|
|
|
|
|
|
|
|
|
render json: replies_collection_presenter, |
|
|
|
|
serializer: ActivityPub::CollectionSerializer, |
|
|
|
|
adapter: ActivityPub::Adapter, |
|
|
|
|
content_type: 'application/activity+json', |
|
|
|
|
skip_activities: true |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
private |
|
|
|
|
|
|
|
|
|
def replies_collection_presenter |
|
|
|
|
page = ActivityPub::CollectionPresenter.new( |
|
|
|
|
id: replies_account_status_url(@account, @status, page_params), |
|
|
|
|
type: :unordered, |
|
|
|
|
part_of: replies_account_status_url(@account, @status), |
|
|
|
|
next: next_page, |
|
|
|
|
items: @replies.map { |status| status.local ? status : status.id } |
|
|
|
|
) |
|
|
|
|
if page_requested? |
|
|
|
|
page |
|
|
|
|
else |
|
|
|
|
ActivityPub::CollectionPresenter.new( |
|
|
|
|
id: replies_account_status_url(@account, @status), |
|
|
|
|
type: :unordered, |
|
|
|
|
first: page |
|
|
|
|
) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def create_descendant_thread(starting_depth, statuses) |
|
|
|
|
depth = starting_depth + statuses.size |
|
|
|
|
if depth < DESCENDANTS_DEPTH_LIMIT |
|
|
|
@ -174,4 +204,27 @@ class StatusesController < ApplicationController |
|
|
|
|
return if @status.public_visibility? || @status.unlisted_visibility? |
|
|
|
|
response.headers['Referrer-Policy'] = 'origin' |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def page_requested? |
|
|
|
|
params[:page] == 'true' |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def set_replies |
|
|
|
|
@replies = page_params[:other_accounts] ? Status.where.not(account_id: @account.id) : @account.statuses |
|
|
|
|
@replies = @replies.where(in_reply_to_id: @status.id, visibility: [:public, :unlisted]) |
|
|
|
|
@replies = @replies.paginate_by_min_id(DESCENDANTS_LIMIT, params[:min_id]) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def next_page |
|
|
|
|
last_reply = @replies.last |
|
|
|
|
return if last_reply.nil? |
|
|
|
|
same_account = last_reply.account_id == @account.id |
|
|
|
|
return unless same_account || @replies.size == DESCENDANTS_LIMIT |
|
|
|
|
same_account = false unless @replies.size == DESCENDANTS_LIMIT |
|
|
|
|
replies_account_status_url(@account, @status, page: true, min_id: last_reply.id, other_accounts: !same_account) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def page_params |
|
|
|
|
{ page: true, other_accounts: params[:other_accounts], min_id: params[:min_id] }.compact |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|