package com.pollex.pam.service; import com.fasterxml.jackson.databind.ObjectMapper; import com.pollex.pam.config.ApplicationProperties; import com.pollex.pam.config.ApplicationProperties.Email; import com.pollex.pam.config.ApplicationProperties.SMS; import com.pollex.pam.config.Constants; import com.pollex.pam.enums.SendEmailMsgMethod; import com.pollex.pam.repository.ConsultantRepository; import com.pollex.pam.service.dto.*; import com.pollex.pam.service.util.HttpRequestUtil; import com.pollex.pam.web.rest.errors.SendEmailFailException; import com.pollex.pam.web.rest.errors.SendSMSFailException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.core.env.Profiles; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.thymeleaf.spring5.SpringTemplateEngine; import tech.jhipster.config.JHipsterConstants; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.Base64.Encoder; @Service public class SendMsgService { private static final Logger log = LoggerFactory.getLogger(SendMsgService.class); private final Encoder encoder = Base64.getEncoder(); private static final String SEND_SMS_SUCCESS_CODE = "1"; @Autowired ApplicationProperties applicationProperties; @Autowired ConsultantRepository consultantRepository; @Autowired SpringTemplateEngine springTemplateEngine; @Autowired Environment environment; @Autowired MailService mailService; public SendSMSResponse sendMsgBySMS(String toMobile, String content) throws SendSMSFailException { SMS smsProperties = applicationProperties.getSms(); if(!smsProperties.isSendNotifyMsg()) { // return getMockSMSResponse(); return null; } SendSMSRequest sendSMSRequest = new SendSMSRequest(); sendSMSRequest.setpKey(UUID.randomUUID().toString()); sendSMSRequest.setSourceCode(smsProperties.getSourceCode()); sendSMSRequest.setSender(smsProperties.getSender()); sendSMSRequest.setMsgTypeSet(smsProperties.getSmsType()); sendSMSRequest.setSendTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:00"))); sendSMSRequest.setSubject(encoder.encodeToString(smsProperties.getSubject().getBytes(StandardCharsets.UTF_8))); sendSMSRequest.setActivityId(""); SMSDetail smsDetail = new SMSDetail(); smsDetail.setMobile(toMobile); smsDetail.setContent(encoder.encodeToString(content.getBytes(StandardCharsets.UTF_8))); sendSMSRequest.setDetail(Collections.singletonList(smsDetail)); try { ResponseEntity responseEntity = HttpRequestUtil.postWithJson(smsProperties.getUrl(), sendSMSRequest, SendSMSResponse.class); SendSMSResponse response = responseEntity.getBody(); log.debug("response status code = {}", responseEntity.getStatusCode()); log.debug("smsResponse = {}", responseEntity.getBody()); if(!SEND_SMS_SUCCESS_CODE.equals(response.getReturnCode())) { throw new SendSMSFailException("sms service return code = " + response.getReturnCode() + ", error_msg = " + response.getErrorMsg()); } return responseEntity.getBody(); } catch (SendSMSFailException e) { throw e; } catch (Exception e) { log.warn("send sms fail by other reason!", e); throw new SendSMSFailException("send sms fail by other reason!"); } } // private SendSMSResponse getMockSMSResponse() { // SendSMSResponse mock = new SendSMSResponse(); // mock.set // return null; // } public String sendMsgByEmail(String to, String subject, String content, boolean htmlFormat) throws SendEmailFailException{ return sendMsgByEmail(to, subject, content, htmlFormat, Collections.emptyList(), Collections.emptyList()); } public String sendMsgByEmail(String toAddress, String subject, String content, boolean htmlFormat, List toCCAddress, List attachments) throws SendEmailFailException { String fromAddress = applicationProperties.getEmail().getSenderEmail(); SendMailRequest sendMailRequest = new SendMailRequest(); sendMailRequest.setSendMailAddresses(Collections.singletonList(toAddress)); sendMailRequest.setFrom(fromAddress); sendMailRequest.setContent(content); sendMailRequest.setSubject(subject); sendMailRequest.setSendCCMailAddresses(toCCAddress); sendMailRequest.setAttachments(attachments); sendMailRequest.setHtmlFormat(htmlFormat); sendMailRequest.setFunctionId(applicationProperties.getEmail().getFunctionId()); return sendMsgByEmail(sendMailRequest); } public String sendMsgByEmail(SendMailRequest sendMailRequest) throws SendEmailFailException{ final Email emailProperties = applicationProperties.getEmail(); if(!emailProperties.isSendNotifyMsg()) { return null; } if(emailProperties.getMethod() == SendEmailMsgMethod.POLLEX_GMAIL) { return sendMsgByPollexGmail(sendMailRequest); } else if(emailProperties.getMethod() == SendEmailMsgMethod.PAM_EMAIL_SERVICE) { return sendMsgByPamEmailService(sendMailRequest); } return null; } private String sendMsgByPollexGmail(SendMailRequest sendMailRequest) { String subject = sendMailRequest.getSubject(); String content = sendMailRequest.getContent(); boolean isHtml = sendMailRequest.isHtmlFormat(); sendMailRequest.getSendMailAddresses().forEach(receiver -> mailService.sendEmail(receiver, subject, content, false, isHtml)); return null; } private String sendMsgByPamEmailService(SendMailRequest sendMailRequest) { final Email emailProperties = applicationProperties.getEmail(); try { ResponseEntity responseEntity = HttpRequestUtil.postWithJson(emailProperties.getUrl(), sendMailRequest, String.class); log.debug("responseEntity = {}", responseEntity); String rawResponseString = responseEntity.getBody(); SendMailResponse sendMailResponse = new ObjectMapper().readValue(rawResponseString, SendMailResponse.class); log.debug("sendMailResponse = {}", sendMailResponse); if (sendMailResponse == null || sendMailResponse.getData() == null || !"ADDED".equalsIgnoreCase(sendMailResponse.getData().getMessageStatus())) { throw new SendEmailFailException("send email service return error msg! raw response string= " + rawResponseString); } return responseEntity.getBody(); } catch (SendEmailFailException e) { throw e; } catch (Exception e) { log.warn("send email fail by other reason", e); throw new SendEmailFailException("send email failed!"); } } }