Add Status::Visibility concern to hold visibility logic (#33578)
				
					
				
			This commit is contained in:
		@@ -38,6 +38,7 @@ class Status < ApplicationRecord
 | 
			
		||||
  include Status::SearchConcern
 | 
			
		||||
  include Status::SnapshotConcern
 | 
			
		||||
  include Status::ThreadingConcern
 | 
			
		||||
  include Status::Visibility
 | 
			
		||||
 | 
			
		||||
  MEDIA_ATTACHMENTS_LIMIT = 4
 | 
			
		||||
 | 
			
		||||
@@ -52,8 +53,6 @@ class Status < ApplicationRecord
 | 
			
		||||
  update_index('statuses', :proper)
 | 
			
		||||
  update_index('public_statuses', :proper)
 | 
			
		||||
 | 
			
		||||
  enum :visibility, { public: 0, unlisted: 1, private: 2, direct: 3, limited: 4 }, suffix: :visibility, validate: true
 | 
			
		||||
 | 
			
		||||
  belongs_to :application, class_name: 'Doorkeeper::Application', optional: true
 | 
			
		||||
 | 
			
		||||
  belongs_to :account, inverse_of: :statuses
 | 
			
		||||
@@ -98,7 +97,6 @@ class Status < ApplicationRecord
 | 
			
		||||
  validates_with StatusLengthValidator
 | 
			
		||||
  validates_with DisallowedHashtagsValidator
 | 
			
		||||
  validates :reblog, uniqueness: { scope: :account }, if: :reblog?
 | 
			
		||||
  validates :visibility, exclusion: { in: %w(direct limited) }, if: :reblog?
 | 
			
		||||
 | 
			
		||||
  accepts_nested_attributes_for :poll
 | 
			
		||||
 | 
			
		||||
@@ -125,9 +123,6 @@ class Status < ApplicationRecord
 | 
			
		||||
  scope :tagged_with_none, lambda { |tag_ids|
 | 
			
		||||
    where('NOT EXISTS (SELECT * FROM statuses_tags forbidden WHERE forbidden.status_id = statuses.id AND forbidden.tag_id IN (?))', tag_ids)
 | 
			
		||||
  }
 | 
			
		||||
  scope :distributable_visibility, -> { where(visibility: %i(public unlisted)) }
 | 
			
		||||
  scope :list_eligible_visibility, -> { where(visibility: %i(public unlisted private)) }
 | 
			
		||||
  scope :not_direct_visibility, -> { where.not(visibility: :direct) }
 | 
			
		||||
 | 
			
		||||
  after_create_commit :trigger_create_webhooks
 | 
			
		||||
  after_update_commit :trigger_update_webhooks
 | 
			
		||||
@@ -140,7 +135,6 @@ class Status < ApplicationRecord
 | 
			
		||||
 | 
			
		||||
  before_validation :prepare_contents, if: :local?
 | 
			
		||||
  before_validation :set_reblog
 | 
			
		||||
  before_validation :set_visibility
 | 
			
		||||
  before_validation :set_conversation
 | 
			
		||||
  before_validation :set_local
 | 
			
		||||
 | 
			
		||||
@@ -242,16 +236,6 @@ class Status < ApplicationRecord
 | 
			
		||||
    PreviewCardsStatus.where(status_id: id).delete_all
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def hidden?
 | 
			
		||||
    !distributable?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def distributable?
 | 
			
		||||
    public_visibility? || unlisted_visibility?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  alias sign? distributable?
 | 
			
		||||
 | 
			
		||||
  def with_media?
 | 
			
		||||
    ordered_media_attachments.any?
 | 
			
		||||
  end
 | 
			
		||||
@@ -351,10 +335,6 @@ class Status < ApplicationRecord
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  class << self
 | 
			
		||||
    def selectable_visibilities
 | 
			
		||||
      visibilities.keys - %w(direct limited)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def favourites_map(status_ids, account_id)
 | 
			
		||||
      Favourite.select(:status_id).where(status_id: status_ids).where(account_id: account_id).each_with_object({}) { |f, h| h[f.status_id] = true }
 | 
			
		||||
    end
 | 
			
		||||
@@ -436,11 +416,6 @@ class Status < ApplicationRecord
 | 
			
		||||
    update_column(:poll_id, poll.id) if association(:poll).loaded? && poll.present?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_visibility
 | 
			
		||||
    self.visibility = reblog.visibility if reblog? && visibility.nil?
 | 
			
		||||
    self.visibility = (account.locked? ? :private : :public) if visibility.nil?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_conversation
 | 
			
		||||
    self.thread = thread.reblog if thread&.reblog?
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user