67 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| # == Schema Information
 | |
| #
 | |
| # Table name: quotes
 | |
| #
 | |
| #  id                :bigint(8)        not null, primary key
 | |
| #  activity_uri      :string
 | |
| #  approval_uri      :string
 | |
| #  state             :integer          default("pending"), not null
 | |
| #  created_at        :datetime         not null
 | |
| #  updated_at        :datetime         not null
 | |
| #  account_id        :bigint(8)        not null
 | |
| #  quoted_account_id :bigint(8)
 | |
| #  quoted_status_id  :bigint(8)
 | |
| #  status_id         :bigint(8)        not null
 | |
| #
 | |
| class Quote < ApplicationRecord
 | |
|   BACKGROUND_REFRESH_INTERVAL = 1.week.freeze
 | |
|   REFRESH_DEADLINE = 6.hours
 | |
| 
 | |
|   enum :state,
 | |
|        { pending: 0, accepted: 1, rejected: 2, revoked: 3 },
 | |
|        validate: true
 | |
| 
 | |
|   belongs_to :status
 | |
|   belongs_to :quoted_status, class_name: 'Status', optional: true
 | |
| 
 | |
|   belongs_to :account
 | |
|   belongs_to :quoted_account, class_name: 'Account', optional: true
 | |
| 
 | |
|   before_validation :set_accounts
 | |
| 
 | |
|   validates :activity_uri, presence: true, if: -> { account.local? && quoted_account&.remote? }
 | |
|   validate :validate_visibility
 | |
| 
 | |
|   def accept!
 | |
|     update!(state: :accepted)
 | |
|   end
 | |
| 
 | |
|   def reject!
 | |
|     if accepted?
 | |
|       update!(state: :revoked)
 | |
|     elsif !revoked?
 | |
|       update!(state: :rejected)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def schedule_refresh_if_stale!
 | |
|     return unless quoted_status_id.present? && approval_uri.present? && updated_at <= BACKGROUND_REFRESH_INTERVAL.ago
 | |
| 
 | |
|     ActivityPub::QuoteRefreshWorker.perform_in(rand(REFRESH_DEADLINE), id)
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def set_accounts
 | |
|     self.account = status.account
 | |
|     self.quoted_account = quoted_status&.account
 | |
|   end
 | |
| 
 | |
|   def validate_visibility
 | |
|     return if account_id == quoted_account_id || quoted_status.nil? || quoted_status.distributable?
 | |
| 
 | |
|     errors.add(:quoted_status_id, :visibility_mismatch)
 | |
|   end
 | |
| end
 |