]> cat aescling's git repositories - mastodon.git/commitdiff
Break out nested relationship API keys (#5887)
authoraschmitz <andy.schmitz@gmail.com>
Wed, 6 Dec 2017 15:10:54 +0000 (09:10 -0600)
committerEugen Rochko <eugen@zeonfederated.com>
Wed, 6 Dec 2017 15:10:54 +0000 (16:10 +0100)
* 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
app/javascript/mastodon/features/account/components/action_bar.js
app/javascript/mastodon/features/account_timeline/containers/header_container.js
app/serializers/rest/relationship_serializer.rb
spec/controllers/api/v1/accounts/relationships_controller_spec.rb
spec/controllers/api/v1/accounts_controller_spec.rb

index 1f2d7690f977ac5f4997497ef95d9543220a3ef1..0cca586ac2f0d884b8e61c389b1d9b9ec6e10e1c 100644 (file)
@@ -81,7 +81,7 @@ export default class Account extends ImmutablePureComponent {
         buttons = <IconButton active icon='unlock-alt' title={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.handleBlock} />;
       } else if (muting) {
         let hidingNotificationsButton;
-        if (muting.get('notifications')) {
+        if (account.getIn(['relationship', 'muting_notifications'])) {
           hidingNotificationsButton = <IconButton active icon='bell' title={intl.formatMessage(messages.unmute_notifications, { name: account.get('username') })} onClick={this.handleUnmuteNotifications} />;
         } else {
           hidingNotificationsButton = <IconButton active icon='bell-slash' title={intl.formatMessage(messages.mute_notifications, { name: account.get('username')  })} onClick={this.handleMuteNotifications} />;
@@ -93,7 +93,7 @@ export default class Account extends ImmutablePureComponent {
           </div>
         );
       } else {
-        buttons = <IconButton icon={following ? 'user-times' : 'user-plus'} title={intl.formatMessage(following ? messages.unfollow : messages.follow)} onClick={this.handleFollow} active={following ? true : false} />;
+        buttons = <IconButton icon={following ? 'user-times' : 'user-plus'} title={intl.formatMessage(following ? messages.unfollow : messages.follow)} onClick={this.handleFollow} active={following} />;
       }
     }
 
index 389296c42b8fa8382a676467f445758763a0ef71..cb849fa5dea3dcc8c8a1dda94c72cf140f10904a 100644 (file)
@@ -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 });
index b41eb19d4759b4f1edc1378e8ff84b90e2a32ae2..7756100322fa5f6b8dd087570cc9f7c358365d42 100644 (file)
@@ -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));
index 998727e37a28f296e30643bc0fb19ab285f13e2b..45bfd4d6e7635a1372ab84a5e03bd5db6b5d858a 100644 (file)
@@ -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
index f25b86ac161c2279d2c2cce9ddb42a5cd58b242b..508415fc8cdb9f9ab2e413b06bdf01e29e87ff5b 100644 (file)
@@ -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
index f3b8794212ab6fae68197ff6bc225d0c5c34bcff..053c53e5af10a906ee956a7d157b149da92431a5 100644 (file)
@@ -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