diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 300eae547..d0c4fe146 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -23,13 +23,16 @@ class PostStatusService < BaseService status = nil text = options.delete(:spoiler_text) if text.blank? && options[:spoiler_text].present? + visibility = options[:visibility] || account.user&.setting_default_privacy + visibility = :unlisted if visibility == :public && account.silenced + ApplicationRecord.transaction do status = account.statuses.create!(text: text, media_attachments: media || [], thread: in_reply_to, sensitive: (options[:sensitive].nil? ? account.user&.setting_default_sensitive : options[:sensitive]) || options[:spoiler_text].present?, spoiler_text: options[:spoiler_text] || '', - visibility: options[:visibility] || account.user&.setting_default_privacy, + visibility: visibility, language: language_from_option(options[:language]) || account.user&.setting_default_language&.presence || LanguageDetector.instance.detect(text, account), application: options[:application]) end diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index 349ad861b..8f3552224 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -68,6 +68,13 @@ RSpec.describe PostStatusService, type: :service do expect(status.visibility).to eq "private" end + it 'creates a status with limited visibility for silenced users' do + status = subject.call(Fabricate(:account, silenced: true), 'test', nil, visibility: :public) + + expect(status).to be_persisted + expect(status.visibility).to eq "unlisted" + end + it 'creates a status for the given application' do application = Fabricate(:application)