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