Deduplicate IDs in relationships and familiar_followers APIs (#27982)
This commit is contained in:
		@@ -12,7 +12,7 @@ class Api::V1::Accounts::FamiliarFollowersController < Api::BaseController
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def set_accounts
 | 
			
		||||
    @accounts = Account.without_suspended.where(id: account_ids).select('id, hide_collections').index_by(&:id).values_at(*account_ids).compact
 | 
			
		||||
    @accounts = Account.without_suspended.where(id: account_ids).select('id, hide_collections')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def familiar_followers
 | 
			
		||||
 
 | 
			
		||||
@@ -5,11 +5,8 @@ class Api::V1::Accounts::RelationshipsController < Api::BaseController
 | 
			
		||||
  before_action :require_user!
 | 
			
		||||
 | 
			
		||||
  def index
 | 
			
		||||
    scope = Account.where(id: account_ids).select('id')
 | 
			
		||||
    scope.merge!(Account.without_suspended) unless truthy_param?(:with_suspended)
 | 
			
		||||
    # .where doesn't guarantee that our results are in the same order
 | 
			
		||||
    # we requested them, so return the "right" order to the requestor.
 | 
			
		||||
    @accounts = scope.index_by(&:id).values_at(*account_ids).compact
 | 
			
		||||
    @accounts = Account.where(id: account_ids).select('id')
 | 
			
		||||
    @accounts.merge!(Account.without_suspended) unless truthy_param?(:with_suspended)
 | 
			
		||||
    render json: @accounts, each_serializer: REST::RelationshipSerializer, relationships: relationships
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,5 +19,17 @@ describe Api::V1::Accounts::FamiliarFollowersController do
 | 
			
		||||
 | 
			
		||||
      expect(response).to have_http_status(200)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'when there are duplicate account IDs in the params' do
 | 
			
		||||
      let(:account_a) { Fabricate(:account) }
 | 
			
		||||
      let(:account_b) { Fabricate(:account) }
 | 
			
		||||
 | 
			
		||||
      it 'removes duplicate account IDs from params' do
 | 
			
		||||
        account_ids = [account_a, account_b, account_b, account_a, account_a].map { |a| a.id.to_s }
 | 
			
		||||
        get :index, params: { id: account_ids }
 | 
			
		||||
 | 
			
		||||
        expect(body_as_json.pluck(:id)).to eq [account_a.id.to_s, account_b.id.to_s]
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -79,6 +79,22 @@ describe 'GET /api/v1/accounts/relationships' do
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      context 'when there are duplicate IDs in the params' do
 | 
			
		||||
        let(:params) { { id: [simon.id, lewis.id, lewis.id, lewis.id, simon.id] } }
 | 
			
		||||
 | 
			
		||||
        it 'removes duplicate account IDs from params' do
 | 
			
		||||
          subject
 | 
			
		||||
 | 
			
		||||
          expect(body_as_json)
 | 
			
		||||
            .to be_an(Enumerable)
 | 
			
		||||
            .and have_attributes(
 | 
			
		||||
              size: 2,
 | 
			
		||||
              first: include(simon_item),
 | 
			
		||||
              second: include(lewis_item)
 | 
			
		||||
            )
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def simon_item
 | 
			
		||||
        {
 | 
			
		||||
          id: simon.id.to_s,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user