From 4de211b80abe7ea5578988040f004ea1f78d4628 Mon Sep 17 00:00:00 2001 From: aschmitz Date: Wed, 6 Dec 2017 09:10:54 -0600 Subject: [PATCH] Break out nested relationship API keys (#5887) * Break out nested relationship API keys This closes #5856 by restoring the existing behavior of the `muting` and `following` keys (returning booleans rather than truthy or false). It adds `showing_reblogs` and `muting_notifications` keys: * `showing_reblogs` returns true if: 1. You've requested to follow the user, with reblogs shown, or 2. You are following the user, with reblogs shown. * `muting_notifications` returns true if you have muted the user and their notifications as well. * Rubocop fix * Fix pulling reblog/mute status from relationships I could swear this had passed tests before, but apparently not. Works now. * More test fixes Really, you'd expect this to be more straightforward. --- app/javascript/mastodon/components/account.js | 4 ++-- .../features/account/components/action_bar.js | 5 ++--- .../containers/header_container.js | 2 +- .../rest/relationship_serializer.rb | 20 ++++++++++++++----- .../accounts/relationships_controller_spec.rb | 6 ++++-- .../api/v1/accounts_controller_spec.rb | 8 ++++---- 6 files changed, 28 insertions(+), 17 deletions(-) diff --git a/app/javascript/mastodon/components/account.js b/app/javascript/mastodon/components/account.js index 1f2d7690f9..0cca586ac2 100644 --- a/app/javascript/mastodon/components/account.js +++ b/app/javascript/mastodon/components/account.js @@ -81,7 +81,7 @@ export default class Account extends ImmutablePureComponent { buttons = ; } else if (muting) { let hidingNotificationsButton; - if (muting.get('notifications')) { + if (account.getIn(['relationship', 'muting_notifications'])) { hidingNotificationsButton = ; } else { hidingNotificationsButton = ; @@ -93,7 +93,7 @@ export default class Account extends ImmutablePureComponent { ); } else { - buttons = ; + buttons = ; } } diff --git a/app/javascript/mastodon/features/account/components/action_bar.js b/app/javascript/mastodon/features/account/components/action_bar.js index 389296c42b..cb849fa5de 100644 --- a/app/javascript/mastodon/features/account/components/action_bar.js +++ b/app/javascript/mastodon/features/account/components/action_bar.js @@ -63,9 +63,8 @@ export default class ActionBar extends React.PureComponent { if (account.get('id') === me) { menu.push({ text: intl.formatMessage(messages.edit_profile), href: '/settings/profile' }); } else { - const following = account.getIn(['relationship', 'following']); - if (following) { - if (following.get('reblogs')) { + if (account.getIn(['relationship', 'following'])) { + if (account.getIn(['relationship', 'showing_reblogs'])) { menu.push({ text: intl.formatMessage(messages.hideReblogs, { name: account.get('username') }), action: this.props.onReblogToggle }); } else { menu.push({ text: intl.formatMessage(messages.showReblogs, { name: account.get('username') }), action: this.props.onReblogToggle }); diff --git a/app/javascript/mastodon/features/account_timeline/containers/header_container.js b/app/javascript/mastodon/features/account_timeline/containers/header_container.js index b41eb19d47..7756100322 100644 --- a/app/javascript/mastodon/features/account_timeline/containers/header_container.js +++ b/app/javascript/mastodon/features/account_timeline/containers/header_container.js @@ -68,7 +68,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onReblogToggle (account) { - if (account.getIn(['relationship', 'following', 'reblogs'])) { + if (account.getIn(['relationship', 'show_reblogs'])) { dispatch(followAccount(account.get('id'), false)); } else { dispatch(followAccount(account.get('id'), true)); diff --git a/app/serializers/rest/relationship_serializer.rb b/app/serializers/rest/relationship_serializer.rb index 998727e37a..45bfd4d6e7 100644 --- a/app/serializers/rest/relationship_serializer.rb +++ b/app/serializers/rest/relationship_serializer.rb @@ -1,15 +1,21 @@ # frozen_string_literal: true class REST::RelationshipSerializer < ActiveModel::Serializer - attributes :id, :following, :followed_by, :blocking, - :muting, :requested, :domain_blocking + attributes :id, :following, :showing_reblogs, :followed_by, :blocking, + :muting, :muting_notifications, :requested, :domain_blocking def id object.id.to_s end def following - instance_options[:relationships].following[object.id] || false + instance_options[:relationships].following[object.id] ? true : false + end + + def showing_reblogs + (instance_options[:relationships].following[object.id] || {})[:reblogs] || + (instance_options[:relationships].requested[object.id] || {})[:reblogs] || + false end def followed_by @@ -21,11 +27,15 @@ class REST::RelationshipSerializer < ActiveModel::Serializer end def muting - instance_options[:relationships].muting[object.id] || false + instance_options[:relationships].muting[object.id] ? true : false + end + + def muting_notifications + (instance_options[:relationships].muting[object.id] || {})[:notifications] || false end def requested - instance_options[:relationships].requested[object.id] || false + instance_options[:relationships].requested[object.id] ? true : false end def domain_blocking diff --git a/spec/controllers/api/v1/accounts/relationships_controller_spec.rb b/spec/controllers/api/v1/accounts/relationships_controller_spec.rb index f25b86ac16..508415fc8c 100644 --- a/spec/controllers/api/v1/accounts/relationships_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/relationships_controller_spec.rb @@ -32,7 +32,7 @@ describe Api::V1::Accounts::RelationshipsController do json = body_as_json expect(json).to be_a Enumerable - expect(json.first[:following]).to be_truthy + expect(json.first[:following]).to be true expect(json.first[:followed_by]).to be false end end @@ -51,7 +51,8 @@ describe Api::V1::Accounts::RelationshipsController do expect(json).to be_a Enumerable expect(json.first[:id]).to eq simon.id.to_s - expect(json.first[:following]).to be_truthy + expect(json.first[:following]).to be true + expect(json.first[:showing_reblogs]).to be true expect(json.first[:followed_by]).to be false expect(json.first[:muting]).to be false expect(json.first[:requested]).to be false @@ -59,6 +60,7 @@ describe Api::V1::Accounts::RelationshipsController do expect(json.second[:id]).to eq lewis.id.to_s expect(json.second[:following]).to be false + expect(json.second[:showing_reblogs]).to be false expect(json.second[:followed_by]).to be true expect(json.second[:muting]).to be false expect(json.second[:requested]).to be false diff --git a/spec/controllers/api/v1/accounts_controller_spec.rb b/spec/controllers/api/v1/accounts_controller_spec.rb index f3b8794212..053c53e5af 100644 --- a/spec/controllers/api/v1/accounts_controller_spec.rb +++ b/spec/controllers/api/v1/accounts_controller_spec.rb @@ -31,10 +31,10 @@ RSpec.describe Api::V1::AccountsController, type: :controller do expect(response).to have_http_status(:success) end - it 'returns JSON with following=truthy and requested=false' do + it 'returns JSON with following=true and requested=false' do json = body_as_json - expect(json[:following]).to be_truthy + expect(json[:following]).to be true expect(json[:requested]).to be false end @@ -50,11 +50,11 @@ RSpec.describe Api::V1::AccountsController, type: :controller do expect(response).to have_http_status(:success) end - it 'returns JSON with following=false and requested=truthy' do + it 'returns JSON with following=false and requested=true' do json = body_as_json expect(json[:following]).to be false - expect(json[:requested]).to be_truthy + expect(json[:requested]).to be true end it 'creates a follow request relation between user and target user' do