parent
2890339734
commit
e46aa1aa64
9 changed files with 112 additions and 22 deletions
|
@ -13,6 +13,7 @@ Metrics/ClassLength:
|
|||
- 'app/models/conversation.rb'
|
||||
- 'app/mailers/conversation_reply_mailer.rb'
|
||||
- 'app/models/message.rb'
|
||||
- 'app/builders/messages/facebook/message_builder.rb'
|
||||
RSpec/ExampleLength:
|
||||
Max: 25
|
||||
Style/Documentation:
|
||||
|
|
|
@ -17,10 +17,15 @@ class Messages::Facebook::MessageBuilder
|
|||
end
|
||||
|
||||
def perform
|
||||
# This channel might require reauthorization, may be owner might have changed the fb password
|
||||
return if @inbox.channel.reauthorization_required?
|
||||
|
||||
ActiveRecord::Base.transaction do
|
||||
build_contact
|
||||
build_message
|
||||
end
|
||||
rescue Koala::Facebook::AuthenticationError
|
||||
Rails.logger.info "Facebook Authorization expired for Inbox #{@inbox.id}"
|
||||
rescue StandardError => e
|
||||
Raven.capture_exception(e)
|
||||
true
|
||||
|
@ -136,6 +141,9 @@ class Messages::Facebook::MessageBuilder
|
|||
begin
|
||||
k = Koala::Facebook::API.new(@inbox.channel.page_access_token) if @inbox.facebook?
|
||||
result = k.get_object(@sender_id) || {}
|
||||
rescue Koala::Facebook::AuthenticationError
|
||||
@inbox.channel.authorization_error!
|
||||
raise
|
||||
rescue StandardError => e
|
||||
result = {}
|
||||
Raven.capture_exception(e)
|
||||
|
|
|
@ -1,10 +1,23 @@
|
|||
class AdministratorNotifications::ChannelNotificationsMailer < ApplicationMailer
|
||||
def slack_disconnect(account)
|
||||
def slack_disconnect
|
||||
return unless smtp_config_set_or_development?
|
||||
|
||||
emails = account.administrators.pluck(:email)
|
||||
subject = 'Your Slack integration has expired'
|
||||
@action_url = "#{ENV['FRONTEND_URL']}/app/accounts/#{account.id}/settings/integrations/slack"
|
||||
send_mail_with_liquid(to: emails, subject: subject) and return
|
||||
@action_url = "#{ENV['FRONTEND_URL']}/app/accounts/#{Current.account.id}/settings/integrations/slack"
|
||||
send_mail_with_liquid(to: admin_emails, subject: subject) and return
|
||||
end
|
||||
|
||||
def facebook_disconnect(inbox)
|
||||
return unless smtp_config_set_or_development?
|
||||
|
||||
subject = 'Your Facebook page connection has expired'
|
||||
@action_url = "#{ENV['FRONTEND_URL']}/app/accounts/#{Current.account.id}/settings/inboxes/#{inbox.id}"
|
||||
send_mail_with_liquid(to: admin_emails, subject: subject) and return
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def admin_emails
|
||||
Current.account.administrators.pluck(:email)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -36,9 +36,13 @@ module Reauthorizable
|
|||
# could used to manually prompt reauthorization if auth scope changes
|
||||
def prompt_reauthorization!
|
||||
::Redis::Alfred.set(reauthorization_required_key, true)
|
||||
return unless (is_a? Integrations::Hook) && slack?
|
||||
|
||||
AdministratorNotifications::ChannelNotificationsMailer.with(account: account).slack_disconnect(account)&.deliver_later
|
||||
if (is_a? Integrations::Hook) && slack?
|
||||
AdministratorNotifications::ChannelNotificationsMailer.with(account: account).slack_disconnect.deliver_later
|
||||
end
|
||||
return unless is_a? Channel::FacebookPage
|
||||
|
||||
AdministratorNotifications::ChannelNotificationsMailer.with(account: account).facebook_disconnect(inbox).deliver_later
|
||||
end
|
||||
|
||||
# call this after you successfully Reauthorized the object in UI
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
<p>Hello,</p>
|
||||
|
||||
<p>Your Facebook Inbox Access has expired. </p>
|
||||
<p>Please reconnect Facebook Page to continue receiving messages in Chatwoot</p>
|
||||
|
||||
<p>
|
||||
Click <a href="{{action_url}}">here</a> to re-connect.
|
||||
</p>
|
|
@ -8,7 +8,8 @@ describe ::Messages::Facebook::MessageBuilder do
|
|||
let!(:incoming_fb_text_message) { Integrations::Facebook::MessageParser.new(message_object) }
|
||||
let(:fb_object) { double }
|
||||
|
||||
before do
|
||||
describe '#perform' do
|
||||
it 'creates contact and message for the facebook inbox' do
|
||||
allow(Koala::Facebook::API).to receive(:new).and_return(fb_object)
|
||||
allow(fb_object).to receive(:get_object).and_return(
|
||||
{
|
||||
|
@ -18,10 +19,6 @@ describe ::Messages::Facebook::MessageBuilder do
|
|||
profile_pic: 'https://via.placeholder.com/250x250.png'
|
||||
}.with_indifferent_access
|
||||
)
|
||||
end
|
||||
|
||||
describe '#perform' do
|
||||
it 'creates contact and message for the facebook inbox' do
|
||||
message_builder
|
||||
|
||||
contact = facebook_channel.inbox.contacts.first
|
||||
|
@ -30,5 +27,13 @@ describe ::Messages::Facebook::MessageBuilder do
|
|||
expect(contact.name).to eq('Jane Dae')
|
||||
expect(message.content).to eq('facebook message')
|
||||
end
|
||||
|
||||
it 'increments channel authorization_error_count when error is thrown' do
|
||||
allow(Koala::Facebook::API).to receive(:new).and_return(fb_object)
|
||||
allow(fb_object).to receive(:get_object).and_raise(Koala::Facebook::AuthenticationError.new(500, 'Error validating access token'))
|
||||
message_builder
|
||||
|
||||
expect(facebook_channel.authorization_error_count).to eq(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe AdministratorNotifications::ChannelNotificationsMailer, type: :mailer do
|
||||
let(:class_instance) { described_class.new }
|
||||
let!(:account) { create(:account) }
|
||||
let!(:administrator) { create(:user, :administrator, email: 'agent1@example.com', account: account) }
|
||||
|
||||
before do
|
||||
allow(described_class).to receive(:new).and_return(class_instance)
|
||||
allow(class_instance).to receive(:smtp_config_set_or_development?).and_return(true)
|
||||
end
|
||||
|
||||
describe 'slack_disconnect' do
|
||||
let(:mail) { described_class.with(account: account).slack_disconnect.deliver_now }
|
||||
|
||||
it 'renders the subject' do
|
||||
expect(mail.subject).to eq('Your Slack integration has expired')
|
||||
end
|
||||
|
||||
it 'renders the receiver email' do
|
||||
expect(mail.to).to eq([administrator.email])
|
||||
end
|
||||
end
|
||||
|
||||
describe 'facebook_disconnect' do
|
||||
let!(:facebook_channel) { create(:channel_facebook_page, account: account) }
|
||||
let!(:facebook_inbox) { create(:inbox, channel: facebook_channel, account: account) }
|
||||
let(:mail) { described_class.with(account: account).facebook_disconnect(facebook_inbox).deliver_now }
|
||||
|
||||
it 'renders the subject' do
|
||||
expect(mail.subject).to eq('Your Facebook page connection has expired')
|
||||
end
|
||||
|
||||
it 'renders the receiver email' do
|
||||
expect(mail.to).to eq([administrator.email])
|
||||
end
|
||||
end
|
||||
end
|
|
@ -14,7 +14,7 @@ RSpec.describe AgentNotifications::ConversationNotificationsMailer, type: :maile
|
|||
end
|
||||
|
||||
describe 'conversation_creation' do
|
||||
let(:mail) { described_class.conversation_creation(conversation, agent).deliver_now }
|
||||
let(:mail) { described_class.with(account: account).conversation_creation(conversation, agent).deliver_now }
|
||||
|
||||
it 'renders the subject' do
|
||||
expect(mail.subject).to eq("#{agent.available_name}, A new conversation [ID - #{conversation
|
||||
|
@ -27,7 +27,7 @@ RSpec.describe AgentNotifications::ConversationNotificationsMailer, type: :maile
|
|||
end
|
||||
|
||||
describe 'conversation_assignment' do
|
||||
let(:mail) { described_class.conversation_assignment(conversation, agent).deliver_now }
|
||||
let(:mail) { described_class.with(account: account).conversation_assignment(conversation, agent).deliver_now }
|
||||
|
||||
it 'renders the subject' do
|
||||
expect(mail.subject).to eq("#{agent.available_name}, A new conversation [ID - #{conversation.display_id}] has been assigned to you.")
|
||||
|
@ -40,7 +40,7 @@ RSpec.describe AgentNotifications::ConversationNotificationsMailer, type: :maile
|
|||
|
||||
describe 'conversation_mention' do
|
||||
let(:message) { create(:message, conversation: conversation, account: account) }
|
||||
let(:mail) { described_class.conversation_mention(message, agent).deliver_now }
|
||||
let(:mail) { described_class.with(account: account).conversation_mention(message, agent).deliver_now }
|
||||
|
||||
it 'renders the subject' do
|
||||
expect(mail.subject).to eq("#{agent.available_name}, You have been mentioned in conversation [ID - #{conversation.display_id}]")
|
||||
|
@ -53,7 +53,7 @@ RSpec.describe AgentNotifications::ConversationNotificationsMailer, type: :maile
|
|||
|
||||
describe 'assigned_conversation_new_message' do
|
||||
let(:message) { create(:message, conversation: conversation, account: account) }
|
||||
let(:mail) { described_class.assigned_conversation_new_message(message, agent).deliver_now }
|
||||
let(:mail) { described_class.with(account: account).assigned_conversation_new_message(message, agent).deliver_now }
|
||||
|
||||
it 'renders the subject' do
|
||||
expect(mail.subject).to eq("#{agent.available_name}, New message in your assigned conversation [ID - #{message.conversation.display_id}].")
|
||||
|
|
|
@ -13,6 +13,17 @@ RSpec.describe Channel::FacebookPage do
|
|||
|
||||
describe 'concerns' do
|
||||
it_behaves_like 'reauthorizable'
|
||||
|
||||
context 'when prompt_reauthorization!' do
|
||||
it 'calls channel notifier mail for facebook' do
|
||||
admin_mailer = double
|
||||
mailer_double = double
|
||||
expect(AdministratorNotifications::ChannelNotificationsMailer).to receive(:with).and_return(admin_mailer)
|
||||
expect(admin_mailer).to receive(:facebook_disconnect).with(channel.inbox).and_return(mailer_double)
|
||||
expect(mailer_double).to receive(:deliver_later)
|
||||
channel.prompt_reauthorization!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it 'has a valid name' do
|
||||
|
|
Loading…
Reference in a new issue