Skip to content

Commit 052055d

Browse files
committed
feat(webhooks): gracefully handle scenario where triggered webhook has been deleted while webhook was being executed
1 parent fe25acc commit 052055d

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

lib/pact_broker/webhooks/repository.rb

+11-5
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
require 'pact_broker/webhooks/triggered_webhook'
88
require 'pact_broker/webhooks/latest_triggered_webhook'
99
require 'pact_broker/webhooks/execution'
10+
require 'pact_broker/logging'
1011

1112
module PactBroker
1213
module Webhooks
13-
1414
class Repository
15+
include PactBroker::Logging
1516

1617
include Repositories
1718

@@ -125,10 +126,15 @@ def update_triggered_webhook_status triggered_webhook, status
125126
end
126127

127128
def create_execution triggered_webhook, webhook_execution_result
128-
Execution.create(
129-
triggered_webhook: triggered_webhook,
130-
success: webhook_execution_result.success?,
131-
logs: webhook_execution_result.logs)
129+
# TriggeredWebhook may have been deleted since the webhook execution started
130+
if TriggeredWebhook.where(id: triggered_webhook.id).any?
131+
Execution.create(
132+
triggered_webhook: triggered_webhook,
133+
success: webhook_execution_result.success?,
134+
logs: webhook_execution_result.logs)
135+
else
136+
logger.info("Could not save webhook execution for triggered webhook with id #{triggered_webhook.id} as it has been delete from the database")
137+
end
132138
end
133139

134140
def delete_triggered_webhooks_by_pacticipant pacticipant

spec/lib/pact_broker/webhooks/repository_spec.rb

+16-1
Original file line numberDiff line numberDiff line change
@@ -430,8 +430,9 @@ module Webhooks
430430

431431
let(:webhook_domain) { Repository.new.find_by_uuid td.webhook.uuid }
432432
let(:webhook_execution_result) { instance_double("PactBroker::Domain::WebhookExecutionResult", success?: true, logs: "logs") }
433+
let(:repository) { Repository.new }
433434

434-
subject { Repository.new.create_execution td.triggered_webhook, webhook_execution_result }
435+
subject { repository.create_execution td.triggered_webhook, webhook_execution_result }
435436

436437
it "saves a new webhook execution " do
437438
expect { subject }.to change { Execution.count }.by(1)
@@ -444,6 +445,20 @@ module Webhooks
444445
it "sets the logs" do
445446
expect(subject.logs).to eq "logs"
446447
end
448+
449+
context "when the triggered webhook has been deleted in the meantime" do
450+
before do
451+
TriggeredWebhook.where(id: td.triggered_webhook.id).delete
452+
allow(repository).to receive(:logger).and_return(logger)
453+
end
454+
455+
let(:logger) { double('logger') }
456+
457+
it "just logs the error" do
458+
expect(logger).to receive(:info).with(/triggered webhook with id #{td.triggered_webhook.id}/)
459+
subject
460+
end
461+
end
447462
end
448463

449464
describe "delete_triggered_webhooks_by_webhook_uuid" do

0 commit comments

Comments
 (0)