Refactor and spec coverage for api/v1/timelines actions (#3482)
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| |
||||||
|
set_maps(statuses) |
||||||
end |
end |
||||||
|
end |
||||||
|
|
||||||
def home_statuses |
def cached_home_statuses |
||||||
account_home_feed.get( |
cache_collection home_statuses, Status |
||||||
limit_param(DEFAULT_STATUSES_LIMIT), |
end |
||||||
params[:max_id], |
|
||||||
params[:since_id] |
|
||||||
) |
|
||||||
end |
|
||||||
|
|
||||||
def account_home_feed |
def home_statuses |
||||||
Feed.new(:home, current_account) |
account_home_feed.get( |
||||||
end |
limit_param(DEFAULT_STATUSES_LIMIT), |
||||||
|
params[:max_id], |
||||||
|
params[:since_id] |
||||||
|
) |
||||||
|
end |
||||||
|
|
||||||
def next_path |
def account_home_feed |
||||||
api_v1_timelines_home_url pagination_params(max_id: @statuses.last.id) |
Feed.new(:home, current_account) |
||||||
end |
end |
||||||
|
|
||||||
def prev_path |
def insert_pagination_headers |
||||||
api_v1_timelines_home_url pagination_params(since_id: @statuses.first.id) |
set_pagination_headers(next_path, prev_path) |
||||||
end |
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 |
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 |
end |
||||||
|
end |
||||||
|
|
||||||
def public_timeline_statuses |
def cached_public_statuses |
||||||
Status.as_public_timeline(current_account, params[:local]) |
cache_collection public_statuses, Status |
||||||
end |
end |
||||||
|
|
||||||
def next_path |
def public_statuses |
||||||
api_v1_timelines_public_url pagination_params(max_id: @statuses.last.id) |
public_timeline_statuses.paginate_by_max_id( |
||||||
end |
limit_param(DEFAULT_STATUSES_LIMIT), |
||||||
|
params[:max_id], |
||||||
|
params[:since_id] |
||||||
|
) |
||||||
|
end |
||||||
|
|
||||||
def prev_path |
def public_timeline_statuses |
||||||
api_v1_timelines_public_url pagination_params(since_id: @statuses.first.id) |
Status.as_public_timeline(current_account, params[:local]) |
||||||
end |
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 |
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| |
||||||
|
set_maps(statuses) |
||||||
end |
end |
||||||
|
end |
||||||
|
|
||||||
def tagged_statuses |
def cached_tagged_statuses |
||||||
if @tag.nil? |
cache_collection tagged_statuses, Status |
||||||
[] |
end |
||||||
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 |
def tagged_statuses |
||||||
Status.as_tag_timeline(@tag, current_account, params[:local]) |
if @tag.nil? |
||||||
|
[] |
||||||
|
else |
||||||
|
tag_timeline_statuses.paginate_by_max_id( |
||||||
|
limit_param(DEFAULT_STATUSES_LIMIT), |
||||||
|
params[:max_id], |
||||||
|
params[:since_id] |
||||||
|
) |
||||||
end |
end |
||||||
|
end |
||||||
|
|
||||||
def next_path |
def tag_timeline_statuses |
||||||
api_v1_timelines_tag_url params[:id], pagination_params(max_id: @statuses.last.id) |
Status.as_tag_timeline(@tag, current_account, params[:local]) |
||||||
end |
end |
||||||
|
|
||||||
def prev_path |
def insert_pagination_headers |
||||||
api_v1_timelines_tag_url params[:id], pagination_params(since_id: @statuses.first.id) |
set_pagination_headers(next_path, prev_path) |
||||||
end |
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 |
end |
||||||
|
@ -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 new issue