public String generateToken(JwtUserPayload payload, TokenType tokenType, boolean useExpiration) {
long maxAge = tokenType.equals(TokenType.ACCESS) ? accessTokenMaxAge : refreshTokenMaxAge;
Date expiration = useExpiration && payload.getExpiration() != null ? payload.getExpiration() :
timestampService.getDate(System.currentTimeMillis() + maxAge);
JwtUserPayload generatedPayload = JwtUserPayload.newBuilder()
.withPayload(payload)
.withExpirationDate(expiration)
.withTokenType(tokenType.getId())
.buildPayload();
Map<String, Object> jwtMap = new HashMap<>();
jwtMap.put(JwtUserPayload.JWT_CLAIM_KEY, generatedPayload);
Claims claims = Jwts.claims(jwtMap);
return Jwts.builder()
.setClaims(claims)
.signWith(SignatureAlgorithm.HS256, jwtSecretService.getJwtSecret())
.compact();
}