From 8e1dcecf66c066396a33ac8145278b743dfd26b4 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Fri, 18 Apr 2025 18:48:49 +0530 Subject: [PATCH] Done ticket GEPAFINBE-199 Implemented the code to send the email to rinaldo from mailgun service like bflows. --- pom.xml | 11 +++ .../constants/GepafinConstant.java | 1 + .../tendermanagement/dao/ApplicationDao.java | 29 ------- .../dao/EmailNotificationDao.java | 21 +++-- .../tendermanagement/dao/NotificationDao.java | 12 +-- .../enums/EmailServiceTypeEnum.java | 3 +- .../service/impl/EmailServiceFactory.java | 16 ++-- .../service/impl/SystemEmailService.java | 83 +++++++++++++++++++ src/main/resources/application.properties | 4 +- 9 files changed, 128 insertions(+), 52 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailService.java diff --git a/pom.xml b/pom.xml index a42534bf..e59892b4 100644 --- a/pom.xml +++ b/pom.xml @@ -251,6 +251,17 @@ 0.4.8 + + + + + + com.sun.mail + jakarta.mail + 2.0.1 + + + diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 9b37da79..c7bf075e 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -505,6 +505,7 @@ public class GepafinConstant { public static final String APPLICATION_ID="applicationId"; public static final String USER_WITH_COMPANY_ID="userWithCompanyId"; + public static final String RINALDO_EMAIL = "rinaldo.bonazzo@bflows.net"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index b63a63fc..e060120e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1,7 +1,5 @@ package net.gepafin.tendermanagement.dao; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.Root; import jakarta.persistence.criteria.*; @@ -50,16 +48,8 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; -import java.sql.Timestamp; import java.text.MessageFormat; -import java.text.NumberFormat; -import java.text.ParseException; -import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -69,7 +59,6 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import static org.apache.commons.lang3.StringUtils.isEmpty; -import static org.hibernate.validator.internal.engine.messageinterpolation.el.RootResolver.FORMATTER; @Component public class ApplicationDao { @@ -1146,24 +1135,6 @@ public class ApplicationDao { EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(),RecipientTypeEnum.PROPERTIES,null,userEntity.getEmail(),userEntity.getId(),applicationEntity.getId(),null,applicationEntity.getCall().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(Boolean.TRUE.equals(hub.getUniqueUuid().equals(defaultHubUuid))) { -// if (validator.isProductionProfileActivated()) { -// emailLogRequest.setRecipientEmails(carloEmail); -//// mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null); -// emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(carloEmail),emailLogRequest); -// } -// List listDefaultSystemReceiverEmail = Arrays.stream(defaultSystemReceiverEmail.split(",")) -// .map(String::trim) -// .filter(email -> !email.isEmpty()) -// .toList(); -// -// emailLogRequest.setRecipientEmails(defaultSystemReceiverEmail); -// emailNotificationDao.sendMail(hub.getId(), subject, body, listDefaultSystemReceiverEmail, emailLogRequest); -// } - List hubEmails = Arrays.stream(hub.getEmail().split(",")) .map(String::trim) .filter(email -> !email.isEmpty()) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 185d1c62..171ccbfa 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.enums.EmailServiceTypeEnum; import net.gepafin.tendermanagement.enums.RecipientTypeEnum; import net.gepafin.tendermanagement.model.request.EmailConfig; import net.gepafin.tendermanagement.model.request.EmailLogRequest; @@ -15,6 +16,7 @@ import net.gepafin.tendermanagement.service.*; import net.gepafin.tendermanagement.service.impl.EmailService; import net.gepafin.tendermanagement.service.impl.EmailServiceFactory; import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.service.impl.SystemEmailService; import net.gepafin.tendermanagement.util.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -140,7 +142,9 @@ public class EmailNotificationDao { if (rinaldoEmail != null) { EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.PROPERTIES,null , rinaldoEmail, userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId()); - sendMail(applicationEntity.getHubId(), subject, body, List.of(rinaldoEmail), emailLogRequest); + + //SMTP + sendMail(null, subject, body, List.of(rinaldoEmail), emailLogRequest); } if (applicationEvaluationEntity.isPresent()) { Long preInstructorId = applicationEvaluationEntity.get().getUserId(); // Assuming UserEntity has an email field @@ -275,10 +279,17 @@ public class EmailNotificationDao { public void sendMail(Long hubId, String subject, String body, List recipientEmails, EmailLogRequest emailLogRequest) { - EmailConfig emailConfig = retrieveEmailConfig(hubId); - EmailService emailService = emailServiceFactory.getEmailService(emailConfig.getEmailServiceType()); - emailService.sendEmail(subject, body, recipientEmails, emailConfig,emailLogRequest); -// emailService.sendEmail(subject, body, recipientEmails, emailConfig); + EmailConfig emailConfig = new EmailConfig(); + if (recipientEmails.stream().anyMatch(email -> email.equals(GepafinConstant.RINALDO_EMAIL))) { + emailConfig.setEmailServiceType(EmailServiceTypeEnum.SYSTEM_EMAIL_SERVICE.getValue()); + EmailService emailService = emailServiceFactory.getEmailService(emailConfig.getEmailServiceType()); + emailService.sendEmail(subject, body, recipientEmails, emailConfig, emailLogRequest); + } else { + emailConfig = retrieveEmailConfig(hubId); + EmailService emailService = emailServiceFactory.getEmailService(emailConfig.getEmailServiceType()); + emailService.sendEmail(subject, body, recipientEmails, emailConfig, emailLogRequest); + + } } public EmailConfig retrieveEmailConfig(Long hubId) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java index 3a32373c..17b86d6e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java @@ -1,10 +1,8 @@ package net.gepafin.tendermanagement.dao; import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; -import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; @@ -12,7 +10,6 @@ import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.NotificationEnum; import net.gepafin.tendermanagement.enums.NotificationTypeEnum; import net.gepafin.tendermanagement.enums.RoleStatusEnum; -import net.gepafin.tendermanagement.model.request.GlobalFilters; import net.gepafin.tendermanagement.model.request.NotificationReq; import net.gepafin.tendermanagement.model.request.NotificationRequestBean; import net.gepafin.tendermanagement.model.response.NotificationResponse; @@ -28,22 +25,19 @@ import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; -import org.opensaml.xmlsec.signature.G; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import static org.apache.commons.lang3.StringUtils.isEmpty; @@ -92,7 +86,7 @@ public class NotificationDao { log.info("Sending notification to user {} with content: {}", userId, notificationReq.getMessage()); List companyIds = notificationReq.getCompanyIds(); - if (companyIds == null || companyIds.isEmpty()) { + if (companyIds == null || companyIds.isEmpty() || companyIds.stream().allMatch(Objects::isNull)) { sendToUser(userId, notificationEntity); } else { sendToCompanies(userId, companyIds, notificationEntity); @@ -154,7 +148,7 @@ public class NotificationDao { notificationEntity.setUserId(notificationReq.getUserId()); notificationEntity.setStatus(NotificationEnum.UNREAD.getValue()); notificationEntity.setIsDeleted(Boolean.FALSE); - notificationEntity.setUserWithCompany(notificationReq.getUserWithCompanyEntity() != null ? notificationReq.getUserWithCompanyEntity() : null); + notificationEntity.setUserWithCompany(notificationReq.getUserWithCompanyEntity()); notificationEntity.setMessage(message); notificationEntity.setTitle(notificationReq.getTitle()); return notificationEntity; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java index 49c14743..7cf34d0e 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java @@ -5,7 +5,8 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum EmailServiceTypeEnum { MAILGUN_SERVICE("MAILGUN_SERVICE"), - PEC_SERVICE("PEC_SERVICE"); + PEC_SERVICE("PEC_SERVICE"), + SYSTEM_EMAIL_SERVICE("SYSTEM_EMAIL_SERVICE"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/EmailServiceFactory.java b/src/main/java/net/gepafin/tendermanagement/service/impl/EmailServiceFactory.java index 6ab6b270..fd8f757b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/EmailServiceFactory.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/EmailServiceFactory.java @@ -12,13 +12,15 @@ public class EmailServiceFactory { @Autowired private MailgunEmailService mailgunEmailService; + @Autowired + private SystemEmailService systemEmailService; + public EmailService getEmailService(String serviceType) { - if ("MAILGUN_SERVICE".equals(serviceType)) { - return mailgunEmailService; - } else if ("PEC_SERVICE".equals(serviceType)) { - return pecEmailService; - } else { - throw new IllegalArgumentException("Invalid email service type: " + serviceType); - } + + return switch (serviceType) { + case "PEC_SERVICE" -> pecEmailService; + case "SYSTEM_EMAIL_SERVICE" -> systemEmailService; + default -> mailgunEmailService; + }; } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailService.java new file mode 100644 index 00000000..fde6fd3e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailService.java @@ -0,0 +1,83 @@ +package net.gepafin.tendermanagement.service.impl; + +import com.mailgun.api.v3.MailgunMessagesApi; +import com.mailgun.client.MailgunClient; +import com.mailgun.model.message.MessageResponse; +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.util.Utils; +import net.gepafin.tendermanagement.util.Validator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class SystemEmailService implements EmailService { + + @Value("${mailGun_user}") + public String mailGunUser; + + @Value("${mailGun_apiKey}") + public String mailGunApiKey; + + @Value("${mailGun_domainName}") + public String mailGunDomainName; + + @Value("${mailGun_base_url}") + public String mailGunBaseUrl; + + @Value("${isMailSendingEnabled}") + private String isEmailSendingEnabled; + + @Autowired + private Validator validator; + + @Autowired + private EmailLogDao emailLogDao; + + public final Logger log = LoggerFactory.getLogger(SystemEmailService.class); + + public void sendEmail(String subject, String body, List recipientEmails, EmailConfig emailConfig, EmailLogRequest emailLogRequest) { + + if (Boolean.FALSE.equals(Boolean.parseBoolean(isEmailSendingEnabled))) { + return; + } + + emailLogRequest.setEmailSubject(subject); + emailLogRequest.setEmailBody(body); + emailLogRequest.setSendStatus(StatusTypeEnum.SUCCESS.getValue()); + emailLogRequest.setRecipientEmails(Utils.listToCommaSeparatedString(recipientEmails)); + + if (Boolean.FALSE.equals(validator.isTestProfileActivated())) { + MessageResponse response = null; + try { + MailgunMessagesApi mailgunMessagesApi = MailgunClient.config(mailGunBaseUrl, mailGunApiKey).createApi(MailgunMessagesApi.class); + + String mailFrom = mailGunUser; + com.mailgun.model.message.Message message = com.mailgun.model.message.Message.builder().from(mailFrom).to(recipientEmails).subject(subject).html(body).build(); + + response = mailgunMessagesApi.sendMessage(mailGunDomainName, message); + } catch (Exception e) { + emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue()); + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.SYSTEM_EMAIL_SERVICE); + emailLogRequest.setErrorMessage(e.getMessage()); + emailLogDao.createEmailLog(emailLogRequest); + + throw new RuntimeException("Failed to send email via Mailgun: " + (response != null ? response.getMessage() : "No response from Mailgun"), e); + } + emailLogRequest.setEmailServiceResponse(response.toString()); + emailLogDao.createEmailLog(emailLogRequest); + } + } + +} + + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 54498aa1..c9685077 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -55,7 +55,9 @@ active.profile.folder=dev # MailGun API mailGun_base_url=https://api.eu.mailgun.net/ - +mailGun_apiKey= 398e3dea1911fe941af261906ec99362-07e2c238-8094421f +mailGun_user=comunicazione@paghiamoci.ai +mailGun_domainName=paghiamoci.ai api.pecUrl=https://ws.pecmassiva.com #senderEmail=mailer@bflows.net