JwtUtil.java

package com.talentradar.talentradarnotificationservicerw.utils;

import com.talentradar.talentradarnotificationservicerw.domain.dtos.UserClaimsDTO;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.function.Function;

@Component
public class JwtUtil {
    private final String secret;
    private final int jwtExpirationInSeconds;

    public JwtUtil(
            @Value("${JWT_SECRET}") String secret,
            @Value("${JWT_EXPIRATION_MS}") int jwtExpirationInSeconds
    ) {
        this.secret = secret;
        this.jwtExpirationInSeconds = jwtExpirationInSeconds;
    }

    private SecretKey getSigningKey() {
        return Keys.hmacShaKeyFor(Decoders.BASE64.decode(secret));
    }

    public String getEmailFromToken(String token) {
        return getClaimFromToken(token, Claims::getSubject);
    }

    public String getRoleFromToken(String token) {
        final Claims claims = getAllClaimsFromToken(token);
        return claims.get("role", String.class);
    }

    public <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) {
        final Claims claims = getAllClaimsFromToken(token);
        return claimsResolver.apply(claims);
    }

    private Claims getAllClaimsFromToken(String token) {
        try {
            return Jwts.parser()
                    .verifyWith(getSigningKey())
                    .build()
                    .parseSignedClaims(token)
                    .getPayload();
        } catch (JwtException | IllegalArgumentException e) {
            throw new IllegalArgumentException("Invalid JWT token", e);
        }
    }
  
    public UserClaimsDTO extractClaimsFromHeader(HttpServletRequest request) {
        return UserClaimsDTO.builder()
                .userId(request.getHeader("X-User-Id"))
                .email(request.getHeader("X-User-Email"))
                .fullName(request.getHeader("X-User-FullName"))
                .role(request.getHeader("X-User-Role"))
                .build();
    }
}