Merge pull request #280 from Kitzanos/manage-pec-errors

Enhance PEC Email Error Handling and Response Saving
This commit is contained in:
Rinaldo
2025-05-08 21:12:02 +02:00
committed by GitHub
20 changed files with 296 additions and 36 deletions

View File

@@ -1,5 +1,6 @@
package net.gepafin.tendermanagement.dao;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.persistence.criteria.CriteriaBuilder;
@@ -308,6 +309,7 @@ public class ApplicationAmendmentRequestDao {
emailNotificationDao.sendMailToNotifyBeneficiaryRegardingNewAmendment(applicationAmendmentRequestEntity);
EmailSendResponse emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request);
applicationAmendmentRequestResponse.setEmailSendResponse(emailSendResponse);
saveEmailSendResponse(emailSendResponse, applicationAmendmentRequestEntity);
}
return applicationAmendmentRequestResponse;
}
@@ -1197,6 +1199,7 @@ public class ApplicationAmendmentRequestDao {
emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email), emailLogRequest);
EmailSendResponse emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request);
emailReminderResponse.setEmailSendResponse(emailSendResponse);
saveEmailSendResponse(emailSendResponse, amendment);
} else {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.BENEFICIARY_EMAIL_NOT_FOUND_MSG));
}
@@ -1551,8 +1554,14 @@ public class ApplicationAmendmentRequestDao {
applicationAmendmentRequestViewResponse.setExpirationDate(applicationAmendmentRequestView.getExpirationDate());
applicationAmendmentRequestViewResponse.setAssigendUserName(applicationAmendmentRequestView.getAssigendUserName());
applicationAmendmentRequestViewResponse.setStatus(applicationAmendmentRequestView.getStatus());
applicationAmendmentRequestViewResponse.setEmailSendResponse(applicationAmendmentRequestView.getEmailSendResponse());
return applicationAmendmentRequestViewResponse;
}
private void saveEmailSendResponse(EmailSendResponse newResponses, ApplicationAmendmentRequestEntity amendment) {
List<EmailSendResponse> mergedResponses = Utils.mergeEmailSendResponses(amendment.getEmailSendResponse(), newResponses);
amendment.setEmailSendResponse(mergedResponses);
applicationAmendmentRequestRepository.save(amendment);
}
}

View File

