From a14f4ede87a62eaca59871e1e405ec4de159f86c Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Wed, 15 Sep 2021 18:12:56 +0530 Subject: [PATCH] chore: Sidebar icons for new inboxes (#3016) - Sidebar icons for line and telegram inboxes - Sentry fix for contact IP lookup job --- .../messages/facebook/message_builder.rb | 19 ++++++++++++++----- .../components/layout/SidebarItem.vue | 2 +- app/javascript/dashboard/helper/inbox.js | 5 ++++- app/javascript/shared/mixins/inboxMixin.js | 1 + app/jobs/contact_ip_lookup_job.rb | 3 ++- config/initializers/rack_attack.rb | 14 ++++++++++---- .../dialogflow/processor_service.rb | 10 +++++++--- .../slack/send_on_slack_service.rb | 2 ++ 8 files changed, 41 insertions(+), 15 deletions(-) diff --git a/app/builders/messages/facebook/message_builder.rb b/app/builders/messages/facebook/message_builder.rb index 23c9d92b4..4ffb4b101 100644 --- a/app/builders/messages/facebook/message_builder.rb +++ b/app/builders/messages/facebook/message_builder.rb @@ -148,6 +148,14 @@ class Messages::Facebook::MessageBuilder } end + def process_contact_params_result(result) + { + name: "#{result['first_name'] || 'John'} #{result['last_name'] || 'Doe'}", + account_id: @inbox.account_id, + remote_avatar_url: result['profile_pic'] || '' + } + end + def contact_params begin k = Koala::Facebook::API.new(@inbox.channel.page_access_token) if @inbox.facebook? @@ -155,14 +163,15 @@ class Messages::Facebook::MessageBuilder rescue Koala::Facebook::AuthenticationError @inbox.channel.authorization_error! raise + rescue Koala::Facebook::ClientError => e + result = {} + # OAuthException, code: 100, error_subcode: 2018218, message: (#100) No profile available for this user + # We don't need to capture this error as we don't care about contact params in case of echo messages + Sentry.capture_exception(e) unless outgoing_echo? rescue StandardError => e result = {} Sentry.capture_exception(e) end - { - name: "#{result['first_name'] || 'John'} #{result['last_name'] || 'Doe'}", - account_id: @inbox.account_id, - remote_avatar_url: result['profile_pic'] || '' - } + process_contact_params_result(result) end end diff --git a/app/javascript/dashboard/components/layout/SidebarItem.vue b/app/javascript/dashboard/components/layout/SidebarItem.vue index 1799a829a..4576045fc 100644 --- a/app/javascript/dashboard/components/layout/SidebarItem.vue +++ b/app/javascript/dashboard/components/layout/SidebarItem.vue @@ -33,7 +33,7 @@
diff --git a/app/javascript/dashboard/helper/inbox.js b/app/javascript/dashboard/helper/inbox.js index af8917dab..3b91f1bc9 100644 --- a/app/javascript/dashboard/helper/inbox.js +++ b/app/javascript/dashboard/helper/inbox.js @@ -22,7 +22,10 @@ export const getInboxClassByType = (type, phoneNumber) => { case INBOX_TYPES.EMAIL: return 'ion-ios-email'; + case INBOX_TYPES.TELEGRAM: + return 'ion-ios-navigate'; + default: - return ''; + return 'ion-ios-chatbubble'; } }; diff --git a/app/javascript/shared/mixins/inboxMixin.js b/app/javascript/shared/mixins/inboxMixin.js index c08c5876b..3afd16508 100644 --- a/app/javascript/shared/mixins/inboxMixin.js +++ b/app/javascript/shared/mixins/inboxMixin.js @@ -5,6 +5,7 @@ export const INBOX_TYPES = { TWILIO: 'Channel::TwilioSms', API: 'Channel::Api', EMAIL: 'Channel::Email', + TELEGRAM: 'Channel::Telegram', LINE: 'Channel::Line', }; diff --git a/app/jobs/contact_ip_lookup_job.rb b/app/jobs/contact_ip_lookup_job.rb index 9b9d7f4b3..22ced17fe 100644 --- a/app/jobs/contact_ip_lookup_job.rb +++ b/app/jobs/contact_ip_lookup_job.rb @@ -27,6 +27,7 @@ class ContactIpLookupJob < ApplicationJob geocoder_result = Geocoder.search(ip).first return unless geocoder_result + contact.additional_attributes ||= {} contact.additional_attributes['city'] = geocoder_result.city contact.additional_attributes['country'] = geocoder_result.country contact.additional_attributes['country_code'] = geocoder_result.country_code @@ -34,7 +35,7 @@ class ContactIpLookupJob < ApplicationJob end def get_contact_ip(contact) - contact.additional_attributes['updated_at_ip'] || contact.additional_attributes['created_at_ip'] + contact.additional_attributes&.dig('updated_at_ip') || contact.additional_attributes&.dig('created_at_ip') end def ensure_look_up_db diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb index 3070d2877..1e1aa9cf8 100644 --- a/config/initializers/rack_attack.rb +++ b/config/initializers/rack_attack.rb @@ -54,13 +54,19 @@ class Rack::Attack # ref: https://github.com/rack/rack-attack/issues/399 throttle('login/email', limit: 20, period: 5.minutes) do |req| - email = req.params['email'].presence || ActionDispatch::Request.new(req.env).params['email'].presence - email.to_s.downcase.gsub(/\s+/, '') if req.path == '/auth/sign_in' && req.post? + if req.path == '/auth/sign_in' && req.post? + # NOTE: This line used to throw ArgumentError /rails/action_mailbox/sendgrid/inbound_emails : invalid byte sequence in UTF-8 + # Hence placed in the if block + email = req.params['email'].presence || ActionDispatch::Request.new(req.env).params['email'].presence + email.to_s.downcase.gsub(/\s+/, '') + end end throttle('reset_password/email', limit: 5, period: 1.hour) do |req| - email = req.params['email'].presence || ActionDispatch::Request.new(req.env).params['email'].presence - email.to_s.downcase.gsub(/\s+/, '') if req.path == '/auth/password' && req.post? + if req.path == '/auth/password' && req.post? + email = req.params['email'].presence || ActionDispatch::Request.new(req.env).params['email'].presence + email.to_s.downcase.gsub(/\s+/, '') + end end end diff --git a/lib/integrations/dialogflow/processor_service.rb b/lib/integrations/dialogflow/processor_service.rb index 32359813a..66911313f 100644 --- a/lib/integrations/dialogflow/processor_service.rb +++ b/lib/integrations/dialogflow/processor_service.rb @@ -7,14 +7,18 @@ class Integrations::Dialogflow::ProcessorService return unless processable_message?(message) return unless message.conversation.pending? - response = get_dialogflow_response(message.conversation.contact_inbox.source_id, message_content(message)) - process_response(message, response) + content = message_content(message) + response = get_dialogflow_response(message.conversation.contact_inbox.source_id, content) if content.present? + process_response(message, response) if response.present? end private def message_content(message) - return message.content_attributes['submitted_values'].first['value'] if event_name == 'message.updated' + # TODO: might needs to change this to a way that we fetch the updated value from event data instead + # cause the message.updated event could be that that the message was deleted + + return message.content_attributes['submitted_values']&.dig 'value' if event_name == 'message.updated' message.content end diff --git a/lib/integrations/slack/send_on_slack_service.rb b/lib/integrations/slack/send_on_slack_service.rb index 87040c04a..ba3e68669 100644 --- a/lib/integrations/slack/send_on_slack_service.rb +++ b/lib/integrations/slack/send_on_slack_service.rb @@ -45,6 +45,8 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService end def send_message + return if message_content.blank? + @slack_message = slack_client.chat_postMessage( channel: hook.reference_id, text: message_content,