Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,21 @@ public String verifyCustomer(@RequestParam String qTokq1) {
}


@GetMapping("/verify-password-update")
public String verifyPasswordUpdate(@RequestParam String qTokq1) {
FindByTokenRequest request = new FindByTokenRequest(qTokq1);
UsersService.setFindByTokenRequest(request);
UsersService.setServiceHandler("verifyUser");
var response = serviceConcurrentExecutor.buildServiceExecutor(service);
/*
I need to create update
*/
if(response.size() == 1){
return "redirect:https://www.example.com";
}else{
return null;
}
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.users.application.dtos;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
@AllArgsConstructor
public class FindByEmailRequest {
private String emailAddress;
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ public class Users implements UserDetails {
private String userEmailAddress;

@Column(columnDefinition = "TEXT",nullable = false)
private String userPassword;
private String userPassword,previousPassword;
@Column(nullable = false)
private Short userStatus, userAge;
private Short userStatus, userAge,passwordUpdateStatus;
@Column(nullable = false, unique = true)
private String userFullName;
@Column(nullable = false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.utils.application.globalExceptions.ServiceHandlerException;
import com.utils.application.mailing.VerifyCustomerEmail;
import com.utils.application.mailing.dto.VerifyCustomerEvent;
import com.utils.application.mailing.dto.VerifyUpdatePasswordEvent;
import jakarta.transaction.Transactional;
import lombok.Getter;
import lombok.Setter;
Expand Down Expand Up @@ -69,7 +70,7 @@ public class UsersService implements Execute<List<UsersResponse>> {
@Autowired
public UsersService(@Autowired ApplicationEventPublisher publisher, @Autowired RedisTemplate redisTemplate, PasswordEncoder passwordEncoder, @Autowired JwtService jwtService, @Autowired AuthenticationManager authenticationManager, @Autowired UsersRepository usersRepository, @Autowired UsersMapper usersMapper) {
setUsersRepository(usersRepository);
this.publisher= publisher;
this.publisher = publisher;
UsersService.passwordEncoder = passwordEncoder;
UsersService.usersMapper = usersMapper;
UsersService.jwtService = jwtService;
Expand Down Expand Up @@ -165,6 +166,7 @@ private List<UsersResponse> registerUsers() {
Users users = Users.builder()
.userIdentityNo(getInstance().validateIdentityNo(request.getUserIdentityNo()))
.userPassword(passwordEncoder.encode(getInstance().checkPasswordValidity(usersRegisterRequest().getUserPassword().trim())))
.previousPassword(passwordEncoder.encode(getInstance().checkPasswordValidity(usersRegisterRequest().getUserPassword().trim())))
.userRegistrationDate(getInstance().formatDateTime(LocalDateTime.now()))
.userModifiedDate(getInstance().formatDateTime(LocalDateTime.now()))
.fk_privilege_id(request.getPrivileges())
Expand All @@ -173,12 +175,13 @@ private List<UsersResponse> registerUsers() {
.userFullName(request.getUserFullName().trim())
.userEmailAddress(request.getUserEmailAddress().trim())
.userAge(getInstance().getValidatedAge())
.passwordUpdateStatus((short) 0)
.build();

try {
logger.info("users was successfully registered : data : {}", usersRepository.save(users));

var responseList =mapToResponse(List.of(users));
var responseList = mapToResponse(List.of(users));

if (redisService.get("ALL_USERS", UsersResponse.class) != null) {
logger.info("Cached data for all users deleted : {}", redisService.delete("ALL_USERS"));
Expand Down Expand Up @@ -260,7 +263,8 @@ private List<UsersResponse> updateUsersPassword() {
throw throwExceptionAndReport(new NullRequestException(errorMessage), errorMessage, resolveIssue);
}
}
private List<UsersResponse> mapToResponse(List<Users> list){

private List<UsersResponse> mapToResponse(List<Users> list) {
return list.parallelStream().map(s -> UsersResponse
.builder()
.usersAge(s.getUserAge())
Expand All @@ -276,7 +280,8 @@ private List<UsersResponse> mapToResponse(List<Users> list){
.token(s.getToken())
.build()).toList();

}
}

private List<UsersResponse> findUserById() {
String encrypt;
try {
Expand All @@ -294,7 +299,7 @@ private List<UsersResponse> findUserById() {
if (responseList.isPresent()) {
var users = responseList.get();

var jpaUserResponse =mapToResponse(List.of(users));
var jpaUserResponse = mapToResponse(List.of(users));

redisService.set(encrypt, jpaUserResponse.get(0), 1L, TimeUnit.HOURS);
logger.info("cached data : {}", redisService.get(encrypt, UsersResponse.class));
Expand All @@ -318,15 +323,15 @@ private List<UsersResponse> findUserById() {
private List<UsersResponse> findAllUsers() {
var redisResponse = redisService.get("ALL_USERS", List.class);
if (redisResponse != null) {
var returnRedisResponse = redisService.safeCastList(redisResponse,UsersResponse.class);
var returnRedisResponse = redisService.safeCastList(redisResponse, UsersResponse.class);
logger.info("get all users from cache, data from redis : {}", returnRedisResponse);
return returnRedisResponse;
} else {
var jpaResponse= mapToResponse(usersRepository.findAll());
var jpaResponse = mapToResponse(usersRepository.findAll());

redisService.set("ALL_USERS",jpaResponse,1L,TimeUnit.HOURS);
redisService.set("ALL_USERS", jpaResponse, 1L, TimeUnit.HOURS);
var redisResponseChecker = redisService.get("ALL_USERS", List.class);
logger.info("cached data for all users from jpa : {}", redisService.safeCastList(redisResponseChecker,UsersResponse.class));
logger.info("cached data for all users from jpa : {}", redisService.safeCastList(redisResponseChecker, UsersResponse.class));
return jpaResponse;
}
}
Expand Down Expand Up @@ -366,7 +371,7 @@ private List<UsersResponse> findAllUsersByName() {

}

private boolean passwordStatus,sendMail;
private boolean passwordStatus, sendMail;


@Transactional
Expand All @@ -380,11 +385,11 @@ private List<UsersResponse> login() {
if (redisUserResponse != null) {
logger.info("redis executing...");
jpaUserResponse = null;
if (redisUserResponse.getUsersStatus() == 0){
var errorMessage = "User already got email to verify account";
var resolveIssue = "check emails and click the link from email : verify@aa.com. New link will be generated after Hour";
throw throwExceptionAndReport(new VerifyEmailAddressException(errorMessage), errorMessage, resolveIssue);
}
if (redisUserResponse.getUsersStatus() == 0) {
var errorMessage = "User already got email to verify account";
var resolveIssue = "check emails and click the link from email : verify@aa.com. New link will be generated after Hour";
throw throwExceptionAndReport(new VerifyEmailAddressException(errorMessage), errorMessage, resolveIssue);
}

redisStatus = true;

Expand All @@ -401,38 +406,47 @@ private List<UsersResponse> login() {
logger.info("email address {} found", loginRequest().getUsersEmailAddress());



var users = optionalEntity.get();
var jwt = jwtService.generateToken(optionalEntity.get());
users.setToken(jwt);
logger.info("JWT Token : {}", jwt);
logger.info("User with set token : {}", users);


var userWithToken= usersRepository.save(users);
var userWithToken = usersRepository.save(users);
logger.info("User with set token from db : {}", userWithToken);

jpaUserResponse = mapToResponse(List.of(userWithToken)).get(0);
// send mail when status is 0, pub sub pattern will be used
if (optionalEntity.get().getUserStatus() == 0){
if (optionalEntity.get().getUserStatus() == 0) {
publisher.publishEvent(VerifyCustomerEvent
.builder()
.emailFrom("softwareaa65@gmail.com")
.emailTo(jpaUserResponse.getUsersEmailAddress())
.name(jpaUserResponse.getUsersFullName())
.token(jpaUserResponse.getToken())
.emailFrom("softwareaa65@gmail.com")
.emailTo(jpaUserResponse.getUsersEmailAddress())
.name(jpaUserResponse.getUsersFullName())
.token(jpaUserResponse.getToken())
.privilegeId(optionalEntity.get().getFk_privilege_id())
.build()
);

logger.info("user : {} has not been verified, email sent to verify customer",jpaUserResponse.getUsersFullName());
logger.info("user : {} has not been verified, email sent to verify customer", jpaUserResponse.getUsersFullName());
sendMail = true;
} else if(optionalEntity.get().getUserStatus() == 1){
} else if (optionalEntity.get().getUserStatus() == 1) {
passwordStatus = true;
logger.info("user : {} has been verified,trying to login...",jpaUserResponse.getUsersFullName());
logger.info("user : {} has been verified,trying to login...", jpaUserResponse.getUsersFullName());

sendMail = false;
}else {
if (optionalEntity.get().getPasswordUpdateStatus() == 0) {
publisher.publishEvent(VerifyUpdatePasswordEvent
.builder()
.emailFrom("softwareaa65@gmail.com")
.emailTo(jpaUserResponse.getUsersEmailAddress())
.name(jpaUserResponse.getUsersFullName())
.token(jpaUserResponse.getToken())
.build()
);
}
} else {

var errorMessage = "log in failed due to invalid user status ";
var resolveIssue = "Contact AA Administrator";
Expand All @@ -456,10 +470,9 @@ private List<UsersResponse> login() {

logger.info("user with email {} successfully logged in using jpa data : {}", loginRequest().getUsersEmailAddress(), jpaUserResponse);

redisService.set(encrypt, jpaUserResponse, 1L, TimeUnit.HOURS);

logger.info("cached login data : {}", redisService.get(encrypt, UsersResponse.class));
redisService.set(encrypt, jpaUserResponse, 1L, TimeUnit.HOURS);

logger.info("cached login data : {}", redisService.get(encrypt, UsersResponse.class));


return List.of(jpaUserResponse);
Expand Down Expand Up @@ -507,30 +520,73 @@ public List<UsersResponse> call() {
case "getUsersById" -> this.findUserById();
case "userLogin" -> this.login();
case "userUpdatePassword" -> this.updateUsersPassword();
case "verifyUser"-> this.verifyCustomer();
case "verifyUser" -> this.verifyCustomer();
case "passwordRollBack" -> this.passwordRollBack();
case "verifyPasswordUpdate" -> this.verifyPasswordUpdate();
default -> throw new ServiceHandlerException("Failed execute service due to incorrect service string");
};
else
return null;
}

private FindByEmailRequest findByEmailRequest;

private List<UsersResponse> passwordRollBack() {
Optional<Users> user = usersRepository.findByUserEmailAddress(findByEmailRequest.getEmailAddress());

if (user.isPresent()) {
var foundUser = user.get();

foundUser.setUserPassword(foundUser.getPreviousPassword());
return mapToResponse(List.of(usersRepository.save(foundUser)));
} else {
var errorMessage = "user with email:" +findByEmailRequest.getEmailAddress() + " not found";
var resolveIssue = "Please provide correct email";
throw throwExceptionAndReport(new UserNotFoundException(errorMessage), errorMessage, resolveIssue);

}


}

private List<UsersResponse> verifyPasswordUpdate() {
Optional<Users> user = usersRepository.findByToken(findByTokenRequest.getToken());
if (user.isPresent()) {
var verifiedUser = user.get();
verifiedUser.setPasswordUpdateStatus((short) 1);
verifiedUser.setPreviousPassword(verifiedUser.getPassword());
verifiedUser.setUserModifiedDate(getInstance().formatDateTime(LocalDateTime.now()));

logger.info("User : {} has been successfully verified", verifiedUser.getUserFullName());
redisService.delete(verifiedUser.getUserEmailAddress());

return mapToResponse(List.of(usersRepository.save(verifiedUser)));

} else {
var errorMessage = UsersControllerAdvice.setMessage("User token to verify customer has expired");
var resolveIssue = "Please log in again to get new token in your mail";
throw throwExceptionAndReport(new VerificationTokenIncorrectException(errorMessage), errorMessage, resolveIssue);
}
}

@Transactional
private List<UsersResponse> verifyCustomer() {
Optional<Users> user = usersRepository.findByToken(findByTokenRequest.getToken());

if(user.isPresent()){
var verifiedUser = user.get();
verifiedUser.setUserStatus((short)1);
verifiedUser.setUserModifiedDate(getInstance().formatDateTime(LocalDateTime.now()));
logger.info("User : {} has been successfully verified", verifiedUser.getUserFullName());
redisService.delete(verifiedUser.getUserEmailAddress());

return mapToResponse(List.of(usersRepository.save(verifiedUser)));
}else{
var errorMessage = UsersControllerAdvice.setMessage("User token to verify customer has expired");
var resolveIssue = "Please log in again to get new token in your mail";
throw throwExceptionAndReport(new VerificationTokenIncorrectException(errorMessage), errorMessage, resolveIssue);
}
Optional<Users> user = usersRepository.findByToken(findByTokenRequest.getToken());

if (user.isPresent()) {
var verifiedUser = user.get();
verifiedUser.setUserStatus((short) 1);
verifiedUser.setPasswordUpdateStatus((short) 1);
verifiedUser.setUserModifiedDate(getInstance().formatDateTime(LocalDateTime.now()));
logger.info("User : {} has been successfully verified", verifiedUser.getUserFullName());
redisService.delete(verifiedUser.getUserEmailAddress());

return mapToResponse(List.of(usersRepository.save(verifiedUser)));
} else {
var errorMessage = UsersControllerAdvice.setMessage("User token to verify customer has expired");
var resolveIssue = "Please log in again to get new token in your mail";
throw throwExceptionAndReport(new VerificationTokenIncorrectException(errorMessage), errorMessage, resolveIssue);
}
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@ <h4>

<p>
To activate your account and complete registration, please
<a th:href="@{'http://localhost:8080/dev/api/verify/verify-customer?qTokq1=' + ${token}}">click here</a>
<a th:href="@{'http://localhost:8080/dev/api/verify/verify-password-update?qTokq1=' + ${token}}">click here</a>
or use the button below:
</p>

<p style="text-align:center;">
<a th:href="@{'http://localhost:8080/dev/api/verify/verify-customer?qTokq1=' + ${token}}"
<a th:href="@{'http://localhost:8080/dev/api/verify/verify-password-update?qTokq1=' + ${token}}"
style="display:inline-block;padding:10px 20px;background:Orange;color:#fff;text-decoration:none;border-radius:4px;">
Verify Me
</a>
Expand Down
Loading
Loading