Skip to content
Snippets Groups Projects
Commit 1f5792c8 authored by Eugen Rochko's avatar Eugen Rochko
Browse files

API now respects ?limit param as long as it's within 2x default limit

parent d9022884
No related branches found
No related tags found
No related merge requests found
...@@ -16,13 +16,13 @@ class Api::V1::AccountsController < ApiController ...@@ -16,13 +16,13 @@ class Api::V1::AccountsController < ApiController
end end
def following def following
results = Follow.where(account: @account).paginate_by_max_id(DEFAULT_ACCOUNTS_LIMIT, params[:max_id], params[:since_id]) results = Follow.where(account: @account).paginate_by_max_id(limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:max_id], params[:since_id])
accounts = Account.where(id: results.map(&:target_account_id)).map { |a| [a.id, a] }.to_h accounts = Account.where(id: results.map(&:target_account_id)).map { |a| [a.id, a] }.to_h
@accounts = results.map { |f| accounts[f.target_account_id] } @accounts = results.map { |f| accounts[f.target_account_id] }
set_account_counters_maps(@accounts) set_account_counters_maps(@accounts)
next_path = following_api_v1_account_url(max_id: results.last.id) if results.size == DEFAULT_ACCOUNTS_LIMIT next_path = following_api_v1_account_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
prev_path = following_api_v1_account_url(since_id: results.first.id) unless results.empty? prev_path = following_api_v1_account_url(since_id: results.first.id) unless results.empty?
set_pagination_headers(next_path, prev_path) set_pagination_headers(next_path, prev_path)
...@@ -31,13 +31,13 @@ class Api::V1::AccountsController < ApiController ...@@ -31,13 +31,13 @@ class Api::V1::AccountsController < ApiController
end end
def followers def followers
results = Follow.where(target_account: @account).paginate_by_max_id(DEFAULT_ACCOUNTS_LIMIT, params[:max_id], params[:since_id]) results = Follow.where(target_account: @account).paginate_by_max_id(limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:max_id], params[:since_id])
accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h
@accounts = results.map { |f| accounts[f.account_id] } @accounts = results.map { |f| accounts[f.account_id] }
set_account_counters_maps(@accounts) set_account_counters_maps(@accounts)
next_path = followers_api_v1_account_url(max_id: results.last.id) if results.size == DEFAULT_ACCOUNTS_LIMIT next_path = followers_api_v1_account_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
prev_path = followers_api_v1_account_url(since_id: results.first.id) unless results.empty? prev_path = followers_api_v1_account_url(since_id: results.first.id) unless results.empty?
set_pagination_headers(next_path, prev_path) set_pagination_headers(next_path, prev_path)
...@@ -46,13 +46,13 @@ class Api::V1::AccountsController < ApiController ...@@ -46,13 +46,13 @@ class Api::V1::AccountsController < ApiController
end end
def statuses def statuses
@statuses = @account.statuses.permitted_for(@account, current_account).paginate_by_max_id(DEFAULT_STATUSES_LIMIT, params[:max_id], params[:since_id]) @statuses = @account.statuses.permitted_for(@account, current_account).paginate_by_max_id(limit_param(DEFAULT_STATUSES_LIMIT), params[:max_id], params[:since_id])
@statuses = cache_collection(@statuses, Status) @statuses = cache_collection(@statuses, Status)
set_maps(@statuses) set_maps(@statuses)
set_counters_maps(@statuses) set_counters_maps(@statuses)
next_path = statuses_api_v1_account_url(max_id: @statuses.last.id) if @statuses.size == DEFAULT_STATUSES_LIMIT next_path = statuses_api_v1_account_url(max_id: @statuses.last.id) if @statuses.size == limit_param(DEFAULT_STATUSES_LIMIT)
prev_path = statuses_api_v1_account_url(since_id: @statuses.first.id) unless @statuses.empty? prev_path = statuses_api_v1_account_url(since_id: @statuses.first.id) unless @statuses.empty?
set_pagination_headers(next_path, prev_path) set_pagination_headers(next_path, prev_path)
...@@ -98,8 +98,7 @@ class Api::V1::AccountsController < ApiController ...@@ -98,8 +98,7 @@ class Api::V1::AccountsController < ApiController
end end
def search def search
limit = params[:limit] ? [DEFAULT_ACCOUNTS_LIMIT, params[:limit].to_i].min : DEFAULT_ACCOUNTS_LIMIT @accounts = SearchService.new.call(params[:q], limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:resolve] == 'true')
@accounts = SearchService.new.call(params[:q], limit, params[:resolve] == 'true')
set_account_counters_maps(@accounts) unless @accounts.nil? set_account_counters_maps(@accounts) unless @accounts.nil?
......
...@@ -7,13 +7,13 @@ class Api::V1::BlocksController < ApiController ...@@ -7,13 +7,13 @@ class Api::V1::BlocksController < ApiController
respond_to :json respond_to :json
def index def index
results = Block.where(account: current_account).paginate_by_max_id(DEFAULT_ACCOUNTS_LIMIT, params[:max_id], params[:since_id]) results = Block.where(account: current_account).paginate_by_max_id(limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:max_id], params[:since_id])
accounts = Account.where(id: results.map(&:target_account_id)).map { |a| [a.id, a] }.to_h accounts = Account.where(id: results.map(&:target_account_id)).map { |a| [a.id, a] }.to_h
@accounts = results.map { |f| accounts[f.target_account_id] } @accounts = results.map { |f| accounts[f.target_account_id] }
set_account_counters_maps(@accounts) set_account_counters_maps(@accounts)
next_path = api_v1_blocks_url(max_id: results.last.id) if results.size == DEFAULT_ACCOUNTS_LIMIT next_path = api_v1_blocks_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
prev_path = api_v1_blocks_url(since_id: results.first.id) unless results.empty? prev_path = api_v1_blocks_url(since_id: results.first.id) unless results.empty?
set_pagination_headers(next_path, prev_path) set_pagination_headers(next_path, prev_path)
......
...@@ -7,13 +7,13 @@ class Api::V1::FavouritesController < ApiController ...@@ -7,13 +7,13 @@ class Api::V1::FavouritesController < ApiController
respond_to :json respond_to :json
def index def index
results = Favourite.where(account: current_account).paginate_by_max_id(DEFAULT_STATUSES_LIMIT, params[:max_id], params[:since_id]) results = Favourite.where(account: current_account).paginate_by_max_id(limit_param(DEFAULT_STATUSES_LIMIT), params[:max_id], params[:since_id])
@statuses = cache_collection(Status.where(id: results.map(&:status_id)), Status) @statuses = cache_collection(Status.where(id: results.map(&:status_id)), Status)
set_maps(@statuses) set_maps(@statuses)
set_counters_maps(@statuses) set_counters_maps(@statuses)
next_path = api_v1_favourites_url(max_id: results.last.id) if results.size == DEFAULT_STATUSES_LIMIT next_path = api_v1_favourites_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_STATUSES_LIMIT)
prev_path = api_v1_favourites_url(since_id: results.first.id) unless results.empty? prev_path = api_v1_favourites_url(since_id: results.first.id) unless results.empty?
set_pagination_headers(next_path, prev_path) set_pagination_headers(next_path, prev_path)
......
...@@ -7,7 +7,7 @@ class Api::V1::NotificationsController < ApiController ...@@ -7,7 +7,7 @@ class Api::V1::NotificationsController < ApiController
respond_to :json respond_to :json
def index def index
@notifications = Notification.where(account: current_account).browserable.paginate_by_max_id(20, params[:max_id], params[:since_id]) @notifications = Notification.where(account: current_account).browserable.paginate_by_max_id(limit_param(15), params[:max_id], params[:since_id])
@notifications = cache_collection(@notifications, Notification) @notifications = cache_collection(@notifications, Notification)
statuses = @notifications.select { |n| !n.target_status.nil? }.map(&:target_status) statuses = @notifications.select { |n| !n.target_status.nil? }.map(&:target_status)
...@@ -15,7 +15,7 @@ class Api::V1::NotificationsController < ApiController ...@@ -15,7 +15,7 @@ class Api::V1::NotificationsController < ApiController
set_counters_maps(statuses) set_counters_maps(statuses)
set_account_counters_maps(@notifications.map(&:from_account)) set_account_counters_maps(@notifications.map(&:from_account))
next_path = api_v1_notifications_url(max_id: @notifications.last.id) if @notifications.size == 20 next_path = api_v1_notifications_url(max_id: @notifications.last.id) if @notifications.size == limit_param(15)
prev_path = api_v1_notifications_url(since_id: @notifications.first.id) unless @notifications.empty? prev_path = api_v1_notifications_url(since_id: @notifications.first.id) unless @notifications.empty?
set_pagination_headers(next_path, prev_path) set_pagination_headers(next_path, prev_path)
......
...@@ -27,13 +27,13 @@ class Api::V1::StatusesController < ApiController ...@@ -27,13 +27,13 @@ class Api::V1::StatusesController < ApiController
end end
def reblogged_by def reblogged_by
results = @status.reblogs.paginate_by_max_id(DEFAULT_ACCOUNTS_LIMIT, params[:max_id], params[:since_id]) results = @status.reblogs.paginate_by_max_id(limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:max_id], params[:since_id])
accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h
@accounts = results.map { |r| accounts[r.account_id] } @accounts = results.map { |r| accounts[r.account_id] }
set_account_counters_maps(@accounts) set_account_counters_maps(@accounts)
next_path = reblogged_by_api_v1_status_url(max_id: results.last.id) if results.size == DEFAULT_ACCOUNTS_LIMIT next_path = reblogged_by_api_v1_status_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
prev_path = reblogged_by_api_v1_status_url(since_id: results.first.id) unless results.empty? prev_path = reblogged_by_api_v1_status_url(since_id: results.first.id) unless results.empty?
set_pagination_headers(next_path, prev_path) set_pagination_headers(next_path, prev_path)
...@@ -42,13 +42,13 @@ class Api::V1::StatusesController < ApiController ...@@ -42,13 +42,13 @@ class Api::V1::StatusesController < ApiController
end end
def favourited_by def favourited_by
results = @status.favourites.paginate_by_max_id(DEFAULT_ACCOUNTS_LIMIT, params[:max_id], params[:since_id]) results = @status.favourites.paginate_by_max_id(limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:max_id], params[:since_id])
accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h
@accounts = results.map { |f| accounts[f.account_id] } @accounts = results.map { |f| accounts[f.account_id] }
set_account_counters_maps(@accounts) set_account_counters_maps(@accounts)
next_path = favourited_by_api_v1_status_url(max_id: results.last.id) if results.size == DEFAULT_ACCOUNTS_LIMIT next_path = favourited_by_api_v1_status_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
prev_path = favourited_by_api_v1_status_url(since_id: results.first.id) unless results.empty? prev_path = favourited_by_api_v1_status_url(since_id: results.first.id) unless results.empty?
set_pagination_headers(next_path, prev_path) set_pagination_headers(next_path, prev_path)
......
...@@ -7,14 +7,14 @@ class Api::V1::TimelinesController < ApiController ...@@ -7,14 +7,14 @@ class Api::V1::TimelinesController < ApiController
respond_to :json respond_to :json
def home def home
@statuses = Feed.new(:home, current_account).get(DEFAULT_STATUSES_LIMIT, params[:max_id], params[:since_id]) @statuses = Feed.new(:home, current_account).get(limit_param(DEFAULT_STATUSES_LIMIT), params[:max_id], params[:since_id])
@statuses = cache_collection(@statuses) @statuses = cache_collection(@statuses)
set_maps(@statuses) set_maps(@statuses)
set_counters_maps(@statuses) set_counters_maps(@statuses)
set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq) set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq)
next_path = api_v1_home_timeline_url(max_id: @statuses.last.id) if @statuses.size == DEFAULT_STATUSES_LIMIT next_path = api_v1_home_timeline_url(max_id: @statuses.last.id) if @statuses.size == limit_param(DEFAULT_STATUSES_LIMIT)
prev_path = api_v1_home_timeline_url(since_id: @statuses.first.id) unless @statuses.empty? prev_path = api_v1_home_timeline_url(since_id: @statuses.first.id) unless @statuses.empty?
set_pagination_headers(next_path, prev_path) set_pagination_headers(next_path, prev_path)
...@@ -23,14 +23,14 @@ class Api::V1::TimelinesController < ApiController ...@@ -23,14 +23,14 @@ class Api::V1::TimelinesController < ApiController
end end
def mentions def mentions
@statuses = Feed.new(:mentions, current_account).get(DEFAULT_STATUSES_LIMIT, params[:max_id], params[:since_id]) @statuses = Feed.new(:mentions, current_account).get(limit_param(DEFAULT_STATUSES_LIMIT), params[:max_id], params[:since_id])
@statuses = cache_collection(@statuses) @statuses = cache_collection(@statuses)
set_maps(@statuses) set_maps(@statuses)
set_counters_maps(@statuses) set_counters_maps(@statuses)
set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq) set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq)
next_path = api_v1_mentions_timeline_url(max_id: @statuses.last.id) if @statuses.size == DEFAULT_STATUSES_LIMIT next_path = api_v1_mentions_timeline_url(max_id: @statuses.last.id) if @statuses.size == limit_param(DEFAULT_STATUSES_LIMIT)
prev_path = api_v1_mentions_timeline_url(since_id: @statuses.first.id) unless @statuses.empty? prev_path = api_v1_mentions_timeline_url(since_id: @statuses.first.id) unless @statuses.empty?
set_pagination_headers(next_path, prev_path) set_pagination_headers(next_path, prev_path)
...@@ -39,14 +39,14 @@ class Api::V1::TimelinesController < ApiController ...@@ -39,14 +39,14 @@ class Api::V1::TimelinesController < ApiController
end end
def public def public
@statuses = Status.as_public_timeline(current_account).paginate_by_max_id(DEFAULT_STATUSES_LIMIT, params[:max_id], params[:since_id]) @statuses = Status.as_public_timeline(current_account).paginate_by_max_id(limit_param(DEFAULT_STATUSES_LIMIT), params[:max_id], params[:since_id])
@statuses = cache_collection(@statuses) @statuses = cache_collection(@statuses)
set_maps(@statuses) set_maps(@statuses)
set_counters_maps(@statuses) set_counters_maps(@statuses)
set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq) set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq)
next_path = api_v1_public_timeline_url(max_id: @statuses.last.id) if @statuses.size == DEFAULT_STATUSES_LIMIT next_path = api_v1_public_timeline_url(max_id: @statuses.last.id) if @statuses.size == limit_param(DEFAULT_STATUSES_LIMIT)
prev_path = api_v1_public_timeline_url(since_id: @statuses.first.id) unless @statuses.empty? prev_path = api_v1_public_timeline_url(since_id: @statuses.first.id) unless @statuses.empty?
set_pagination_headers(next_path, prev_path) set_pagination_headers(next_path, prev_path)
...@@ -56,14 +56,14 @@ class Api::V1::TimelinesController < ApiController ...@@ -56,14 +56,14 @@ class Api::V1::TimelinesController < ApiController
def tag def tag
@tag = Tag.find_by(name: params[:id].downcase) @tag = Tag.find_by(name: params[:id].downcase)
@statuses = @tag.nil? ? [] : Status.as_tag_timeline(@tag, current_account).paginate_by_max_id(DEFAULT_STATUSES_LIMIT, params[:max_id], params[:since_id]) @statuses = @tag.nil? ? [] : Status.as_tag_timeline(@tag, current_account).paginate_by_max_id(limit_param(DEFAULT_STATUSES_LIMIT), params[:max_id], params[:since_id])
@statuses = cache_collection(@statuses) @statuses = cache_collection(@statuses)
set_maps(@statuses) set_maps(@statuses)
set_counters_maps(@statuses) set_counters_maps(@statuses)
set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq) set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq)
next_path = api_v1_hashtag_timeline_url(params[:id], max_id: @statuses.last.id) if @statuses.size == DEFAULT_STATUSES_LIMIT next_path = api_v1_hashtag_timeline_url(params[:id], max_id: @statuses.last.id) if @statuses.size == limit_param(DEFAULT_STATUSES_LIMIT)
prev_path = api_v1_hashtag_timeline_url(params[:id], since_id: @statuses.first.id) unless @statuses.empty? prev_path = api_v1_hashtag_timeline_url(params[:id], since_id: @statuses.first.id) unless @statuses.empty?
set_pagination_headers(next_path, prev_path) set_pagination_headers(next_path, prev_path)
......
...@@ -62,6 +62,11 @@ class ApiController < ApplicationController ...@@ -62,6 +62,11 @@ class ApiController < ApplicationController
response.headers['Link'] = LinkHeader.new(links) response.headers['Link'] = LinkHeader.new(links)
end end
def limit_param(default_limit)
return default_limit unless params[:limit]
[params[:limit].to_i.abs, default_limit * 2].min
end
def current_resource_owner def current_resource_owner
@current_user ||= User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token @current_user ||= User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
end end
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment