diff --git a/src/main/java/com/billpaymentservice/bbps/config/CustomUserDetailsService.java b/src/main/java/com/billpaymentservice/bbps/config/CustomUserDetailsService.java index e6c3698..c9f2759 100644 --- a/src/main/java/com/billpaymentservice/bbps/config/CustomUserDetailsService.java +++ b/src/main/java/com/billpaymentservice/bbps/config/CustomUserDetailsService.java @@ -12,18 +12,19 @@ import org.springframework.stereotype.Service; import com.billpaymentservice.bbps.entites.UserEntity; import com.billpaymentservice.bbps.entites.UsersDetails; +import com.billpaymentservice.bbps.repository.UserRepository; import com.billpaymentservice.bbps.repository.UsersDetailsRepository; @Service public class CustomUserDetailsService implements UserDetailsService { @Autowired - private UsersDetailsRepository userRepo; + private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String userMobNo) throws UsernameNotFoundException { - Optional adminOptional = userRepo.findByMobile(userMobNo); + Optional adminOptional = userRepository.findByMobile(userMobNo); if (adminOptional.isPresent()) { UserEntity user = adminOptional.get(); diff --git a/src/main/java/com/billpaymentservice/bbps/controller/AuthController.java b/src/main/java/com/billpaymentservice/bbps/controller/AuthController.java index b8b7a32..85a2f30 100644 --- a/src/main/java/com/billpaymentservice/bbps/controller/AuthController.java +++ b/src/main/java/com/billpaymentservice/bbps/controller/AuthController.java @@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.billpaymentservice.bbps.dto.ResponseModel; import com.billpaymentservice.bbps.dto.auth.AuthResponse; import com.billpaymentservice.bbps.dto.response.AuthResponses; import com.billpaymentservice.bbps.dto.auth.LoginRequest; @@ -32,33 +33,28 @@ public class AuthController { } @PostMapping(value = "/sendOtp", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity sendOtp(@Validated @RequestBody LoginRequest request) { + public ResponseEntity sendOtp(@Validated @RequestBody LoginRequest request) { log.info("Received sendOtp request for mobile: {}", request.getMobile()); - OtpSendResponse resp = authService.sendOtp(request); - return ResponseEntity.ok(resp); + return ResponseEntity.ok(authService.sendOtp(request)); } @PostMapping(value = "/verifyOtp", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity verifyOtp(@Validated @RequestBody VerifyOtpRequest request) { - AuthResponses resp = authService.verifyOtp(request); - return ResponseEntity.ok(resp); + public ResponseEntity verifyOtp(@Validated @RequestBody VerifyOtpRequest request) { + + return ResponseEntity.ok(authService.verifyOtp(request)); } @PostMapping(value = "/register", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity register(@Validated @RequestBody RegisterRequest request) { - AuthResponse resp = authService.registerUser(request); - return ResponseEntity.ok(resp); + public ResponseEntity register(@Validated @RequestBody RegisterRequest request) { + + return ResponseEntity.ok(authService.registerUser(request)); } @PostMapping("/loginWithoutDecryption") - public ResponseEntity login(@RequestBody LoginRequest loginRequest) { - try { - AuthResponses authResponse = authService.authenticateUser(loginRequest); - return ResponseEntity.ok(authResponse); - } catch (Exception e) { - return ResponseEntity.status(500).body(AuthResponses.builder().status("Unauthorized") - .message("An unexpected error occurred").statusCode(500).build()); - } + public ResponseEntity login(@RequestBody LoginRequest loginRequest) { + + return ResponseEntity.ok(authService.authenticateUser(loginRequest)); + } } \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/dto/UserDetailsDTO.java b/src/main/java/com/billpaymentservice/bbps/dto/UserDetailsDTO.java index 2962792..46575e1 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/UserDetailsDTO.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/UserDetailsDTO.java @@ -19,5 +19,5 @@ public class UserDetailsDTO { private String userName; - private int userAge; + private String userAge; } diff --git a/src/main/java/com/billpaymentservice/bbps/dto/auth/AuthResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/auth/AuthResponse.java index a88d366..af3dbec 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/auth/AuthResponse.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/auth/AuthResponse.java @@ -1,14 +1,23 @@ package com.billpaymentservice.bbps.dto.auth; -import com.billpaymentservice.bbps.dto.auth.UserDto; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) public class AuthResponse { private boolean success; private String message; private boolean userExists; private UserDto user; - - public AuthResponse() {} + private String token; public AuthResponse(boolean success, String message, boolean userExists, UserDto user) { this.success = success; @@ -16,36 +25,10 @@ public class AuthResponse { this.userExists = userExists; this.user = user; } + public AuthResponse(boolean success, String message, String token) { + this.success = success; + this.message = message; + this.token = token; + } - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isUserExists() { - return userExists; - } - - public void setUserExists(boolean userExists) { - this.userExists = userExists; - } - - public UserDto getUser() { - return user; - } - - public void setUser(UserDto user) { - this.user = user; - } } \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/dto/auth/RegisterRequest.java b/src/main/java/com/billpaymentservice/bbps/dto/auth/RegisterRequest.java index ee156a1..be23b07 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/auth/RegisterRequest.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/auth/RegisterRequest.java @@ -9,6 +9,6 @@ public class RegisterRequest { private String mobile; private String name; private String email; - private int age; + private String age; } \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/dto/auth/UserDto.java b/src/main/java/com/billpaymentservice/bbps/dto/auth/UserDto.java index 1c35570..e6efb71 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/auth/UserDto.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/auth/UserDto.java @@ -14,7 +14,7 @@ public class UserDto { private String mobile; private String name; private String email; - private int age; + private String age; } \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/entites/UserEntity.java b/src/main/java/com/billpaymentservice/bbps/entites/UserEntity.java index ab454eb..135305e 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/UserEntity.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/UserEntity.java @@ -35,7 +35,14 @@ public class UserEntity extends Auditable { private String email; @Column(name = "age") - private int age; + private String age; + + public UserEntity(String mobile, String name, String email, String age) { + this.mobile = mobile; + this.name = name; + this.email = email; + this.age = age; + } diff --git a/src/main/java/com/billpaymentservice/bbps/repository/UsersDetailsRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/UsersDetailsRepository.java index eeca8d4..167b40a 100644 --- a/src/main/java/com/billpaymentservice/bbps/repository/UsersDetailsRepository.java +++ b/src/main/java/com/billpaymentservice/bbps/repository/UsersDetailsRepository.java @@ -3,13 +3,14 @@ package com.billpaymentservice.bbps.repository; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Repository; -import com.billpaymentservice.bbps.entites.UserEntity; +import com.billpaymentservice.bbps.entites.UsersDetails; @Repository -public interface UsersDetailsRepository extends JpaRepository { +public interface UsersDetailsRepository extends JpaRepository { - Optional findByMobile(String userMobNo); + Optional findByUserMobNo(String userMobNo); } diff --git a/src/main/java/com/billpaymentservice/bbps/service/AuthService.java b/src/main/java/com/billpaymentservice/bbps/service/AuthService.java index 5698c80..b9a5926 100644 --- a/src/main/java/com/billpaymentservice/bbps/service/AuthService.java +++ b/src/main/java/com/billpaymentservice/bbps/service/AuthService.java @@ -1,5 +1,6 @@ package com.billpaymentservice.bbps.service; +import com.billpaymentservice.bbps.dto.ResponseModel; import com.billpaymentservice.bbps.dto.auth.AuthResponse; import com.billpaymentservice.bbps.dto.auth.LoginRequest; import com.billpaymentservice.bbps.dto.auth.OtpSendResponse; @@ -9,13 +10,13 @@ import com.billpaymentservice.bbps.dto.response.AuthResponses; import com.billpaymentservice.bbps.entites.UserEntity; public interface AuthService { - OtpSendResponse sendOtp(LoginRequest request); + ResponseModel sendOtp(LoginRequest request); - AuthResponses verifyOtp(VerifyOtpRequest request); + ResponseModel verifyOtp(VerifyOtpRequest request); - AuthResponse registerUser(RegisterRequest request); + ResponseModel registerUser(RegisterRequest request); UserEntity findByMobile(String mobile); - AuthResponses authenticateUser(LoginRequest loginRequest); + ResponseModel authenticateUser(LoginRequest loginRequest); } \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AuthServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AuthServiceImpl.java index d07f367..d8b3d0a 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AuthServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AuthServiceImpl.java @@ -3,11 +3,12 @@ package com.billpaymentservice.bbps.serviceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - import com.billpaymentservice.bbps.config.JwtUtil; import com.billpaymentservice.bbps.dto.UserDetailsDTO; +import com.billpaymentservice.bbps.dto.ResponseModel; import com.billpaymentservice.bbps.dto.auth.AuthResponse; import com.billpaymentservice.bbps.dto.auth.LoginRequest; import com.billpaymentservice.bbps.dto.auth.OtpSendResponse; @@ -16,12 +17,12 @@ import com.billpaymentservice.bbps.dto.auth.UserDto; import com.billpaymentservice.bbps.dto.auth.VerifyOtpRequest; import com.billpaymentservice.bbps.dto.response.AuthResponses; import com.billpaymentservice.bbps.entites.UserEntity; +import com.billpaymentservice.bbps.entites.UsersDetails; import com.billpaymentservice.bbps.repository.UserRepository; import com.billpaymentservice.bbps.repository.UsersDetailsRepository; import com.billpaymentservice.bbps.service.AuthService; import com.billpaymentservice.bbps.util.Helper; import com.billpaymentservice.bbps.util.OtpClient; - import java.util.Optional; @Service @@ -33,9 +34,9 @@ public class AuthServiceImpl implements AuthService { private final OtpClient otpClient; private final Helper helper; private final UsersDetailsRepository userRepo; - private final JwtUtil jwtUtil; + @Autowired public AuthServiceImpl(UserRepository userRepository, OtpClient otpClient, Helper helper, UsersDetailsRepository userRepo, JwtUtil jwtUtil) { this.userRepository = userRepository; @@ -46,32 +47,37 @@ public class AuthServiceImpl implements AuthService { } @Override - public OtpSendResponse sendOtp(LoginRequest request) { - Optional existing = userRepository.findByMobile(request.getMobile()); - - if (existing.isPresent()) { - UserEntity u = existing.get(); - UserDto dto = new UserDto(u.getId(), u.getMobile(), u.getName(), u.getEmail(), u.getAge()); - return null; + public ResponseModel sendOtp(LoginRequest request) { + try { + OtpSendResponse resp = otpClient.sendOtp(request.getMobile()); + if (resp == null) { + return ResponseModel.builder().message("OTP send service returned null").status("Failure") + .statusCode(500).data(null).build(); + } + String status = resp.isSuccess() ? "Success" : "Failure"; + int code = resp.isSuccess() ? 200 : 400; + return ResponseModel.builder().message(resp.getMessage()).status(status).statusCode(code).data(resp) + .build(); + } catch (Exception ex) { + LOGGER.error("Error in sendOtp: {}", ex.getMessage(), ex); + return ResponseModel.builder().message("An unexpected error occurred while sending OTP").status("Failure") + .statusCode(500).data(null).build(); } - // delegate to external OTP provider - return otpClient.sendOtp(request.getMobile()); } @Override - public AuthResponses verifyOtp(VerifyOtpRequest request) { + public ResponseModel verifyOtp(VerifyOtpRequest request) { boolean ok = otpClient.verifyOtp(request.getMobile(), request.getOtp()); - LOGGER.info("OTP STATUS" + ok); - if (ok) { - return new AuthResponses("", "Invalid OTP", "Failed", 401, null); + LOGGER.info("OTP STATUS {}", ok); + if (!ok) { + return ResponseModel.builder().message("Invalid OTP").status("Failure").statusCode(401).data(null).build(); } String mobileNo = request.getMobile(); try { + Optional byMobileNumber = userRepository.findByMobile(mobileNo); - Optional byAdminEmail = userRepo.findByMobile(mobileNo); - - if (byAdminEmail.isPresent()) { - UserEntity user = byAdminEmail.get(); + if (byMobileNumber.isPresent()) { + UserEntity user = byMobileNumber.get(); String token = jwtUtil.generateToken(user.getMobile()); LOGGER.info("Generated JWT token for mobileNo: " + mobileNo); @@ -82,82 +88,92 @@ public class AuthServiceImpl implements AuthService { userDetailsDTO = UserDetailsDTO.builder().id(user.getId()).userEmailId(user.getEmail()) .userMobNo(user.getMobile()).userName(user.getName()).userAge(user.getAge()).build(); } - return new AuthResponses(token, "Success", "Login Done", 200, userDetailsDTO); + + AuthResponses authResp = new AuthResponses(token, "Success", "Login Success", 200, userDetailsDTO); + return ResponseModel.builder().message("Login Success").status("Success").statusCode(200).data(authResp) + .build(); } else { - return new AuthResponses("", "User Not Found", "Authentication failed", 401, null); + AuthResponses authResp = new AuthResponses("", "User Not Found", "Authentication failed", 401, null); + return ResponseModel.builder().message("User Not Found").status("Failure").statusCode(401) + .data(authResp).build(); } } catch (Exception ex) { - System.out.println( - "Error occurred during login for mobile no: " + mobileNo + " Exception: " + ex.getMessage()); - - return AuthResponses.builder().status("Unauthorized").message("Authentication failed: " + ex.getMessage()) - .statusCode(401).build(); + LOGGER.error("Error occurred during login for mobile no: {} Exception: {}", mobileNo, ex.getMessage(), ex); + return ResponseModel.builder().message("Authentication failed: " + ex.getMessage()).status("Failure") + .statusCode(500).data(null).build(); } - -// Optional userOpt = userRepository.findByMobile(request.getMobile()); -// if (userOpt.isPresent()) { -// UserEntity user = userOpt.get(); -// UserDto dto = new UserDto(user.getId(), user.getMobile(), user.getName(), user.getEmail(), user.getAge()); -// return new AuthResponse(true, "Login successful", true, dto); -// } else { -// return new AuthResponse(true, "OTP verified; user not found - proceed to registration", false, null); -// } } @Override @Transactional - public AuthResponse registerUser(RegisterRequest request) { - Optional existing = userRepository.findByMobile(request.getMobile()); - if (existing.isPresent()) { - UserEntity u = existing.get(); - UserDto dto = new UserDto(u.getId(), u.getMobile(), u.getName(), u.getEmail(), u.getAge()); - return new AuthResponse(false, "User already exists", true, dto); - } + public ResponseModel registerUser(RegisterRequest request) { + try { + Optional existing = userRepository.findByMobile(request.getMobile()); + if (existing.isPresent()) { + UserEntity u = existing.get(); + UserDto dto = new UserDto(u.getId(), u.getMobile(), u.getName(), u.getEmail(), u.getAge()); + AuthResponse ar = new AuthResponse(false, "User already exists", true, dto); + return ResponseModel.builder().message(ar.getMessage()).status("Failure").statusCode(409).data(ar) + .build(); + } - UserEntity user = helper.createNewUser(request); - user = userRepository.save(user); - UserDto dto = new UserDto(user.getId(), user.getMobile(), user.getName(), user.getEmail(), user.getAge()); - return new AuthResponse(true, "Registration successful", true, dto); + UserEntity newUser = new UserEntity(request.getMobile(), request.getName(), request.getEmail(), + request.getAge()); + userRepository.save(newUser); + String token = jwtUtil.generateToken(newUser.getMobile()); + UserDto dto = new UserDto(newUser.getId(), newUser.getMobile(), newUser.getName(), newUser.getEmail(), + newUser.getAge()); + AuthResponse ar = new AuthResponse(true, "user registed sucessfully", token); + return ResponseModel.builder().message(ar.getMessage()).status("Success").statusCode(201).data(ar).build(); + } catch (Exception ex) { + LOGGER.error("Error in registerUser: {}", ex.getMessage(), ex); + return ResponseModel.builder().message("An unexpected error occurred while registering user") + .status("Failure").statusCode(500).data(null).build(); + } + } + + @Override + public ResponseModel authenticateUser(LoginRequest loginRequest) { + LOGGER.info("Processing login for Request: {}", loginRequest); + + try { + String mobileNo = loginRequest.getMobile(); + + Optional byMobileNo = userRepo.findByUserMobNo(mobileNo); + + if (byMobileNo.isPresent()) { + UsersDetails user = (UsersDetails) byMobileNo.get(); + String token = jwtUtil.generateToken(user.getUserMobNo()); + + LOGGER.info("Generated JWT token for mobileNo: " + mobileNo); + + Object userDetailsDTO = null; + + if (user != null) { + userDetailsDTO = UserDetailsDTO.builder().id(user.getId()).userEmailId(user.getUserEmailId()) + .userMobNo(user.getUserMobNo()).userName(user.getUserName()).userAge(user.getUserAge()) + .build(); + } + AuthResponses authResp = new AuthResponses(token, "Success", "Login Done", 200, userDetailsDTO); + return ResponseModel.builder().message("Login Done").status("Success").statusCode(200).data(authResp) + .build(); + } else { + AuthResponses authResp = new AuthResponses("", "User Not Found", "Authentication failed", 401, null); + return ResponseModel.builder().message("User Not Found").status("Failure").statusCode(401) + .data(authResp).build(); + } + + } catch (Exception ex) { + LOGGER.error("Error occurred during login for mobile no: {} Exception: {}", loginRequest.getMobile(), + ex.getMessage(), ex); + return ResponseModel.builder().message("Authentication failed: " + ex.getMessage()).status("Failure") + .statusCode(500).data(null).build(); + } } @Override public UserEntity findByMobile(String mobile) { return userRepository.findByMobile(mobile).orElse(null); } - - @Override - public AuthResponses authenticateUser(LoginRequest loginRequest) { - LOGGER.info("Processing login for Request: " + loginRequest); - - try { - String mobileNo = loginRequest.getMobile(); - - Optional byAdminEmail = userRepo.findByMobile(mobileNo); - - if (byAdminEmail.isPresent()) { - UserEntity user = byAdminEmail.get(); - String token = jwtUtil.generateToken(user.getMobile()); - - LOGGER.info("Generated JWT token for mobileNo: " + mobileNo); - - Object userDetailsDTO = null; - - if (user != null) { - userDetailsDTO = UserDetailsDTO.builder().id(user.getId()).userEmailId(user.getEmail()) - .userMobNo(user.getMobile()).userName(user.getName()).userAge(user.getAge()).build(); - } - return new AuthResponses(token, "Success", "Login Done", 200, userDetailsDTO); - } else { - return new AuthResponses("", "User Not Found", "Authentication failed", 401, null); - } - - } catch (Exception ex) { - System.out.println("Error occurred during login for mobile no: " + loginRequest.getMobile() + " Exception: " - + ex.getMessage()); - - return AuthResponses.builder().status("Unauthorized").message("Authentication failed: " + ex.getMessage()) - .statusCode(401).build(); - } - } } \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/util/OtpClient.java b/src/main/java/com/billpaymentservice/bbps/util/OtpClient.java index 758ced5..24530bf 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/OtpClient.java +++ b/src/main/java/com/billpaymentservice/bbps/util/OtpClient.java @@ -53,13 +53,6 @@ public class OtpClient { try { logger.info("Initiating OTP send process for mobile: {}", mobile); - logger.info("eKYC Mobile URL: {}", ekycMobileUrl); - logger.info("API Key: {}", apiKey != null && !apiKey.isEmpty()); - logger.info("Secret Key: {}", secretKey != null && !secretKey.isEmpty()); - logger.info("Send URL: {}", sendUrl); - logger.info("Verify URL: {}", verifyUrl); - logger.info("Mobile Number: {}", mobile); - // If explicit eKYC config present, use that flow if (ekycMobileUrl != null && !ekycMobileUrl.isEmpty()) { HttpHeaders headers = new HttpHeaders(); @@ -145,28 +138,20 @@ public class OtpClient { if (response.getStatusCode() == HttpStatus.OK) { String respBody = response.getBody(); + if (respBody != null) { - // try to parse JSON and look for common verification keys ObjectMapper mapper = new ObjectMapper(); - try { - Map respMap = mapper.readValue(respBody, Map.class); - if (respMap.containsKey("verified")) { - return Boolean.TRUE.equals(respMap.get("verified")); - } - if (respMap.containsKey("success")) { - return Boolean.TRUE.equals(respMap.get("success")); - } - if (respMap.containsKey("status") && "OK".equalsIgnoreCase(String.valueOf(respMap.get("status")))) { - return true; - } - } catch (Exception e) { - logger.debug("Unable to parse verification response body to JSON: {}", e.getMessage()); - // fall through to treat 200 as success + Map respMap = mapper.readValue(respBody, Map.class); + + // Check correct key of your service + if (respMap.containsKey("status")) { + return Boolean.TRUE.equals(respMap.get("status")); } } - // fallback: treat HTTP 200 as successful verification - return true; - } else { + + return false; // default fallback + } + else { logger.warn("OTP verification endpoint returned non-OK status: {}", response.getStatusCode()); return false; } @@ -183,4 +168,6 @@ public class OtpClient { return false; } } + + }