@@ -1892,7 +1892,7 @@ public class ApplicationEvaluationDao {
log.info("Status updated to ADMISSIBLE for applicationId: " + application.getId());
emailNotificationDao.sendAdmissibilityNotificationEmailForAdmissibleApplication(application);
emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request);
saveEmailSendResponseToEvaluation(emailSendResponse,existingEntity);
}
if(newStatus.equals(ApplicationStatusForEvaluation.TECHNICAL_EVALUATION) && Boolean.TRUE.equals(application.getStatus().equals(ApplicationStatusTypeEnum.ADMISSIBLE.getValue()))){
@@ -1950,6 +1950,7 @@ public class ApplicationEvaluationDao {
application = applicationRepository.save(application);
emailNotificationDao.sendInadmissibilityEmailForRejectedApplication(application,existingEntity);
emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request);
saveEmailSendResponseToEvaluation(emailSendResponse,existingEntity);
}
Map<String, String> placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_RESULT);
@@ -1963,6 +1964,14 @@ public class ApplicationEvaluationDao {
return null;
}
private void saveEmailSendResponseToEvaluation(EmailSendResponse newResponse, ApplicationEvaluationEntity evaluationEntity) {
List<EmailSendResponse> mergedResponses = Utils.mergeEmailSendResponses(
evaluationEntity.getEmailSendResponse(), newResponse
);
evaluationEntity.setEmailSendResponse(mergedResponses);
applicationEvaluationRepository.save(evaluationEntity);
}
public ApplicationEvaluationEntity validateApplicationEvaluationByApplicationId(Long applicationId) {
return applicationEvaluationRepository
.findByApplicationIdAndIsDeletedFalse(applicationId)

View File

@@ -470,6 +470,7 @@ public class AssignedApplicationsDao {
response.setCompanyName(view.getCompanyName());
response.setCreatedDate(view.getCreatedDate());
response.setUpdatedDate(view.getUpdatedDate());
response.setEmailSendResponse(view.getEmailSendResponse());
return response;
}

View File

@@ -20,8 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Set;
import java.util.*;
@Component
@Log4j2
@@ -36,21 +35,25 @@ public class EmailDao {
@Autowired
private CallService callService;
@Autowired
private EmailLogDao emailLogDao;
public EmailResendResponseBean resendEmail(HttpServletRequest request , Long userActionId){
List<EmailLogEntity> emailLogs = emailLogRepository.findByUserActionIdAndEmailServiceType(userActionId,EmailServiceTypeEnum.PEC_SERVICE.getValue());
List<EmailLogEntity> emailLogs = emailLogRepository.findByUserActionIdAndEmailServiceTypeAndSendStatus(userActionId,EmailServiceTypeEnum.PEC_SERVICE.getValue(),StatusTypeEnum.FAILED.getValue());
if (emailLogs.isEmpty()) {
log.info("No emails found for given userActionId.");
}
EmailResendResponseBean emailResendResponseBean = new EmailResendResponseBean();
for (EmailLogEntity log : emailLogs){
EmailLogRequest emailLogRequest = new EmailLogRequest();
emailLogRequest.setEmailType(EmailScenarioTypeEnum.valueOf(log.getEmailType()));
emailLogRequest.setRecipientType(RecipientTypeEnum.valueOf(log.getRecipientType()));
emailLogRequest.setRecipientId(log.getRecipientId());
emailLogRequest.setUserId(log.getUserId());
emailLogRequest.setApplicatioId(log.getApplicationId());
emailLogRequest.setCallId(log.getCallId());
emailLogRequest.setAmendmentId(log.getAmendmentId());
EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(EmailScenarioTypeEnum.valueOf(log.getEmailType()),
RecipientTypeEnum.valueOf(log.getRecipientType()),
log.getRecipientId(),
log.getRecipientEmails(),
log.getUserId(),
log.getApplicationId(),
log.getAmendmentId(),
log.getCallId()
);
List<String> recipients = Utils.commaSeparatedStringToList(log.getRecipientEmails());
CallEntity call = callService.validateCall(log.getCallId());
@@ -69,23 +72,37 @@ public class EmailDao {
public EmailSendResponse buildEmailSendResponseFromRequest(HttpServletRequest request) {
Long userActionId = (Long) request.getAttribute(GepafinConstant.USER_ACTION_ID);
boolean isEmailSendSuccess = isEmailSentSuccessfully(userActionId);
EmailSendResponse emailSendResponse = new EmailSendResponse();
emailSendResponse.setIsEmailSend(isEmailSendSuccess);
emailSendResponse.setUserActionId(userActionId);
return emailSendResponse;
}
public boolean isEmailSentSuccessfully(Long userActionId) {
List<EmailLogEntity> emailLogs = emailLogRepository.findByUserActionId(userActionId);
boolean allSuccess = true;
String emailScenario = null;
for (EmailLogEntity log : emailLogs) {
if (EmailServiceTypeEnum.PEC_SERVICE.getValue().equals(log.getEmailServiceType()) &&
StatusTypeEnum.SUCCESS.getValue().equals(log.getSendStatus())) {
return true;
if (emailScenario == null) {
emailScenario = log.getEmailType();
}
boolean isSuccess = EmailServiceTypeEnum.PEC_SERVICE.getValue().equals(log.getEmailServiceType()) &&
StatusTypeEnum.SUCCESS.getValue().equals(log.getSendStatus());
if (!isSuccess) {
allSuccess = false;
break;
}
}
return false;
return buildResponse(userActionId, allSuccess, emailScenario);
}
private EmailSendResponse buildResponse(Long userActionId, boolean allSuccess, String emailScenario) {
EmailSendResponse response = new EmailSendResponse();
response.setUserActionId(userActionId);
response.setIsEmailSend(allSuccess);
response.setEmailScenario(emailScenario != null ? EmailScenarioTypeEnum.valueOf(emailScenario) : null);
return response;
}
}

View File

@@ -43,6 +43,7 @@ import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static net.gepafin.tendermanagement.util.Utils.setIfUpdated;
@@ -155,6 +156,8 @@ public class UserDao {
emailSendResponse.setIsEmailSend(isEmailSendSuccess);
Long userActionId =(Long)request.getAttribute(GepafinConstant.USER_ACTION_ID);
emailSendResponse.setUserActionId(userActionId);
emailSendResponse.setEmailScenario(EmailScenarioTypeEnum.USER_CREATION);
saveEmailSendResponseToUser(emailSendResponse,userEntity);
}
JWTToken token = authService.getJWTTokenBean(userEntity, Boolean.TRUE, loginAttemptEntity.getId(),emailSendResponse);
return token;
@@ -406,6 +409,7 @@ public class UserDao {
RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(userEntity.getRoleEntity());
userResponseBean.setRole(roleResponseBean);
userResponseBean.setLastLogin(userEntity.getLastLogin());
userResponseBean.setEmailSendResponse(userEntity.getEmailSendResponse());
List<CompanyResponse> companyResponseBeans = companyDao.getCompanyByUserId(userEntity.getId());
userResponseBean.setCompanies(companyResponseBeans);
if (userEntity.getBeneficiary() == null) {
@@ -506,8 +510,18 @@ public class UserDao {
InitiatePasswordResetResponse initiatePasswordResetResponse = new InitiatePasswordResetResponse();
EmailSendResponse emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request);
initiatePasswordResetResponse.setEmailSendResponse(emailSendResponse);
saveEmailSendResponseToUser(emailSendResponse,user);
return initiatePasswordResetResponse;
}
private void saveEmailSendResponseToUser(EmailSendResponse newResponse, UserEntity user) {
List<EmailSendResponse> mergedResponses = Utils.mergeEmailSendResponses(
user.getEmailSendResponse(), newResponse
);
user.setEmailSendResponse(mergedResponses);
userRepository.save(user);
}
public void sendResetPasswordTokenEmail(UserEntity user, String token) {
SystemEmailTemplateResponse emailTemplate = systemEmailTemplatesService.retrieveTemplateByTypeAndCall(