Fix pagination in Api::V1::BlocksController (#5285)
This commit is contained in:
		
				
					committed by
					
						 Eugen Rochko
						Eugen Rochko
					
				
			
			
				
	
			
			
			
						parent
						
							7fd66cf2fe
						
					
				
				
					commit
					cc796298c9
				
			| @@ -15,19 +15,17 @@ class Api::V1::BlocksController < Api::BaseController | ||||
|   private | ||||
|  | ||||
|   def load_accounts | ||||
|     default_accounts.merge(paginated_blocks).to_a | ||||
|   end | ||||
|  | ||||
|   def default_accounts | ||||
|     Account.includes(:blocked_by).references(:blocked_by) | ||||
|     paginated_blocks.map(&:target_account) | ||||
|   end | ||||
|  | ||||
|   def paginated_blocks | ||||
|     Block.where(account: current_account).paginate_by_max_id( | ||||
|       limit_param(DEFAULT_ACCOUNTS_LIMIT), | ||||
|       params[:max_id], | ||||
|       params[:since_id] | ||||
|     ) | ||||
|     @paginated_blocks ||= Block.eager_load(:target_account) | ||||
|                                .where(account: current_account) | ||||
|                                .paginate_by_max_id( | ||||
|                                  limit_param(DEFAULT_ACCOUNTS_LIMIT), | ||||
|                                  params[:max_id], | ||||
|                                  params[:since_id] | ||||
|                                ) | ||||
|   end | ||||
|  | ||||
|   def insert_pagination_headers | ||||
| @@ -41,21 +39,21 @@ class Api::V1::BlocksController < Api::BaseController | ||||
|   end | ||||
|  | ||||
|   def prev_path | ||||
|     unless @accounts.empty? | ||||
|     unless paginated_blocks.empty? | ||||
|       api_v1_blocks_url pagination_params(since_id: pagination_since_id) | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   def pagination_max_id | ||||
|     @accounts.last.blocked_by_ids.last | ||||
|     paginated_blocks.last.id | ||||
|   end | ||||
|  | ||||
|   def pagination_since_id | ||||
|     @accounts.first.blocked_by_ids.first | ||||
|     paginated_blocks.first.id | ||||
|   end | ||||
|  | ||||
|   def records_continue? | ||||
|     @accounts.size == limit_param(DEFAULT_ACCOUNTS_LIMIT) | ||||
|     paginated_blocks.size == limit_param(DEFAULT_ACCOUNTS_LIMIT) | ||||
|   end | ||||
|  | ||||
|   def pagination_params(core_params) | ||||
|   | ||||
| @@ -6,15 +6,47 @@ RSpec.describe Api::V1::BlocksController, type: :controller do | ||||
|   let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } | ||||
|   let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'follow') } | ||||
|  | ||||
|   before do | ||||
|     Fabricate(:block, account: user.account) | ||||
|     allow(controller).to receive(:doorkeeper_token) { token } | ||||
|   end | ||||
|   before { allow(controller).to receive(:doorkeeper_token) { token } } | ||||
|  | ||||
|   describe 'GET #index' do | ||||
|     it 'returns http success' do | ||||
|     it 'limits according to limit parameter' do | ||||
|       2.times.map { Fabricate(:block, account: user.account) } | ||||
|       get :index, params: { limit: 1 } | ||||
|       expect(body_as_json.size).to eq 1 | ||||
|     end | ||||
|  | ||||
|     it 'queries blocks in range according to max_id' do | ||||
|       blocks = 2.times.map { Fabricate(:block, account: user.account) } | ||||
|  | ||||
|       get :index, params: { max_id: blocks[1] } | ||||
|  | ||||
|       expect(body_as_json.size).to eq 1 | ||||
|       expect(body_as_json[0][:id]).to eq blocks[0].target_account_id.to_s | ||||
|     end | ||||
|  | ||||
|     it 'queries blocks in range according to since_id' do | ||||
|       blocks = 2.times.map { Fabricate(:block, account: user.account) } | ||||
|  | ||||
|       get :index, params: { since_id: blocks[0] } | ||||
|  | ||||
|       expect(body_as_json.size).to eq 1 | ||||
|       expect(body_as_json[0][:id]).to eq blocks[1].target_account_id.to_s | ||||
|     end | ||||
|  | ||||
|     it 'sets pagination header for next path' do | ||||
|       blocks = 2.times.map { Fabricate(:block, account: user.account) } | ||||
|       get :index, params: { limit: 1, since_id: blocks[0] } | ||||
|       expect(response.headers['Link'].find_link(['rel', 'next']).href).to eq api_v1_blocks_url(limit: 1, max_id: blocks[1]) | ||||
|     end | ||||
|  | ||||
|     it 'sets pagination header for previous path' do | ||||
|       block = Fabricate(:block, account: user.account) | ||||
|       get :index | ||||
|       expect(response.headers['Link'].find_link(['rel', 'prev']).href).to eq api_v1_blocks_url(since_id: block) | ||||
|     end | ||||
|  | ||||
|     it 'returns http success' do | ||||
|       get :index | ||||
|       expect(response).to have_http_status(:success) | ||||
|     end | ||||
|   end | ||||
|   | ||||
		Reference in New Issue
	
	Block a user