forked from fedi/mastodon
f665901e3c
Fetching statuses from all followed accounts at once takes too long within Postgres. Fetching them one by one and merging in Ruby could be a lot less resource-intensive Because the query for dynamically fetching the home timeline is so heavy, we can no longer offer it when the home timeline is missing
66 lines
1.5 KiB
Ruby
66 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Api::V1::Timelines::HomeController < Api::BaseController
|
|
before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, only: [:show]
|
|
before_action :require_user!, only: [:show]
|
|
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
|
|
|
|
respond_to :json
|
|
|
|
def show
|
|
@statuses = load_statuses
|
|
|
|
render json: @statuses,
|
|
each_serializer: REST::StatusSerializer,
|
|
relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id),
|
|
status: account_home_feed.regenerating? ? 206 : 200
|
|
end
|
|
|
|
private
|
|
|
|
def load_statuses
|
|
cached_home_statuses
|
|
end
|
|
|
|
def cached_home_statuses
|
|
cache_collection home_statuses, Status
|
|
end
|
|
|
|
def home_statuses
|
|
account_home_feed.get(
|
|
limit_param(DEFAULT_STATUSES_LIMIT),
|
|
params[:max_id],
|
|
params[:since_id],
|
|
params[:min_id]
|
|
)
|
|
end
|
|
|
|
def account_home_feed
|
|
HomeFeed.new(current_account)
|
|
end
|
|
|
|
def insert_pagination_headers
|
|
set_pagination_headers(next_path, prev_path)
|
|
end
|
|
|
|
def pagination_params(core_params)
|
|
params.slice(:local, :limit).permit(:local, :limit).merge(core_params)
|
|
end
|
|
|
|
def next_path
|
|
api_v1_timelines_home_url pagination_params(max_id: pagination_max_id)
|
|
end
|
|
|
|
def prev_path
|
|
api_v1_timelines_home_url pagination_params(min_id: pagination_since_id)
|
|
end
|
|
|
|
def pagination_max_id
|
|
@statuses.last.id
|
|
end
|
|
|
|
def pagination_since_id
|
|
@statuses.first.id
|
|
end
|
|
end
|