diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2018-09-19 15:20:04 -0700 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2018-09-19 15:20:04 -0700 |
commit | 3c8fc4e9ae53af9739a0e84b1141a79e03552d4a (patch) | |
tree | fa49358fc9eb5e1deb681de5d45eeadc340340a3 /app | |
parent | c6cae759ef0cb9063dc26015132804a6218281b7 (diff) | |
download | rails-3c8fc4e9ae53af9739a0e84b1141a79e03552d4a.tar.gz rails-3c8fc4e9ae53af9739a0e84b1141a79e03552d4a.tar.bz2 rails-3c8fc4e9ae53af9739a0e84b1141a79e03552d4a.zip |
Add incineration by default
Diffstat (limited to 'app')
4 files changed, 62 insertions, 0 deletions
diff --git a/app/jobs/action_mailroom/inbound_email/incineration_job.rb b/app/jobs/action_mailroom/inbound_email/incineration_job.rb new file mode 100644 index 0000000000..fa1d346008 --- /dev/null +++ b/app/jobs/action_mailroom/inbound_email/incineration_job.rb @@ -0,0 +1,11 @@ +class ActionMailroom::InboundEmail::IncinerationJob < ApplicationJob + queue_as :action_mailroom_incineration + + def self.schedule(inbound_email) + set(wait: ActionMailroom::InboundEmail::Incineratable::INCINERATABLE_AFTER).perform_later(inbound_email) + end + + def perform(inbound_email) + inbound_email.incinerate + end +end diff --git a/app/models/action_mailroom/inbound_email.rb b/app/models/action_mailroom/inbound_email.rb index 92f80f26e3..5c351b74b8 100644 --- a/app/models/action_mailroom/inbound_email.rb +++ b/app/models/action_mailroom/inbound_email.rb @@ -1,6 +1,8 @@ require "mail" class ActionMailroom::InboundEmail < ActiveRecord::Base + include Incineratable + self.table_name = "action_mailroom_inbound_emails" has_one_attached :raw_email diff --git a/app/models/action_mailroom/inbound_email/incineratable.rb b/app/models/action_mailroom/inbound_email/incineratable.rb new file mode 100644 index 0000000000..83ccec89ba --- /dev/null +++ b/app/models/action_mailroom/inbound_email/incineratable.rb @@ -0,0 +1,31 @@ +module ActionMailroom::InboundEmail::Incineratable + extend ActiveSupport::Concern + + # TODO: Extract into framework configuration + INCINERATABLE_AFTER = 30.days + + included do + before_update :remember_to_incinerate_later + after_update_commit :incinerate_later, if: :need_to_incinerate_later? + end + + def incinerate + Incineration.new(self).run + end + + private + # TODO: Use enum change tracking once merged into Active Support + def remember_to_incinerate_later + if status_changed? && (delivered? || failed?) + @incinerate_later = true + end + end + + def need_to_incinerate_later? + @incinerate_later + end + + def incinerate_later + ActionMailroom::InboundEmail::IncinerationJob.schedule(self) + end +end diff --git a/app/models/action_mailroom/inbound_email/incineratable/incineration.rb b/app/models/action_mailroom/inbound_email/incineratable/incineration.rb new file mode 100644 index 0000000000..8b88c1fc5b --- /dev/null +++ b/app/models/action_mailroom/inbound_email/incineratable/incineration.rb @@ -0,0 +1,18 @@ +class ActionMailroom::InboundEmail::Incineratable::Incineration + def initialize(inbound_email) + @inbound_email = inbound_email + end + + def run + @inbound_email.destroy if due? && processed? + end + + private + def due? + @inbound_email.updated_at < ActionMailroom::InboundEmail::Incineratable::INCINERATABLE_AFTER.ago.end_of_day + end + + def processed? + @inbound_email.delivered? || @inbound_email.failed? + end +end |