diff --git a/app/controllers/concerns/microsoft_concern.rb b/app/controllers/concerns/microsoft_concern.rb deleted file mode 100644 index 0f37bd03f..000000000 --- a/app/controllers/concerns/microsoft_concern.rb +++ /dev/null @@ -1,25 +0,0 @@ -module MicrosoftConcern - extend ActiveSupport::Concern - - def microsoft_client - app_id = GlobalConfigService.load('AZURE_APP_ID', nil) - app_secret = GlobalConfigService.load('AZURE_APP_SECRET', nil) - - ::OAuth2::Client.new(app_id, app_secret, - { - site: 'https://login.microsoftonline.com', - authorize_url: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize', - token_url: 'https://login.microsoftonline.com/common/oauth2/v2.0/token' - }) - end - - private - - def parsed_body - @parsed_body ||= Rack::Utils.parse_nested_query(@response.raw_response.body) - end - - def base_url - ENV.fetch('FRONTEND_URL', 'http://localhost:3000') - end -end diff --git a/app/controllers/microsoft/callbacks_controller.rb b/app/controllers/microsoft/callbacks_controller.rb index aa1c22d91..7f894f7b2 100644 --- a/app/controllers/microsoft/callbacks_controller.rb +++ b/app/controllers/microsoft/callbacks_controller.rb @@ -1,12 +1,5 @@ -class Microsoft::CallbacksController < ApplicationController - include MicrosoftConcern - - def show - @response = microsoft_client.auth_code.get_token( - oauth_code, - redirect_uri: "#{base_url}/microsoft/callback" - ) - +class Microsoft::CallbacksController < OauthCallbackController + def handle_response inbox, already_exists = find_or_create_inbox ::Redis::Alfred.delete(users_data['email'].downcase) @@ -15,26 +8,27 @@ class Microsoft::CallbacksController < ApplicationController else redirect_to app_microsoft_inbox_agents_url(account_id: account.id, inbox_id: inbox.id) end - rescue StandardError => e - ChatwootExceptionTracker.new(e).capture_exception - redirect_to '/' + end + + def oauth_client + app_id = GlobalConfigService.load('AZURE_APP_ID', nil) + app_secret = GlobalConfigService.load('AZURE_APP_SECRET', nil) + + ::OAuth2::Client.new(app_id, app_secret, + { + site: 'https://login.microsoftonline.com', + authorize_url: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize', + token_url: 'https://login.microsoftonline.com/common/oauth2/v2.0/token' + }) end private - def oauth_code - params[:code] - end - def users_data decoded_token = JWT.decode parsed_body[:id_token], nil, false decoded_token[0] end - def parsed_body - @parsed_body ||= @response.response.parsed - end - def account_id ::Redis::Alfred.get(users_data['email'].downcase) end diff --git a/app/controllers/oauth_callback_controller.rb b/app/controllers/oauth_callback_controller.rb new file mode 100644 index 000000000..ab78700b7 --- /dev/null +++ b/app/controllers/oauth_callback_controller.rb @@ -0,0 +1,40 @@ +class OauthCallbackController < ApplicationController + def show + @response = oauth_client.auth_code.get_token( + oauth_code, + redirect_uri: "#{base_url}/#{provider_name}/callback" + ) + + handle_response + rescue StandardError => e + ChatwootExceptionTracker.new(e).capture_exception + redirect_to '/' + end + + private + + def oauth_code + params[:code] + end + + def base_url + ENV.fetch('FRONTEND_URL', 'http://localhost:3000') + end + + def parsed_body + @parsed_body ||= Rack::Utils.parse_nested_query(@response.raw_response.body) + end + + # These methods should be implemented in the subclasses + def oauth_client + raise NotImplementedError + end + + def provider_name + raise NotImplementedError + end + + def handle_response + raise NotImplementedError + end +end