# frozen_string_literal: true
|
|
|
|
class DeliveryFailureTracker
|
|
FAILURE_DAYS_THRESHOLD = 7
|
|
|
|
def initialize(inbox_url)
|
|
@inbox_url = inbox_url
|
|
end
|
|
|
|
def track_failure!
|
|
Redis.current.sadd(exhausted_deliveries_key, today)
|
|
Redis.current.sadd('unavailable_inboxes', @inbox_url) if reached_failure_threshold?
|
|
end
|
|
|
|
def track_success!
|
|
Redis.current.del(exhausted_deliveries_key)
|
|
Redis.current.srem('unavailable_inboxes', @inbox_url)
|
|
end
|
|
|
|
def days
|
|
Redis.current.scard(exhausted_deliveries_key) || 0
|
|
end
|
|
|
|
class << self
|
|
def filter(arr)
|
|
arr.reject(&method(:unavailable?))
|
|
end
|
|
|
|
def unavailable?(url)
|
|
Redis.current.sismember('unavailable_inboxes', url)
|
|
end
|
|
|
|
def available?(url)
|
|
!unavailable?(url)
|
|
end
|
|
|
|
def track_inverse_success!(from_account)
|
|
new(from_account.inbox_url).track_success! if from_account.inbox_url.present?
|
|
new(from_account.shared_inbox_url).track_success! if from_account.shared_inbox_url.present?
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def exhausted_deliveries_key
|
|
"exhausted_deliveries:#{@inbox_url}"
|
|
end
|
|
|
|
def today
|
|
Time.now.utc.strftime('%Y%m%d')
|
|
end
|
|
|
|
def reached_failure_threshold?
|
|
days >= FAILURE_DAYS_THRESHOLD
|
|
end
|
|
end
|