Deduplicate IDs in relationships and familiar_followers APIs (#27982)

main
Kevin Bongart 2023-11-23 05:00:09 -05:00 committed by GitHub
parent 973597c6f1
commit 7877fcd83c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 31 additions and 6 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,