From f18ed01eb7725954fc9c0d45201ac3c53cd9855b Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 9 Oct 2024 15:01:11 +0530 Subject: [PATCH] feat: use of imap login as default if present (#10249) When moving form using Gmail Legacy auth to using OAuth, we need the email address that will be used to connect. This is because we need to store this email address in the cache and reuse when we get the callback to find the associated inbox. However there are cases where the imap login might be `support@company.com` and the email used to communicate will be `contact@company.com` (Probably an alias) In that case, we need to send the correct email address to Chatwoot when re-authenticating At the moment, we used the inbox email. This PR adds a check that defaults to to `imap_login` if that is available and imap is enabled This PR also fixes an unrelated problem where the email inbox creation flow was not working --- Tested it, it is working correctly ![CleanShot 2024-10-09 at 14 23 47@2x](https://github.com/user-attachments/assets/0e2cb6c8-1224-4b45-b34a-7b19611249bc) --- app/controllers/google/callbacks_controller.rb | 9 +++++++++ app/controllers/oauth_callback_controller.rb | 6 +++++- .../dashboard/settings/inbox/channels/Email.vue | 2 +- .../settings/inbox/channels/google/Reauthorize.vue | 11 +++++++++-- spec/controllers/google/callbacks_controller_spec.rb | 7 ++++--- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/app/controllers/google/callbacks_controller.rb b/app/controllers/google/callbacks_controller.rb index 391e1de0f..766d984df 100644 --- a/app/controllers/google/callbacks_controller.rb +++ b/app/controllers/google/callbacks_controller.rb @@ -1,6 +1,15 @@ class Google::CallbacksController < OauthCallbackController include GoogleConcern + def find_channel_by_email + # find by imap_login first, and then by email + # this ensures the legacy users can migrate correctly even if inbox email address doesn't match + imap_channel = Channel::Email.find_by(imap_login: users_data['email'], account: account) + return imap_channel if imap_channel + + Channel::Email.find_by(email: users_data['email'], account: account) + end + private def provider_name diff --git a/app/controllers/oauth_callback_controller.rb b/app/controllers/oauth_callback_controller.rb index 309160f1f..4cb02d266 100644 --- a/app/controllers/oauth_callback_controller.rb +++ b/app/controllers/oauth_callback_controller.rb @@ -25,7 +25,7 @@ class OauthCallbackController < ApplicationController end def find_or_create_inbox - channel_email = Channel::Email.find_by(email: users_data['email'], account: account) + channel_email = find_channel_by_email # we need this value to know where to redirect on sucessful processing of the callback channel_exists = channel_email.present? @@ -39,6 +39,10 @@ class OauthCallbackController < ApplicationController [channel_email.inbox, channel_exists] end + def find_channel_by_email + Channel::Email.find_by(email: users_data['email'], account: account) + end + def update_channel(channel_email) channel_email.update!({ imap_login: users_data['email'], imap_address: imap_address, diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Email.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Email.vue index 981f148d4..c356f7bbc 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Email.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/Email.vue @@ -47,7 +47,7 @@ const emailProviderList = computed(() => { function onClick(emailProvider) { if (emailProvider.isEnabled) { - this.provider = emailProvider.key; + provider.value = emailProvider.key; } } diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/google/Reauthorize.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/google/Reauthorize.vue index bc4df68d1..de9047ca7 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/google/Reauthorize.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/google/Reauthorize.vue @@ -1,5 +1,5 @@