diff --git a/apps/api/src/app/project/project.controller.ts b/apps/api/src/app/project/project.controller.ts index b0a04eed1..9cc87806d 100644 --- a/apps/api/src/app/project/project.controller.ts +++ b/apps/api/src/app/project/project.controller.ts @@ -111,6 +111,35 @@ export class ProjectController { return projectWithEnvironment; } + @Put('/switch/:projectId') + @ApiOperation({ + summary: 'Switch project', + }) + async switchProject( + @UserSession() user: IJwtPayload, + @Param('projectId', ValidateMongoId) projectId: string, + @Res({ passthrough: true }) res: Response + ) { + const projectEnvironment = await this.getEnvironment.execute(projectId); + const token = this.authService.getSignedToken( + { + _id: user._id, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + profilePicture: user.profilePicture, + accessToken: projectEnvironment.apiKeys[0].key, + }, + projectEnvironment._projectId + ); + res.cookie(CONSTANTS.AUTH_COOKIE_NAME, token, { + ...COOKIE_CONFIG, + domain: process.env.COOKIE_DOMAIN, + }); + + return; + } + @Put(':projectId') @ApiOperation({ summary: 'Update project', diff --git a/apps/web/config/constants.config.ts b/apps/web/config/constants.config.ts index c6842ab5a..eab0360a1 100644 --- a/apps/web/config/constants.config.ts +++ b/apps/web/config/constants.config.ts @@ -42,6 +42,7 @@ export const MODAL_TITLES = { }; export const API_KEYS = { + PROJECT_SWITCH: 'PROJECT_SWITCH', PROJECTS_LIST: 'PROJECT_LIST', PROJECT_CREATE: 'PROJECT_CREATE', PROJECT_ENVIRONMENT: 'PROJECT_ENVIRONMENT', diff --git a/apps/web/hooks/useApp.tsx b/apps/web/hooks/useApp.tsx index 2ff36c971..0f24026be 100644 --- a/apps/web/hooks/useApp.tsx +++ b/apps/web/hooks/useApp.tsx @@ -40,6 +40,10 @@ export function useApp() { replace(ROUTES.SIGNIN); }, }); + const { mutate: switchProject } = useMutation( + [API_KEYS.PROJECT_SWITCH], + (projectId) => commonApi(API_KEYS.PROJECT_SWITCH as any, { parameters: [projectId] }) + ); const { mutate: createProject, isLoading: isCreateProjectLoading } = useMutation< { project: IProjectPayload; environment: IEnvironmentData }, IErrorObject, @@ -74,13 +78,14 @@ export function useApp() { } }, }); - const onProjectIdChange = (id: string) => { + const onProjectIdChange = async (id: string) => { const project = projects?.find((projectItem) => projectItem._id === id); if (project && profileInfo) { setProfileInfo({ ...profileInfo, _projectId: id, }); + switchProject(id); if (![ROUTES.SETTINGS, ROUTES.ACTIVITIES, ROUTES.IMPORTS].includes(pathname)) { replace(ROUTES.IMPORTS); } diff --git a/apps/web/libs/api.ts b/apps/web/libs/api.ts index 8f3d8a6fa..d0495e199 100644 --- a/apps/web/libs/api.ts +++ b/apps/web/libs/api.ts @@ -15,6 +15,10 @@ const routes: Record = { url: () => '/v1/project', method: 'POST', }, + [API_KEYS.PROJECT_SWITCH]: { + url: (projectId) => `/v1/project/switch/${projectId}`, + method: 'PUT', + }, [API_KEYS.PROJECT_ENVIRONMENT]: { url: (projectId) => `/v1/project/${projectId}/environment`, method: 'GET',