Change source attribute of Suggestion entity in /api/v2/suggestions back to a string (#29108)

This commit is contained in:
Claire 2024-02-06 18:10:17 +01:00 committed by GitHub
parent 1e0b0a3486
commit 7ee93b7431
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 41 additions and 10 deletions

View file

@ -59,7 +59,7 @@ Source.propTypes = {
id: PropTypes.oneOf(['friends_of_friends', 'similar_to_recently_followed', 'featured', 'most_followed', 'most_interactions']), id: PropTypes.oneOf(['friends_of_friends', 'similar_to_recently_followed', 'featured', 'most_followed', 'most_interactions']),
}; };
const Card = ({ id, source }) => { const Card = ({ id, sources }) => {
const intl = useIntl(); const intl = useIntl();
const account = useSelector(state => state.getIn(['accounts', id])); const account = useSelector(state => state.getIn(['accounts', id]));
const relationship = useSelector(state => state.getIn(['relationships', id])); const relationship = useSelector(state => state.getIn(['relationships', id]));
@ -89,7 +89,7 @@ const Card = ({ id, source }) => {
<div className='inline-follow-suggestions__body__scrollable__card__text-stack'> <div className='inline-follow-suggestions__body__scrollable__card__text-stack'>
<Link to={`/@${account.get('acct')}`}><DisplayName account={account} /></Link> <Link to={`/@${account.get('acct')}`}><DisplayName account={account} /></Link>
{firstVerifiedField ? <VerifiedBadge link={firstVerifiedField.get('value')} /> : <Source id={source.get(0)} />} {firstVerifiedField ? <VerifiedBadge link={firstVerifiedField.get('value')} /> : <Source id={sources.get(0)} />}
</div> </div>
<Button text={intl.formatMessage(following ? messages.unfollow : messages.follow)} onClick={handleFollow} /> <Button text={intl.formatMessage(following ? messages.unfollow : messages.follow)} onClick={handleFollow} />
@ -99,7 +99,7 @@ const Card = ({ id, source }) => {
Card.propTypes = { Card.propTypes = {
id: PropTypes.string.isRequired, id: PropTypes.string.isRequired,
source: ImmutablePropTypes.list, sources: ImmutablePropTypes.list,
}; };
const DISMISSIBLE_ID = 'home/follow-suggestions'; const DISMISSIBLE_ID = 'home/follow-suggestions';
@ -175,7 +175,7 @@ export const InlineFollowSuggestions = ({ hidden }) => {
<Card <Card
key={suggestion.get('account')} key={suggestion.get('account')}
id={suggestion.get('account')} id={suggestion.get('account')}
source={suggestion.get('source')} sources={suggestion.get('sources')}
/> />
))} ))}
</div> </div>

View file

@ -31,12 +31,12 @@ class AccountSuggestions
account_ids = account_ids_with_sources[offset, limit] account_ids = account_ids_with_sources[offset, limit]
accounts_map = Account.where(id: account_ids.map(&:first)).includes(:account_stat, :user).index_by(&:id) accounts_map = Account.where(id: account_ids.map(&:first)).includes(:account_stat, :user).index_by(&:id)
account_ids.filter_map do |(account_id, source)| account_ids.filter_map do |(account_id, sources)|
next unless accounts_map.key?(account_id) next unless accounts_map.key?(account_id)
AccountSuggestions::Suggestion.new( AccountSuggestions::Suggestion.new(
account: accounts_map[account_id], account: accounts_map[account_id],
source: source sources: sources
) )
end end
end end

View file

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
class AccountSuggestions::Suggestion < ActiveModelSerializers::Model class AccountSuggestions::Suggestion < ActiveModelSerializers::Model
attributes :account, :source attributes :account, :sources
delegate :id, to: :account, prefix: true delegate :id, to: :account, prefix: true
end end

View file

@ -1,7 +1,20 @@
# frozen_string_literal: true # frozen_string_literal: true
class REST::SuggestionSerializer < ActiveModel::Serializer class REST::SuggestionSerializer < ActiveModel::Serializer
attributes :source attributes :source, :sources
has_one :account, serializer: REST::AccountSerializer has_one :account, serializer: REST::AccountSerializer
LEGACY_SOURCE_TYPE_MAP = {
featured: 'staff',
most_followed: 'global',
most_interactions: 'global',
# NOTE: Those are not completely accurate, but those are personalized interactions
similar_to_recently_followed: 'past_interactions',
friends_of_friends: 'past_interactions',
}.freeze
def source
LEGACY_SOURCE_TYPE_MAP[object.sources.first]
end
end end

View file

@ -9,10 +9,28 @@ describe 'Suggestions API' do
let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
describe 'GET /api/v2/suggestions' do describe 'GET /api/v2/suggestions' do
it 'returns http success' do let(:bob) { Fabricate(:account) }
let(:jeff) { Fabricate(:account) }
let(:params) { {} }
before do
Setting.bootstrap_timeline_accounts = [bob, jeff].map(&:acct).join(',')
end
it 'returns the expected suggestions' do
get '/api/v2/suggestions', headers: headers get '/api/v2/suggestions', headers: headers
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
expect(body_as_json).to match_array(
[bob, jeff].map do |account|
hash_including({
source: 'staff',
sources: ['featured'],
account: hash_including({ id: account.id.to_s }),
})
end
)
end end
end end
end end

View file

@ -7,7 +7,7 @@ describe REST::SuggestionSerializer do
let(:record) do let(:record) do
AccountSuggestions::Suggestion.new( AccountSuggestions::Suggestion.new(
account: account, account: account,
source: 'SuggestionSource' sources: ['SuggestionSource']
) )
end end
let(:account) { Fabricate(:account) } let(:account) { Fabricate(:account) }