import { IS_PUBLIC_KEY } from '@hedhog/core'; import { CanActivate, ExecutionContext, Injectable, UnauthorizedException, } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { Request } from 'express'; import { AuthService } from '../auth.service'; @Injectable() export class AuthGuard implements CanActivate { constructor( private auth: AuthService, private reflector: Reflector, ) {} async canActivate(context: ExecutionContext): Promise { const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ context.getHandler(), context.getClass(), ]); const request = context.switchToHttp().getRequest(); const token = this.extractTokenFromHeader(request); if (!token) { if (isPublic) { return true; } else { throw new UnauthorizedException(); } } try { const payload = await this.auth.verifyToken(token); request['auth'] = payload; } catch (error) { if (isPublic) { return true; } else { throw new UnauthorizedException(error); } } return true; } private extractTokenFromHeader(request: Request): string | undefined { const [type, token] = request.headers.authorization?.split(' ') ?? []; return type === 'Bearer' ? token : undefined; } }