Merge pull request #87 from Kitzanos/feature/GEPAFINBE-84

GEPAFINBE- 84 & GEPAFINBE - 92 (Email Tracking Management)
This commit is contained in:
rbonazzo-KZ
2024-11-19 12:38:35 +01:00
committed by GitHub
28 changed files with 549 additions and 112 deletions

View File

@@ -1,24 +0,0 @@
package net.gepafin.tendermanagement.service.feignClient;
import org.springframework.cloud.openfeign.FeignClient;
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 java.util.List;
@FeignClient(name = "mailgunClient", url = "${mailGun_base_url}")
public interface MailgunFeignClient {
@PostMapping("/v3/{domain}/messages")
ResponseEntity<Void> sendEmail(
@PathVariable("domain") String domain,
@RequestParam("from") String from,
@RequestParam("to") List<String> to,
@RequestParam("subject") String subject,
@RequestParam("html") String htmlBody,
@RequestHeader("Authorization") String authorizationHeader);
}

View File

@@ -1,17 +0,0 @@
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.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}")
public interface PecFeignClient {
@PostMapping("/send")
ResponseEntity<Void> sendEmail(@RequestHeader("Authorization") String token,
@RequestBody PecEmailRequest emailRequest);
}

View File

@@ -1,11 +1,12 @@
package net.gepafin.tendermanagement.service.impl;
import net.gepafin.tendermanagement.model.request.EmailConfig;
import net.gepafin.tendermanagement.model.request.EmailLogRequest;
import java.util.List;
public interface EmailService {
void sendEmail(String subject, String body, List<String> recipientEmails, EmailConfig emailConfig);
void sendEmail(String subject, String body, List<String> recipientEmails, EmailConfig emailConfig, EmailLogRequest emailLogRequest);
}

View File

@@ -1,12 +1,18 @@
package net.gepafin.tendermanagement.service.impl;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
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.service.feignClient.MailgunFeignClient;
import net.gepafin.tendermanagement.model.request.EmailLogRequest;
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;
@@ -14,9 +20,6 @@ import java.util.List;
@Service
public class MailgunEmailService implements EmailService {
@Autowired
private MailgunFeignClient mailgunFeignClient;
@Value("${isMailSendingEnabled}")
private String isEmailSendingEnabled;
@@ -24,25 +27,50 @@ public class MailgunEmailService implements EmailService {
@Autowired
private Validator validator;
@Autowired
private EmailLogDao emailLogDao;
@Override
public void sendEmail(String subject, String body, List<String> recipientEmails, EmailConfig emailConfig) {
public void sendEmail(String subject, String body, List<String> recipientEmails, EmailConfig emailConfig, EmailLogRequest emailLogRequest) {
if (Boolean.FALSE.equals(Boolean.parseBoolean(isEmailSendingEnabled))) {
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<String> response2=null;
if (Boolean.FALSE.equals(validator.isTestProfileActivated())) {
ResponseEntity<Void> response = mailgunFeignClient.sendEmail(domain, from, recipientEmails, subject, body, authHeader);
if (!response.getStatusCode().is2xxSuccessful()) {
throw new RuntimeException("Failed to send email via Mailgun: " + response.getStatusCode());
emailLogRequest.setEmailSubject(subject);
emailLogRequest.setEmailBody(body);
emailLogRequest.setSendStatus(StatusTypeEnum.SUCCESS.getValue());
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.setEmailServiceType(EmailServiceTypeEnum.MAILGUN_SERVICE);
emailLogRequest.setErrorMessage(e.getMessage());
EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest);
throw new RuntimeException("Failed to send email via Mailgun: " + response2.getStatus());
}
emailLogRequest.setEmailServiceResponse(response2.getBody());
}
emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.MAILGUN_SERVICE);
EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest);
}
}

View File

@@ -1,14 +1,20 @@
package net.gepafin.tendermanagement.service.impl;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
import lombok.extern.slf4j.Slf4j;
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.ResponseEntity;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -16,12 +22,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;
@@ -29,8 +29,11 @@ public class PecEmailService implements EmailService {
@Autowired
private Validator validator;
@Autowired
private EmailLogDao emailLogDao;
@Override
public void sendEmail(String subject, String body, List<String> recipientEmails, EmailConfig emailConfig) {
public void sendEmail(String subject, String body, List<String> recipientEmails, EmailConfig emailConfig, EmailLogRequest emailLogRequest) {
if (Boolean.FALSE.equals(Boolean.parseBoolean(isEmailSendingEnabled))) {
return;
@@ -38,20 +41,37 @@ 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());
emailRequest.setRecipient(recipientEmails);
String url=emailConfig.getUrl();
String authToken = emailConfig.getAuthToken();
HttpResponse<String> response2=null;
if (Boolean.FALSE.equals(validator.isTestProfileActivated())) {
ResponseEntity<Void> response = pecFeignClient.sendEmail("Bearer " + authToken, emailRequest);
log.info("Mail response status: {}, headers: {}, body: {}", response.getStatusCode(), response.getHeaders(), response.getBody());
if (!response.getStatusCode().is2xxSuccessful()) {
throw new RuntimeException("Failed to send email via PEC: " + response.getStatusCode());
}
emailLogRequest.setEmailSubject(emailRequest.getSubject());
emailLogRequest.setEmailBody(emailRequest.getBody());
emailLogRequest.setSendStatus(StatusTypeEnum.SUCCESS.getValue());
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.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE);
emailLogRequest.setErrorMessage(e.getMessage());
EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest);
throw new RuntimeException("Failed to send email via PEC: " + response2.getStatus());
}
emailLogRequest.setEmailServiceResponse(response2.getBody());
}
emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE);
EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest);
}
}