Class: WarningEmail

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/warning_email.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.spawn_sender_threadObject



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'app/models/warning_email.rb', line 13

def self.spawn_sender_thread
  Thread.main[:warning_email_sender] = Thread.new do
    loop do
      begin
        warning_times = {}

        min_wait_time = 600
        WarningEmail.find_each do |warning_email|
          next if warning_email.minutes.blank?

          warning_times[warning_email.id] ||= Time.now.to_i
          wait_time = warning_email.minutes * 60.0 - (Time.now.to_i - warning_times[warning_email.id])

          if wait_time < 0
            warning_email.send_report if warning_email.warnings.any?
            warning_times[warning_email.id] = Time.now.to_i
            wait_time = warning_email.minutes * 60.0
          end

          min_wait_time = wait_time if wait_time < min_wait_time
        end

        ActiveRecord::Base.clear_active_connections!
        sleep min_wait_time.seconds + 1
      rescue StandardError => e
        Rails.logger.error "WARNING_EMAILS ERROR DURING LOOP #{e.class.name}: #{e.message}"

        ActiveRecord::Base.clear_active_connections!
        sleep 1.minute
      end
    end
  end
end

Instance Method Details

#send_reportObject



9
10
11
# File 'app/models/warning_email.rb', line 9

def send_report
  WarningEmailMailer.send_report(self, warnings).deliver
end

#warningsObject



5
6
7
# File 'app/models/warning_email.rb', line 5

def warnings
  Warning.where(warnable_type: model, dismissed_at: nil)
end