From a4cc6e102efafadc8696a28d82b563234e7c7f56 Mon Sep 17 00:00:00 2001 From: Artyom Savchenko Date: Tue, 20 May 2025 14:03:26 +0700 Subject: [PATCH] UBERF-10653: Handle gmail integration errors (#8985) --- plugins/setting-assets/lang/cs.json | 5 ++- plugins/setting-assets/lang/de.json | 5 ++- plugins/setting-assets/lang/en.json | 8 +++- plugins/setting-assets/lang/es.json | 5 ++- plugins/setting-assets/lang/fr.json | 5 ++- plugins/setting-assets/lang/it.json | 5 ++- plugins/setting-assets/lang/ja.json | 5 ++- plugins/setting-assets/lang/pt.json | 5 ++- plugins/setting-assets/lang/ru.json | 5 ++- plugins/setting-assets/lang/zh.json | 5 ++- .../IntegrationErrorNotification.svelte | 29 ++++++++++++++ .../src/components/Integrations.svelte | 40 ++++++++++++++++++- plugins/setting/src/index.ts | 9 ++++- services/gmail/pod-gmail/src/accounts.ts | 3 +- services/gmail/pod-gmail/src/main.ts | 16 ++++++-- 15 files changed, 131 insertions(+), 19 deletions(-) create mode 100644 plugins/setting-resources/src/components/IntegrationErrorNotification.svelte diff --git a/plugins/setting-assets/lang/cs.json b/plugins/setting-assets/lang/cs.json index d03ecb4846..e30cd0fc3f 100644 --- a/plugins/setting-assets/lang/cs.json +++ b/plugins/setting-assets/lang/cs.json @@ -153,6 +153,9 @@ "EnablePermissions": "Povolit řízení přístupu na základě rolí", "DisablePermissionsConfirmation": "Opravdu chcete zakázat řízení přístupu na základě rolí? Všechny role a oprávnění budou deaktivovány.", "EnablePermissionsConfirmation": "Opravdu chcete povolit řízení přístupu na základě rolí? Všechny role a oprávnění budou aktivovány.", - "BetaWarning": "Moduly označené jako beta jsou k dispozici pro experimentální účely a nemusí být plně funkční. V tuto chvíli nedoporučujeme spoléhat se na funkce beta pro kritickou práci." + "BetaWarning": "Moduly označené jako beta jsou k dispozici pro experimentální účely a nemusí být plně funkční. V tuto chvíli nedoporučujeme spoléhat se na funkce beta pro kritickou práci.", + "IntegrationFailed": "Nepodařilo se vytvořit integraci", + "IntegrationError": "Zkuste to prosím znovu nebo kontaktujte podporu, pokud problém přetrvává", + "EmailIsUsed": "E-mailová adresa je již použita jiným účtem" } } diff --git a/plugins/setting-assets/lang/de.json b/plugins/setting-assets/lang/de.json index 278678cfee..743fbcbb28 100644 --- a/plugins/setting-assets/lang/de.json +++ b/plugins/setting-assets/lang/de.json @@ -153,6 +153,9 @@ "EnablePermissions": "Rollenbasierte Zugriffskontrolle aktivieren", "DisablePermissionsConfirmation": "Sind Sie sicher, dass Sie die rollenbasierte Zugriffskontrolle deaktivieren möchten? Alle Rollen und Berechtigungen werden deaktiviert.", "EnablePermissionsConfirmation": "Sind Sie sicher, dass Sie die rollenbasierte Zugriffskontrolle aktivieren möchten? Alle Rollen und Berechtigungen werden aktiviert.", - "BetaWarningDe": "Als Beta gekennzeichnete Module sind zu experimentellen Zwecken verfügbar und funktionieren möglicherweise nicht vollständig. Wir empfehlen derzeit nicht, sich auf Beta-Funktionen für kritische Arbeiten zu verlassen." + "BetaWarningDe": "Als Beta gekennzeichnete Module sind zu experimentellen Zwecken verfügbar und funktionieren möglicherweise nicht vollständig. Wir empfehlen derzeit nicht, sich auf Beta-Funktionen für kritische Arbeiten zu verlassen.", + "IntegrationFailed": "Integration konnte nicht erstellt werden", + "IntegrationError": "Bitte versuchen Sie es erneut oder wenden Sie sich an den Support, wenn das Problem weiterhin besteht", + "EmailIsUsed": "E-Mail-Adresse wird in einem anderen Konto verwendet" } } diff --git a/plugins/setting-assets/lang/en.json b/plugins/setting-assets/lang/en.json index 9068059283..ed0031d642 100644 --- a/plugins/setting-assets/lang/en.json +++ b/plugins/setting-assets/lang/en.json @@ -153,5 +153,9 @@ "EnablePermissions": "Enable role-based access control", "DisablePermissionsConfirmation": "Are you sure you want to disable role-based access control? All roles and permissions will be disabled.", "EnablePermissionsConfirmation": "Are you sure you want to enable role-based access control? All roles and permissions will be enabled.", - "BetaWarning": "Modules labeled as beta are available for experimental purposes and may not be fully functional. We do not recommend relying on beta features for critical work at this time." } -} \ No newline at end of file + "BetaWarning": "Modules labeled as beta are available for experimental purposes and may not be fully functional. We do not recommend relying on beta features for critical work at this time.", + "IntegrationFailed": "Failed to create integration", + "IntegrationError": "Please try again or contact support if the problem persists", + "EmailIsUsed": "Email address is already used by another account" + } +} diff --git a/plugins/setting-assets/lang/es.json b/plugins/setting-assets/lang/es.json index f5604dbd6f..9b1eb3bafc 100644 --- a/plugins/setting-assets/lang/es.json +++ b/plugins/setting-assets/lang/es.json @@ -144,6 +144,9 @@ "EnablePermissions": "Activar el control de acceso basado en roles", "DisablePermissionsConfirmation": "¿Está seguro de que desea desactivar el control de acceso basado en roles? Todos los roles y permisos serán desactivados.", "EnablePermissionsConfirmation": "¿Está seguro de que desea activar el control de acceso basado en roles? Todos los roles y permisos serán activados.", - "BetaWarning": "Los módulos etiquetados como beta están disponibles con fines experimentales y pueden no ser completamente funcionales. No recomendamos confiar en las funciones beta para trabajos críticos en este momento." + "BetaWarning": "Los módulos etiquetados como beta están disponibles con fines experimentales y pueden no ser completamente funcionales. No recomendamos confiar en las funciones beta para trabajos críticos en este momento.", + "IntegrationFailed": "Error al crear la integración", + "IntegrationError": "Por favor, inténtelo de nuevo o contacte con soporte si el problema persiste", + "EmailIsUsed": "El correo electrónico ya está en uso" } } diff --git a/plugins/setting-assets/lang/fr.json b/plugins/setting-assets/lang/fr.json index 4b47013c01..1683c4d95d 100644 --- a/plugins/setting-assets/lang/fr.json +++ b/plugins/setting-assets/lang/fr.json @@ -153,6 +153,9 @@ "EnablePermissions": "Activer le contrôle d'accès basé sur les rôles", "DisablePermissionsConfirmation": "Êtes-vous sûr de vouloir désactiver le contrôle d'accès basé sur les rôles ? Tous les rôles et permissions seront désactivés.", "EnablePermissionsConfirmation": "Êtes-vous sûr de vouloir activer le contrôle d'accès basé sur les rôles ? Tous les rôles et permissions seront activés.", - "BetaWarning": "Les modules étiquetés comme bêta sont disponibles à des fins expérimentales et peuvent ne pas être entièrement fonctionnels. Nous ne recommandons pas de compter sur les fonctionnalités bêta pour un travail critique pour le moment." + "BetaWarning": "Les modules étiquetés comme bêta sont disponibles à des fins expérimentales et peuvent ne pas être entièrement fonctionnels. Nous ne recommandons pas de compter sur les fonctionnalités bêta pour un travail critique pour le moment.", + "IntegrationFailed": "Échec de la création de l'intégration", + "IntegrationError": "Veuillez réessayer ou contacter le support si le problème persiste", + "EmailIsUsed": "L'adresse e-mail est déjà utilisée par un autre compte" } } diff --git a/plugins/setting-assets/lang/it.json b/plugins/setting-assets/lang/it.json index 27d12c13db..d9b8584739 100644 --- a/plugins/setting-assets/lang/it.json +++ b/plugins/setting-assets/lang/it.json @@ -153,6 +153,9 @@ "EnablePermissions": "Abilita il controllo degli accessi basato sui ruoli", "DisablePermissionsConfirmation": "Sei sicuro di voler disabilitare il controllo degli accessi basato sui ruoli? Tutti i ruoli e le autorizzazioni verranno disabilitati.", "EnablePermissionsConfirmation": "Sei sicuro di voler abilitare il controllo degli accessi basato sui ruoli? Tutti i ruoli e le autorizzazioni verranno abilitati.", - "BetaWarning": "I moduli contrassegnati come beta sono disponibili per scopi sperimentali e potrebbero non funzionare completamente. Non ti consigliamo di fare affidamento sulle funzionalità beta per il lavoro critico in questo momento." + "BetaWarning": "I moduli contrassegnati come beta sono disponibili per scopi sperimentali e potrebbero non funzionare completamente. Non ti consigliamo di fare affidamento sulle funzionalità beta per il lavoro critico in questo momento.", + "IntegrationFailed": "Impossibile creare l'integrazione", + "IntegrationError": "Si prega di riprovare o contattare il supporto se il problema persiste", + "EmailIsUsed": "L'email è già in uso" } } diff --git a/plugins/setting-assets/lang/ja.json b/plugins/setting-assets/lang/ja.json index b829a38280..d5bc663aa9 100644 --- a/plugins/setting-assets/lang/ja.json +++ b/plugins/setting-assets/lang/ja.json @@ -153,6 +153,9 @@ "EnablePermissions": "ロールベースのアクセス制御を有効にする", "DisablePermissionsConfirmation": "本当にロールベースのアクセス制御を無効にしますか?すべての役割と権限が無効になります。", "EnablePermissionsConfirmation": "本当にロールベースのアクセス制御を有効にしますか?すべての役割と権限が有効になります。", - "BetaWarning": "ベータ版としてラベル付けされたモジュールは、実験的な目的で利用可能であり、完全に機能しない場合があります。現時点では、重要な作業にベータ版機能を依存することはお勧めしません。" + "BetaWarning": "ベータ版としてラベル付けされたモジュールは、実験的な目的で利用可能であり、完全に機能しない場合があります。現時点では、重要な作業にベータ版機能を依存することはお勧めしません。", + "IntegrationFailed": "統合に失敗しました", + "IntegrationError": "問題が解決しない場合は、もう一度お試しいただくか、サポートにお問い合わせください", + "EmailIsUsed": "メールアドレスは他のアカウントで使用されています" } } diff --git a/plugins/setting-assets/lang/pt.json b/plugins/setting-assets/lang/pt.json index aa110649e2..2e7cae902f 100644 --- a/plugins/setting-assets/lang/pt.json +++ b/plugins/setting-assets/lang/pt.json @@ -144,6 +144,9 @@ "EnablePermissions": "Ativar controle de acesso baseado em funções", "DisablePermissionsConfirmation": "Tem certeza de que deseja desativar o controle de acesso baseado em funções? Todos os papéis e permissões serão desativados.", "EnablePermissionsConfirmation": "Tem certeza de que deseja ativar o controle de acesso baseado em funções? Todos os papéis e permissões serão ativados.", - "BetaWarning": "Modules labeled as beta are available for experimental purposes and may not be fully functional. We do not recommend relying on beta features for critical work at this time." + "BetaWarning": "Modules labeled as beta are available for experimental purposes and may not be fully functional. We do not recommend relying on beta features for critical work at this time.", + "IntegrationFailed": "Falha na integração", + "IntegrationError": "Tente novamente ou entre em contato com o suporte se o problema persistir", + "EmailIsUsed": "Este e-mail já está em uso" } } diff --git a/plugins/setting-assets/lang/ru.json b/plugins/setting-assets/lang/ru.json index 462bb0adc1..88e4f96739 100644 --- a/plugins/setting-assets/lang/ru.json +++ b/plugins/setting-assets/lang/ru.json @@ -153,6 +153,9 @@ "EnablePermissions": "Включить ролевое управление доступом", "DisablePermissionsConfirmation": "Вы уверены, что хотите отключить ролевое управление доступом? Все роли и разрешения будут отключены.", "EnablePermissionsConfirmation": "Вы уверены, что хотите включить ролевое управление доступом? Все роли и разрешения будут включены.", - "BetaWarning": "Модули, помеченные как бета-версии, доступны для экспериментальных целей и могут быть не полностью функциональными. Мы не рекомендуем полагаться на функции бета-версии для критической работы в настоящее время." + "BetaWarning": "Модули, помеченные как бета-версии, доступны для экспериментальных целей и могут быть не полностью функциональными. Мы не рекомендуем полагаться на функции бета-версии для критической работы в настоящее время.", + "IntegrationFailed": "Не удалось создать интеграцию", + "IntegrationError": "Пожалуйста, попробуйте снова или свяжитесь с поддержкой, если проблема не исчезнет", + "EmailIsUsed": "Адрес электронной почты уже используется другим аккаунтом" } } diff --git a/plugins/setting-assets/lang/zh.json b/plugins/setting-assets/lang/zh.json index 80214e830c..3dca20e6e3 100644 --- a/plugins/setting-assets/lang/zh.json +++ b/plugins/setting-assets/lang/zh.json @@ -153,6 +153,9 @@ "EnablePermissions": "启用基于角色的访问控制", "DisablePermissionsConfirmation": "您确定要禁用基于角色的访问控制吗?所有角色和权限都将被禁用。", "EnablePermissionsConfirmation": "您确定要启用基于角色的访问控制吗?所有角色和权限都将被启用。", - "BetaWarning": "标记为测试版的模块可用于实验目的,可能无法完全正常工作。我们不建议在此时依赖测试版功能进行关键工作。" + "BetaWarning": "标记为测试版的模块可用于实验目的,可能无法完全正常工作。我们不建议在此时依赖测试版功能进行关键工作。", + "IntegrationFailed": "创建集成失败", + "IntegrationError": "请重试,如果问题仍然存在,请联系客服支持", + "EmailIsUsed": "该电子邮件地址已被其他账户使用" } } diff --git a/plugins/setting-resources/src/components/IntegrationErrorNotification.svelte b/plugins/setting-resources/src/components/IntegrationErrorNotification.svelte new file mode 100644 index 0000000000..e99e0de367 --- /dev/null +++ b/plugins/setting-resources/src/components/IntegrationErrorNotification.svelte @@ -0,0 +1,29 @@ + + + + + + + {notification.subTitle} + + diff --git a/plugins/setting-resources/src/components/Integrations.svelte b/plugins/setting-resources/src/components/Integrations.svelte index 2500bab21e..9afd052375 100644 --- a/plugins/setting-resources/src/components/Integrations.svelte +++ b/plugins/setting-resources/src/components/Integrations.svelte @@ -13,12 +13,16 @@ // limitations under the License. -->
diff --git a/plugins/setting/src/index.ts b/plugins/setting/src/index.ts index 057815fcf6..3048e8eb49 100644 --- a/plugins/setting/src/index.ts +++ b/plugins/setting/src/index.ts @@ -111,6 +111,10 @@ export interface WorkspaceSetting extends Doc { icon?: Ref | null } +export enum IntegrationError { + EMAIL_IS_ALREADY_USED = 'EMAIL_IS_ALREADY_USED' +} + /** * @public */ @@ -239,7 +243,10 @@ export default plugin(settingId, { MailboxErrorMailboxExists: '' as IntlString, MailboxErrorMailboxCountLimit: '' as IntlString, DeleteMailbox: '' as IntlString, - MailboxDeleteConfirmation: '' as IntlString + MailboxDeleteConfirmation: '' as IntlString, + IntegrationFailed: '' as IntlString, + IntegrationError: '' as IntlString, + EmailIsUsed: '' as IntlString }, icon: { AccountSettings: '' as Asset, diff --git a/services/gmail/pod-gmail/src/accounts.ts b/services/gmail/pod-gmail/src/accounts.ts index 93a8f99ada..9f1c5f9650 100644 --- a/services/gmail/pod-gmail/src/accounts.ts +++ b/services/gmail/pod-gmail/src/accounts.ts @@ -15,6 +15,7 @@ import { AccountUuid, Person, PersonId, SocialId, SocialIdType, buildSocialIdString } from '@hcengineering/core' import { getAccountClient } from '@hcengineering/server-client' import { generateToken } from '@hcengineering/server-token' +import { IntegrationError } from '@hcengineering/setting' import { serviceToken } from './utils' @@ -67,7 +68,7 @@ export async function getOrCreateSocialId (account: AccountUuid, email: string): } if (socialId.personUuid !== account) { - throw new Error('Social id connected to another account') + throw new Error(IntegrationError.EMAIL_IS_ALREADY_USED) } return socialId diff --git a/services/gmail/pod-gmail/src/main.ts b/services/gmail/pod-gmail/src/main.ts index 7da8a39086..86f83c3658 100644 --- a/services/gmail/pod-gmail/src/main.ts +++ b/services/gmail/pod-gmail/src/main.ts @@ -101,15 +101,23 @@ export const main = async (): Promise => { endpoint: '/signin/code', type: 'get', handler: async (req, res) => { + let state: State | undefined try { ctx.info('Signin code request received') const code = req.query.code as string - const state = JSON.parse(decode64(req.query.state as string)) as unknown as State + state = JSON.parse(decode64(req.query.state as string)) as unknown as State await gmailController.createClient(state, code) res.redirect(state.redirectURL) - } catch (err) { - ctx.error('Failed to process signin code', { message: (err as any).message }) - res.status(500).send() + } catch (err: any) { + ctx.error('Failed to process signin code', { message: err.message }) + if (state !== undefined) { + const errorMessage = encodeURIComponent(err.message) + const url = new URL(state.redirectURL) + url.searchParams.append('integrationError', errorMessage) + res.redirect(url.toString()) + } else { + res.status(500).send() + } } } },