diff --git a/src/main/java/com/tarento/retail/config/JwtTokenUtil.java b/src/main/java/com/tarento/retail/config/JwtTokenUtil.java index e8294df66cf7ec85d5a6156ddc32f612304cf8d0..558ade7fbfea1fce1e83f4f310420bc9b0530e30 100644 --- a/src/main/java/com/tarento/retail/config/JwtTokenUtil.java +++ b/src/main/java/com/tarento/retail/config/JwtTokenUtil.java @@ -9,6 +9,8 @@ import java.util.Arrays; import java.util.Date; import java.util.function.Function; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; @@ -16,6 +18,7 @@ import org.springframework.stereotype.Component; import com.tarento.retail.model.User; import com.tarento.retail.util.AppConfiguration; +import com.tarento.retail.util.Constants; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; @@ -23,64 +26,62 @@ import io.jsonwebtoken.SignatureAlgorithm; @Component public class JwtTokenUtil implements Serializable { - + + public static final Logger LOGGER = LoggerFactory.getLogger(JwtTokenUtil.class); + /** * */ private static final long serialVersionUID = 1L; - public static final String CLAIMS_KEY = "scopes"; - + public static final String CLAIMS_KEY = "scopes"; + @Autowired AppConfiguration appConfig; - public String getUsernameFromToken(String token) { - return getClaimFromToken(token, Claims::getSubject); - } - - public Date getExpirationDateFromToken(String token) { - return getClaimFromToken(token, Claims::getExpiration); - } - - public <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) { - final Claims claims = getAllClaimsFromToken(token); - return claimsResolver.apply(claims); - } - - private Claims getAllClaimsFromToken(String token) { - return Jwts.parser() - .setSigningKey(SIGNING_KEY) - .parseClaimsJws(token) - .getBody(); - } - - private Boolean isTokenExpired(String token) { - final Date expiration = getExpirationDateFromToken(token); - return expiration.before(new Date()); - } - - public String generateToken(User user) { - return doGenerateToken(user.getUsername()); - } - - private String doGenerateToken(String subject) { - - Claims claims = Jwts.claims().setSubject(subject); - claims.put(CLAIMS_KEY, Arrays.asList(new SimpleGrantedAuthority(JWT_GRANTED_AUTHORITY))); - - return Jwts.builder() - .setClaims(claims) - .setIssuer(JWT_ISSUER) - .setIssuedAt(new Date(System.currentTimeMillis())) - .setExpiration(new Date(System.currentTimeMillis() + appConfig.getJwtValidity() * 60 * 1000)) - .signWith(SignatureAlgorithm.HS256, SIGNING_KEY) - .compact(); - } - - public Boolean validateToken(String token, UserDetails userDetails) { - final String username = getUsernameFromToken(token); - return ( - username.equals(userDetails.getUsername()) - && !isTokenExpired(token)); - } + public String getUsernameFromToken(String token) { + return getClaimFromToken(token, Claims::getSubject); + } + + public Date getExpirationDateFromToken(String token) { + return getClaimFromToken(token, Claims::getExpiration); + } + + public <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) { + final Claims claims = getAllClaimsFromToken(token); + return claimsResolver.apply(claims); + } + + private Claims getAllClaimsFromToken(String token) { + return Jwts.parser().setSigningKey(SIGNING_KEY).parseClaimsJws(token).getBody(); + } + + public Boolean isTokenExpired(String token) { + try { + final Date expiration = getExpirationDateFromToken(token); + return expiration.before(new Date()); + } catch (Exception e) { + LOGGER.error(String.format(Constants.EXCEPTION_METHOD, "isTokenExpired", e.getMessage())); + return Boolean.TRUE; + } + } + + public String generateToken(User user) { + return doGenerateToken(user.getUsername()); + } + + private String doGenerateToken(String subject) { + + Claims claims = Jwts.claims().setSubject(subject); + claims.put(CLAIMS_KEY, Arrays.asList(new SimpleGrantedAuthority(JWT_GRANTED_AUTHORITY))); + + return Jwts.builder().setClaims(claims).setIssuer(JWT_ISSUER).setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(new Date(System.currentTimeMillis() + appConfig.getJwtValidity() * 60 * 1000)) + .signWith(SignatureAlgorithm.HS256, SIGNING_KEY).compact(); + } + + public Boolean validateToken(String token, UserDetails userDetails) { + final String username = getUsernameFromToken(token); + return (username.equals(userDetails.getUsername()) && !isTokenExpired(token)); + } } diff --git a/src/main/java/com/tarento/retail/controller/UserController.java b/src/main/java/com/tarento/retail/controller/UserController.java index c3f21fdd190606eb7d1c308f919ea3f79a59bf42..b9ea9ae2c02b1183be409fc782934863b84edf3e 100644 --- a/src/main/java/com/tarento/retail/controller/UserController.java +++ b/src/main/java/com/tarento/retail/controller/UserController.java @@ -394,17 +394,16 @@ public class UserController { return ResponseGenerator.failureResponse("Failed"); } - @RequestMapping(value = "getDeviceTokenForUserIds", method = RequestMethod.GET) - public List<UserDeviceToken> getUsersForAStore( - @RequestParam(value = "userIds", required = false) List<Long> userIdList) throws JsonProcessingException { + @RequestMapping(value = PathRoutes.UserRoutes.GET_USER_DEVICE_TOKEN, method = RequestMethod.GET) + public String getUsersDeviceToken(@RequestParam(value = "userIds", required = false) List<Long> userIdList) + throws JsonProcessingException { if (userIdList != null) { List<UserDeviceToken> tokenList = userService.getDeviceTokenForUsers(userIdList); if (tokenList != null) { - return tokenList; + return ResponseGenerator.successResponse(tokenList); } - return null; } - return null; + return ResponseGenerator.failureResponse(); } @RequestMapping(value = PathRoutes.UserRoutes.CREATE_UPDATE_COUNTRY, method = RequestMethod.POST) diff --git a/src/main/java/com/tarento/retail/dao/impl/UserDaoImpl.java b/src/main/java/com/tarento/retail/dao/impl/UserDaoImpl.java index ae546f44143e65b4ad44c1c531cbc6132b16331a..da4e2eca4792eda9baeaff10c34ea92e00852576 100644 --- a/src/main/java/com/tarento/retail/dao/impl/UserDaoImpl.java +++ b/src/main/java/com/tarento/retail/dao/impl/UserDaoImpl.java @@ -22,6 +22,7 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Repository; +import com.tarento.retail.config.JwtTokenUtil; import com.tarento.retail.dao.RoleDao; import com.tarento.retail.dao.UserDao; import com.tarento.retail.dto.CountryDto; @@ -64,6 +65,9 @@ public class UserDaoImpl implements UserDao { @Autowired RoleDao roleDao; + @Autowired + private JwtTokenUtil jwtTokenUtil; + @Override public List<Action> findAllActionsByRoleID(Integer roleID) { List<Action> actions = new ArrayList<Action>(); @@ -643,8 +647,14 @@ public class UserDaoImpl implements UserDao { public List<UserDeviceToken> getDeviceTokenForUserList(List<Long> userIdList) { List<UserDeviceToken> tokenList = new ArrayList<>(); try { - tokenList = jdbcTemplate.query(UserQueries.FETCH_USER_DEVICE_TOKEN + getIdQuery(userIdList) - + UserQueries.USER_DEVICE_ROLE_CONDITION, new SqlDataMapper().new UserDeviceMapper()); + List<UserDeviceToken> response = jdbcTemplate.query( + UserQueries.FETCH_USER_DEVICE_TOKEN + getIdQuery(userIdList), + new SqlDataMapper().new UserDeviceMapper()); + for (UserDeviceToken tokens : response) { + if (!jwtTokenUtil.isTokenExpired(tokens.getAuthToken())) { + tokenList.add(tokens); + } + } } catch (Exception e) { LOGGER.error("Encountered an Exception while fetching User Device Token Map: " + e); } diff --git a/src/main/java/com/tarento/retail/model/UserDeviceToken.java b/src/main/java/com/tarento/retail/model/UserDeviceToken.java index b0c907fdc1170adfa518c4ae321b2317aa92519c..fcdacdf1881b94cc707e35a5e655f85460cf6430 100644 --- a/src/main/java/com/tarento/retail/model/UserDeviceToken.java +++ b/src/main/java/com/tarento/retail/model/UserDeviceToken.java @@ -7,31 +7,42 @@ package com.tarento.retail.model; */ public class UserDeviceToken { - + private Long userId; private String deviceToken; private String deviceId; - + private String authToken; + public Long getUserId() { return userId; } + public void setUserId(Long userId) { this.userId = userId; } + public String getDeviceToken() { return deviceToken; } + public void setDeviceToken(String deviceToken) { this.deviceToken = deviceToken; } + public String getDeviceId() { return deviceId; } + public void setDeviceId(String deviceId) { this.deviceId = deviceId; - } - - - + } + + public String getAuthToken() { + return authToken; + } + + public void setAuthToken(String authToken) { + this.authToken = authToken; + } } diff --git a/src/main/java/com/tarento/retail/model/mapper/SqlDataMapper.java b/src/main/java/com/tarento/retail/model/mapper/SqlDataMapper.java index adce2fa982523f2efde78b7073081796a9315481..bbffa90baa3f3c0bc49d3e908a5c9574d756216e 100644 --- a/src/main/java/com/tarento/retail/model/mapper/SqlDataMapper.java +++ b/src/main/java/com/tarento/retail/model/mapper/SqlDataMapper.java @@ -96,6 +96,7 @@ public class SqlDataMapper { UserDeviceToken token = new UserDeviceToken(); token.setDeviceToken(rs.getString("device_token")); token.setUserId(rs.getLong("user_id")); + token.setAuthToken(rs.getString("auth_token")); return token; } } @@ -311,10 +312,10 @@ public class SqlDataMapper { return action; } } - + public class UserRoleCountMapper implements RowMapper<KeyValue> { public KeyValue mapRow(ResultSet rs, int rowNum) throws SQLException { - KeyValue keyValue = new KeyValue(); + KeyValue keyValue = new KeyValue(); keyValue.setKey(rs.getString("roleName")); keyValue.setValue(rs.getObject("numberOfUsers")); return keyValue; diff --git a/src/main/java/com/tarento/retail/util/PathRoutes.java b/src/main/java/com/tarento/retail/util/PathRoutes.java index 204f14ed487d0cd223d8adbf4c9790c11e4ed186..8797b32d924b627a7619370e928326f6c42bb55e 100644 --- a/src/main/java/com/tarento/retail/util/PathRoutes.java +++ b/src/main/java/com/tarento/retail/util/PathRoutes.java @@ -39,6 +39,7 @@ public interface PathRoutes { final String MAP_USER_MASTER_ROLE_COUNTRY_ORG = "mapUserMasterRoleCountryOrg"; final String REQUEST_OTP = "/requestOTP"; final String NUMBER_OF_USERS_ROLES_GET = "/getNumberOfUsersAndRoles"; + final String GET_USER_DEVICE_TOKEN = "getDeviceTokenForUserIds"; } public interface AuthenticationRoutes { diff --git a/src/main/java/com/tarento/retail/util/Sql.java b/src/main/java/com/tarento/retail/util/Sql.java index 8243db6865246c765037eaf2212c66e812744fc8..b58809c8ed0847155caf4a01ec0f96dd865d00ab 100644 --- a/src/main/java/com/tarento/retail/util/Sql.java +++ b/src/main/java/com/tarento/retail/util/Sql.java @@ -147,7 +147,7 @@ public interface Sql { final String CHECK_USER_DEVICE_TOKEN = "SELECT COUNT(*) FROM user_device WHERE user_id = ? AND device_token = ? "; final String INSERT_USER_DEVICE_TOKEN = "INSERT INTO user_device (user_id, device_token, device_id, created_date, user_auth_id) VALUES (?,?,?,?,?) "; final String UPDATE_USER_DEVICE_TOKEN = "UPDATE user_device SET device_token = ?, created_date = ? WHERE user_id = ? "; - final String FETCH_USER_DEVICE_TOKEN = " SELECT device.id, device.user_id, device.device_token FROM user_device device WHERE device.user_id IN "; + final String FETCH_USER_DEVICE_TOKEN = " SELECT device.id, device.user_id, device.device_token, auth_token FROM user_device device, user_authentication WHERE device.user_auth_id = user_authentication.id AND device.user_id IN "; final String USER_DEVICE_ROLE_CONDITION = " and exists (select 1 from user_role where user_id = device.user_id and role_id IN (1,2)) " + "and not exists (select 1 from user_role where user_id = device.user_id and role_id NOT IN (1,2)) "; final String FETCH_AUTH_TOKEN_REF = "SELECT id FROM user_authentication WHERE auth_token = ? ";