about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2017-09-05 17:48:13 +0200
committerGitHub <noreply@github.com>2017-09-05 17:48:13 +0200
commit9b994c4aee379f7998d2ddb562a08ccff92e0b0b (patch)
treeee658c5973b3317d58f47942eeb8a0431d81c506
parent4c3dd0b25472b4d291f607979d255dd406856bef (diff)
Fix #4794 - Fake instant follow in API response when account is believed unlocked (#4799)
-rw-r--r--app/controllers/api/v1/accounts_controller.rb10
-rw-r--r--app/presenters/account_relationships_presenter.rb14
-rw-r--r--spec/controllers/api/v1/accounts_controller_spec.rb7
3 files changed, 24 insertions, 7 deletions
diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index f621aa245..656cacd8a 100644
--- a/app/controllers/api/v1/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -14,6 +14,16 @@ class Api::V1::AccountsController < Api::BaseController
 
   def follow
     FollowService.new.call(current_user.account, @account.acct)
+
+    unless @account.locked?
+      relationships = AccountRelationshipsPresenter.new(
+        [@account.id],
+        current_user.account_id,
+        following_map: { @account.id => true },
+        requested_map: { @account.id => false }
+      )
+    end
+
     render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships
   end
 
diff --git a/app/presenters/account_relationships_presenter.rb b/app/presenters/account_relationships_presenter.rb
index 657807863..a30558bac 100644
--- a/app/presenters/account_relationships_presenter.rb
+++ b/app/presenters/account_relationships_presenter.rb
@@ -4,12 +4,12 @@ class AccountRelationshipsPresenter
   attr_reader :following, :followed_by, :blocking,
               :muting, :requested, :domain_blocking
 
-  def initialize(account_ids, current_account_id)
-    @following       = Account.following_map(account_ids, current_account_id)
-    @followed_by     = Account.followed_by_map(account_ids, current_account_id)
-    @blocking        = Account.blocking_map(account_ids, current_account_id)
-    @muting          = Account.muting_map(account_ids, current_account_id)
-    @requested       = Account.requested_map(account_ids, current_account_id)
-    @domain_blocking = Account.domain_blocking_map(account_ids, current_account_id)
+  def initialize(account_ids, current_account_id, options = {})
+    @following       = Account.following_map(account_ids, current_account_id).merge(options[:following_map] || {})
+    @followed_by     = Account.followed_by_map(account_ids, current_account_id).merge(options[:followed_by_map] || {})
+    @blocking        = Account.blocking_map(account_ids, current_account_id).merge(options[:blocking_map] || {})
+    @muting          = Account.muting_map(account_ids, current_account_id).merge(options[:muting_map] || {})
+    @requested       = Account.requested_map(account_ids, current_account_id).merge(options[:requested_map] || {})
+    @domain_blocking = Account.domain_blocking_map(account_ids, current_account_id).merge(options[:domain_blocking_map] || {})
   end
 end
diff --git a/spec/controllers/api/v1/accounts_controller_spec.rb b/spec/controllers/api/v1/accounts_controller_spec.rb
index c13509e7b..05df2f844 100644
--- a/spec/controllers/api/v1/accounts_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts_controller_spec.rb
@@ -28,6 +28,13 @@ RSpec.describe Api::V1::AccountsController, type: :controller do
       expect(response).to have_http_status(:success)
     end
 
+    it 'returns JSON with following=true and requested=false' do
+      json = body_as_json
+
+      expect(json[:following]).to be true
+      expect(json[:requested]).to be false
+    end
+
     it 'creates a following relation between user and target user' do
       expect(user.account.following?(other_account)).to be true
     end