From a4a085392d8b8d5811651663f65c23832eb6106b Mon Sep 17 00:00:00 2001 From: Antoine Moreaux Date: Fri, 14 Feb 2025 12:58:01 +0100 Subject: [PATCH] fix(auth): Invite with public url and social sso. (#10216) Correct the URL parameter name from "inviteHash" to "workspaceInviteHash" and enhance domain URL handling for multi-workspace environments. --- .../auth/hooks/__tests__/useAuth.test.tsx | 25 ++++++++++++++++++- .../src/modules/auth/hooks/useAuth.ts | 2 +- .../services/domain-manager.service.spec.ts | 5 ++-- .../services/domain-manager.service.ts | 4 ++- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/packages/twenty-front/src/modules/auth/hooks/__tests__/useAuth.test.tsx b/packages/twenty-front/src/modules/auth/hooks/__tests__/useAuth.test.tsx index f428132f9..0a45988de 100644 --- a/packages/twenty-front/src/modules/auth/hooks/__tests__/useAuth.test.tsx +++ b/packages/twenty-front/src/modules/auth/hooks/__tests__/useAuth.test.tsx @@ -5,7 +5,6 @@ import { ReactNode, act } from 'react'; import { MemoryRouter } from 'react-router-dom'; import { RecoilRoot, useRecoilValue } from 'recoil'; import { iconsState } from 'twenty-ui'; - import { useAuth } from '@/auth/hooks/useAuth'; import { billingState } from '@/client-config/states/billingState'; import { isDebugModeState } from '@/client-config/states/isDebugModeState'; @@ -17,6 +16,14 @@ import { isMultiWorkspaceEnabledState } from '@/client-config/states/isMultiWork import { renderHook } from '@testing-library/react'; import { email, mocks, password, results, token } from '../__mocks__/useAuth'; +const redirectSpy = jest.fn(); + +jest.mock('@/domain-manager/hooks/useRedirect', () => ({ + useRedirect: jest.fn().mockImplementation(() => ({ + redirect: redirectSpy, + })), +})); + const Wrapper = ({ children }: { children: ReactNode }) => ( @@ -76,6 +83,22 @@ describe('useAuth', () => { expect(mocks[1].result).toHaveBeenCalled(); }); + it('should handle google sign-in', async () => { + const { result } = renderHooks(); + + await act(async () => { + await result.current.signInWithGoogle({ + workspaceInviteHash: 'workspaceInviteHash', + }); + }); + + expect(redirectSpy).toHaveBeenCalledWith( + expect.stringContaining( + '/auth/google?workspaceInviteHash=workspaceInviteHash', + ), + ); + }); + it('should handle sign-out', async () => { const { result } = renderHook( () => { diff --git a/packages/twenty-front/src/modules/auth/hooks/useAuth.ts b/packages/twenty-front/src/modules/auth/hooks/useAuth.ts index 5ef07e884..c170dc90c 100644 --- a/packages/twenty-front/src/modules/auth/hooks/useAuth.ts +++ b/packages/twenty-front/src/modules/auth/hooks/useAuth.ts @@ -455,7 +455,7 @@ export const useAuth = () => { ) => { const url = new URL(`${REACT_APP_SERVER_BASE_URL}${path}`); if (isDefined(params.workspaceInviteHash)) { - url.searchParams.set('inviteHash', params.workspaceInviteHash); + url.searchParams.set('workspaceInviteHash', params.workspaceInviteHash); } if (isDefined(params.workspacePersonalInviteToken)) { url.searchParams.set( diff --git a/packages/twenty-server/src/engine/core-modules/domain-manager/services/domain-manager.service.spec.ts b/packages/twenty-server/src/engine/core-modules/domain-manager/services/domain-manager.service.spec.ts index 1d45aecf6..d39d05ab7 100644 --- a/packages/twenty-server/src/engine/core-modules/domain-manager/services/domain-manager.service.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/domain-manager/services/domain-manager.service.spec.ts @@ -29,7 +29,7 @@ describe('DomainManagerService', () => { expect(result).toEqual({ customUrl: 'https://custom-host.com/', - subdomainUrl: 'https://subdomain.example.com/', + subdomainUrl: 'https://example.com/', }); }); @@ -39,6 +39,7 @@ describe('DomainManagerService', () => { .mockImplementation((key: string) => { const env = { FRONTEND_URL: 'https://example.com', + IS_MULTIWORKSPACE_ENABLED: true, }; return env[key]; @@ -104,7 +105,6 @@ describe('DomainManagerService', () => { .mockImplementation((key: string) => { const env = { FRONTEND_URL: 'https://example.com', - IS_MULTIWORKSPACE_ENABLED: true, DEFAULT_SUBDOMAIN: 'test', }; @@ -125,7 +125,6 @@ describe('DomainManagerService', () => { .mockImplementation((key: string) => { const env = { FRONTEND_URL: 'https://example.com', - IS_MULTIWORKSPACE_ENABLED: true, DEFAULT_SUBDOMAIN: 'default', }; diff --git a/packages/twenty-server/src/engine/core-modules/domain-manager/services/domain-manager.service.ts b/packages/twenty-server/src/engine/core-modules/domain-manager/services/domain-manager.service.ts index 196176a2d..43c3ac3e3 100644 --- a/packages/twenty-server/src/engine/core-modules/domain-manager/services/domain-manager.service.ts +++ b/packages/twenty-server/src/engine/core-modules/domain-manager/services/domain-manager.service.ts @@ -217,7 +217,9 @@ export class DomainManagerService { private getTwentyWorkspaceUrl(subdomain: string) { const url = this.getFrontUrl(); - url.hostname = `${subdomain}.${url.hostname}`; + url.hostname = this.environmentService.get('IS_MULTIWORKSPACE_ENABLED') + ? `${subdomain}.${url.hostname}` + : url.hostname; return url.toString(); }