diff --git a/lib/outboxer/message.rb b/lib/outboxer/message.rb index 0bfe0942..d31469cf 100644 --- a/lib/outboxer/message.rb +++ b/lib/outboxer/message.rb @@ -79,6 +79,20 @@ def failed!(id:, exception:) end end + def delete!(id:) + ActiveRecord::Base.connection_pool.with_connection do + ActiveRecord::Base.transaction do + outboxer_message = Models::Message.includes(exceptions: :frames).find_by!(id: id) + + outboxer_message.exceptions.each { |exception| exception.frames.destroy_all } + outboxer_message.exceptions.destroy_all + outboxer_message.destroy + end + end + + { 'id' => id } + end + def republish!(id:) ActiveRecord::Base.connection_pool.with_connection do outboxer_message = Models::Message.lock.find_by!(id: id) diff --git a/spec/lib/outboxer/message/delete_spec.rb b/spec/lib/outboxer/message/delete_spec.rb new file mode 100644 index 00000000..927f3f51 --- /dev/null +++ b/spec/lib/outboxer/message/delete_spec.rb @@ -0,0 +1,21 @@ +require 'spec_helper' + +module Outboxer + RSpec.describe Message do + describe '.delete!' do + let!(:message) { create(:outboxer_message, :failed) } + let!(:exception) { create(:outboxer_exception, message: message) } + let!(:frame) { create(:outboxer_frame, exception: exception) } + + let!(:result) { Message.delete!(id: message.id) } + + it 'deletes the message' do + expect(Models::Message).not_to exist(message.id) + end + + it 'returns the message id' do + expect(result['id']).to eq(message.id) + end + end + end +end