diff --git a/app/controllers/microsoft/callbacks_controller.rb b/app/controllers/microsoft/callbacks_controller.rb index f5dd8d68e..27a86caa8 100644 --- a/app/controllers/microsoft/callbacks_controller.rb +++ b/app/controllers/microsoft/callbacks_controller.rb @@ -7,7 +7,6 @@ class Microsoft::CallbacksController < OauthCallbackController def handle_response inbox, already_exists = find_or_create_inbox - ::Redis::Alfred.delete(users_data['email'].downcase) if already_exists redirect_to app_microsoft_inbox_settings_url(account_id: account.id, inbox_id: inbox.id) @@ -28,52 +27,7 @@ class Microsoft::CallbacksController < OauthCallbackController }) end - def users_data - decoded_token = JWT.decode parsed_body[:id_token], nil, false - decoded_token[0] - end - - def account_id - ::Redis::Alfred.get(users_data['email'].downcase) - end - - def account - @account ||= Account.find(account_id) - end - - def find_or_create_inbox - channel_email = Channel::Email.find_by(email: users_data['email'], account: account) - # we need this value to know where to redirect on sucessful processing of the callback - channel_exists = channel_email.present? - - channel_email ||= create_microsoft_channel_with_inbox - update_microsoft_channel(channel_email) - - # reauthorize channel, this code path only triggers when microsoft auth is successful - # reauthorized will also update cache keys for the associated inbox - channel_email.reauthorized! - - [channel_email.inbox, channel_exists] - end - - # Fallback name, for when name field is missing from users_data - def fallback_name - users_data['email'].split('@').first.parameterize.titleize - end - - def create_microsoft_channel_with_inbox - ActiveRecord::Base.transaction do - channel_email = Channel::Email.create!(email: users_data['email'], account: account) - account.inboxes.create!( - account: account, - channel: channel_email, - name: users_data['name'] || fallback_name - ) - channel_email - end - end - - def update_microsoft_channel(channel_email) + def update_channel(channel_email) channel_email.update!({ imap_login: users_data['email'], imap_address: 'outlook.office365.com', imap_port: '993', imap_enabled: true, diff --git a/app/controllers/oauth_callback_controller.rb b/app/controllers/oauth_callback_controller.rb index cb3549cce..45ed68350 100644 --- a/app/controllers/oauth_callback_controller.rb +++ b/app/controllers/oauth_callback_controller.rb @@ -6,6 +6,7 @@ class OauthCallbackController < ApplicationController ) handle_response + ::Redis::Alfred.delete(users_data['email'].downcase) rescue StandardError => e ChatwootExceptionTracker.new(e).capture_exception redirect_to '/' @@ -13,6 +14,21 @@ class OauthCallbackController < ApplicationController private + def find_or_create_inbox + channel_email = Channel::Email.find_by(email: users_data['email'], account: account) + # we need this value to know where to redirect on sucessful processing of the callback + channel_exists = channel_email.present? + + channel_email ||= create_channel_with_inbox + update_channel(channel_email) + + # reauthorize channel, this code path only triggers when microsoft auth is successful + # reauthorized will also update cache keys for the associated inbox + channel_email.reauthorized! + + [channel_email.inbox, channel_exists] + end + def provider_name raise NotImplementedError end @@ -21,6 +37,40 @@ class OauthCallbackController < ApplicationController raise NotImplementedError end + def update_channel(channel_email) + raise NotImplementedError + end + + def create_channel_with_inbox + ActiveRecord::Base.transaction do + channel_email = Channel::Email.create!(email: users_data['email'], account: account) + account.inboxes.create!( + account: account, + channel: channel_email, + name: users_data['name'] || fallback_name + ) + channel_email + end + end + + def users_data + decoded_token = JWT.decode parsed_body[:id_token], nil, false + decoded_token[0] + end + + def account_id + ::Redis::Alfred.get(users_data['email'].downcase) + end + + def account + @account ||= Account.find(account_id) + end + + # Fallback name, for when name field is missing from users_data + def fallback_name + users_data['email'].split('@').first.parameterize.titleize + end + def oauth_code params[:code] end