forked from fedi/mastodon
Refactor and spec coverage for api/v1/timelines actions (#3482)
This commit is contained in:
parent
bd669e3907
commit
d6774d2ca3
|
@ -1,30 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Api::V1::Timelines
|
|
||||||
class BaseController < ApiController
|
|
||||||
respond_to :json
|
|
||||||
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def cache_collection(raw)
|
|
||||||
super(raw, Status)
|
|
||||||
end
|
|
||||||
|
|
||||||
def pagination_params(core_params)
|
|
||||||
params.permit(:local, :limit).merge(core_params)
|
|
||||||
end
|
|
||||||
|
|
||||||
def insert_pagination_headers
|
|
||||||
set_pagination_headers(next_path, prev_path)
|
|
||||||
end
|
|
||||||
|
|
||||||
def next_path
|
|
||||||
raise 'Override in child controllers'
|
|
||||||
end
|
|
||||||
|
|
||||||
def prev_path
|
|
||||||
raise 'Override in child controllers'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,44 +1,62 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module Api::V1::Timelines
|
class Api::V1::Timelines::HomeController < ApiController
|
||||||
class HomeController < BaseController
|
before_action -> { doorkeeper_authorize! :read }, only: [:show]
|
||||||
before_action -> { doorkeeper_authorize! :read }, only: [:show]
|
before_action :require_user!, only: [:show]
|
||||||
before_action :require_user!, only: [:show]
|
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
|
||||||
|
|
||||||
def show
|
respond_to :json
|
||||||
@statuses = load_statuses
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
def show
|
||||||
|
@statuses = load_statuses
|
||||||
|
render 'api/v1/timelines/show'
|
||||||
|
end
|
||||||
|
|
||||||
def load_statuses
|
private
|
||||||
cached_home_statuses.tap do |statuses|
|
|
||||||
set_maps(statuses)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def cached_home_statuses
|
def load_statuses
|
||||||
cache_collection home_statuses
|
cached_home_statuses.tap do |statuses|
|
||||||
end
|
set_maps(statuses)
|
||||||
|
|
||||||
def home_statuses
|
|
||||||
account_home_feed.get(
|
|
||||||
limit_param(DEFAULT_STATUSES_LIMIT),
|
|
||||||
params[:max_id],
|
|
||||||
params[:since_id]
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def account_home_feed
|
|
||||||
Feed.new(:home, current_account)
|
|
||||||
end
|
|
||||||
|
|
||||||
def next_path
|
|
||||||
api_v1_timelines_home_url pagination_params(max_id: @statuses.last.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def prev_path
|
|
||||||
api_v1_timelines_home_url pagination_params(since_id: @statuses.first.id)
|
|
||||||
end
|
end
|
||||||
end
|
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]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def account_home_feed
|
||||||
|
Feed.new(:home, current_account)
|
||||||
|
end
|
||||||
|
|
||||||
|
def insert_pagination_headers
|
||||||
|
set_pagination_headers(next_path, prev_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def pagination_params(core_params)
|
||||||
|
params.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(since_id: pagination_since_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def pagination_max_id
|
||||||
|
@statuses.last.id
|
||||||
|
end
|
||||||
|
|
||||||
|
def pagination_since_id
|
||||||
|
@statuses.first.id
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,41 +1,60 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module Api::V1::Timelines
|
class Api::V1::Timelines::PublicController < ApiController
|
||||||
class PublicController < BaseController
|
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
|
||||||
def show
|
|
||||||
@statuses = load_statuses
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
respond_to :json
|
||||||
|
|
||||||
def load_statuses
|
def show
|
||||||
cached_public_statuses.tap do |statuses|
|
@statuses = load_statuses
|
||||||
set_maps(statuses)
|
render 'api/v1/timelines/show'
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
def cached_public_statuses
|
private
|
||||||
cache_collection public_statuses
|
|
||||||
end
|
|
||||||
|
|
||||||
def public_statuses
|
def load_statuses
|
||||||
public_timeline_statuses.paginate_by_max_id(
|
cached_public_statuses.tap do |statuses|
|
||||||
limit_param(DEFAULT_STATUSES_LIMIT),
|
set_maps(statuses)
|
||||||
params[:max_id],
|
|
||||||
params[:since_id]
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def public_timeline_statuses
|
|
||||||
Status.as_public_timeline(current_account, params[:local])
|
|
||||||
end
|
|
||||||
|
|
||||||
def next_path
|
|
||||||
api_v1_timelines_public_url pagination_params(max_id: @statuses.last.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def prev_path
|
|
||||||
api_v1_timelines_public_url pagination_params(since_id: @statuses.first.id)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def cached_public_statuses
|
||||||
|
cache_collection public_statuses, Status
|
||||||
|
end
|
||||||
|
|
||||||
|
def public_statuses
|
||||||
|
public_timeline_statuses.paginate_by_max_id(
|
||||||
|
limit_param(DEFAULT_STATUSES_LIMIT),
|
||||||
|
params[:max_id],
|
||||||
|
params[:since_id]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def public_timeline_statuses
|
||||||
|
Status.as_public_timeline(current_account, params[:local])
|
||||||
|
end
|
||||||
|
|
||||||
|
def insert_pagination_headers
|
||||||
|
set_pagination_headers(next_path, prev_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def pagination_params(core_params)
|
||||||
|
params.permit(:local, :limit).merge(core_params)
|
||||||
|
end
|
||||||
|
|
||||||
|
def next_path
|
||||||
|
api_v1_timelines_public_url pagination_params(max_id: pagination_max_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def prev_path
|
||||||
|
api_v1_timelines_public_url pagination_params(since_id: pagination_since_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def pagination_max_id
|
||||||
|
@statuses.last.id
|
||||||
|
end
|
||||||
|
|
||||||
|
def pagination_since_id
|
||||||
|
@statuses.first.id
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,51 +1,69 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module Api::V1::Timelines
|
class Api::V1::Timelines::TagController < ApiController
|
||||||
class TagController < BaseController
|
before_action :load_tag
|
||||||
before_action :load_tag
|
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
|
||||||
|
|
||||||
def show
|
respond_to :json
|
||||||
@statuses = load_statuses
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
def show
|
||||||
|
@statuses = load_statuses
|
||||||
|
render 'api/v1/timelines/show'
|
||||||
|
end
|
||||||
|
|
||||||
def load_tag
|
private
|
||||||
@tag = Tag.find_by(name: params[:id].downcase)
|
|
||||||
end
|
|
||||||
|
|
||||||
def load_statuses
|
def load_tag
|
||||||
cached_tagged_statuses.tap do |statuses|
|
@tag = Tag.find_by(name: params[:id].downcase)
|
||||||
set_maps(statuses)
|
end
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def cached_tagged_statuses
|
def load_statuses
|
||||||
cache_collection tagged_statuses
|
cached_tagged_statuses.tap do |statuses|
|
||||||
end
|
set_maps(statuses)
|
||||||
|
|
||||||
def tagged_statuses
|
|
||||||
if @tag.nil?
|
|
||||||
[]
|
|
||||||
else
|
|
||||||
tag_timeline_statuses.paginate_by_max_id(
|
|
||||||
limit_param(DEFAULT_STATUSES_LIMIT),
|
|
||||||
params[:max_id],
|
|
||||||
params[:since_id]
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def tag_timeline_statuses
|
|
||||||
Status.as_tag_timeline(@tag, current_account, params[:local])
|
|
||||||
end
|
|
||||||
|
|
||||||
def next_path
|
|
||||||
api_v1_timelines_tag_url params[:id], pagination_params(max_id: @statuses.last.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def prev_path
|
|
||||||
api_v1_timelines_tag_url params[:id], pagination_params(since_id: @statuses.first.id)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def cached_tagged_statuses
|
||||||
|
cache_collection tagged_statuses, Status
|
||||||
|
end
|
||||||
|
|
||||||
|
def tagged_statuses
|
||||||
|
if @tag.nil?
|
||||||
|
[]
|
||||||
|
else
|
||||||
|
tag_timeline_statuses.paginate_by_max_id(
|
||||||
|
limit_param(DEFAULT_STATUSES_LIMIT),
|
||||||
|
params[:max_id],
|
||||||
|
params[:since_id]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def tag_timeline_statuses
|
||||||
|
Status.as_tag_timeline(@tag, current_account, params[:local])
|
||||||
|
end
|
||||||
|
|
||||||
|
def insert_pagination_headers
|
||||||
|
set_pagination_headers(next_path, prev_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def pagination_params(core_params)
|
||||||
|
params.permit(:local, :limit).merge(core_params)
|
||||||
|
end
|
||||||
|
|
||||||
|
def next_path
|
||||||
|
api_v1_timelines_tag_url params[:id], pagination_params(max_id: pagination_max_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def prev_path
|
||||||
|
api_v1_timelines_tag_url params[:id], pagination_params(since_id: pagination_since_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def pagination_max_id
|
||||||
|
@statuses.last.id
|
||||||
|
end
|
||||||
|
|
||||||
|
def pagination_since_id
|
||||||
|
@statuses.first.id
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
20
spec/routing/api_routing_spec.rb
Normal file
20
spec/routing/api_routing_spec.rb
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe 'API routes' do
|
||||||
|
describe 'Timeline routes' do
|
||||||
|
it 'routes to home timeline' do
|
||||||
|
expect(get('/api/v1/timelines/home')).
|
||||||
|
to route_to('api/v1/timelines/home#show')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'routes to public timeline' do
|
||||||
|
expect(get('/api/v1/timelines/public')).
|
||||||
|
to route_to('api/v1/timelines/public#show')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'routes to tag timeline' do
|
||||||
|
expect(get('/api/v1/timelines/tag/test')).
|
||||||
|
to route_to('api/v1/timelines/tag#show', id: 'test')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,18 +0,0 @@
|
||||||
require 'rails_helper'
|
|
||||||
|
|
||||||
describe 'API timeline routes' do
|
|
||||||
it 'routes to home timeline' do
|
|
||||||
expect(get('/api/v1/timelines/home')).
|
|
||||||
to route_to('api/v1/timelines/home#show')
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'routes to public timeline' do
|
|
||||||
expect(get('/api/v1/timelines/public')).
|
|
||||||
to route_to('api/v1/timelines/public#show')
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'routes to tag timeline' do
|
|
||||||
expect(get('/api/v1/timelines/tag/test')).
|
|
||||||
to route_to('api/v1/timelines/tag#show', id: 'test')
|
|
||||||
end
|
|
||||||
end
|
|
Loading…
Reference in a new issue