mirror of
https://github.com/lingble/chatwoot.git
synced 2025-10-29 18:22:53 +00:00
- Adds the backend APIs required for Microsoft Email Channels Co-authored-by: Pranav Raj S <pranav@chatwoot.com> Co-authored-by: Sojan <sojan@pepalo.com>
73 lines
2.0 KiB
Ruby
73 lines
2.0 KiB
Ruby
class Microsoft::CallbacksController < ApplicationController
|
|
include MicrosoftConcern
|
|
|
|
def show
|
|
@response = microsoft_client.auth_code.get_token(
|
|
oauth_code,
|
|
redirect_uri: "#{base_url}/microsoft/callback"
|
|
)
|
|
|
|
inbox = find_or_create_inbox
|
|
::Redis::Alfred.delete(users_data['email'])
|
|
redirect_to app_microsoft_inbox_agents_url(account_id: account.id, inbox_id: inbox.id)
|
|
rescue StandardError => e
|
|
ChatwootExceptionTracker.new(e).capture_exception
|
|
redirect_to '/'
|
|
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'])
|
|
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)
|
|
channel_email ||= create_microsoft_channel_with_inbox
|
|
update_microsoft_channel(channel_email)
|
|
channel_email.inbox
|
|
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']
|
|
)
|
|
channel_email
|
|
end
|
|
end
|
|
|
|
def update_microsoft_channel(channel_email)
|
|
channel_email.update!({
|
|
imap_login: users_data['email'], imap_address: 'outlook.office365.com',
|
|
imap_port: '993', imap_enabled: true,
|
|
provider: 'microsoft',
|
|
provider_config: {
|
|
access_token: parsed_body['access_token'],
|
|
refresh_token: parsed_body['refresh_token'],
|
|
expires_on: (Time.current.utc + 1.hour).to_s
|
|
}
|
|
})
|
|
end
|
|
end
|