diff --git a/app/models/event.rb b/app/models/event.rb index 64fdf15..cd6b7d7 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -72,6 +72,7 @@ def obj_hash # After the event is persisted successfully to the database, we index the event in OpenSearch. after_commit -> { EventIndexJob.perform_later(self) } + after_commit -> { SqsUtilities.send_events_other_doi_job_message({ subj_id: subj_id, obj_id: obj_id }) } # OpenSearch Mappings mapping dynamic: "false" do diff --git a/app/utilities/sqs_utilities.rb b/app/utilities/sqs_utilities.rb new file mode 100644 index 0000000..7430347 --- /dev/null +++ b/app/utilities/sqs_utilities.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module SqsUtilities + require "aws-sdk-sqs" + + class << self + def send_events_other_doi_job_message(data) + send_message(data, shoryuken_class: "OtherDoiJob", queue_name: "events_other_doi_job") + end + + private + + def send_message(body, options = {}) + sqs = create_sqs_client + queue_name_prefix = ENV["SQS_PREFIX"].presence || Rails.env + queue_url = sqs.get_queue_url(queue_name: "#{queue_name_prefix}_#{options[:queue_name]}").queue_url + + options = { + queue_url: queue_url, + message_attributes: { + "shoryuken_class" => { + string_value: options[:shoryuken_class], + data_type: "String", + }, + }, + message_body: body.to_json, + } + + sqs.send_message(options) + rescue => error + Rails.logger.error("Failed to send message to #{queue_url}. #{error.inspect}.") + end + + def create_sqs_client + if Rails.env.development? + Aws::SQS::Client.new(endpoint: ENV["AWS_ENDPOINT"]) + else + Aws::SQS::Client.new + end + end + end +end diff --git a/spec/utlilities/sqs_utilities_spec.rb b/spec/utlilities/sqs_utilities_spec.rb new file mode 100644 index 0000000..bb80e51 --- /dev/null +++ b/spec/utlilities/sqs_utilities_spec.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe(SqsUtilities) do + let(:sqs_client) { instance_double(Aws::SQS::Client) } + + before do + allow(Aws::SQS::Client).to(receive(:new).and_return(sqs_client)) + + allow(ENV).to(receive(:[]).and_call_original) + + allow(ENV).to(receive(:[]).with("SQS_PREFIX").and_return("test")) + + allow(ENV).to(receive(:[]).with("AWS_ENDPOINT").and_return("http://aws.fake.com")) + + allow(sqs_client).to(receive(:send_message)) + end + + describe "#send_events_other_doi_job_message" do + let(:data) { { subj_id: "subj_id", obj_id: "obj_id" } } + let(:queue_url) { "https://sqs.fake.aws/test_events_other_doi_job" } + + before do + allow(sqs_client) + .to(receive(:get_queue_url) + .and_return(instance_double(Aws::SQS::Types::GetQueueUrlResult, queue_url: queue_url))) + end + + describe "when in development" do + before do + allow(Rails.env).to(receive(:development?).and_return(true)) + end + + it "calls send_message with correct params" do + described_class.send_events_other_doi_job_message(data) + + expect(sqs_client).to(have_received(:send_message).with( + hash_including( + queue_url: queue_url, + message_attributes: hash_including( + "shoryuken_class" => hash_including(string_value: "OtherDoiJob"), + ), + message_body: data.to_json, + ), + )) + end + end + + describe "when not in development" do + before do + allow(Rails.env).to(receive(:development?).and_return(false)) + end + + it "calls send_message with correct params" do + described_class.send_events_other_doi_job_message(data) + + expect(sqs_client).to(have_received(:send_message).with( + hash_including( + queue_url: queue_url, + message_attributes: hash_including( + "shoryuken_class" => hash_including(string_value: "OtherDoiJob"), + ), + message_body: data.to_json, + ), + )) + end + end + + describe "when SQS send fails" do + before do + allow(Rails.logger).to(receive(:error)) + allow(sqs_client).to(receive(:send_message).and_raise(StandardError, "Oops")) + end + + it "logs an error" do + described_class.send_events_other_doi_job_message(data) + expect(Rails.logger).to(have_received(:error)) + end + end + end +end