@ -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 | |||
module Api::V1::Timelines | |||
class HomeController < BaseController | |||
before_action -> { doorkeeper_authorize! :read }, only: [:show] | |||
before_action :require_user!, only: [:show] | |||
class Api::V1::Timelines::HomeController < ApiController | |||
before_action -> { doorkeeper_authorize! :read }, only: [:show] | |||
before_action :require_user!, only: [:show] | |||
after_action :insert_pagination_headers, unless: -> { @statuses.empty? } | |||
def show | |||
@statuses = load_statuses | |||
end | |||
respond_to :json | |||
private | |||
def show | |||
@statuses = load_statuses | |||
render 'api/v1/timelines/show' | |||
end | |||
def load_statuses | |||
cached_home_statuses.tap do |statuses| | |||
set_maps(statuses) | |||
end | |||
end | |||
private | |||
def cached_home_statuses | |||
cache_collection home_statuses | |||
def load_statuses | |||
cached_home_statuses.tap do |statuses| | |||
set_maps(statuses) | |||
end | |||
end | |||
def home_statuses | |||
account_home_feed.get( | |||
limit_param(DEFAULT_STATUSES_LIMIT), | |||
params[:max_id], | |||
params[:since_id] | |||
) | |||
end | |||
def cached_home_statuses | |||
cache_collection home_statuses, Status | |||
end | |||
def account_home_feed | |||
Feed.new(:home, current_account) | |||
end | |||
def home_statuses | |||
account_home_feed.get( | |||
limit_param(DEFAULT_STATUSES_LIMIT), | |||
params[:max_id], | |||
params[:since_id] | |||
) | |||
end | |||
def next_path | |||
api_v1_timelines_home_url pagination_params(max_id: @statuses.last.id) | |||
end | |||
def account_home_feed | |||
Feed.new(:home, current_account) | |||
end | |||
def prev_path | |||
api_v1_timelines_home_url pagination_params(since_id: @statuses.first.id) | |||
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 |
@ -1,41 +1,60 @@ | |||
# frozen_string_literal: true | |||
module Api::V1::Timelines | |||
class PublicController < BaseController | |||
def show | |||
@statuses = load_statuses | |||
end | |||
class Api::V1::Timelines::PublicController < ApiController | |||
after_action :insert_pagination_headers, unless: -> { @statuses.empty? } | |||
private | |||
respond_to :json | |||
def load_statuses | |||
cached_public_statuses.tap do |statuses| | |||
set_maps(statuses) | |||
end | |||
end | |||
def show | |||
@statuses = load_statuses | |||
render 'api/v1/timelines/show' | |||
end | |||
def cached_public_statuses | |||
cache_collection public_statuses | |||
end | |||
private | |||
def public_statuses | |||
public_timeline_statuses.paginate_by_max_id( | |||
limit_param(DEFAULT_STATUSES_LIMIT), | |||
params[:max_id], | |||
params[:since_id] | |||
) | |||
def load_statuses | |||
cached_public_statuses.tap do |statuses| | |||
set_maps(statuses) | |||
end | |||
end | |||
def public_timeline_statuses | |||
Status.as_public_timeline(current_account, params[:local]) | |||
end | |||
def cached_public_statuses | |||
cache_collection public_statuses, Status | |||
end | |||
def next_path | |||
api_v1_timelines_public_url pagination_params(max_id: @statuses.last.id) | |||
end | |||
def public_statuses | |||
public_timeline_statuses.paginate_by_max_id( | |||
limit_param(DEFAULT_STATUSES_LIMIT), | |||
params[:max_id], | |||
params[:since_id] | |||
) | |||
end | |||
def prev_path | |||
api_v1_timelines_public_url pagination_params(since_id: @statuses.first.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 |
@ -1,51 +1,69 @@ | |||
# frozen_string_literal: true | |||
module Api::V1::Timelines | |||
class TagController < BaseController | |||
before_action :load_tag | |||
class Api::V1::Timelines::TagController < ApiController | |||
before_action :load_tag | |||
after_action :insert_pagination_headers, unless: -> { @statuses.empty? } | |||
def show | |||
@statuses = load_statuses | |||
end | |||
respond_to :json | |||
private | |||
def show | |||
@statuses = load_statuses | |||
render 'api/v1/timelines/show' | |||
end | |||
def load_tag | |||
@tag = Tag.find_by(name: params[:id].downcase) | |||
end | |||
private | |||
def load_statuses | |||
cached_tagged_statuses.tap do |statuses| | |||
set_maps(statuses) | |||
end | |||
end | |||
def load_tag | |||
@tag = Tag.find_by(name: params[:id].downcase) | |||
end | |||
def cached_tagged_statuses | |||
cache_collection tagged_statuses | |||
def load_statuses | |||
cached_tagged_statuses.tap do |statuses| | |||
set_maps(statuses) | |||
end | |||
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 cached_tagged_statuses | |||
cache_collection tagged_statuses, Status | |||
end | |||
def tag_timeline_statuses | |||
Status.as_tag_timeline(@tag, current_account, params[:local]) | |||
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 next_path | |||
api_v1_timelines_tag_url params[:id], pagination_params(max_id: @statuses.last.id) | |||
end | |||
def tag_timeline_statuses | |||
Status.as_tag_timeline(@tag, current_account, params[:local]) | |||
end | |||
def prev_path | |||
api_v1_timelines_tag_url params[:id], pagination_params(since_id: @statuses.first.id) | |||
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 |
@ -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 |