diff options
author | ThibG <thib@sitedethib.com> | 2020-04-17 22:36:48 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-17 22:36:48 +0200 |
commit | 62e65dca11e1c39630db2958c514c45407dcdfa7 (patch) | |
tree | 92b5f9a2f93a2355dd94bac7e63e8fd9c552dafb /app/lib | |
parent | 5fdd5eef5a6b05b072a57e065954fdcb0b4a8898 (diff) | |
parent | 81ef26b67d01aaa693edbdcf7a8f2a6cdfd56920 (diff) |
Merge pull request #1318 from ThibG/glitch-soc/merge-upstream
Merge upstream changes
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 |