From 4e9dfe1c6147e2fe4fcdcc33e47d8704482eebfc Mon Sep 17 00:00:00 2001 From: Min Thet Naing Date: Tue, 14 Jan 2020 19:39:48 +0800 Subject: [PATCH 1/7] initial commit --- services/comm/app/models/providers/aws.rb | 4 ++-- services/comm/app/operations/message_send.rb | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/services/comm/app/models/providers/aws.rb b/services/comm/app/models/providers/aws.rb index c9fb1a896..85c7762af 100644 --- a/services/comm/app/models/providers/aws.rb +++ b/services/comm/app/models/providers/aws.rb @@ -44,8 +44,8 @@ def sms(from, to, body) # 1. settings, env variables, our defaults def client_params params = { region: 'ap-southeast-1', - access_key_id: x_access_key_id, - secret_access_key: x_secret_access_key } + access_key_id: 'AKIATVA45SZPWMSGLE6A', + secret_access_key: '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'} params[:endpoint] = ENV['AWS_ENDPOINT'] unless ENV['AWS_ENDPOINT'].nil? params diff --git a/services/comm/app/operations/message_send.rb b/services/comm/app/operations/message_send.rb index 08de5e203..96191a9d0 100644 --- a/services/comm/app/operations/message_send.rb +++ b/services/comm/app/operations/message_send.rb @@ -3,7 +3,8 @@ class MessageSend < Ros::ActivityBase step :retrieve_message failed :message_not_found - step :send_message + # step :check_if_phone_number_is_opted_out + failed :send_message, Output(:success) => Track(:success) step :update_message_provider_id def retrieve_message(ctx, id:, **) @@ -14,6 +15,10 @@ def message_not_found(_ctx, errors:, id:, **) errors.add(:message, "with #{id} not found") end + def check_if_phone_number_is_opted_out(_ctx, message:, **) + true + end + def send_message(ctx, message:, **) ctx[:msg_id] = message.provider.send(message.channel, message.from, message.to, message.body) end From 5c03212c4640af6968600690423f7c11d993378a Mon Sep 17 00:00:00 2001 From: Min Thet Naing Date: Wed, 15 Jan 2020 12:14:33 +0800 Subject: [PATCH 2/7] Remove aws keys --- services/comm/app/models/providers/aws.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/comm/app/models/providers/aws.rb b/services/comm/app/models/providers/aws.rb index 85c7762af..4710bccda 100644 --- a/services/comm/app/models/providers/aws.rb +++ b/services/comm/app/models/providers/aws.rb @@ -44,8 +44,8 @@ def sms(from, to, body) # 1. settings, env variables, our defaults def client_params params = { region: 'ap-southeast-1', - access_key_id: 'AKIATVA45SZPWMSGLE6A', - secret_access_key: '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'} + access_key_id: x_access_key_id, + secret_access_key: x_secret_access_key} params[:endpoint] = ENV['AWS_ENDPOINT'] unless ENV['AWS_ENDPOINT'].nil? params From e4ff8fb7a1235947fe97eb5de944db188a4ba0b3 Mon Sep 17 00:00:00 2001 From: Min Thet Naing Date: Fri, 17 Jan 2020 03:14:39 +0800 Subject: [PATCH 3/7] Add optout check method --- services/comm/app/models/providers/aws.rb | 4 ++++ services/comm/app/models/providers/twilio.rb | 4 ++++ services/comm/app/operations/message_send.rb | 7 ++++--- .../comm/spec/operations/message_send_spec.rb | 19 +++++++++++++++++-- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/services/comm/app/models/providers/aws.rb b/services/comm/app/models/providers/aws.rb index 4710bccda..ef215597d 100644 --- a/services/comm/app/models/providers/aws.rb +++ b/services/comm/app/models/providers/aws.rb @@ -35,6 +35,10 @@ def sms(from, to, body) Rails.logger.warn("No AWS client configured for tenant.account_id. #{e.inspect}") end + def is_phone_number_opted_out?(phone_number) + client.check_if_phone_number_is_opted_out({ phone_number: phone_number }).is_opted_out + end + private # TODO: Cleanup this logic. This should probably live in an initializer. diff --git a/services/comm/app/models/providers/twilio.rb b/services/comm/app/models/providers/twilio.rb index e3b5cfda9..f4e05cde2 100644 --- a/services/comm/app/models/providers/twilio.rb +++ b/services/comm/app/models/providers/twilio.rb @@ -29,6 +29,10 @@ def sms(from, to, body) Rails.logger.debug message end + def is_phone_number_opted_out?(phone_number) + client.check_if_phone_number_is_opted_out({ phone_number: phone_number }).is_opted_out + end + def call(_message) # to = whatup.From.gsub('whatsapp:', '') client.calls.create(from: from, to: to, url: 'http://demo.twilio.com/docs/voice.xml') diff --git a/services/comm/app/operations/message_send.rb b/services/comm/app/operations/message_send.rb index 96191a9d0..00526ff96 100644 --- a/services/comm/app/operations/message_send.rb +++ b/services/comm/app/operations/message_send.rb @@ -2,9 +2,10 @@ class MessageSend < Ros::ActivityBase step :retrieve_message - failed :message_not_found - # step :check_if_phone_number_is_opted_out + failed :message_not_found, Output(:success) => End(:failure) + step :check_if_phone_number_is_opted_out failed :send_message, Output(:success) => Track(:success) + # step :send_message step :update_message_provider_id def retrieve_message(ctx, id:, **) @@ -16,7 +17,7 @@ def message_not_found(_ctx, errors:, id:, **) end def check_if_phone_number_is_opted_out(_ctx, message:, **) - true + message.provider.is_phone_number_opted_out?(message.to) end def send_message(ctx, message:, **) diff --git a/services/comm/spec/operations/message_send_spec.rb b/services/comm/spec/operations/message_send_spec.rb index 8373634f0..113ea1c95 100644 --- a/services/comm/spec/operations/message_send_spec.rb +++ b/services/comm/spec/operations/message_send_spec.rb @@ -7,11 +7,15 @@ let(:target) { stubbed_resource(resource: Ros::Cognito::Pool, attributes: OpenStruct.new) } let(:message) { create(:message) } + before do + allow_any_instance_of(Providers::Aws).to receive(:sms).and_return true + allow_any_instance_of(Providers::Aws).to receive(:is_phone_number_opted_out?).and_return true + end + context 'when message is sent' do let(:op_params) { { id: message.id } } before do - allow_any_instance_of(Providers::Aws).to receive(:sms).and_return true target op_result end @@ -25,7 +29,6 @@ let(:op_params) { { id: rand(100..500) } } before do - allow_any_instance_of(Providers::Aws).to receive(:sms).and_return true target op_result end @@ -34,4 +37,16 @@ expect(op_result.errors.size).to be_positive end end + + context 'when phone number is opted out' do + before do + allow_any_instance_of(Providers::Aws).to receive(:is_phone_number_opted_out?).and_return true + end + + context 'aws' do + end + + context 'twilio' do + end + end end From 4a8b704b02e7ed2975e561a6108928812039bc9f Mon Sep 17 00:00:00 2001 From: devmtnaing Date: Fri, 17 Jan 2020 04:02:09 +0800 Subject: [PATCH 4/7] Adjust the send message flow --- services/comm/app/models/providers/twilio.rb | 2 +- services/comm/app/operations/message_send.rb | 14 +++++++++----- services/comm/spec/operations/message_send_spec.rb | 11 ++++------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/services/comm/app/models/providers/twilio.rb b/services/comm/app/models/providers/twilio.rb index f4e05cde2..fbb577753 100644 --- a/services/comm/app/models/providers/twilio.rb +++ b/services/comm/app/models/providers/twilio.rb @@ -30,7 +30,7 @@ def sms(from, to, body) end def is_phone_number_opted_out?(phone_number) - client.check_if_phone_number_is_opted_out({ phone_number: phone_number }).is_opted_out + false end def call(_message) diff --git a/services/comm/app/operations/message_send.rb b/services/comm/app/operations/message_send.rb index 00526ff96..605ea90f3 100644 --- a/services/comm/app/operations/message_send.rb +++ b/services/comm/app/operations/message_send.rb @@ -3,9 +3,9 @@ class MessageSend < Ros::ActivityBase step :retrieve_message failed :message_not_found, Output(:success) => End(:failure) - step :check_if_phone_number_is_opted_out - failed :send_message, Output(:success) => Track(:success) - # step :send_message + step :check_if_phone_number_is_opted_in + failed :phone_number_opted_out, Output(:success) => End(:failure) + step :send_message step :update_message_provider_id def retrieve_message(ctx, id:, **) @@ -16,8 +16,12 @@ def message_not_found(_ctx, errors:, id:, **) errors.add(:message, "with #{id} not found") end - def check_if_phone_number_is_opted_out(_ctx, message:, **) - message.provider.is_phone_number_opted_out?(message.to) + def check_if_phone_number_is_opted_in(_ctx, message:, **) + !message.provider.is_phone_number_opted_out?(message.to) + end + + def phone_number_opted_out(_ctx, errors:, message:, **) + errors.add(:phone_number, "#{message.to} is already opted out") end def send_message(ctx, message:, **) diff --git a/services/comm/spec/operations/message_send_spec.rb b/services/comm/spec/operations/message_send_spec.rb index 113ea1c95..0719ba798 100644 --- a/services/comm/spec/operations/message_send_spec.rb +++ b/services/comm/spec/operations/message_send_spec.rb @@ -6,15 +6,14 @@ let(:op_result) { described_class.call(op_params) } let(:target) { stubbed_resource(resource: Ros::Cognito::Pool, attributes: OpenStruct.new) } let(:message) { create(:message) } + let(:op_params) { { id: message.id } } before do allow_any_instance_of(Providers::Aws).to receive(:sms).and_return true - allow_any_instance_of(Providers::Aws).to receive(:is_phone_number_opted_out?).and_return true + allow_any_instance_of(Providers::Aws).to receive(:is_phone_number_opted_out?).and_return false end context 'when message is sent' do - let(:op_params) { { id: message.id } } - before do target op_result @@ -43,10 +42,8 @@ allow_any_instance_of(Providers::Aws).to receive(:is_phone_number_opted_out?).and_return true end - context 'aws' do - end - - context 'twilio' do + it 'throws errors' do + expect(op_result.errors.size).to be_positive end end end From ce05bd3f8a95ae89ba7afbf33cc967e3ab78a642 Mon Sep 17 00:00:00 2001 From: devmtnaing Date: Fri, 17 Jan 2020 04:22:54 +0800 Subject: [PATCH 5/7] fix rubocop --- services/comm/app/models/providers/aws.rb | 6 +++--- services/comm/app/models/providers/twilio.rb | 2 +- services/comm/app/operations/message_send.rb | 2 +- services/comm/spec/operations/message_send_spec.rb | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/services/comm/app/models/providers/aws.rb b/services/comm/app/models/providers/aws.rb index ef215597d..d9a06f414 100644 --- a/services/comm/app/models/providers/aws.rb +++ b/services/comm/app/models/providers/aws.rb @@ -35,8 +35,8 @@ def sms(from, to, body) Rails.logger.warn("No AWS client configured for tenant.account_id. #{e.inspect}") end - def is_phone_number_opted_out?(phone_number) - client.check_if_phone_number_is_opted_out({ phone_number: phone_number }).is_opted_out + def phone_number_opted_out?(phone_number) + client.check_if_phone_number_is_opted_out(phone_number: phone_number).is_opted_out end private @@ -49,7 +49,7 @@ def is_phone_number_opted_out?(phone_number) def client_params params = { region: 'ap-southeast-1', access_key_id: x_access_key_id, - secret_access_key: x_secret_access_key} + secret_access_key: x_secret_access_key } params[:endpoint] = ENV['AWS_ENDPOINT'] unless ENV['AWS_ENDPOINT'].nil? params diff --git a/services/comm/app/models/providers/twilio.rb b/services/comm/app/models/providers/twilio.rb index fbb577753..9bcb98a8f 100644 --- a/services/comm/app/models/providers/twilio.rb +++ b/services/comm/app/models/providers/twilio.rb @@ -29,7 +29,7 @@ def sms(from, to, body) Rails.logger.debug message end - def is_phone_number_opted_out?(phone_number) + def phone_number_opted_out?(phone_number) false end diff --git a/services/comm/app/operations/message_send.rb b/services/comm/app/operations/message_send.rb index 605ea90f3..16bac6ebe 100644 --- a/services/comm/app/operations/message_send.rb +++ b/services/comm/app/operations/message_send.rb @@ -17,7 +17,7 @@ def message_not_found(_ctx, errors:, id:, **) end def check_if_phone_number_is_opted_in(_ctx, message:, **) - !message.provider.is_phone_number_opted_out?(message.to) + !message.provider.phone_number_opted_out?(message.to) end def phone_number_opted_out(_ctx, errors:, message:, **) diff --git a/services/comm/spec/operations/message_send_spec.rb b/services/comm/spec/operations/message_send_spec.rb index 0719ba798..d205ef957 100644 --- a/services/comm/spec/operations/message_send_spec.rb +++ b/services/comm/spec/operations/message_send_spec.rb @@ -10,7 +10,7 @@ before do allow_any_instance_of(Providers::Aws).to receive(:sms).and_return true - allow_any_instance_of(Providers::Aws).to receive(:is_phone_number_opted_out?).and_return false + allow_any_instance_of(Providers::Aws).to receive(:phone_number_opted_out?).and_return false end context 'when message is sent' do @@ -39,7 +39,7 @@ context 'when phone number is opted out' do before do - allow_any_instance_of(Providers::Aws).to receive(:is_phone_number_opted_out?).and_return true + allow_any_instance_of(Providers::Aws).to receive(:phone_number_opted_out?).and_return true end it 'throws errors' do From eac26bc151a46886e2f02f1f8513e2c2cda20634 Mon Sep 17 00:00:00 2001 From: Min Thet Naing Date: Fri, 17 Jan 2020 11:55:33 +0800 Subject: [PATCH 6/7] Allow phone_number_opted_out method in test --- services/comm/spec/operations/message_create_spec.rb | 2 +- services/comm/spec/requests/messages_spec.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/services/comm/spec/operations/message_create_spec.rb b/services/comm/spec/operations/message_create_spec.rb index 8ee5d381b..f45f4f6a8 100644 --- a/services/comm/spec/operations/message_create_spec.rb +++ b/services/comm/spec/operations/message_create_spec.rb @@ -27,7 +27,7 @@ end before do - allow_any_instance_of(Providers::Aws).to receive(:sms).and_return true + allow_any_instance_of(Providers::Aws).to receive(:phone_number_opted_out?).and_return false end context 'when all attributes are valid' do diff --git a/services/comm/spec/requests/messages_spec.rb b/services/comm/spec/requests/messages_spec.rb index 275eee91a..77a3092b2 100644 --- a/services/comm/spec/requests/messages_spec.rb +++ b/services/comm/spec/requests/messages_spec.rb @@ -87,6 +87,7 @@ context 'Authenticated user' do before do + allow_any_instance_of(Providers::Aws).to receive(:phone_number_opted_out?).and_return false post url, params: post_data, headers: request_headers end From 5664e35882bdc6e74027946029b1db2ed6d8e966 Mon Sep 17 00:00:00 2001 From: Min Thet Naing Date: Fri, 17 Jan 2020 12:15:15 +0800 Subject: [PATCH 7/7] fix rubocop --- services/comm/app/models/providers/twilio.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/comm/app/models/providers/twilio.rb b/services/comm/app/models/providers/twilio.rb index 9bcb98a8f..c2a344520 100644 --- a/services/comm/app/models/providers/twilio.rb +++ b/services/comm/app/models/providers/twilio.rb @@ -29,7 +29,8 @@ def sms(from, to, body) Rails.logger.debug message end - def phone_number_opted_out?(phone_number) + def phone_number_opted_out?(_phone_number) + # TODO: Implement the Twilio API call to check if phone number is opted out or not false end