import { ExecutionContext, Injectable, UnauthorizedException, } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { IS_PUBLIC_KEY } from '../decorators/public.decorator'; import { Reflector } from '@nestjs/core'; import { EnvironmentService } from '../../integrations/environment/environment.service'; import { addDays } from 'date-fns'; @Injectable() export class JwtAuthGuard extends AuthGuard('jwt') { constructor( private reflector: Reflector, private environmentService: EnvironmentService, ) { super(); } canActivate(context: ExecutionContext) { const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ context.getHandler(), context.getClass(), ]); if (isPublic) { return true; } return super.canActivate(context); } handleRequest(err: any, user: any, info: any, ctx: ExecutionContext) { if (err || !user) { throw err || new UnauthorizedException(); } this.setJoinedWorkspacesCookie(user, ctx); return user; } setJoinedWorkspacesCookie(user: any, ctx: ExecutionContext) { if (this.environmentService.isCloud()) { const req = ctx.switchToHttp().getRequest(); const res = ctx.switchToHttp().getResponse(); const workspaceId = user?.workspace?.id; let workspaceIds = []; try { workspaceIds = req.cookies.joinedWorkspaces ? JSON.parse(req.cookies.joinedWorkspaces) : []; } catch (err) { /* empty */ } if (!workspaceIds.includes(workspaceId)) { workspaceIds.push(workspaceId); } res.setCookie('joinedWorkspaces', JSON.stringify(workspaceIds), { httpOnly: false, domain: '.' + this.environmentService.getSubdomainHost(), path: '/', expires: addDays(new Date(), 365), secure: this.environmentService.isHttps(), }); } } }