diff --git a/app/serializers/hidden_profile_serializer.rb b/app/serializers/hidden_profile_serializer.rb index f0b8e00d3b6..5755171bd7e 100644 --- a/app/serializers/hidden_profile_serializer.rb +++ b/app/serializers/hidden_profile_serializer.rb @@ -1,12 +1,16 @@ # frozen_string_literal: true class HiddenProfileSerializer < BasicUserSerializer - attributes(:profile_hidden?, :title, :primary_group_name) + attributes(:profile_hidden?, :title, :primary_group_name, :can_send_private_message_to_user) def profile_hidden? true end + def can_send_private_message_to_user + scope.can_send_private_message?(object) + end + def primary_group_name object.primary_group.try(:name) end diff --git a/plugins/chat/plugin.rb b/plugins/chat/plugin.rb index 904bd518ce2..71a1688caa1 100644 --- a/plugins/chat/plugin.rb +++ b/plugins/chat/plugin.rb @@ -149,6 +149,14 @@ after_initialize do scope.can_direct_message? && Guardian.new(object).can_chat? end + add_to_serializer(:hidden_profile, :can_chat_user) do + return false if !SiteSetting.chat_enabled + return false if scope.user.blank? || scope.user.id == object.id + return false if !scope.user.user_option.chat_enabled || !object.user_option.chat_enabled + + scope.can_direct_message? && Guardian.new(object).can_chat? + end + add_to_serializer( :current_user, :can_chat, diff --git a/plugins/chat/spec/requests/core_ext/users_controller_spec.rb b/plugins/chat/spec/requests/core_ext/users_controller_spec.rb index d6cbe07224a..274134f3d2b 100644 --- a/plugins/chat/spec/requests/core_ext/users_controller_spec.rb +++ b/plugins/chat/spec/requests/core_ext/users_controller_spec.rb @@ -53,4 +53,34 @@ describe UsersController do expect(notifications.size).to eq(0) end end + + describe "#show_card" do + fab!(:user) { Fabricate(:user) } + fab!(:another_user) { Fabricate(:user) } + context "when hidden users" do + before do + sign_in(another_user) + SiteSetting.chat_enabled = true + SiteSetting.chat_allowed_groups = Group::AUTO_GROUPS[:everyone] + SiteSetting.direct_message_enabled_groups = Group::AUTO_GROUPS[:everyone] + user.user_option.update!(hide_profile_and_presence: true) + end + + it "returns the correct partial response when the user has chat enabled" do + user.user_option.update!(chat_enabled: true) + get "/u/#{user.username}/card.json" + expect(response).to be_successful + expect(response.parsed_body["user"]["profile_hidden"]).to eq(true) + expect(response.parsed_body["user"]["can_chat_user"]).to eq(true) + end + + it "returns the correct partial response when the user has chat disabled" do + user.user_option.update!(chat_enabled: false) + get "/u/#{user.username}/card.json" + expect(response).to be_successful + expect(response.parsed_body["user"]["profile_hidden"]).to eq(true) + expect(response.parsed_body["user"]["can_chat_user"]).to eq(false) + end + end + end end diff --git a/spec/requests/users_controller_spec.rb b/spec/requests/users_controller_spec.rb index b43f104a37d..17b14190df2 100644 --- a/spec/requests/users_controller_spec.rb +++ b/spec/requests/users_controller_spec.rb @@ -4792,18 +4792,31 @@ RSpec.describe UsersController do expect(response.parsed_body["user"]["inactive"]).to eq(true) end - it "returns partial response when hidden users" do - user.user_option.update!(hide_profile_and_presence: true) - get "/u/#{user.username}/card.json" - expect(response).to be_successful - expect(response.parsed_body["user"]["profile_hidden"]).to eq(true) - end - it "raises an error on invalid access" do Guardian.any_instance.expects(:can_see?).with(user).returns(false) get "/u/#{user.username}/card.json" expect(response).to be_forbidden end + + context "when hidden users" do + before { user.user_option.update!(hide_profile_and_presence: true) } + + it "returns the correct partial response when the user has messages enabled" do + user.user_option.update!(allow_private_messages: true) + get "/u/#{user.username}/card.json" + expect(response).to be_successful + expect(response.parsed_body["user"]["profile_hidden"]).to eq(true) + expect(response.parsed_body["user"]["can_send_private_message_to_user"]).to eq(true) + end + + it "returns the correct partial response when the user has messages disabled" do + user.user_option.update!(allow_private_messages: false) + get "/u/#{user.username}/card.json" + expect(response).to be_successful + expect(response.parsed_body["user"]["profile_hidden"]).to eq(true) + expect(response.parsed_body["user"]["can_send_private_message_to_user"]).to eq(false) + end + end end end