Deduplicate IDs in relationships and familiar_followers APIs (#27982)
This commit is contained in:
parent
973597c6f1
commit
7877fcd83c
4 changed files with 31 additions and 6 deletions
|
@ -12,7 +12,7 @@ class Api::V1::Accounts::FamiliarFollowersController < Api::BaseController
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_accounts
|
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
|
end
|
||||||
|
|
||||||
def familiar_followers
|
def familiar_followers
|
||||||
|
|
|
@ -5,11 +5,8 @@ class Api::V1::Accounts::RelationshipsController < Api::BaseController
|
||||||
before_action :require_user!
|
before_action :require_user!
|
||||||
|
|
||||||
def index
|
def index
|
||||||
scope = Account.where(id: account_ids).select('id')
|
@accounts = Account.where(id: account_ids).select('id')
|
||||||
scope.merge!(Account.without_suspended) unless truthy_param?(:with_suspended)
|
@accounts.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
|
|
||||||
render json: @accounts, each_serializer: REST::RelationshipSerializer, relationships: relationships
|
render json: @accounts, each_serializer: REST::RelationshipSerializer, relationships: relationships
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -19,5 +19,17 @@ describe Api::V1::Accounts::FamiliarFollowersController do
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
expect(response).to have_http_status(200)
|
||||||
end
|
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
|
||||||
end
|
end
|
||||||
|
|
|
@ -79,6 +79,22 @@ describe 'GET /api/v1/accounts/relationships' do
|
||||||
end
|
end
|
||||||
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
|
def simon_item
|
||||||
{
|
{
|
||||||
id: simon.id.to_s,
|
id: simon.id.to_s,
|
||||||
|
|
Loading…
Reference in a new issue