diff --git a/app/jobs/webhook/cleanup_deliveries_job.rb b/app/jobs/webhook/cleanup_deliveries_job.rb new file mode 100644 index 000000000..63f87ead5 --- /dev/null +++ b/app/jobs/webhook/cleanup_deliveries_job.rb @@ -0,0 +1,7 @@ +class Webhook::CleanupDeliveriesJob < ApplicationJob + def perform + ApplicationRecord.with_each_tenant do + Webhook::Delivery.cleanup + end + end +end diff --git a/app/models/webhook/delivery.rb b/app/models/webhook/delivery.rb index 3624a2d0b..780d6772d 100644 --- a/app/models/webhook/delivery.rb +++ b/app/models/webhook/delivery.rb @@ -1,4 +1,5 @@ class Webhook::Delivery < ApplicationRecord + STALE_TRESHOLD = 7.days USER_AGENT = "fizzy/1.0.0 Webhook" ENDPOINT_TIMEOUT = 7.seconds DNS_RESOLUTION_TIMEOUT = 2 @@ -18,9 +19,14 @@ class Webhook::Delivery < ApplicationRecord enum :state, %w[ pending in_progress completed errored ].index_by(&:itself), default: :pending scope :ordered, -> { order created_at: :desc, id: :desc } + scope :stale, -> { where(created_at: ...STALE_TRESHOLD.ago) } after_create_commit :deliver_later + def self.cleanup + stale.delete_all + end + def deliver_later Webhook::DeliveryJob.perform_later(self) end diff --git a/config/recurring.yml b/config/recurring.yml index 45410859d..d6d68ae88 100644 --- a/config/recurring.yml +++ b/config/recurring.yml @@ -26,6 +26,9 @@ production: &production generate_weekly_highlights: command: "User.generate_all_weekly_highlights_later" schedule: every sunday at noon + cleanup_webhook_deliveries: + command: "Webhook::CleanupDeliveriesJob" + schedule: every 4 hours beta: *production staging: *production diff --git a/test/models/webhook/delivery_test.rb b/test/models/webhook/delivery_test.rb index b882559a7..8de7b6713 100644 --- a/test/models/webhook/delivery_test.rb +++ b/test/models/webhook/delivery_test.rb @@ -190,4 +190,17 @@ class Webhook::DeliveryTest < ActiveSupport::TestCase assert_requested request_stub assert delivery.succeeded? end + + test "cleanup" do + webhook = webhooks(:active) + event = events(:layout_commented) + + fresh_delivery = Webhook::Delivery.create!(webhook: webhook, event: event) + stale_delivery = Webhook::Delivery.create!(webhook: webhook, event: event, created_at: 8.days.ago) + + Webhook::Delivery.cleanup + + assert Webhook::Delivery.exists?(fresh_delivery.id) + assert_not Webhook::Delivery.exists?(stale_delivery.id) + end end