diff --git a/pom.xml b/pom.xml index b443ec18..08c677d0 100644 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,13 @@ lombok + + + com.mashape.unirest + unirest-java + 1.4.9 + + com.h2database diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index dc3049a6..c3fbc94c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -595,7 +595,7 @@ public class ApplicationAmendmentRequestDao { String body = prepareBody(emailTemplate, amendment, beneficiaryUser); String email = beneficiaryUser.getEmail(); if (Boolean.TRUE.equals(amendment.getIsEmail())&&email != null && !email.isEmpty()) { - EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(SystemEmailTemplatesEntityTypeEnum.AMENDMENT_REMINDER.getValue(),RecipientTypeEnum.BENEFICIARY,beneficiaryUser.getId(),subject,body,StatusTypeEnum.SUCCESS.getValue(), null,amendment.getId(),EmailTrackingEntityTypeEnum.AMENDMENT,beneficiaryUser); + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(emailTemplate.getEmailScenario(),RecipientTypeEnum.USER,beneficiaryUser.getId(),subject,body,StatusTypeEnum.SUCCESS.getValue(), null,amendment.getId(), EmailEntityTypeEnum.AMENDMENT,beneficiaryUser.getEmail(),beneficiaryUser.getId()); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email),emailLogRequest); } else { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.BENEFICIARY_EMAIL_NOT_FOUND_MSG)); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 27dd5485..53b3128e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -791,12 +791,13 @@ public class ApplicationDao { // Replace placeholders in the subject and body String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); - + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(),RecipientTypeEnum.USER,userEntity.getId(),subject,body, StatusTypeEnum.SUCCESS.getValue(), null,applicationEntity.getId(), EmailEntityTypeEnum.APPLICATION,userEntity.getEmail(),userEntity.getId()); String email = userEntity.getEmail(); if (userEntity.getBeneficiary() != null) { + emailLogRequest.setRecipientType(RecipientTypeEnum.BENEFICIARY); email = userEntity.getBeneficiary().getEmail(); + emailLogRequest.setUserId(userEntity.getBeneficiary().getId()); } - EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(SystemEmailTemplatesEntityTypeEnum.APPLICATION_SUBMISSION_TO_USER_AND_COMPANY.getValue(),RecipientTypeEnum.BENEFICIARY,userEntity.getId(),subject,body, StatusTypeEnum.SUCCESS.getValue(), null,applicationEntity.getId(),EmailTrackingEntityTypeEnum.APPLICATION,userEntity); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email),emailLogRequest); List recipientEmails = new ArrayList<>(); // recipientEmails.add(email); @@ -810,6 +811,11 @@ public class ApplicationDao { if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { recipientEmails.add(contactEmail); } + if(Boolean.FALSE.equals(recipientEmails.isEmpty())){ + emailLogRequest.setRecipientId(applicationEntity.getCompany().getId()); + emailLogRequest.setRecipientType(RecipientTypeEnum.COMPANY); + emailLogRequest.setRecipientEmails(companyEmail); + } emailNotificationDao.sendMail(hub.getId(), subject, body, recipientEmails,emailLogRequest); } private void sendMailTodefaultSystemAndGepafin(UserEntity userEntity, ApplicationEntity applicationEntity) { @@ -837,17 +843,21 @@ public class ApplicationDao { String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); - EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(SystemEmailTemplatesEntityTypeEnum.APPLICATION_SUBMISSION_TO_GEPAFIN.getValue(),RecipientTypeEnum.BENEFICIARY,userEntity.getId(),subject,body,StatusTypeEnum.SUCCESS.getValue(), null,applicationEntity.getId(),EmailTrackingEntityTypeEnum.APPLICATION,userEntity); + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(),RecipientTypeEnum.PROPERTIES,null,subject,body,StatusTypeEnum.SUCCESS.getValue(), null,applicationEntity.getId(), EmailEntityTypeEnum.APPLICATION,userEntity.getEmail(),userEntity.getId()); // mailUtil.sendByMailGun(subject, body, List.of(defaultSystemReceiverEmail), null); // mailUtil.sendByMailGun(subject, body, List.of(gepafinEmail), null); // mailUtil.sendByMailGun(subject, body, List.of(rinaldoEmail), null); if(validator.isProductionProfileActivated()) { + emailLogRequest.setRecipientEmails(carloEmail); // mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(carloEmail),emailLogRequest); } + emailLogRequest.setRecipientEmails(gepafinEmail); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(gepafinEmail),emailLogRequest); + emailLogRequest.setRecipientEmails(defaultSystemReceiverEmail); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(defaultSystemReceiverEmail),emailLogRequest); + emailLogRequest.setRecipientEmails(rinaldoEmail); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail),emailLogRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java index 8c8a0eaa..8b6a8ea3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java @@ -1,17 +1,12 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.entities.EmailLogEntity; -import net.gepafin.tendermanagement.entities.EmailTrackingEntity; -import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.enums.EmailTrackingEntityTypeEnum; +import net.gepafin.tendermanagement.enums.EmailScenarioTypeEnum; +import net.gepafin.tendermanagement.enums.EmailEntityTypeEnum; import net.gepafin.tendermanagement.enums.RecipientTypeEnum; -import net.gepafin.tendermanagement.enums.StatusTypeEnum; import net.gepafin.tendermanagement.model.request.EmailLogRequest; import net.gepafin.tendermanagement.repositories.EmailLogRepository; -import net.gepafin.tendermanagement.repositories.EmailTrackingRepository; import net.gepafin.tendermanagement.util.DateTimeUtil; -import net.gepafin.tendermanagement.util.FieldValidator; -import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -23,13 +18,10 @@ public class EmailLogDao { @Autowired private EmailLogRepository emailLogRepository; - @Autowired - private EmailTrackingRepository emailTrackingRepository; - public EmailLogEntity createEmailLog(EmailLogRequest emailLogRequest){ EmailLogEntity emailLogEntity=new EmailLogEntity(); - emailLogEntity.setEmailType(emailLogRequest.getEmailType()); + emailLogEntity.setEmailType(emailLogRequest.getEmailType().getValue()); emailLogEntity.setRecipientType(emailLogRequest.getRecipientType().getValue()); emailLogEntity.setRecipientId(emailLogRequest.getRecipientId()); emailLogEntity.setEmailSubject(emailLogRequest.getEmailSubject()); @@ -37,32 +29,22 @@ public class EmailLogDao { emailLogEntity.setSendStatus(emailLogRequest.getSendStatus()); emailLogEntity.setSendDateTime(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); // Set to now if null emailLogEntity.setErrorMessage(emailLogRequest.getErrorMessage()); - emailLogEntity=saveEmailLogEntity(emailLogEntity); + emailLogEntity.setUserId(emailLogRequest.getUserId()); + emailLogEntity.setEmailServiceResponse(emailLogRequest.getEmailServiceResponse()); + emailLogEntity.setRecipientEmails(emailLogRequest.getRecipientEmails()); if(emailLogRequest.getEntityId()!=null && emailLogRequest.getEntityId()>0){ - EmailTrackingEntity emailTrackingEntity=createEmailTrackingEntity(emailLogEntity,emailLogRequest); - if(emailTrackingEntity==null){ - emailLogEntity.setErrorMessage("Failed while creating email tracking entity"); - emailLogEntity.setSendStatus(StatusTypeEnum.FAILED.getValue()); - emailLogEntity=saveEmailLogEntity(emailLogEntity); - } + emailLogEntity.setEntityId(emailLogRequest.getEntityId()); + emailLogEntity.setEntityType(emailLogRequest.getEntitytype().getValue()); } + emailLogEntity=saveEmailLogEntity(emailLogEntity); return emailLogEntity; } public EmailLogEntity saveEmailLogEntity(EmailLogEntity emailLogEntity){ return emailLogRepository.save(emailLogEntity); } - public EmailTrackingEntity createEmailTrackingEntity(EmailLogEntity emailLogEntity,EmailLogRequest emailLogRequest){ - EmailTrackingEntity emailTrackingEntity=new EmailTrackingEntity(); - emailTrackingEntity.setEmailLog(emailLogEntity); - emailTrackingEntity.setEntityId(emailLogRequest.getEntityId()); - emailTrackingEntity.setEntityType(emailLogRequest.getEntitytype().getValue()); - emailTrackingEntity.setUser(emailLogRequest.getUser()); - emailTrackingRepository.save(emailTrackingEntity); - return emailTrackingEntity; - } - public EmailLogRequest createEmailLogRequest(String emailType, RecipientTypeEnum recipientType, Long recipientId, + public EmailLogRequest createEmailLogRequest(EmailScenarioTypeEnum emailType, RecipientTypeEnum recipientType, Long recipientId, String emailSubject, String emailBody, String sendStatus, - String errorMessage, Long entityId, EmailTrackingEntityTypeEnum entityType, UserEntity user) { + String errorMessage, Long entityId, EmailEntityTypeEnum entityType, String recipientEmails, Long userId) { EmailLogRequest emailLogRequest = new EmailLogRequest(); emailLogRequest.setEmailType(emailType); emailLogRequest.setRecipientType(recipientType); @@ -71,9 +53,10 @@ public class EmailLogDao { emailLogRequest.setEmailBody(emailBody); emailLogRequest.setSendStatus(sendStatus); emailLogRequest.setErrorMessage(errorMessage); + emailLogRequest.setUserId(userId); emailLogRequest.setEntityId(entityId); emailLogRequest.setEntitytype(entityType); - emailLogRequest.setUser(user); + emailLogRequest.setRecipientEmails(recipientEmails); return emailLogRequest; } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index c88cee97..46833b42 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -5,15 +5,13 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; -import net.gepafin.tendermanagement.enums.EmailTrackingEntityTypeEnum; +import net.gepafin.tendermanagement.enums.EmailEntityTypeEnum; import net.gepafin.tendermanagement.enums.RecipientTypeEnum; import net.gepafin.tendermanagement.enums.StatusTypeEnum; import net.gepafin.tendermanagement.model.request.EmailConfig; import net.gepafin.tendermanagement.model.request.EmailLogRequest; import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; -import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.repositories.EmailLogRepository; -import net.gepafin.tendermanagement.repositories.EmailTrackingRepository; import net.gepafin.tendermanagement.repositories.HubRepository; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.HubService; @@ -57,9 +55,6 @@ public class EmailNotificationDao { @Autowired private EmailLogDao emailLogDao; - @Autowired - private EmailTrackingRepository emailTrackingRepository; - @Autowired private EmailLogRepository emailLogRepository; @@ -82,7 +77,7 @@ public class EmailNotificationDao { UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); List recipientEmails = getRecipientEmails(applicationEntity, userEntity, additionalRecipients); - EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(String.valueOf(templateType), RecipientTypeEnum.BENEFICIARY,userEntity.getId(),subject,body, StatusTypeEnum.SUCCESS.getValue(), null, amendmentRequest.getId(), EmailTrackingEntityTypeEnum.AMENDMENT,userEntity); + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.BENEFICIARY,userEntity.getBeneficiary().getId(),subject,body, StatusTypeEnum.SUCCESS.getValue(), null, amendmentRequest.getId(), EmailEntityTypeEnum.AMENDMENT,Utils.listToCommaSeparatedString(recipientEmails),userEntity.getId()); sendMail(applicationEntity.getHubId(), subject, body, recipientEmails,emailLogRequest); } @@ -153,14 +148,10 @@ public class EmailNotificationDao { Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); LocalDateTime lastReminderDateTime=amendmentRequest.getCreatedDate(); - List emailTrackingEntity=emailTrackingRepository.findFirstByEntityTypeAndEntityIdAndUser(EmailTrackingEntityTypeEnum.AMENDMENT.getValue(), amendmentRequest.getId(),user); - if(emailTrackingEntity != null && (!emailTrackingEntity.isEmpty())) { - EmailTrackingEntity emailTrackingEntity1=emailTrackingEntity.get(0); - List emailLogEntity = emailLogRepository.findByIdAndEmailTypeOrderByCreatedDateDesc(emailTrackingEntity1.getId(), SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST.getValue()); + List emailLogEntity = emailLogRepository.findByUserIdAndEntityIdAndEntityType(user.getId(),amendmentRequest.getId(),EmailEntityTypeEnum.AMENDMENT.getValue()); if(emailLogEntity!=null && (!emailLogEntity.isEmpty())){ EmailLogEntity emailLogEntity1=emailLogEntity.get(0); lastReminderDateTime=emailLogEntity1.getSendDateTime(); - } } bodyPlaceholders.put("{{date_time_emailSend}}", DateTimeUtil.formatLocalDateTime(lastReminderDateTime, GepafinConstant.DD_MM_YYYY)); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java b/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java index 1665a724..514506f5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; +import net.gepafin.tendermanagement.enums.EmailScenarioTypeEnum; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -78,6 +79,7 @@ public class SystemEmailTemplatesDao { systemEmailTemplateResponse.setHtmlContent(htmlContent); systemEmailTemplateResponse.setSubject(subject); systemEmailTemplateResponse.setJsonMap(languageMap); + systemEmailTemplateResponse.setEmailScenario(EmailScenarioTypeEnum.valueOf(dbSystemEmailTemplatesEntity.getEmailScenario())); return systemEmailTemplateResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java index 8dcaa76a..848e895b 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java @@ -33,5 +33,22 @@ public class EmailLogEntity extends BaseEntity{ @Column(name = "error_message", columnDefinition = "TEXT") private String errorMessage; + @Column(name = "email_service_response") + private String emailServiceResponse; + + @Column(name = "email_service_type") + private String emailServiceType; + + @Column(name = "recipient_emails") + private String recipientEmails; + + @Column(name = "user_id") + private Long userId; + + @Column(name = "entity_id") + private Long entityId; + + @Column(name = "entity_type") + private String entityType; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EmailTrackingEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EmailTrackingEntity.java deleted file mode 100644 index 57a25747..00000000 --- a/src/main/java/net/gepafin/tendermanagement/entities/EmailTrackingEntity.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.gepafin.tendermanagement.entities; -import jakarta.persistence.*; -import lombok.Data; - -import java.time.LocalDateTime; - -@Entity -@Data -@Table(name = "email_tracking") -public class EmailTrackingEntity extends BaseEntity{ - - - @ManyToOne - @JoinColumn(name = "email_log_id", nullable = false, foreignKey = @ForeignKey(name = "fk_email_log_id")) - private EmailLogEntity emailLog; - - @ManyToOne - @JoinColumn(name = "user_id", nullable = false, foreignKey = @ForeignKey(name = "fk_user_id")) - private UserEntity user; - - @Column(name = "entity_id", nullable = false) - private Long entityId; - - @Column(name = "entity_type", nullable = false, length = 255) - private String entityType; - -} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java index 1440e00d..f7974eca 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java @@ -35,6 +35,9 @@ public class SystemEmailTemplatesEntity extends BaseEntity { @Column(name ="IS_DELETED", nullable = false) private Boolean isDeleted = false; + + @Column(name = "email_scenario") + private String emailScenario; public enum SystemEmailTemplatesEntityTypeEnum { diff --git a/src/main/java/net/gepafin/tendermanagement/enums/EmailTrackingEntityTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/EmailEntityTypeEnum.java similarity index 76% rename from src/main/java/net/gepafin/tendermanagement/enums/EmailTrackingEntityTypeEnum.java rename to src/main/java/net/gepafin/tendermanagement/enums/EmailEntityTypeEnum.java index a2a356db..6abea8ce 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/EmailTrackingEntityTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/EmailEntityTypeEnum.java @@ -2,14 +2,14 @@ package net.gepafin.tendermanagement.enums; import com.fasterxml.jackson.annotation.JsonValue; -public enum EmailTrackingEntityTypeEnum { +public enum EmailEntityTypeEnum { AMENDMENT("AMENDMENT"), APPLICATION("APPLICATION"); private String value; - EmailTrackingEntityTypeEnum(String value) { + EmailEntityTypeEnum(String value) { this.value = value; } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java new file mode 100644 index 00000000..493f987c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum EmailScenarioTypeEnum { + + APPLICATION_SUBMITTED("APPLICATION_SUBMITTED"), + APPLICATION_AMENDMENT_REQUESTED("APPLICATION_AMENDMENT_REQUESTED"), + APPLICATION_AMENDMENT_EXPIRED("APPLICATION_AMENDMENT_EXPIRED"), + APPLICATION_AMENDMENT_REMINDER("APPLICATION_AMENDMENT_REMINDER"), + APPLICATION_APPROVED("APPLICATION_APPROVED"), + APPLICATION_REJECTED("APPLICATION_REJECTED"); + + private final String value; + + EmailScenarioTypeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java new file mode 100644 index 00000000..8a22c69c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum EmailServiceTypeEnum { + + MAILGUN("MAILGUN"), + PEC("PEC"); + + private String value; + + EmailServiceTypeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/RecipientTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/RecipientTypeEnum.java index e08a3e6b..c4f54175 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/RecipientTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/RecipientTypeEnum.java @@ -6,7 +6,8 @@ public enum RecipientTypeEnum { BENEFICIARY ("BENEFICIARY"), USER("USER"), - COMPANY("COMPANY"); + COMPANY("COMPANY"), + PROPERTIES("PROPERTIES"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EmailConfig.java b/src/main/java/net/gepafin/tendermanagement/model/request/EmailConfig.java index 5a94b325..79f4c966 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/EmailConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EmailConfig.java @@ -13,6 +13,7 @@ public class EmailConfig { private String domain; private String mailgunApiUrl; private String pecApiUrl; + private String url; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java index e15c6783..b6e8c07b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java @@ -1,15 +1,15 @@ package net.gepafin.tendermanagement.model.request; -import jakarta.persistence.Column; import lombok.Data; -import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.enums.EmailTrackingEntityTypeEnum; +import net.gepafin.tendermanagement.enums.EmailScenarioTypeEnum; +import net.gepafin.tendermanagement.enums.EmailEntityTypeEnum; +import net.gepafin.tendermanagement.enums.EmailServiceTypeEnum; import net.gepafin.tendermanagement.enums.RecipientTypeEnum; @Data public class EmailLogRequest { - private String emailType; + private EmailScenarioTypeEnum emailType; private RecipientTypeEnum recipientType; @@ -25,7 +25,14 @@ public class EmailLogRequest { private Long entityId; - private EmailTrackingEntityTypeEnum entitytype; + private EmailEntityTypeEnum entitytype; + + private Long userId; + + private String emailServiceResponse; + + private EmailServiceTypeEnum emailServiceType; + + private String recipientEmails; - private UserEntity user; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/SystemEmailTemplateResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/SystemEmailTemplateResponse.java index cd65e6e4..0752afb8 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/SystemEmailTemplateResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/SystemEmailTemplateResponse.java @@ -3,10 +3,13 @@ package net.gepafin.tendermanagement.model.response; import java.util.Map; import lombok.Data; +import net.gepafin.tendermanagement.enums.EmailScenarioTypeEnum; @Data public class SystemEmailTemplateResponse { + EmailScenarioTypeEnum emailScenario; + String htmlContent; String subject; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java index 998050ec..ec181249 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java @@ -7,5 +7,5 @@ import java.util.List; public interface EmailLogRepository extends JpaRepository { - List findByIdAndEmailTypeOrderByCreatedDateDesc(Long id, String emailType); + List findByUserIdAndEntityIdAndEntityType(Long userId,Long entityId,String entityType); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EmailTrackingRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EmailTrackingRepository.java deleted file mode 100644 index e89ec2c6..00000000 --- a/src/main/java/net/gepafin/tendermanagement/repositories/EmailTrackingRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.gepafin.tendermanagement.repositories; - -import net.gepafin.tendermanagement.entities.EmailTrackingEntity; -import net.gepafin.tendermanagement.entities.UserEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface EmailTrackingRepository extends JpaRepository { - - List findFirstByEntityTypeAndEntityIdAndUser( - String entityType, Long entityId, UserEntity user - ); -} diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java index eb9c50d1..3006ef51 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java @@ -1,24 +1,40 @@ package net.gepafin.tendermanagement.service.feignClient; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.util.List; -@FeignClient(name = "mailgunClient", url = "${mailGun_base_url}") +//@FeignClient(name = "mailgunClient", url = "${mailGun_base_url}") public interface MailgunFeignClient { - @PostMapping("/v3/{domain}/messages") - ResponseEntity sendEmail( - @PathVariable("domain") String domain, - @RequestParam("from") String from, - @RequestParam("to") List to, - @RequestParam("subject") String subject, - @RequestParam("html") String htmlBody, - @RequestHeader("Authorization") String authorizationHeader); +// @PostMapping(value = "/v3/{domain}/messages", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) +// ResponseEntity sendEmail( @RequestPart("from") String from, +// @RequestPart("to") List to, +// @RequestPart("subject") String subject, +// @RequestPart("text") String htmlBody, +// @PathVariable("domain") String domain, +//// @RequestBody PayloadDTO dto, +// //RequestParam +// +// @RequestHeader HttpHeaders headers); +// +// public class PayloadDTO { +// public String from; +// public List to; +// public String subject; +// public String htmlBody; +// +// public PayloadDTO(String from, List to, String subject, String htmlBody) { +// this.from = from; +// this.to = to; +// this.subject = subject; +// this.htmlBody = htmlBody; +// } +// +// } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java index d251e644..f6fe99f6 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java @@ -3,15 +3,16 @@ package net.gepafin.tendermanagement.service.feignClient; import feign.Headers; import net.gepafin.tendermanagement.model.request.PecEmailRequest; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; -@FeignClient(name = "pecClient", url = "${api.pecUrl}") +//@FeignClient(name = "pecClient", url = "${api.pecUrl}") public interface PecFeignClient { - @PostMapping("/send") - ResponseEntity sendEmail(@RequestHeader("Authorization") String token, - @RequestBody PecEmailRequest emailRequest); +// @PostMapping("/send") +// ResponseEntity sendEmail(@RequestHeader HttpHeaders headers, +// @RequestBody PecEmailRequest emailRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java index e27a231a..97c75667 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java @@ -1,16 +1,20 @@ package net.gepafin.tendermanagement.service.impl; +import com.mashape.unirest.http.HttpResponse; +import com.mashape.unirest.http.Unirest; +import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.EmailLogDao; import net.gepafin.tendermanagement.entities.EmailLogEntity; +import net.gepafin.tendermanagement.enums.EmailServiceTypeEnum; import net.gepafin.tendermanagement.enums.StatusTypeEnum; import net.gepafin.tendermanagement.model.request.EmailConfig; import net.gepafin.tendermanagement.model.request.EmailLogRequest; import net.gepafin.tendermanagement.service.feignClient.MailgunFeignClient; +import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import java.util.Base64; @@ -18,9 +22,6 @@ import java.util.List; @Service public class MailgunEmailService implements EmailService { - - @Autowired - private MailgunFeignClient mailgunFeignClient; @Value("${isMailSendingEnabled}") private String isEmailSendingEnabled; @@ -38,21 +39,36 @@ public class MailgunEmailService implements EmailService { return; } - String domain = emailConfig.getDomain(); + String url = emailConfig.getUrl(); String from = emailConfig.getSender(); String apiKey = emailConfig.getApiKey(); String authHeader = "Basic " + Base64.getEncoder().encodeToString(("api:" + apiKey).getBytes()); // Send email via Mailgun API + HttpResponse response2=null; if (Boolean.FALSE.equals(validator.isTestProfileActivated())) { - ResponseEntity response = mailgunFeignClient.sendEmail(domain, from, recipientEmails, subject, body, authHeader); - if (!response.getStatusCode().is2xxSuccessful()) { + + emailLogRequest.setRecipientEmails(Utils.listToCommaSeparatedString(recipientEmails)); + try { + Unirest.setTimeouts(0, 0); + response2 = Unirest.post(url) + .header("Authorization", authHeader) +// .header("content-type", "multipart/form-data") + .field("from", from) + .field("to", recipientEmails) + .field("subject", subject) + .field("html", body) + .asString(); + }catch(Exception e) { emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue()); - emailLogRequest.setErrorMessage(String.valueOf(response.getStatusCode())); + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.MAILGUN); + emailLogRequest.setErrorMessage(e.getMessage()); EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); - throw new RuntimeException("Failed to send email via Mailgun: " + response.getStatusCode()); + throw new RuntimeException("Failed to send email via Mailgun: " + response2.getStatus()); } + emailLogRequest.setEmailServiceResponse(response2.getBody()); } + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.MAILGUN); EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java index e9500d4b..8d6667d5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java @@ -1,17 +1,25 @@ package net.gepafin.tendermanagement.service.impl; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.mashape.unirest.http.HttpResponse; +import com.mashape.unirest.http.Unirest; import lombok.extern.slf4j.Slf4j; +import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.EmailLogDao; import net.gepafin.tendermanagement.entities.EmailLogEntity; +import net.gepafin.tendermanagement.enums.EmailServiceTypeEnum; import net.gepafin.tendermanagement.enums.StatusTypeEnum; import net.gepafin.tendermanagement.model.request.EmailConfig; import net.gepafin.tendermanagement.model.request.EmailLogRequest; import net.gepafin.tendermanagement.model.request.PecEmailRequest; import net.gepafin.tendermanagement.service.feignClient.PecFeignClient; +import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; @@ -20,12 +28,6 @@ import java.util.List; @Slf4j @Service public class PecEmailService implements EmailService { - private final PecFeignClient pecFeignClient; - - public PecEmailService(PecFeignClient pecFeignClient) { - - this.pecFeignClient = pecFeignClient; - } @Value("${isMailSendingEnabled}") private String isEmailSendingEnabled; @@ -45,23 +47,33 @@ public class PecEmailService implements EmailService { PecEmailRequest emailRequest = new PecEmailRequest(); emailRequest.setSender(emailConfig.getSender()); - emailRequest.setRecipient(recipientEmails); + emailRequest.setSubject(subject); emailRequest.setBody(body); emailRequest.setUsername(emailConfig.getUsername()); emailRequest.setPassword(emailConfig.getPassword()); - + String url=emailConfig.getUrl(); String authToken = emailConfig.getAuthToken(); + HttpResponse response2=null; if (Boolean.FALSE.equals(validator.isTestProfileActivated())) { - ResponseEntity response = pecFeignClient.sendEmail("Bearer " + authToken, emailRequest); - log.info("Mail response status: {}, headers: {}, body: {}", response.getStatusCode(), response.getHeaders(), response.getBody()); - if (!response.getStatusCode().is2xxSuccessful()) { + emailLogRequest.setRecipientEmails(Utils.listToCommaSeparatedString(emailRequest.getRecipient())); + try { + Unirest.setTimeouts(0, 0); + response2 = Unirest.post(url) + .header("Authorization", "Bearer " + authToken) + .header("Content-Type", "application/json") + .body(Utils.convertObjectToJson(emailRequest)) // Serialize the emailRequest object to JSON + .asString(); + }catch(Exception e) { emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue()); - emailLogRequest.setErrorMessage(String.valueOf(response.getStatusCode())); + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC); + emailLogRequest.setErrorMessage(e.getMessage()); EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); - throw new RuntimeException("Failed to send email via PEC: " + response.getStatusCode()); - } + throw new RuntimeException("Failed to send email via PEC: " + response2.getStatus()); + } + emailLogRequest.setEmailServiceResponse(response2.getBody()); } + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC); EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 26f049ef..ebd5eea3 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -24,6 +24,7 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import com.fasterxml.jackson.core.JsonProcessingException; @@ -40,6 +41,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientForbiddenExce import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientUnauthorizedException; import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientValidationException; +import org.springframework.http.MediaType; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; @@ -515,4 +517,7 @@ public class Utils { } return null; } + public static String listToCommaSeparatedString(List list) { + return String.join(", ", list.stream().map(String::valueOf).toList()); + } } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 8a06b83e..a794719f 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1720,7 +1720,7 @@ - + - @@ -1741,32 +1740,24 @@ + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - diff --git a/src/main/resources/db/dump/updated_hub_data_for_email_service_config_15-11-2024.sql b/src/main/resources/db/dump/updated_hub_data_for_email_service_config_15-11-2024.sql new file mode 100644 index 00000000..40b6a790 --- /dev/null +++ b/src/main/resources/db/dump/updated_hub_data_for_email_service_config_15-11-2024.sql @@ -0,0 +1,9 @@ +UPDATE hub +SET email_service_type = 'PEC_SERVICE', + email_service_config = 'JkFbBfuVvq7VWwp5LcWIi+hAa1RJ1ekI0jq3w7gLTXETZiTaN8zC4OBWD53x8FtbfFTh3L/5805CIYTH1BQGa3X9q16q9SDzMy7DKHdmJzOnLKhn74C5akoXKaeXUCGnzp0cSk2c01FV6lwefC29IshijFSumCHtVlgWNeZigBzmWK+M7NS+EXf4goIMzguL5bHpYXfoQunQozeY1SpOo+28gDDpzZRMXdtcwKkTgESFGwsy6S1m1TBxJwZC7p8W' +WHERE UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs'; + +UPDATE hub +SET email_service_type = 'MAILGUN_SERVICE', + email_service_config = 'QlICHJMvBHd09ci/B2+EDR0q6kFsEdu5gOSI1hgG/7SAm2wXQZagDsAbkBrA6JPHXUS3Bkw6UD9x5boYYxBi3tnpu16i0NgdZqcc2BBhMF1VgRlJMgX+KgsOJsnQbHAJ/9YZaeIVrJpxceHFx93NTbfjT3TzzaZ9cW/64wbeZFspEp6WwgKgV1/3+j297Q1QtKIiWKanolYaU9myx9KwPJZc8AmPe0PR2ViyA7VyGn6iQSrX2pr15tBw3xVIm0tfHh6pktHro4gRYs5CEypQ2cSbP5wv4Z6pDa//FHXzYpRvnb1AUh0thGOix5FZl9Kn' +WHERE UNIQUE_UUID = 't7jh5wfg9QXylNaTZkPoE'; \ No newline at end of file diff --git a/src/main/resources/db/dump/updated_system_email_template_for_email_scenario_15-11-2024.sql b/src/main/resources/db/dump/updated_system_email_template_for_email_scenario_15-11-2024.sql new file mode 100644 index 00000000..bf70f8aa --- /dev/null +++ b/src/main/resources/db/dump/updated_system_email_template_for_email_scenario_15-11-2024.sql @@ -0,0 +1,17 @@ +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_SUBMITTED' WHERE "type"='APPLICATION_SUBMISSION_TO_USER_AND_COMPANY' AND "system"=true ; + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_SUBMITTED' WHERE "type"='APPLICATION_SUBMISSION_TO_GEPAFIN' AND "system"=true ; + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_AMENDMENT_REMINDER' WHERE "type"='AMENDMENT_REMINDER' AND "system"=true ; + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_AMENDMENT_EXPIRED' WHERE "type"='INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE' AND "system"=true ; + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_APPROVED' WHERE "type"='ADMISSIBILITY_NOTIFICATION' AND "system"=true ; + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_REJECTED' WHERE "type"='INADMISSIBILITY_NOTIFICATION' AND "system"=true ; + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_AMENDMENT_REQUESTED' WHERE "type"='DOCUMENTATION_INTEGRATION_REQUEST' AND "system"=true ; + + + +