* Display an error when an appeal could not be submitted * Do not offer users to appeal old strikes * Fix 500 error when trying to appeal a strike that is too old * Avoid using an extra translatable string
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| # == Schema Information
 | |
| #
 | |
| # Table name: appeals
 | |
| #
 | |
| #  id                     :bigint(8)        not null, primary key
 | |
| #  account_id             :bigint(8)        not null
 | |
| #  account_warning_id     :bigint(8)        not null
 | |
| #  text                   :text             default(""), not null
 | |
| #  approved_at            :datetime
 | |
| #  approved_by_account_id :bigint(8)
 | |
| #  rejected_at            :datetime
 | |
| #  rejected_by_account_id :bigint(8)
 | |
| #  created_at             :datetime         not null
 | |
| #  updated_at             :datetime         not null
 | |
| #
 | |
| class Appeal < ApplicationRecord
 | |
|   MAX_STRIKE_AGE = 20.days
 | |
| 
 | |
|   belongs_to :account
 | |
|   belongs_to :strike, class_name: 'AccountWarning', foreign_key: 'account_warning_id'
 | |
|   belongs_to :approved_by_account, class_name: 'Account', optional: true
 | |
|   belongs_to :rejected_by_account, class_name: 'Account', optional: true
 | |
| 
 | |
|   validates :text, presence: true, length: { maximum: 2_000 }
 | |
|   validates :account_warning_id, uniqueness: true
 | |
| 
 | |
|   validate :validate_time_frame, on: :create
 | |
| 
 | |
|   scope :approved, -> { where.not(approved_at: nil) }
 | |
|   scope :rejected, -> { where.not(rejected_at: nil) }
 | |
|   scope :pending, -> { where(approved_at: nil, rejected_at: nil) }
 | |
| 
 | |
|   def pending?
 | |
|     !approved? && !rejected?
 | |
|   end
 | |
| 
 | |
|   def approved?
 | |
|     approved_at.present?
 | |
|   end
 | |
| 
 | |
|   def rejected?
 | |
|     rejected_at.present?
 | |
|   end
 | |
| 
 | |
|   def approve!(current_account)
 | |
|     update!(approved_at: Time.now.utc, approved_by_account: current_account)
 | |
|   end
 | |
| 
 | |
|   def reject!(current_account)
 | |
|     update!(rejected_at: Time.now.utc, rejected_by_account: current_account)
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def validate_time_frame
 | |
|     errors.add(:base, I18n.t('strikes.errors.too_late')) if strike.created_at < MAX_STRIKE_AGE.ago
 | |
|   end
 | |
| end
 |