# 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