21
1
Fork 0
mirror of https://github.com/Evolix/chexpire.git synced 2024-04-29 07:20:50 +02:00
chexpire/app/models/check.rb
2018-07-05 16:26:15 +02:00

113 lines
3.1 KiB
Ruby

# == Schema Information
#
# Table name: checks
#
# id :bigint(8) not null, primary key
# active :boolean default(TRUE), not null
# comment :string(255)
# domain :string(255) not null
# domain_created_at :datetime
# domain_expires_at :datetime
# domain_updated_at :datetime
# kind :integer not null
# last_run_at :datetime
# last_success_at :datetime
# vendor :string(255)
# created_at :datetime not null
# updated_at :datetime not null
# user_id :bigint(8)
#
# Indexes
#
# index_checks_on_user_id (user_id)
#
# Foreign Keys
#
# fk_rails_... (user_id => users.id)
#
class Check < ApplicationRecord
ERROR_DELAY_DAYS = 3
belongs_to :user
has_many :logs, class_name: "CheckLog", dependent: :destroy
has_many :notifications, validate: true, dependent: :destroy
accepts_nested_attributes_for :notifications,
allow_destroy: true,
reject_if: lambda { |at| at["recipient"].blank? && at["interval"].blank? }
enum kind: [:domain, :ssl]
self.skip_time_zone_conversion_for_attributes = [
:domain_created_at,
:domain_updated_at,
:domain_expires_at,
]
validates :kind, presence: true
validates :domain, presence: true
validate :domain_created_at_past
validate :domain_updated_at_past
validates :comment, length: { maximum: 255 }
validates :vendor, length: { maximum: 255 }
after_update :reset_notifications
after_save :enqueue_sync
scope :active, -> { where(active: true) }
scope :last_run_failed, -> {
where("(last_success_at IS NULL AND last_run_at IS NOT NULL)
OR (last_success_at <= DATE_SUB(last_run_at, INTERVAL 5 MINUTE))")
}
scope :kind, ->(kind) { where(kind: kind) }
scope :by_domain, ->(domain) { where("domain LIKE ?", "%#{domain}%") }
scope :recurrent_failures, -> {
interval = "INTERVAL #{ERROR_DELAY_DAYS} DAY"
where("last_run_at IS NOT NULL AND created_at <= DATE_SUB(NOW(), #{interval})")
.where("last_success_at IS NULL OR last_success_at <= DATE_SUB(last_run_at, #{interval})")
}
def self.default_sort
[:domain_expires_at, :asc]
end
def in_error?
return false if created_at > ERROR_DELAY_DAYS.days.ago
return false if last_run_at.nil?
return true if last_success_at.nil?
last_success_at < ERROR_DELAY_DAYS.days.ago
end
def days_from_last_success
return unless last_success_at.present?
(Date.today - last_success_at.to_date).to_i
end
private
def domain_created_at_past
errors.add(:domain_created_at, :past) if domain_created_at.present? && domain_created_at.future?
end
def domain_updated_at_past
errors.add(:domain_updated_at, :past) if domain_updated_at.present? && domain_updated_at.future?
end
def enqueue_sync
return unless active?
return unless saved_changes.key?("domain")
WhoisSyncJob.perform_later(id) if domain?
SSLSyncJob.perform_later(id) if ssl?
end
def reset_notifications
return unless (saved_changes.keys & %w[domain domain_expires_at]).present?
notifications.each(&:reset!)
end
end