package com.finki.icare.service; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.security.Keys; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.crypto.SecretKey; import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.HashMap; import java.util.Map; @Service public class JwtService { @Value("${JWT_SECRET}") private String secretKey; @Value("${JWT_EXPIRATION}") private long jwtExpiration; private SecretKey getSigningKey() { return Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8)); } public String generateToken(String username, Integer userId, String userType) { Map claims = new HashMap<>(); claims.put("userId", userId); claims.put("userType", userType); return Jwts.builder() .claims(claims) .subject(username) .issuedAt(new Date(System.currentTimeMillis())) .expiration(new Date(System.currentTimeMillis() + jwtExpiration)) .signWith(getSigningKey()) .compact(); } public String extractUsername(String token) { return extractClaims(token).getSubject(); } public Integer extractUserId(String token) { return extractClaims(token).get("userId", Integer.class); } public String extractUserType(String token) { return extractClaims(token).get("userType", String.class); } public boolean isTokenValid(String token, String username) { final String extractedUsername = extractUsername(token); return (extractedUsername.equals(username) && !isTokenExpired(token)); } private boolean isTokenExpired(String token) { return extractClaims(token).getExpiration().before(new Date()); } private Claims extractClaims(String token) { return Jwts.parser() .verifyWith(getSigningKey()) .build() .parseSignedClaims(token) .getPayload(); } }