diff options
author | Thibaut Girka <thib@sitedethib.com> | 2020-04-17 20:16:24 +0200 |
---|---|---|
committer | Thibaut Girka <thib@sitedethib.com> | 2020-04-17 20:16:24 +0200 |
commit | 81e49ba5c6107927d12bd222b7081f63ba63bdc9 (patch) | |
tree | d88e34d9a103f23b7ab568e92bd9b2e6ab679a47 /app/lib | |
parent | 5fdd5eef5a6b05b072a57e065954fdcb0b4a8898 (diff) | |
parent | 89077fb65713ece348fdbee1986d1593383ba801 (diff) |
Merge branch 'master' into glitch-soc/merge-upstream
Diffstat (limited to 'app/lib')
-rw-r--r-- | app/lib/delivery_failure_tracker.rb | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/app/lib/delivery_failure_tracker.rb b/app/lib/delivery_failure_tracker.rb index 8d3be35de..25fa694d2 100644 --- a/app/lib/delivery_failure_tracker.rb +++ b/app/lib/delivery_failure_tracker.rb @@ -3,47 +3,53 @@ class DeliveryFailureTracker FAILURE_DAYS_THRESHOLD = 7 - def initialize(inbox_url) - @inbox_url = inbox_url + def initialize(url_or_host) + @host = url_or_host.start_with?('https://') || url_or_host.start_with?('http://') ? Addressable::URI.parse(url_or_host).normalized_host : url_or_host end def track_failure! Redis.current.sadd(exhausted_deliveries_key, today) - Redis.current.sadd('unavailable_inboxes', @inbox_url) if reached_failure_threshold? + UnavailableDomain.create(domain: @host) if reached_failure_threshold? end def track_success! Redis.current.del(exhausted_deliveries_key) - Redis.current.srem('unavailable_inboxes', @inbox_url) + UnavailableDomain.find_by(domain: @host)&.destroy end def days Redis.current.scard(exhausted_deliveries_key) || 0 end + def available? + !UnavailableDomain.where(domain: @host).exists? + end + + alias reset! track_success! + class << self - def filter(arr) - arr.reject(&method(:unavailable?)) - end + def without_unavailable(urls) + unavailable_domains_map = Rails.cache.fetch('unavailable_domains') { UnavailableDomain.pluck(:domain).each_with_object({}) { |domain, hash| hash[domain] = true } } - def unavailable?(url) - Redis.current.sismember('unavailable_inboxes', url) + urls.reject do |url| + host = Addressable::URI.parse(url).normalized_host + unavailable_domains_map[host] + end end def available?(url) - !unavailable?(url) + new(url).available? 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? + def reset!(url) + new(url).reset! end end private def exhausted_deliveries_key - "exhausted_deliveries:#{@inbox_url}" + "exhausted_deliveries:#{@host}" end def today |