Refactor and spec coverage for api/v1/timelines actions (#3482)

master
Matt Jankowski 8 years ago committed by Eugen Rochko
parent bd669e3907
commit d6774d2ca3
  1. 30
      app/controllers/api/v1/timelines/base_controller.rb
  2. 80
      app/controllers/api/v1/timelines/home_controller.rb
  3. 77
      app/controllers/api/v1/timelines/public_controller.rb
  4. 90
      app/controllers/api/v1/timelines/tag_controller.rb
  5. 0
      app/views/api/v1/timelines/show.rabl
  6. 20
      spec/routing/api_routing_spec.rb
  7. 18
      spec/routing/api_timelines_spec.rb

@ -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…
Cancel
Save