import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from "@nestjs/common"; import { Reflector } from "@nestjs/core"; import { JwtService } from "@nestjs/jwt"; import { Request } from 'express'; import { IS_PUBLIC_KEY } from "../decorators/public.decorator"; import { ConfigService } from "@nestjs/config"; @Injectable() export class AuthGuard implements CanActivate { constructor( private readonly jwtService: JwtService, private readonly reflector: Reflector, private readonly configService: ConfigService, ) {} async canActivate(context: ExecutionContext): Promise { const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ context.getHandler(), context.getClass(), ]); if (isPublic) return true; const request = context.switchToHttp().getRequest(); if (request.path.startsWith('/api-docs')) { return true; } const authHeader = request.headers['authorization'] as string | undefined; if (!authHeader || !authHeader.startsWith('Bearer ')) { throw new UnauthorizedException('Token manquant ou invalide'); } const token = authHeader.split(' ')[1]; try { const payload = await this.jwtService.verifyAsync(token, { secret: this.configService.get('jwt.accessSecret'), }); request.user = { ...payload, id: payload.sub, }; return true; } catch (error) { throw new UnauthorizedException('Token invalide ou expiré'); } } }