Skip to content

Commit

Permalink
Merge pull request #185 from AppLinkers/feature/util
Browse files Browse the repository at this point in the history
REFACTOR - 이메일 관련 기능 리팩토링
  • Loading branch information
yuseogi0218 authored Jan 22, 2024
2 parents 1c31a32 + c34b369 commit f67c0ce
Show file tree
Hide file tree
Showing 22 changed files with 598 additions and 252 deletions.
80 changes: 80 additions & 0 deletions src/main/java/com/laser/ordermanage/common/email/EmailService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package com.laser.ordermanage.common.email;

import com.laser.ordermanage.common.email.dto.EmailRequest;
import com.laser.ordermanage.common.email.dto.EmailWithButtonRequest;
import com.laser.ordermanage.common.email.dto.EmailWithCodeRequest;
import com.laser.ordermanage.common.exception.CommonErrorCode;
import com.laser.ordermanage.common.exception.CustomCommonException;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;


@Service
@RequiredArgsConstructor
public class EmailService {

private final JavaMailSender emailSender;
private final TemplateEngine templateEngine;

public void sendEmail(EmailRequest emailRequest) {
try {
MimeMessage emailForm = createEmailForm(emailRequest);
emailSender.send(emailForm);
} catch (Exception e) {
e.printStackTrace();
throw new CustomCommonException(CommonErrorCode.UNABLE_TO_SEND_EMAIL);
}
}

// 발신할 이메일 데이터 세팅
private MimeMessage createEmailForm(EmailRequest emailRequest) throws MessagingException {
MimeMessage message = emailSender.createMimeMessage();
message.addRecipients(MimeMessage.RecipientType.TO, emailRequest.recipient());
message.setSubject(emailRequest.subject());
message.setText(emailRequest.text(), "utf-8", "html");

return message;
}

@Async("mailExecutor")
public void sendEmailWithButton(EmailWithButtonRequest request) {
Context context = new Context();
context.setVariable("title", request.title());
context.setVariable("content", request.content());
context.setVariable("buttonText", request.buttonText());
context.setVariable("buttonUrl", request.buttonUrl());
String text = templateEngine.process("email-with-button", context);

EmailRequest emailRequest = EmailRequest.builder()
.recipient(request.recipient())
.subject(request.subject())
.text(text)
.build();

sendEmail(emailRequest);
}

@Async("mailExecutor")
public void sendEmailWithCode(EmailWithCodeRequest request) {
Context context = new Context();
context.setVariable("title", request.title());
context.setVariable("content", request.content());
context.setVariable("code", request.code());
String text = templateEngine.process("email-with-code", context);

EmailRequest emailRequest = EmailRequest.builder()
.recipient(request.recipient())
.subject(request.subject())
.text(text)
.build();

sendEmail(emailRequest);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.laser.ordermanage.common.email.dto;

import lombok.Builder;

@Builder
public record EmailRequest(
String recipient,
String subject,
String text
) { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.laser.ordermanage.common.email.dto;

import lombok.Builder;

@Builder
public record EmailWithButtonRequest(
String recipient,
String subject,
String title,
String content,
String buttonText,
String buttonUrl
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.laser.ordermanage.common.email.dto;

import lombok.Builder;

@Builder
public record EmailWithCodeRequest(
String recipient,
String subject,
String title,
String content,
String code
) {
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.laser.ordermanage.common.exception;

import com.laser.ordermanage.common.util.NetworkUtil;
import com.laser.ordermanage.user.exception.UserErrorCode;
import com.slack.api.Slack;
import com.slack.api.model.Attachment;
Expand Down Expand Up @@ -168,10 +169,10 @@ private void sendSlackAlertErrorLog(Exception e, HttpServletRequest request) {
// attachment 생성 메서드
private Attachment generateSlackAttachment(Exception e, HttpServletRequest request) {
String requestTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS").format(LocalDateTime.now());
String xffHeader = request.getHeader("X-FORWARDED-FOR");
String requestIP = NetworkUtil.getClientIp(request);

List<Field> fieldList = new ArrayList<>();
fieldList.add(new Field("Request IP", xffHeader == null ? request.getRemoteAddr() : xffHeader, false));
fieldList.add(new Field("Request IP", requestIP, false));
fieldList.add(new Field("Request URL", request.getMethod() + " " + request.getRequestURL(), false));

if (request.getContentType() != null && request.getContentType().contains("application/json")) {
Expand Down
50 changes: 0 additions & 50 deletions src/main/java/com/laser/ordermanage/common/mail/MailService.java

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.laser.ordermanage.common.scheduler.job;

import com.laser.ordermanage.factory.service.FactoryOrderMailService;
import com.laser.ordermanage.factory.service.FactoryOrderEmailService;
import com.laser.ordermanage.factory.service.FactoryOrderService;
import com.laser.ordermanage.order.domain.Order;
import com.laser.ordermanage.order.service.OrderService;
Expand All @@ -15,7 +15,7 @@ public class ChangeStageToCompletedJob implements Job {

private final OrderService orderService;
private final FactoryOrderService factoryOrderService;
private final FactoryOrderMailService factoryOrderMailService;
private final FactoryOrderEmailService factoryOrderEmailService;

@Override
public void execute(JobExecutionContext context) {
Expand All @@ -29,6 +29,6 @@ public void execute(JobExecutionContext context) {

factoryOrderService.changeStageToCompleted(orderId);

factoryOrderMailService.sendEmailForChangeStageToCompleted(orderId);
factoryOrderEmailService.sendEmailForChangeStageToCompleted(orderId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import com.laser.ordermanage.customer.dto.response.CustomerCreateDrawingResponse;
import com.laser.ordermanage.customer.dto.response.CustomerCreateOrUpdateOrderPurchaseOrderResponse;
import com.laser.ordermanage.customer.service.CustomerDeliveryAddressService;
import com.laser.ordermanage.customer.service.CustomerOrderMailService;
import com.laser.ordermanage.customer.service.CustomerOrderEmailService;
import com.laser.ordermanage.customer.service.CustomerOrderService;
import com.laser.ordermanage.order.domain.Order;
import com.laser.ordermanage.order.exception.OrderErrorCode;
Expand All @@ -26,7 +26,7 @@ public class CustomerOrderAPI {

private final OrderService orderService;
private final CustomerOrderService customerOrderService;
private final CustomerOrderMailService customerOrderMailService;
private final CustomerOrderEmailService customerOrderEmailService;
private final CustomerDeliveryAddressService customerDeliveryAddressService;

/**
Expand All @@ -36,13 +36,16 @@ public class CustomerOrderAPI {
* - 제조 서비스 및 후처리 서비스 데이터 생성 및 거래 데이터와 연관관계 매핑
* - 거래 데이터 생성
* - 도면 데이터 생성 및 거래 데이터와 연관관계 매핑
* - 공장에게 이메일 전송
*/
@PostMapping("")
public ResponseEntity<?> createOrder(@RequestBody @Valid CustomerCreateOrderRequest request) {

User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

customerOrderService.createOrder(user, request);
Long orderId = customerOrderService.createOrder(user, request);

customerOrderEmailService.sendEmailForCreateOrder(orderId);

return ResponseEntity.ok().build();
}
Expand All @@ -53,7 +56,7 @@ public ResponseEntity<?> createOrder(@RequestBody @Valid CustomerCreateOrderRequ
* - 거래에 대한 현재 로그인한 회원의 접근 권한 확인 (거래의 고객 회원)
* - 거래 배송지 수정 가능 단계 확인 (견적 대기, 견적 승인, 제작 중, 배송 중)
* - 거래 배송지를 deliveryAddressId 에 맞춰서 설정
* - 공장에게 메일 전송
* - 공장에게 이메일 전송
*/
@PatchMapping("/{order-id}/delivery-address")
public ResponseEntity<?> updateOrderDeliveryAddress(
Expand All @@ -68,7 +71,7 @@ public ResponseEntity<?> updateOrderDeliveryAddress(

customerOrderService.updateOrderDeliveryAddress(orderId, request);

customerOrderMailService.sendEmailForUpdateOrderDeliveryAddress(orderId);
customerOrderEmailService.sendEmailForUpdateOrderDeliveryAddress(orderId);

return ResponseEntity.ok().build();
}
Expand All @@ -79,7 +82,7 @@ public ResponseEntity<?> updateOrderDeliveryAddress(
* - 거래에 대한 현재 로그인한 회원의 접근 권한 확인 (거래의 고객 회원)
* - 거래 도면 항목 추가 가능 단계 확인 (견적 대기, 견적 승인, 제작 중)
* - 거래 도면 항목 추가
* - 공장에게 메일 전송
* - 공장에게 이메일 전송
*/
@PostMapping("/{order-id}/drawing")
public ResponseEntity<?> createOrderDrawing(
Expand All @@ -92,7 +95,7 @@ public ResponseEntity<?> createOrderDrawing(

Long drawingId = customerOrderService.createOrderDrawing(orderId, request);

customerOrderMailService.sendEmailForCreateOrderDrawing(orderId);
customerOrderEmailService.sendEmailForCreateOrderDrawing(orderId);

return ResponseEntity.ok(
CustomerCreateDrawingResponse.builder()
Expand All @@ -108,7 +111,7 @@ public ResponseEntity<?> createOrderDrawing(
* - 거래 도면 항목 수정 가능 단계 확인 (견적 대기, 견적 승인, 제작 중)
* - path parameter {drawing-id} 에 해당하는 도면 항목 조회
* - 거래 도면 항목 수정
* - 공장에게 메일 전송
* - 공장에게 이메일 전송
*/
@PatchMapping("/{order-id}/drawing/{drawing-id}")
public ResponseEntity<?> updateOrderDrawing(
Expand All @@ -122,7 +125,7 @@ public ResponseEntity<?> updateOrderDrawing(

customerOrderService.updateOrderDrawing(orderId, drawingId, request);

customerOrderMailService.sendEmailForUpdateOrderDrawing(orderId);
customerOrderEmailService.sendEmailForUpdateOrderDrawing(orderId);

return ResponseEntity.ok().build();
}
Expand All @@ -134,7 +137,7 @@ public ResponseEntity<?> updateOrderDrawing(
* - 거래 도면 항목 삭제 가능 단계 확인 (견적 대기, 견적 승인, 제작 중)
* - 거래 도면 개수 조건 확인 (1개 초과)
* - path parameter {drawing-id} 에 해당하는 도면 삭제
* - 공장에게 메일 전송
* - 공장에게 이메일 전송
*/
@DeleteMapping("/{order-id}/drawing/{drawing-id}")
public ResponseEntity<?> deleteOrderDrawing(
Expand All @@ -147,7 +150,7 @@ public ResponseEntity<?> deleteOrderDrawing(

customerOrderService.deleteOrderDrawing(orderId, drawingId);

customerOrderMailService.sendEmailForDeleteOrderDrawing(orderId);
customerOrderEmailService.sendEmailForDeleteOrderDrawing(orderId);

return ResponseEntity.ok().build();
}
Expand All @@ -159,7 +162,7 @@ public ResponseEntity<?> deleteOrderDrawing(
* - 거래 견적서 승인 가능 단계 확인 (견적 대기)
* - 거래 견적서 유무 확인
* - 거래 단계 변경 : 견적 대기 -> 견적 승인
* - 공장에게 메일 전송
* - 공장에게 이메일 전송
*/
@PatchMapping("/{order-id}/quotation")
public ResponseEntity<?> approveQuotation(@PathVariable("order-id") Long orderId) {
Expand All @@ -170,7 +173,7 @@ public ResponseEntity<?> approveQuotation(@PathVariable("order-id") Long orderId

customerOrderService.approveQuotation(orderId);

customerOrderMailService.sendEmailForApproveQuotation(orderId);
customerOrderEmailService.sendEmailForApproveQuotation(orderId);
return ResponseEntity.ok().build();
}

Expand All @@ -181,7 +184,7 @@ public ResponseEntity<?> approveQuotation(@PathVariable("order-id") Long orderId
* - 거래 발주서 작성 및 수정 가능 단계 확인 (견적 승인)
* - 거래 발주서의 검수 기간 및 지급일이 거래의 견적서 납기일 이후인지 확인
* - 거래 발주서 작성 및 수정
* - 공장에게 메일 전송
* - 공장에게 이메일 전송
*/
@PutMapping("/{order-id}/purchase-order")
public ResponseEntity<?> createOrUpdateOrderPurchaseOrder(
Expand All @@ -207,10 +210,10 @@ public ResponseEntity<?> createOrUpdateOrderPurchaseOrder(

if (order.hasPurchaseOrder()) {
response = customerOrderService.updateOrderPurchaseOrder(orderId, file, request);
customerOrderMailService.sendEmailForUpdateOrderPurchaseOrder(orderId);
customerOrderEmailService.sendEmailForUpdateOrderPurchaseOrder(orderId);
} else {
response = customerOrderService.createOrderPurchaseOrder(orderId, file, request);
customerOrderMailService.sendEmailForCreateOrderPurchaseOrder(orderId);
customerOrderEmailService.sendEmailForCreateOrderPurchaseOrder(orderId);
}

return ResponseEntity.ok(response);
Expand Down
Loading

0 comments on commit f67c0ce

Please sign in to comment.