40 lines
842 B
Ruby
40 lines
842 B
Ruby
class Webhook::DelinquencyTracker < ApplicationRecord
|
|
RESET_INTERVAL = 12.hours
|
|
MINIMUM_DELIVERIES = 50
|
|
|
|
belongs_to :webhook
|
|
|
|
before_validation { self.last_reset_at ||= Time.current }
|
|
|
|
def record_delivery_of(delivery)
|
|
if reset_due?
|
|
webhook.deactivate if delinquent?
|
|
reset
|
|
else
|
|
increment!(:total_count)
|
|
increment!(:failed_count) unless delivery.succeeded?
|
|
end
|
|
end
|
|
|
|
private
|
|
def delinquent?
|
|
significantly_active? && all_deliveries_failed?
|
|
end
|
|
|
|
def significantly_active?
|
|
total_count >= MINIMUM_DELIVERIES
|
|
end
|
|
|
|
def all_deliveries_failed?
|
|
failed_count == total_count
|
|
end
|
|
|
|
def reset
|
|
update_columns total_count: 0, failed_count: 0, last_reset_at: Time.current
|
|
end
|
|
|
|
def reset_due?
|
|
last_reset_at.before?(RESET_INTERVAL.ago)
|
|
end
|
|
end
|