diff --git a/src/main/java/life/mosu/mosuserver/MosuServerApplication.java b/src/main/java/life/mosu/mosuserver/MosuServerApplication.java index 31446349..35aba227 100644 --- a/src/main/java/life/mosu/mosuserver/MosuServerApplication.java +++ b/src/main/java/life/mosu/mosuserver/MosuServerApplication.java @@ -1,13 +1,22 @@ package life.mosu.mosuserver; +import life.mosu.mosuserver.infra.notify.NotifyEventPublisher; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class MosuServerApplication { +@RequiredArgsConstructor +public class MosuServerApplication implements CommandLineRunner { + + private final NotifyEventPublisher publisher; public static void main(String[] args) { SpringApplication.run(MosuServerApplication.class, args); } + @Override + public void run(String... args) throws Exception { + } } diff --git a/src/main/java/life/mosu/mosuserver/application/notify/NotifyService.java b/src/main/java/life/mosu/mosuserver/application/notify/NotifyService.java index ee539d7a..fec46014 100644 --- a/src/main/java/life/mosu/mosuserver/application/notify/NotifyService.java +++ b/src/main/java/life/mosu/mosuserver/application/notify/NotifyService.java @@ -1,16 +1,14 @@ package life.mosu.mosuserver.application.notify; -import life.mosu.mosuserver.domain.profile.ProfileJpaEntity; import life.mosu.mosuserver.domain.profile.ProfileJpaRepository; import life.mosu.mosuserver.global.exception.CustomRuntimeException; import life.mosu.mosuserver.global.exception.ErrorCode; -import life.mosu.mosuserver.infra.notify.NotifyClientAdapter; -import life.mosu.mosuserver.infra.notify.dto.NotifyEvent; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventRequest; -import life.mosu.mosuserver.infra.notify.strategy.NotifyStrategy; +import life.mosu.mosuserver.infra.notify.component.NotifySender; +import life.mosu.mosuserver.infra.notify.dto.NotificationEvent; +import life.mosu.mosuserver.infra.notify.dto.NotificationVariable; +import life.mosu.mosuserver.infra.notify.resolver.NotifySenderResolver; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; @Slf4j @@ -18,24 +16,22 @@ @RequiredArgsConstructor public class NotifyService { - private final NotifyClientAdapter notifier; private final ProfileJpaRepository profileJpaRepository; - private final ApplicationContext applicationContext; + private final NotifySenderResolver senderResolver; + private final NotifyVariableFactory notifyVariableFactory; - public void notify(NotifyEvent event) { - NotifyStrategy strategy = getNotifyStrategy(event.status().getStrategyName()); + public void notify(NotificationEvent event) { + String phone = retrievePhoneNumberByUserId(event.userId()); + NotificationVariable notifyVariable = notifyVariableFactory.create(event); + NotifySender sender = senderResolver.resolve( + event.status()); - ProfileJpaEntity profile = profileJpaRepository.findByUserId(event.targetId()) - .orElseThrow(() -> new CustomRuntimeException(ErrorCode.PROFILE_NOT_FOUND)); - String parsedPhoneNumber = profile.getPhoneNumber().replaceAll("-", ""); - - NotifyEventRequest request = strategy.apply(parsedPhoneNumber, event); - - notifier.send(request); + sender.send(phone, event, notifyVariable); } - private NotifyStrategy getNotifyStrategy(String strategyName) { - return (NotifyStrategy) applicationContext.getBean(strategyName); + private String retrievePhoneNumberByUserId(Long userId) { + return profileJpaRepository.findByUserId(userId) + .orElseThrow(() -> new CustomRuntimeException(ErrorCode.PROFILE_NOT_FOUND)) + .getPhoneNumberWithoutHyphen(); } - } diff --git a/src/main/java/life/mosu/mosuserver/application/notify/NotifyVariableFactory.java b/src/main/java/life/mosu/mosuserver/application/notify/NotifyVariableFactory.java new file mode 100644 index 00000000..1ff1909b --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/application/notify/NotifyVariableFactory.java @@ -0,0 +1,96 @@ +package life.mosu.mosuserver.application.notify; + +import life.mosu.mosuserver.application.notify.dto.ApplicationNotifyRequest; +import life.mosu.mosuserver.application.notify.dto.Exam1DayBeforeNotifyRequest; +import life.mosu.mosuserver.application.notify.dto.Exam1WeekBeforeNotifyRequest; +import life.mosu.mosuserver.application.notify.dto.Exam3DayBeforeNotifyRequest; +import life.mosu.mosuserver.application.notify.dto.InquiryAnswerNotifyRequest; +import life.mosu.mosuserver.application.notify.dto.RefundNotifyRequest; +import life.mosu.mosuserver.application.notify.dto.SignUpNotifyRequest; +import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaEntity; +import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaRepository; +import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolNotifyProjection; +import life.mosu.mosuserver.domain.applicationschool.OneWeekNotifyProjection; +import life.mosu.mosuserver.domain.inquiry.InquiryJpaEntity; +import life.mosu.mosuserver.domain.inquiry.InquiryJpaRepository; +import life.mosu.mosuserver.domain.refund.RefundJpaRepository; +import life.mosu.mosuserver.domain.refund.RefundNotifyProjection; +import life.mosu.mosuserver.global.exception.CustomRuntimeException; +import life.mosu.mosuserver.global.exception.ErrorCode; +import life.mosu.mosuserver.infra.notify.dto.NotificationEvent; +import life.mosu.mosuserver.infra.notify.dto.NotificationVariable; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class NotifyVariableFactory { + + private final InquiryJpaRepository inquiryJpaRepository; + private final ApplicationSchoolJpaRepository applicationSchoolJpaRepository; + private final RefundJpaRepository refundJpaRepository; + + public NotificationVariable create(NotificationEvent event) { + return switch (event.status()) { + case INQUIRY_ANSWER_SUCCESS -> createInquiryAnswerVariable(event.targetId()); + case REFUND_SUCCESS -> createRefundVariable(event.targetId()); + case APPLICATION_SUCCESS -> createApplicationVariable(event.targetId()); + case EXAM_1WEEK_BEFORE_REMINDER_INFO -> createExam1WeekBeforeVariable(event.targetId()); + case EXAM_3DAY_BEFORE_REMINDER_INFO -> createExam3DayBeforeVariable(event.targetId()); + case EXAM_1DAY_BEFORE_REMINDER_INFO -> createExam1DayBeforeVariable(event.targetId()); + case SIGN_UP_SUCCESS -> createSignUpVariable(); + default -> + throw new IllegalArgumentException("지원하지 않는 NotifyStatus: " + event.status()); + }; + } + + private NotificationVariable createSignUpVariable() { + return new SignUpNotifyRequest(); + } + + private NotificationVariable createInquiryAnswerVariable(Long targetId) { + InquiryJpaEntity inquiry = inquiryJpaRepository.findById(targetId) + .orElseThrow(() -> new CustomRuntimeException(ErrorCode.INQUIRY_NOT_FOUND)); + return new InquiryAnswerNotifyRequest(inquiry.getTitle()); + } + + private NotificationVariable createRefundVariable(Long targetId) { + RefundNotifyProjection projection = refundJpaRepository.findRefundByApplicationSchoolId( + targetId) + .orElseThrow( + () -> new CustomRuntimeException(ErrorCode.APPLICATION_SCHOOL_NOT_FOUND)); + return new RefundNotifyRequest( + projection.paymentKey(), projection.examDate(), projection.schoolName(), + projection.paymentMethod().getName(), projection.reason() + ); + } + + private NotificationVariable createApplicationVariable(Long targetId) { + ApplicationSchoolNotifyProjection projection = applicationSchoolJpaRepository.findPaymentByApplicationSchoolId( + targetId); + return ApplicationNotifyRequest.from(projection); + } + + private NotificationVariable createExam1WeekBeforeVariable(Long targetId) { + OneWeekNotifyProjection projection = applicationSchoolJpaRepository.findOneWeekNotifyByApplicationSchoolId( + targetId); + return new Exam1WeekBeforeNotifyRequest(projection.examDate(), projection.paymentKey(), + projection.schoolName()); + } + + private NotificationVariable createExam3DayBeforeVariable(Long targetId) { + ApplicationSchoolJpaEntity entity = applicationSchoolJpaRepository.findById(targetId) + .orElseThrow( + () -> new CustomRuntimeException(ErrorCode.APPLICATION_SCHOOL_NOT_FOUND)); + return new Exam3DayBeforeNotifyRequest(entity.getExamDate(), entity.getExaminationNumber(), + entity.getSchoolName()); + } + + private NotificationVariable createExam1DayBeforeVariable(Long targetId) { + ApplicationSchoolJpaEntity entity = applicationSchoolJpaRepository.findById(targetId) + .orElseThrow( + () -> new CustomRuntimeException(ErrorCode.APPLICATION_SCHOOL_NOT_FOUND)); + return new Exam1DayBeforeNotifyRequest(entity.getExamDate(), entity.getExaminationNumber(), + entity.getSchoolName()); + } +} diff --git a/src/main/java/life/mosu/mosuserver/application/notify/dto/ApplicationNotifyRequest.java b/src/main/java/life/mosu/mosuserver/application/notify/dto/ApplicationNotifyRequest.java new file mode 100644 index 00000000..b34957a9 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/application/notify/dto/ApplicationNotifyRequest.java @@ -0,0 +1,47 @@ +package life.mosu.mosuserver.application.notify.dto; + +import static life.mosu.mosuserver.infra.notify.constant.NotifyRedirectUrlConstants.MY_PAGE; +import static life.mosu.mosuserver.infra.notify.constant.NotifyRedirectUrlConstants.WARNING_PAGE; + +import java.time.LocalDate; +import java.util.Map; +import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolNotifyProjection; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls.NotificationButtonUrl; +import life.mosu.mosuserver.infra.notify.dto.NotificationVariable; + +public record ApplicationNotifyRequest( + String paymentKey, + LocalDate examDate, + String schoolName, + String lunch +) implements NotificationVariable { + + public static ApplicationNotifyRequest from( + ApplicationSchoolNotifyProjection applicationSchool) { + return new ApplicationNotifyRequest( + applicationSchool.paymentKey(), + applicationSchool.examDate(), + applicationSchool.schoolName(), + applicationSchool.lunch() != null ? applicationSchool.lunch().getLunchName() : "" + ); + } + + @Override + public NotificationButtonUrls getNotificationButtonUrls() { + return NotificationButtonUrls.of( + NotificationButtonUrl.of(WARNING_PAGE, WARNING_PAGE), + NotificationButtonUrl.of(MY_PAGE, MY_PAGE) + ); + } + + @Override + public Map toMap() { + return Map.of( + "paymentKey", paymentKey, + "examDate", examDate.toString(), + "schoolName", schoolName, + "lunch", lunch + ); + } +} diff --git a/src/main/java/life/mosu/mosuserver/application/notify/dto/Exam1DayBeforeNotifyRequest.java b/src/main/java/life/mosu/mosuserver/application/notify/dto/Exam1DayBeforeNotifyRequest.java new file mode 100644 index 00000000..e5923823 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/application/notify/dto/Exam1DayBeforeNotifyRequest.java @@ -0,0 +1,34 @@ +package life.mosu.mosuserver.application.notify.dto; + +import static life.mosu.mosuserver.infra.notify.constant.NotifyRedirectUrlConstants.INQUIRY_PAGE; +import static life.mosu.mosuserver.infra.notify.constant.NotifyRedirectUrlConstants.MY_PAGE; + +import java.time.LocalDate; +import java.util.Map; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls.NotificationButtonUrl; +import life.mosu.mosuserver.infra.notify.dto.NotificationVariable; + +public record Exam1DayBeforeNotifyRequest( + LocalDate examDate, + String examinationNumber, + String schoolName +) implements NotificationVariable { + + @Override + public NotificationButtonUrls getNotificationButtonUrls() { + return NotificationButtonUrls.of( + NotificationButtonUrl.of(INQUIRY_PAGE, INQUIRY_PAGE), + NotificationButtonUrl.of(MY_PAGE, MY_PAGE) + ); + } + + @Override + public Map toMap() { + return Map.of( + "examDate", examDate.toString(), + "examinationNumber", examinationNumber, + "schoolName", schoolName + ); + } +} diff --git a/src/main/java/life/mosu/mosuserver/application/notify/dto/Exam1WeekBeforeNotifyRequest.java b/src/main/java/life/mosu/mosuserver/application/notify/dto/Exam1WeekBeforeNotifyRequest.java new file mode 100644 index 00000000..f286a095 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/application/notify/dto/Exam1WeekBeforeNotifyRequest.java @@ -0,0 +1,32 @@ +package life.mosu.mosuserver.application.notify.dto; + +import static life.mosu.mosuserver.infra.notify.constant.NotifyRedirectUrlConstants.INQUIRY_PAGE; + +import java.time.LocalDate; +import java.util.Map; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls.NotificationButtonUrl; +import life.mosu.mosuserver.infra.notify.dto.NotificationVariable; + +public record Exam1WeekBeforeNotifyRequest( + LocalDate examDate, + String paymentKey, + String schoolName +) implements NotificationVariable { + + @Override + public NotificationButtonUrls getNotificationButtonUrls() { + return NotificationButtonUrls.of( + NotificationButtonUrl.of(INQUIRY_PAGE, INQUIRY_PAGE) + ); + } + + @Override + public Map toMap() { + return Map.of( + "examDate", examDate.toString(), + "paymentKey", paymentKey, + "schoolName", schoolName + ); + } +} diff --git a/src/main/java/life/mosu/mosuserver/application/notify/dto/Exam3DayBeforeNotifyRequest.java b/src/main/java/life/mosu/mosuserver/application/notify/dto/Exam3DayBeforeNotifyRequest.java new file mode 100644 index 00000000..a0a7b254 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/application/notify/dto/Exam3DayBeforeNotifyRequest.java @@ -0,0 +1,34 @@ +package life.mosu.mosuserver.application.notify.dto; + +import static life.mosu.mosuserver.infra.notify.constant.NotifyRedirectUrlConstants.INQUIRY_PAGE; +import static life.mosu.mosuserver.infra.notify.constant.NotifyRedirectUrlConstants.MY_PAGE; + +import java.time.LocalDate; +import java.util.Map; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls.NotificationButtonUrl; +import life.mosu.mosuserver.infra.notify.dto.NotificationVariable; + +public record Exam3DayBeforeNotifyRequest( + LocalDate examDate, + String examinationNumber, + String schoolName +) implements NotificationVariable { + + @Override + public NotificationButtonUrls getNotificationButtonUrls() { + return NotificationButtonUrls.of( + NotificationButtonUrl.of(INQUIRY_PAGE, INQUIRY_PAGE), + NotificationButtonUrl.of(MY_PAGE, MY_PAGE) + ); + } + + @Override + public Map toMap() { + return Map.of( + "examDate", examDate.toString(), + "examinationNumber", examinationNumber, + "schoolName", schoolName + ); + } +} diff --git a/src/main/java/life/mosu/mosuserver/application/notify/dto/InquiryAnswerNotifyRequest.java b/src/main/java/life/mosu/mosuserver/application/notify/dto/InquiryAnswerNotifyRequest.java new file mode 100644 index 00000000..f5f500cd --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/application/notify/dto/InquiryAnswerNotifyRequest.java @@ -0,0 +1,27 @@ +package life.mosu.mosuserver.application.notify.dto; + +import static life.mosu.mosuserver.infra.notify.constant.NotifyRedirectUrlConstants.INQUIRY_PAGE; + +import java.util.Map; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls.NotificationButtonUrl; +import life.mosu.mosuserver.infra.notify.dto.NotificationVariable; + +public record InquiryAnswerNotifyRequest( + String title +) implements NotificationVariable { + + @Override + public NotificationButtonUrls getNotificationButtonUrls() { + return NotificationButtonUrls.of( + NotificationButtonUrl.of(INQUIRY_PAGE, INQUIRY_PAGE) + ); + } + + @Override + public Map toMap() { + return Map.of( + "inquiryTitle", title + ); + } +} diff --git a/src/main/java/life/mosu/mosuserver/application/notify/dto/RefundNotifyRequest.java b/src/main/java/life/mosu/mosuserver/application/notify/dto/RefundNotifyRequest.java new file mode 100644 index 00000000..367f6b91 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/application/notify/dto/RefundNotifyRequest.java @@ -0,0 +1,38 @@ +package life.mosu.mosuserver.application.notify.dto; + +import static life.mosu.mosuserver.infra.notify.constant.NotifyRedirectUrlConstants.MY_PAGE; + +import java.time.LocalDate; +import java.util.Map; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls.NotificationButtonUrl; +import life.mosu.mosuserver.infra.notify.dto.NotificationVariable; + +public record RefundNotifyRequest( + String paymentKey, + LocalDate examDate, + String schoolName, +// String amount, + String paymentMethod, + String reason +) implements NotificationVariable { + + @Override + public NotificationButtonUrls getNotificationButtonUrls() { + return NotificationButtonUrls.of( + NotificationButtonUrl.of(MY_PAGE, MY_PAGE) + ); + } + + @Override + public Map toMap() { + return Map.of( + "paymentKey", paymentKey, + "examDate", examDate.toString(), + "schoolName", schoolName, + "amount", String.valueOf(1000), + "paymentMethod", paymentMethod, + "reason", reason + ); + } +} diff --git a/src/main/java/life/mosu/mosuserver/application/notify/dto/SignUpNotifyRequest.java b/src/main/java/life/mosu/mosuserver/application/notify/dto/SignUpNotifyRequest.java new file mode 100644 index 00000000..1d846f86 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/application/notify/dto/SignUpNotifyRequest.java @@ -0,0 +1,25 @@ +package life.mosu.mosuserver.application.notify.dto; + +import static life.mosu.mosuserver.infra.notify.constant.NotifyRedirectUrlConstants.HOME_PAGE; + +import java.util.Map; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls.NotificationButtonUrl; +import life.mosu.mosuserver.infra.notify.dto.NotificationVariable; + +public record SignUpNotifyRequest( + +) implements NotificationVariable { + + @Override + public NotificationButtonUrls getNotificationButtonUrls() { + return NotificationButtonUrls.of( + NotificationButtonUrl.of(HOME_PAGE, HOME_PAGE) + ); + } + + @Override + public Map toMap() { + return Map.of(); + } +} diff --git a/src/main/java/life/mosu/mosuserver/domain/applicationschool/ApplicationSchoolJpaRepository.java b/src/main/java/life/mosu/mosuserver/domain/applicationschool/ApplicationSchoolJpaRepository.java index 857a21d3..d850d8d3 100644 --- a/src/main/java/life/mosu/mosuserver/domain/applicationschool/ApplicationSchoolJpaRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/applicationschool/ApplicationSchoolJpaRepository.java @@ -8,8 +8,6 @@ public interface ApplicationSchoolJpaRepository extends JpaRepository { -// boolean existsByUserIdAndSchoolIds(Long userId, List schoolId); - boolean existsByUserIdAndSchoolId(Long userId, Long schoolId); List findAllByApplicationId(Long applicationId); @@ -22,7 +20,9 @@ boolean existsAllByIds(@Param("applicationSchoolIds") List applicationScho @Param("size") long size); @Query(""" - SELECT p.paymentKey, a.examDate, a.schoolName, a.lunch + SELECT new life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolNotifyProjection( + p.paymentKey, a.examDate, a.schoolName, a.lunch + ) FROM ApplicationSchoolJpaEntity a LEFT JOIN PaymentJpaEntity p ON a.id = p.applicationSchoolId WHERE a.id = :applicationSchoolId @@ -30,7 +30,9 @@ boolean existsAllByIds(@Param("applicationSchoolIds") List applicationScho ApplicationSchoolNotifyProjection findPaymentByApplicationSchoolId(Long applicationSchoolId); @Query(""" - SELECT p.paymentKey, a.examDate, a.schoolName + SELECT new life.mosu.mosuserver.domain.applicationschool.OneWeekNotifyProjection( + p.paymentKey, a.examDate, a.schoolName + ) FROM ApplicationSchoolJpaEntity a JOIN PaymentJpaEntity p ON a.id = p.applicationSchoolId WHERE a.id = :applicationSchoolId diff --git a/src/main/java/life/mosu/mosuserver/domain/profile/ProfileJpaEntity.java b/src/main/java/life/mosu/mosuserver/domain/profile/ProfileJpaEntity.java index 3ebba57a..62e84225 100644 --- a/src/main/java/life/mosu/mosuserver/domain/profile/ProfileJpaEntity.java +++ b/src/main/java/life/mosu/mosuserver/domain/profile/ProfileJpaEntity.java @@ -98,4 +98,8 @@ public void edit(final EditProfileRequest request) { public void registerRecommenderPhoneNumber(final String recommenderPhoneNumber) { this.recommenderPhoneNumber = recommenderPhoneNumber; } + + public String getPhoneNumberWithoutHyphen() { + return getPhoneNumber().replaceAll("-", ""); + } } diff --git a/src/main/java/life/mosu/mosuserver/domain/refund/RefundJpaRepository.java b/src/main/java/life/mosu/mosuserver/domain/refund/RefundJpaRepository.java index 6fdc1ec8..f499039f 100644 --- a/src/main/java/life/mosu/mosuserver/domain/refund/RefundJpaRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/refund/RefundJpaRepository.java @@ -1,20 +1,24 @@ package life.mosu.mosuserver.domain.refund; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; public interface RefundJpaRepository extends JpaRepository { @Query(""" - SELECT - p.paymentKey AS paymentKey, - a.examDate AS examDate, - p.paymentMethod AS paymentMethod, - r.reason AS reason + SELECT new life.mosu.mosuserver.domain.refund.RefundNotifyProjection( + p.paymentKey, + a.examDate, + a.schoolName, + p.paymentMethod, + r.reason + ) FROM RefundJpaEntity r LEFT JOIN PaymentJpaEntity p ON r.applicationSchoolId = p.applicationSchoolId LEFT JOIN ApplicationSchoolJpaEntity a ON r.applicationSchoolId = a.id WHERE r.applicationSchoolId = :applicationSchoolId """) - RefundNotifyProjection findRefundByApplicationSchoolId(Long applicationSchoolId); + Optional findRefundByApplicationSchoolId(Long applicationSchoolId); + } diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/NotifyEventPublisher.java b/src/main/java/life/mosu/mosuserver/infra/notify/NotifyEventPublisher.java index f61f3147..354b35c9 100644 --- a/src/main/java/life/mosu/mosuserver/infra/notify/NotifyEventPublisher.java +++ b/src/main/java/life/mosu/mosuserver/infra/notify/NotifyEventPublisher.java @@ -1,6 +1,6 @@ package life.mosu.mosuserver.infra.notify; -import life.mosu.mosuserver.infra.notify.dto.NotifyEvent; +import life.mosu.mosuserver.infra.notify.dto.NotificationEvent; import lombok.RequiredArgsConstructor; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; @@ -11,7 +11,7 @@ public class NotifyEventPublisher { private final ApplicationEventPublisher publisher; - public void notify(NotifyEvent event) { + public void notify(NotificationEvent event) { publisher.publishEvent(event); } } diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/NotifyEventTemplateGenerator.java b/src/main/java/life/mosu/mosuserver/infra/notify/NotifyEventTemplateGenerator.java index 5da898b1..2661b668 100644 --- a/src/main/java/life/mosu/mosuserver/infra/notify/NotifyEventTemplateGenerator.java +++ b/src/main/java/life/mosu/mosuserver/infra/notify/NotifyEventTemplateGenerator.java @@ -3,9 +3,11 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import life.mosu.mosuserver.infra.notify.dto.NotificationVariable; import life.mosu.mosuserver.infra.notify.dto.NotifyEventRemindMessageDto; import life.mosu.mosuserver.infra.notify.dto.NotifyEventRequest; import life.mosu.mosuserver.infra.notify.dto.NotifyEventSuccessMessageDto; +import life.mosu.mosuserver.infra.notify.dto.NotifyTemplateCode; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.context.MessageSource; @@ -13,13 +15,29 @@ @Component @RequiredArgsConstructor -public class NotifyEventTemplateGenerator { +public class NotifyEventTemplateGenerator { private final MessageSource messageSource; - public String getProcessedMessage(String code, Map variables) { - String message = messageSource.getMessage(code, null, Locale.KOREA); - for (Map.Entry entry : variables.entrySet()) { + public String getProcessedMessage( + NotifyTemplateCode templateCode, + T variables) { + if (variables == null) { + return messageSource.getMessage(templateCode.getCode(), null, Locale.KOREA); + } + Map data = variables.toMap(); + String message = messageSource.getMessage(templateCode.getCode(), null, Locale.KOREA); + for (Map.Entry entry : data.entrySet()) { + message = StringUtils.replace(message, "#{" + entry.getKey() + "}", entry.getValue()); + } + return message; + } + + public String getProcessedMessage(String templateCode, + T variables) { + Map data = variables.toMap(); + String message = messageSource.getMessage(templateCode, null, Locale.KOREA); + for (Map.Entry entry : data.entrySet()) { message = StringUtils.replace(message, "#{" + entry.getKey() + "}", entry.getValue()); } return message; diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/annotation/NotifyStrategyMapping.java b/src/main/java/life/mosu/mosuserver/infra/notify/annotation/NotifyStrategyMapping.java new file mode 100644 index 00000000..11ceaf6d --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/infra/notify/annotation/NotifyStrategyMapping.java @@ -0,0 +1,14 @@ +package life.mosu.mosuserver.infra.notify.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import life.mosu.mosuserver.infra.notify.dto.NotificationStatus; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface NotifyStrategyMapping { + + NotificationStatus[] value(); // 여러 상태 매핑 허용 +} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/component/NotifySender.java b/src/main/java/life/mosu/mosuserver/infra/notify/component/NotifySender.java new file mode 100644 index 00000000..45ee2b5d --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/infra/notify/component/NotifySender.java @@ -0,0 +1,8 @@ +package life.mosu.mosuserver.infra.notify.component; + +import life.mosu.mosuserver.infra.notify.dto.NotificationEvent; + +public interface NotifySender { + + void send(String targetPhoneNumber, NotificationEvent event, T referObject); +} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/component/luna/LunaNotifySender.java b/src/main/java/life/mosu/mosuserver/infra/notify/component/luna/LunaNotifySender.java new file mode 100644 index 00000000..6d1a4e83 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/infra/notify/component/luna/LunaNotifySender.java @@ -0,0 +1,58 @@ +package life.mosu.mosuserver.infra.notify.component.luna; + +import static life.mosu.mosuserver.infra.notify.dto.NotificationStatus.INQUIRY_ANSWER_SUCCESS; +import static life.mosu.mosuserver.infra.notify.dto.NotificationStatus.SIGN_UP_SUCCESS; + +import life.mosu.mosuserver.infra.notify.NotifyClientAdapter; +import life.mosu.mosuserver.infra.notify.NotifyEventTemplateGenerator; +import life.mosu.mosuserver.infra.notify.annotation.NotifyStrategyMapping; +import life.mosu.mosuserver.infra.notify.component.NotifySender; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls; +import life.mosu.mosuserver.infra.notify.dto.NotificationEvent; +import life.mosu.mosuserver.infra.notify.dto.NotificationVariable; +import life.mosu.mosuserver.infra.notify.dto.NotifyEventRequest; +import life.mosu.mosuserver.infra.notify.dto.NotifyEventSuccessMessageDto; +import life.mosu.mosuserver.infra.notify.dto.NotifyTemplateCode; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@NotifyStrategyMapping({ + SIGN_UP_SUCCESS, + INQUIRY_ANSWER_SUCCESS +}) +@RequiredArgsConstructor +public class LunaNotifySender implements NotifySender { + + private final NotifyEventTemplateGenerator template; + private final NotifyClientAdapter notifier; + + /** + * @param targetPhoneNumber target 휴대폰 번호 + * @param event event 티켓 + * @param dto variable + */ + @Override + public void send(String targetPhoneNumber, NotificationEvent event, T dto) { + NotifyTemplateCode templateCode = event.status().getTemplateCode(); + + String alimTalkContent = template.getProcessedMessage(templateCode, + dto); + + NotificationButtonUrls btnUrls = dto.getNotificationButtonUrls(); + + NotifyEventSuccessMessageDto eventMessage = NotifyEventSuccessMessageDto.create( + 1, + targetPhoneNumber, + alimTalkContent, + btnUrls); + + NotifyEventRequest request = template.getNotifyEventSuccessTemplate( + templateCode.getId(), + eventMessage); + + notifier.send(request); + } +} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/component/luna/LunaNotifyWithSmsFallbackSender.java b/src/main/java/life/mosu/mosuserver/infra/notify/component/luna/LunaNotifyWithSmsFallbackSender.java new file mode 100644 index 00000000..502841b4 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/infra/notify/component/luna/LunaNotifyWithSmsFallbackSender.java @@ -0,0 +1,71 @@ +package life.mosu.mosuserver.infra.notify.component.luna; + +import static life.mosu.mosuserver.infra.notify.dto.NotificationStatus.APPLICATION_SUCCESS; +import static life.mosu.mosuserver.infra.notify.dto.NotificationStatus.EXAM_1DAY_BEFORE_REMINDER_INFO; +import static life.mosu.mosuserver.infra.notify.dto.NotificationStatus.EXAM_1WEEK_BEFORE_REMINDER_INFO; +import static life.mosu.mosuserver.infra.notify.dto.NotificationStatus.EXAM_3DAY_BEFORE_REMINDER_INFO; +import static life.mosu.mosuserver.infra.notify.dto.NotificationStatus.REFUND_SUCCESS; + +import life.mosu.mosuserver.infra.notify.NotifyClientAdapter; +import life.mosu.mosuserver.infra.notify.NotifyEventTemplateGenerator; +import life.mosu.mosuserver.infra.notify.annotation.NotifyStrategyMapping; +import life.mosu.mosuserver.infra.notify.component.NotifySender; +import life.mosu.mosuserver.infra.notify.dto.NotificationButtonUrls; +import life.mosu.mosuserver.infra.notify.dto.NotificationEvent; +import life.mosu.mosuserver.infra.notify.dto.NotificationVariable; +import life.mosu.mosuserver.infra.notify.dto.NotifyEventRequest; +import life.mosu.mosuserver.infra.notify.dto.NotifyEventSuccessMessageDto; +import life.mosu.mosuserver.infra.notify.dto.NotifyTemplateCode; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@NotifyStrategyMapping({ + APPLICATION_SUCCESS, + REFUND_SUCCESS, + EXAM_1DAY_BEFORE_REMINDER_INFO, + EXAM_3DAY_BEFORE_REMINDER_INFO, + EXAM_1WEEK_BEFORE_REMINDER_INFO +}) +@RequiredArgsConstructor +@Slf4j +public class LunaNotifyWithSmsFallbackSender implements + NotifySender { + + private final NotifyEventTemplateGenerator template; + private final NotifyClientAdapter notifier; + + /** + * @param targetPhoneNumber target 휴대폰 번호 + * @param event event 티켓 + * @param dto variable + */ + @Override + public void send(String targetPhoneNumber, NotificationEvent event, T dto) { + NotifyTemplateCode templateCode = event.status().getTemplateCode(); + log.info("templateCode : {}", templateCode); + + String alimTalkContent = template.getProcessedMessage(templateCode, + dto); + + NotificationButtonUrls btnUrls = dto.getNotificationButtonUrls(); + + String smsContent = template.getProcessedMessage(templateCode.getSmsCode(), + dto); + + NotifyEventSuccessMessageDto eventMessage = NotifyEventSuccessMessageDto.createWithSmsFallback( + 1, + targetPhoneNumber, + alimTalkContent, + smsContent, + btnUrls + ); + + NotifyEventRequest request = template.getNotifyEventSuccessTemplate( + templateCode.getId(), + eventMessage); + + notifier.send(request); + } +} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/constant/NotifyConstants.java b/src/main/java/life/mosu/mosuserver/infra/notify/constant/NotifyConstants.java deleted file mode 100644 index fe186ad5..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/constant/NotifyConstants.java +++ /dev/null @@ -1,21 +0,0 @@ -package life.mosu.mosuserver.infra.notify.constant; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class NotifyConstants { - - public static final String HOMEPAGE = "https://www.mosuedu.com"; - public static final String MYPAGE = "https://www.mosuedu.com/mypage"; - public static final String WARNING = "https://www.mosuedu.com/warning"; - public static final String INQUIRY = "https://www.mosuedu.com/notice"; - - public static final Integer APPLICATION_TEMPLATE_ID = 50037; - public static final Integer EXAM_1DAY_BEFORE_TEMPLATE_ID = 50041; - public static final Integer EXAM_3DAY_BEFORE_TEMPLATE_ID = 50040; - public static final Integer EXAM_1WEEK_BEFORE_TEMPLATE_ID = 50039; - public static final Integer INQUIRY_ANSWER_TEMPLATE_ID = 50038; - public static final Integer SIGN_UP_TEMPLATE_ID = 50042; - public static final Integer REFUND_TEMPLATE_ID = 50043; -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/constant/NotifyRedirectUrlConstants.java b/src/main/java/life/mosu/mosuserver/infra/notify/constant/NotifyRedirectUrlConstants.java new file mode 100644 index 00000000..17ac7eb6 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/infra/notify/constant/NotifyRedirectUrlConstants.java @@ -0,0 +1,13 @@ +package life.mosu.mosuserver.infra.notify.constant; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class NotifyRedirectUrlConstants { + + public static final String HOME_PAGE = "https://www.mosuedu.com"; + public static final String MY_PAGE = "https://www.mosuedu.com/mypage"; + public static final String WARNING_PAGE = "https://www.mosuedu.com/warning"; + public static final String INQUIRY_PAGE = "https://www.mosuedu.com/notice"; +} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/ApplicationNotifyVariablesDto.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/ApplicationNotifyVariablesDto.java deleted file mode 100644 index 5a8b0f5c..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/dto/ApplicationNotifyVariablesDto.java +++ /dev/null @@ -1,22 +0,0 @@ -package life.mosu.mosuserver.infra.notify.dto; - -import java.time.LocalDate; -import java.util.Map; - -public record ApplicationNotifyVariablesDto( - String paymentKey, - LocalDate examDate, - String schoolName, - String lunch -) { - - public Map toMap() { - return Map.of( - "paymentKey", paymentKey, - "examDate", examDate.toString(), - "schoolName", schoolName, - "lunch", lunch - ); - } - -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/EventStatus.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/EventStatus.java deleted file mode 100644 index 42ff0106..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/dto/EventStatus.java +++ /dev/null @@ -1,5 +0,0 @@ -package life.mosu.mosuserver.infra.notify.dto; - -public enum EventStatus { - SUCCESS, FAILURE, INFO -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/Exam1DayBeforeNotifyVariablesDto.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/Exam1DayBeforeNotifyVariablesDto.java deleted file mode 100644 index b4cb7736..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/dto/Exam1DayBeforeNotifyVariablesDto.java +++ /dev/null @@ -1,19 +0,0 @@ -package life.mosu.mosuserver.infra.notify.dto; - -import java.time.LocalDate; -import java.util.Map; - -public record Exam1DayBeforeNotifyVariablesDto( - LocalDate examDate, - String examinationNumber, - String schoolName -) { - - public Map toMap() { - return Map.of( - "examDate", examDate.toString(), - "examinationNumber", examinationNumber, - "schoolName", schoolName - ); - } -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/Exam1WeekBeforeNotifyVariablesDto.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/Exam1WeekBeforeNotifyVariablesDto.java deleted file mode 100644 index 7653c59c..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/dto/Exam1WeekBeforeNotifyVariablesDto.java +++ /dev/null @@ -1,19 +0,0 @@ -package life.mosu.mosuserver.infra.notify.dto; - -import java.time.LocalDate; -import java.util.Map; - -public record Exam1WeekBeforeNotifyVariablesDto( - LocalDate examDate, - String paymentKey, - String schoolName -) { - - public Map toMap() { - return Map.of( - "examDate", examDate.toString(), - "paymentKey", paymentKey, - "schoolName", schoolName - ); - } -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/Exam3DayBeforeNotifyVariablesDto.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/Exam3DayBeforeNotifyVariablesDto.java deleted file mode 100644 index a37c0cfa..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/dto/Exam3DayBeforeNotifyVariablesDto.java +++ /dev/null @@ -1,19 +0,0 @@ -package life.mosu.mosuserver.infra.notify.dto; - -import java.time.LocalDate; -import java.util.Map; - -public record Exam3DayBeforeNotifyVariablesDto( - LocalDate examDate, - String examinationNumber, - String schoolName -) { - - public Map toMap() { - return Map.of( - "examDate", examDate.toString(), - "examinationNumber", examinationNumber, - "schoolName", schoolName - ); - } -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/InquiryAnswerNotifyVariablesDto.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/InquiryAnswerNotifyVariablesDto.java deleted file mode 100644 index 3b739c2d..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/dto/InquiryAnswerNotifyVariablesDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package life.mosu.mosuserver.infra.notify.dto; - -import java.util.Map; - -public record InquiryAnswerNotifyVariablesDto( - String title -) { - - public Map toMap() { - return Map.of( - "inquiryTitle", title - ); - } -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotificationButtonUrls.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotificationButtonUrls.java new file mode 100644 index 00000000..f31a20e2 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotificationButtonUrls.java @@ -0,0 +1,42 @@ +package life.mosu.mosuserver.infra.notify.dto; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public record NotificationButtonUrls(List btnUrls) { + + public NotificationButtonUrls { + btnUrls = btnUrls == null ? List.of() : List.copyOf(btnUrls); + } + + public static NotificationButtonUrls of(NotificationButtonUrl... btns) { + return new NotificationButtonUrls(List.of(btns)); + } + + public static NotificationButtonUrls of(List btnList) { + return new NotificationButtonUrls(btnList); + } + + public static NotificationButtonUrls empty() { + return new NotificationButtonUrls(List.of()); + } + + public List> toMapList() { + return btnUrls.stream().map(NotificationButtonUrl::toMap).collect(Collectors.toList()); + } + + public record NotificationButtonUrl(String urlPc, String urlMobile) { + + public static NotificationButtonUrl of(String urlPc, String urlMobile) { + return new NotificationButtonUrl(urlPc, urlMobile); + } + + public Map toMap() { + return Map.of( + "url_pc", urlPc, + "url_mobile", urlMobile + ); + } + } +} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotificationEvent.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotificationEvent.java new file mode 100644 index 00000000..acbbcd29 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotificationEvent.java @@ -0,0 +1,13 @@ +package life.mosu.mosuserver.infra.notify.dto; + +public record NotificationEvent( + NotificationStatus status, + Long userId, + Long targetId +) { + + public static NotificationEvent create(NotificationStatus status, Long userId, Long targetId) { + return new NotificationEvent(status, userId, targetId); + } + +} \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotificationStatus.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotificationStatus.java new file mode 100644 index 00000000..f5b9f6b0 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotificationStatus.java @@ -0,0 +1,37 @@ +package life.mosu.mosuserver.infra.notify.dto; + +import lombok.Getter; + +@Getter +public enum NotificationStatus { + + // 성공 알림 + SIGN_UP_SUCCESS("회원 가입 완료", NotifyTemplateCode.SIGN_UP), + APPLICATION_SUCCESS("신청 완료", NotifyTemplateCode.APPLICATION), + REFUND_SUCCESS("환불 완료", NotifyTemplateCode.REFUND), + INQUIRY_ANSWER_SUCCESS("문의 답변 완료", NotifyTemplateCode.INQUIRY_ANSWER), + + // 정보성 알림 (리마인더) + EXAM_1WEEK_BEFORE_REMINDER_INFO("시험 1주일 전 리마인드 알림", NotifyTemplateCode.EXAM_1WEEK_BEFORE), + EXAM_3DAY_BEFORE_REMINDER_INFO("시험 3일 전 리마인드 알림", NotifyTemplateCode.EXAM_3DAY_BEFORE), + EXAM_1DAY_BEFORE_REMINDER_INFO("시험 하루 전 리마인드 알림", NotifyTemplateCode.EXAM_1DAY_BEFORE); + + private final String message; + private final NotifyTemplateCode templateCode; + private final NotificationSendStatus sendStatus; + + NotificationStatus(String message, NotifyTemplateCode templateCode) { + this(message, templateCode, NotificationSendStatus.SUCCESS); + } + + NotificationStatus(String message, NotifyTemplateCode templateCode, + NotificationSendStatus sendStatus) { + this.message = message; + this.templateCode = templateCode; + this.sendStatus = sendStatus; + } + + public enum NotificationSendStatus { + SUCCESS, FAILURE, INFO + } +} \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotificationVariable.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotificationVariable.java new file mode 100644 index 00000000..8264f065 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotificationVariable.java @@ -0,0 +1,10 @@ +package life.mosu.mosuserver.infra.notify.dto; + +import java.util.Map; + +public interface NotificationVariable { + + NotificationButtonUrls getNotificationButtonUrls(); + + Map toMap(); +} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyButtonUrl.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyButtonUrl.java deleted file mode 100644 index b71d1291..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyButtonUrl.java +++ /dev/null @@ -1,24 +0,0 @@ -package life.mosu.mosuserver.infra.notify.dto; - -import java.util.Map; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class NotifyButtonUrl { - - private String urlPc; - private String urlMobile; - - public static NotifyButtonUrl of(String urlPc, String urlMobile) { - return new NotifyButtonUrl(urlPc, urlMobile); - } - - public Map toMap() { - return Map.of( - "url_pc", urlPc, - "url_mobile", urlMobile - ); - } -} \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyButtonUrls.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyButtonUrls.java deleted file mode 100644 index 230d0928..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyButtonUrls.java +++ /dev/null @@ -1,21 +0,0 @@ -package life.mosu.mosuserver.infra.notify.dto; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class NotifyButtonUrls { - - private final List btnUrls; - - public static NotifyButtonUrls of(NotifyButtonUrl... btns) { - return new NotifyButtonUrls(Arrays.asList(btns)); - } - - public List> toMapList() { - return btnUrls.stream().map(NotifyButtonUrl::toMap).collect(Collectors.toList()); - } -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyEvent.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyEvent.java deleted file mode 100644 index dcd9bf26..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyEvent.java +++ /dev/null @@ -1,12 +0,0 @@ -package life.mosu.mosuserver.infra.notify.dto; - -public record NotifyEvent( - NotifyStatus status, - Long userId, - Long targetId -) { - - public static NotifyEvent create(NotifyStatus status, Long userId, Long targetId) { - return new NotifyEvent(status, userId, targetId); - } -} \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyEventRemindMessageDto.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyEventRemindMessageDto.java index 7336496b..56a88b30 100644 --- a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyEventRemindMessageDto.java +++ b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyEventRemindMessageDto.java @@ -10,7 +10,7 @@ public record NotifyEventRemindMessageDto( LocalDateTime reserveTime, String msgContent, String smsContent, - NotifyButtonUrls btnUrls + NotificationButtonUrls btnUrls ) { public static NotifyEventRemindMessageDto create( @@ -19,7 +19,7 @@ public static NotifyEventRemindMessageDto create( LocalDateTime reserveTime, String msgContent, String smsContent, - NotifyButtonUrls btnUrls + NotificationButtonUrls btnUrls ) { return new NotifyEventRemindMessageDto( no, diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyEventSuccessMessageDto.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyEventSuccessMessageDto.java index ee5ffe31..8c2e6abf 100644 --- a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyEventSuccessMessageDto.java +++ b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyEventSuccessMessageDto.java @@ -9,19 +9,29 @@ public record NotifyEventSuccessMessageDto( String msgContent, String smsContent, String useSms, - NotifyButtonUrls btnUrls + NotificationButtonUrls btnUrls ) { public static NotifyEventSuccessMessageDto create( + Integer no, + String telNum, + String msgContent, + NotificationButtonUrls btnUrls + ) { + return new NotifyEventSuccessMessageDto( + no, telNum, msgContent, "", "0", btnUrls + ); + } + + public static NotifyEventSuccessMessageDto createWithSmsFallback( Integer no, String telNum, String msgContent, String smsContent, - String useSms, - NotifyButtonUrls btnUrls + NotificationButtonUrls btnUrls ) { return new NotifyEventSuccessMessageDto( - no, telNum, msgContent, smsContent, useSms, btnUrls + no, telNum, msgContent, smsContent, "1", btnUrls ); } diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyStatus.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyStatus.java deleted file mode 100644 index ca7acc12..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyStatus.java +++ /dev/null @@ -1,31 +0,0 @@ -package life.mosu.mosuserver.infra.notify.dto; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public enum NotifyStatus { - - // success - SIGN_UP_SUCCESS(EventStatus.SUCCESS, "회원 가입 완료", - "SignUpNotifyStrategy"), - APPLICATION_SUCCESS(EventStatus.SUCCESS, "신청 완료", - "ApplicationNotifyStrategy"), - REFUND_SUCCESS(EventStatus.SUCCESS, "환불 완료", - "RefundNotifyStrategy"), - INQUIRY_ANSWER_SUCCESS(EventStatus.SUCCESS, "문의 답변 완료", - "InquiryAnswerNotifyStrategy"), - - // info - EXAM_1WEEK_BEFORE_REMINDER_INFO(EventStatus.INFO, "시험 1주일 전 리마인드 알림", - "Exam1DayBeforeNotifyStrategy"), - EXAM_3DAY_BEFORE_REMINDER_INFO(EventStatus.INFO, "시험 3일 전 리마인드 알림", - "Exam3DayBeforeNotifyStrategy"), - EXAM_1DAY_BEFORE_REMINDER_INFO(EventStatus.INFO, "시험 하루 전 리마인드 알림", - "Exam1WeekBeforeNotifyStrategy"); - - private final EventStatus status; - private final String message; - private final String strategyName; -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyTemplateCode.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyTemplateCode.java new file mode 100644 index 00000000..0a7efe11 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/infra/notify/dto/NotifyTemplateCode.java @@ -0,0 +1,43 @@ +package life.mosu.mosuserver.infra.notify.dto; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum NotifyTemplateCode { + APPLICATION( + 50037, + "notify.exam.application.complete.alimtalk", + "notify.exam.application.complete.sms" + ), + EXAM_1DAY_BEFORE( + 50041, + "notify.exam.oneday.reminder.alimtalk", + "notify.exam.onday.reminder.sms"), + EXAM_1WEEK_BEFORE( + 50039, + "notify.exam.oneweek.reminder.alimtalk", + "notify.exam.oneweek.reminder.sms"), + EXAM_3DAY_BEFORE( + 50040, + "notify.exam.threeday.reminder.alimtalk", + "notify.exam.threeday.reminder.sms"), + INQUIRY_ANSWER( + 50038, + "notify.inquiry.answered.alimtalk", + ""), + REFUND( + 50043, + "notify.refund.complete.alimtalk", + "notify.refund.complete.sms"), + SIGN_UP( + 50042, + "notify.signup.complete.alimtalk", + ""); + + + private final Integer id; + private final String code; + private final String smsCode; +} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/dto/RefundNotifyVariablesDto.java b/src/main/java/life/mosu/mosuserver/infra/notify/dto/RefundNotifyVariablesDto.java deleted file mode 100644 index 6adfd2a3..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/dto/RefundNotifyVariablesDto.java +++ /dev/null @@ -1,25 +0,0 @@ -package life.mosu.mosuserver.infra.notify.dto; - -import java.time.LocalDate; -import java.util.Map; - -public record RefundNotifyVariablesDto( - String paymentKey, - LocalDate examDate, - String schoolName, -// String amount, - String paymentMethod, - String reason -) { - - public Map toMap() { - return Map.of( - "paymentKey", paymentKey, - "examDate", examDate.toString(), - "schoolName", schoolName, -// "amount", amount, - "paymentMethod", paymentMethod, - "reason", reason - ); - } -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/resolver/NotifySenderResolver.java b/src/main/java/life/mosu/mosuserver/infra/notify/resolver/NotifySenderResolver.java new file mode 100644 index 00000000..48432c3c --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/infra/notify/resolver/NotifySenderResolver.java @@ -0,0 +1,42 @@ +package life.mosu.mosuserver.infra.notify.resolver; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import life.mosu.mosuserver.infra.notify.annotation.NotifyStrategyMapping; +import life.mosu.mosuserver.infra.notify.component.NotifySender; +import life.mosu.mosuserver.infra.notify.dto.NotificationStatus; +import life.mosu.mosuserver.infra.notify.dto.NotificationVariable; +import org.springframework.stereotype.Component; + +@Component +public class NotifySenderResolver { + + private final Map> senderMap = new HashMap<>(); + + public NotifySenderResolver(List> senders) { + for (NotifySender sender : senders) { + NotifyStrategyMapping mapping = sender.getClass() + .getAnnotation(NotifyStrategyMapping.class); + if (mapping == null) { + throw new IllegalStateException("NotifySender에 @NotifyStrategyMapping 없음"); + } + + for (NotificationStatus status : mapping.value()) { + if (senderMap.containsKey(status)) { + throw new IllegalStateException("중복된 NotifyStatus: " + status); + } + senderMap.put(status, sender); + } + } + } + + @SuppressWarnings("unchecked") + public NotifySender resolve(NotificationStatus status) { + NotifySender sender = senderMap.get(status); + if (sender == null) { + throw new IllegalArgumentException("전략이 등록되지 않은 상태: " + status); + } + return (NotifySender) sender; + } +} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/ApplicationNotifyStrategy.java b/src/main/java/life/mosu/mosuserver/infra/notify/strategy/ApplicationNotifyStrategy.java deleted file mode 100644 index 39a8f1d9..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/ApplicationNotifyStrategy.java +++ /dev/null @@ -1,53 +0,0 @@ -package life.mosu.mosuserver.infra.notify.strategy; - -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.APPLICATION_TEMPLATE_ID; -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.MYPAGE; -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.WARNING; - -import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaRepository; -import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolNotifyProjection; -import life.mosu.mosuserver.infra.notify.NotifyEventTemplateGenerator; -import life.mosu.mosuserver.infra.notify.dto.ApplicationNotifyVariablesDto; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrl; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrls; -import life.mosu.mosuserver.infra.notify.dto.NotifyEvent; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventRequest; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventSuccessMessageDto; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component("ApplicationNotifyStrategy") -@RequiredArgsConstructor -public class ApplicationNotifyStrategy implements NotifyStrategy { - - private final NotifyEventTemplateGenerator template; - private final ApplicationSchoolJpaRepository applicationSchoolJpaRepository; - - @Override - public NotifyEventRequest apply(String targetPhoneNumber, NotifyEvent event) { - ApplicationSchoolNotifyProjection projection = applicationSchoolJpaRepository.findPaymentByApplicationSchoolId( - event.targetId()); - - ApplicationNotifyVariablesDto dto = new ApplicationNotifyVariablesDto( - projection.paymentKey(), projection.examDate(), projection.schoolName(), - projection.lunch().getLunchName()); - - String alimTalkContent = template.getProcessedMessage( - "notify.exam.application.complete.alimtalk", - dto.toMap()); - - String smsContent = template.getProcessedMessage("notify.exam.application.complete.sms", - dto.toMap()); - - NotifyButtonUrls btnUrls = NotifyButtonUrls.of( - NotifyButtonUrl.of(WARNING, WARNING), - NotifyButtonUrl.of(MYPAGE, MYPAGE) - ); - - NotifyEventSuccessMessageDto eventMessage = NotifyEventSuccessMessageDto.create(1, - targetPhoneNumber, alimTalkContent, - smsContent, "1", btnUrls); - return template.getNotifyEventSuccessTemplate(APPLICATION_TEMPLATE_ID, eventMessage); - } - -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/Exam1DayBeforeNotifyStrategy.java b/src/main/java/life/mosu/mosuserver/infra/notify/strategy/Exam1DayBeforeNotifyStrategy.java deleted file mode 100644 index fd9bc5b5..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/Exam1DayBeforeNotifyStrategy.java +++ /dev/null @@ -1,62 +0,0 @@ -package life.mosu.mosuserver.infra.notify.strategy; - -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.EXAM_1DAY_BEFORE_TEMPLATE_ID; -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.INQUIRY; -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.MYPAGE; - -import java.time.LocalDateTime; -import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaEntity; -import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaRepository; -import life.mosu.mosuserver.global.exception.CustomRuntimeException; -import life.mosu.mosuserver.global.exception.ErrorCode; -import life.mosu.mosuserver.infra.notify.NotifyEventTemplateGenerator; -import life.mosu.mosuserver.infra.notify.dto.Exam1DayBeforeNotifyVariablesDto; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrl; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrls; -import life.mosu.mosuserver.infra.notify.dto.NotifyEvent; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventRemindMessageDto; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventRequest; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component("Exam1DayBeforeNotifyStrategy") -@RequiredArgsConstructor -public class Exam1DayBeforeNotifyStrategy implements NotifyStrategy { - - private final NotifyEventTemplateGenerator template; - private final ApplicationSchoolJpaRepository applicationSchoolJpaRepository; - - @Override - public NotifyEventRequest apply(String targetPhoneNumber, NotifyEvent event) { - ApplicationSchoolJpaEntity applicationSchool = applicationSchoolJpaRepository.findById( - event.targetId()).orElseThrow( - () -> new CustomRuntimeException(ErrorCode.APPLICATION_SCHOOL_NOT_FOUND)); - - Exam1DayBeforeNotifyVariablesDto dto = new Exam1DayBeforeNotifyVariablesDto( - applicationSchool.getExamDate(), applicationSchool.getExaminationNumber(), - applicationSchool.getSchoolName()); - - String alimTalkContent = template.getProcessedMessage( - "notify.exam.oneday.reminder.alimtalk", - dto.toMap()); - - String smsContent = template.getProcessedMessage("notify.exam.oneday.reminder.sms", - dto.toMap()); - - LocalDateTime reserveTime = applicationSchool.getExamDate() - .minusDays(1) - .atTime(8, 0); - - NotifyButtonUrls btnUrls = NotifyButtonUrls.of( - NotifyButtonUrl.of(INQUIRY, INQUIRY), - NotifyButtonUrl.of(MYPAGE, MYPAGE) - ); - - NotifyEventRemindMessageDto eventMessage = NotifyEventRemindMessageDto.create(1, - targetPhoneNumber, reserveTime, - alimTalkContent, - smsContent, btnUrls); - - return template.getNotifyEventRemindTemplate(EXAM_1DAY_BEFORE_TEMPLATE_ID, eventMessage); - } -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/Exam1WeekBeforeNotifyStrategy.java b/src/main/java/life/mosu/mosuserver/infra/notify/strategy/Exam1WeekBeforeNotifyStrategy.java deleted file mode 100644 index 042cf220..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/Exam1WeekBeforeNotifyStrategy.java +++ /dev/null @@ -1,57 +0,0 @@ -package life.mosu.mosuserver.infra.notify.strategy; - -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.EXAM_1WEEK_BEFORE_TEMPLATE_ID; -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.INQUIRY; - -import java.time.LocalDateTime; -import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaRepository; -import life.mosu.mosuserver.domain.applicationschool.OneWeekNotifyProjection; -import life.mosu.mosuserver.infra.notify.NotifyEventTemplateGenerator; -import life.mosu.mosuserver.infra.notify.dto.Exam1WeekBeforeNotifyVariablesDto; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrl; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrls; -import life.mosu.mosuserver.infra.notify.dto.NotifyEvent; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventRemindMessageDto; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventRequest; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - - -@Component("Exam1WeekBeforeNotifyStrategy") -@RequiredArgsConstructor -public class Exam1WeekBeforeNotifyStrategy implements NotifyStrategy { - - private final NotifyEventTemplateGenerator template; - private final ApplicationSchoolJpaRepository applicationSchoolJpaRepository; - - @Override - public NotifyEventRequest apply(String targetPhoneNumber, NotifyEvent event) { - OneWeekNotifyProjection projection = applicationSchoolJpaRepository.findOneWeekNotifyByApplicationSchoolId( - event.targetId()); - - Exam1WeekBeforeNotifyVariablesDto dto = new Exam1WeekBeforeNotifyVariablesDto( - projection.examDate(), projection.paymentKey(), projection.schoolName()); - - String alimTalkContent = template.getProcessedMessage( - "notify.exam.oneweek.reminder.alimtalk", - dto.toMap()); - - String smsContent = template.getProcessedMessage("notify.exam.oneweek.reminder.sms", - dto.toMap()); - - LocalDateTime reserveTime = projection.examDate() - .minusDays(7) - .atTime(8, 0); - - NotifyButtonUrls btnUrls = NotifyButtonUrls.of( - NotifyButtonUrl.of(INQUIRY, INQUIRY) - ); - - NotifyEventRemindMessageDto eventMessage = NotifyEventRemindMessageDto.create(1, - targetPhoneNumber, reserveTime, - alimTalkContent, - smsContent, btnUrls); - - return template.getNotifyEventRemindTemplate(EXAM_1WEEK_BEFORE_TEMPLATE_ID, eventMessage); - } -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/Exam3DayBeforeNotifyStrategy.java b/src/main/java/life/mosu/mosuserver/infra/notify/strategy/Exam3DayBeforeNotifyStrategy.java deleted file mode 100644 index 1bd6b444..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/Exam3DayBeforeNotifyStrategy.java +++ /dev/null @@ -1,63 +0,0 @@ -package life.mosu.mosuserver.infra.notify.strategy; - -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.EXAM_3DAY_BEFORE_TEMPLATE_ID; -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.INQUIRY; -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.MYPAGE; - -import java.time.LocalDateTime; -import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaEntity; -import life.mosu.mosuserver.domain.applicationschool.ApplicationSchoolJpaRepository; -import life.mosu.mosuserver.global.exception.CustomRuntimeException; -import life.mosu.mosuserver.global.exception.ErrorCode; -import life.mosu.mosuserver.infra.notify.NotifyEventTemplateGenerator; -import life.mosu.mosuserver.infra.notify.dto.Exam3DayBeforeNotifyVariablesDto; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrl; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrls; -import life.mosu.mosuserver.infra.notify.dto.NotifyEvent; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventRemindMessageDto; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventRequest; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component("Exam3DayBeforeNotifyStrategy") -@RequiredArgsConstructor -public class Exam3DayBeforeNotifyStrategy implements NotifyStrategy { - - private final NotifyEventTemplateGenerator template; - private final ApplicationSchoolJpaRepository applicationSchoolJpaRepository; - - @Override - public NotifyEventRequest apply(String targetPhoneNumber, NotifyEvent event) { - ApplicationSchoolJpaEntity applicationSchool = applicationSchoolJpaRepository.findById( - event.targetId()).orElseThrow( - () -> new CustomRuntimeException(ErrorCode.APPLICATION_SCHOOL_NOT_FOUND)); - - Exam3DayBeforeNotifyVariablesDto dto = new Exam3DayBeforeNotifyVariablesDto( - applicationSchool.getExamDate(), applicationSchool.getExaminationNumber(), - applicationSchool.getSchoolName()); - - String alimTalkContent = template.getProcessedMessage( - "notify.exam.threeday.reminder.alimtalk", - dto.toMap()); - - String smsContent = template.getProcessedMessage("notify.exam.threeday.reminder.sms", - dto.toMap()); - - LocalDateTime reserveTime = applicationSchool.getExamDate() - .minusDays(3) - .atTime(8, 0); - - NotifyButtonUrls btnUrls = NotifyButtonUrls.of( - NotifyButtonUrl.of(INQUIRY, INQUIRY), - NotifyButtonUrl.of(MYPAGE, MYPAGE) - ); - - NotifyEventRemindMessageDto eventMessage = NotifyEventRemindMessageDto.create(1, - targetPhoneNumber, reserveTime, - alimTalkContent, - smsContent, btnUrls); - - return template.getNotifyEventRemindTemplate(EXAM_3DAY_BEFORE_TEMPLATE_ID, eventMessage); - - } -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/InquiryAnswerNotifyStrategy.java b/src/main/java/life/mosu/mosuserver/infra/notify/strategy/InquiryAnswerNotifyStrategy.java deleted file mode 100644 index 16361a17..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/InquiryAnswerNotifyStrategy.java +++ /dev/null @@ -1,55 +0,0 @@ -package life.mosu.mosuserver.infra.notify.strategy; - -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.INQUIRY; -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.INQUIRY_ANSWER_TEMPLATE_ID; - -import life.mosu.mosuserver.domain.inquiry.InquiryJpaEntity; -import life.mosu.mosuserver.domain.inquiry.InquiryJpaRepository; -import life.mosu.mosuserver.global.exception.CustomRuntimeException; -import life.mosu.mosuserver.global.exception.ErrorCode; -import life.mosu.mosuserver.infra.notify.NotifyEventTemplateGenerator; -import life.mosu.mosuserver.infra.notify.dto.InquiryAnswerNotifyVariablesDto; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrl; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrls; -import life.mosu.mosuserver.infra.notify.dto.NotifyEvent; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventRequest; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventSuccessMessageDto; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Slf4j -@Component("InquiryAnswerNotifyStrategy") -@RequiredArgsConstructor -public class InquiryAnswerNotifyStrategy implements NotifyStrategy { - - private final NotifyEventTemplateGenerator template; - private final InquiryJpaRepository inquiryJpaRepository; - - //inquiry ID 가 없음 - @Override - public NotifyEventRequest apply(String targetPhoneNumber, NotifyEvent event) { - log.info("log: {}", inquiryJpaRepository.findAll()); - InquiryJpaEntity inquiry = inquiryJpaRepository.findById(event.targetId()) - .orElseThrow(() -> new CustomRuntimeException( - ErrorCode.INQUIRY_NOT_FOUND)); - - InquiryAnswerNotifyVariablesDto dto = new InquiryAnswerNotifyVariablesDto( - inquiry.getTitle()); - - String alimTalkContent = template.getProcessedMessage("notify.inquiry.answered.alimtalk", - dto.toMap()); - - NotifyButtonUrls btnUrls = NotifyButtonUrls.of( - NotifyButtonUrl.of(INQUIRY, INQUIRY) - ); - - NotifyEventSuccessMessageDto eventMessage = NotifyEventSuccessMessageDto.create(1, - targetPhoneNumber, alimTalkContent, - "", "0", btnUrls); - return template.getNotifyEventSuccessTemplate(INQUIRY_ANSWER_TEMPLATE_ID, eventMessage); - - } - - -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/NotifyStrategy.java b/src/main/java/life/mosu/mosuserver/infra/notify/strategy/NotifyStrategy.java deleted file mode 100644 index 08421d52..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/NotifyStrategy.java +++ /dev/null @@ -1,9 +0,0 @@ -package life.mosu.mosuserver.infra.notify.strategy; - -import life.mosu.mosuserver.infra.notify.dto.NotifyEvent; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventRequest; - -public interface NotifyStrategy { - - NotifyEventRequest apply(String targetPhoneNumber, NotifyEvent event); -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/RefundNotifyStrategy.java b/src/main/java/life/mosu/mosuserver/infra/notify/strategy/RefundNotifyStrategy.java deleted file mode 100644 index e91b9889..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/RefundNotifyStrategy.java +++ /dev/null @@ -1,55 +0,0 @@ -package life.mosu.mosuserver.infra.notify.strategy; - -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.MYPAGE; -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.REFUND_TEMPLATE_ID; - -import life.mosu.mosuserver.domain.refund.RefundJpaRepository; -import life.mosu.mosuserver.domain.refund.RefundNotifyProjection; -import life.mosu.mosuserver.infra.notify.NotifyEventTemplateGenerator; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrl; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrls; -import life.mosu.mosuserver.infra.notify.dto.NotifyEvent; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventRequest; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventSuccessMessageDto; -import life.mosu.mosuserver.infra.notify.dto.RefundNotifyVariablesDto; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component("RefundNotifyStrategy") -@RequiredArgsConstructor -public class RefundNotifyStrategy implements NotifyStrategy { - - private final NotifyEventTemplateGenerator template; - private final RefundJpaRepository refundJpaRepository; - - @Override - public NotifyEventRequest apply(String targetPhoneNumber, NotifyEvent event) { - RefundNotifyProjection projection = refundJpaRepository.findRefundByApplicationSchoolId( - event.targetId()); - - //TODO: 가격 추가 - RefundNotifyVariablesDto dto = new RefundNotifyVariablesDto( - projection.paymentKey(), projection.examDate(), projection.schoolName(), - projection.paymentMethod().getName(), - projection.reason()); - - String alimTalkContent = template.getProcessedMessage( - "notify.refund.complete.alimtalk", - dto.toMap()); - - String smsContent = template.getProcessedMessage("notify.refund.complete.sms", - dto.toMap()); - - NotifyButtonUrls btnUrls = NotifyButtonUrls.of( - NotifyButtonUrl.of(MYPAGE, MYPAGE) - ); - - NotifyEventSuccessMessageDto eventMessage = NotifyEventSuccessMessageDto.create(1, - targetPhoneNumber, alimTalkContent, - smsContent, "1", btnUrls); - return template.getNotifyEventSuccessTemplate(REFUND_TEMPLATE_ID - , eventMessage); - } - - -} diff --git a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/SignUpNotifyStrategy.java b/src/main/java/life/mosu/mosuserver/infra/notify/strategy/SignUpNotifyStrategy.java deleted file mode 100644 index 2696923a..00000000 --- a/src/main/java/life/mosu/mosuserver/infra/notify/strategy/SignUpNotifyStrategy.java +++ /dev/null @@ -1,40 +0,0 @@ -package life.mosu.mosuserver.infra.notify.strategy; - -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.HOMEPAGE; -import static life.mosu.mosuserver.infra.notify.constant.NotifyConstants.SIGN_UP_TEMPLATE_ID; - -import java.util.Locale; -import life.mosu.mosuserver.infra.notify.NotifyEventTemplateGenerator; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrl; -import life.mosu.mosuserver.infra.notify.dto.NotifyButtonUrls; -import life.mosu.mosuserver.infra.notify.dto.NotifyEvent; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventRequest; -import life.mosu.mosuserver.infra.notify.dto.NotifyEventSuccessMessageDto; -import lombok.RequiredArgsConstructor; -import org.springframework.context.MessageSource; -import org.springframework.stereotype.Component; - -@Component("SignUpNotifyStrategy") -@RequiredArgsConstructor -public class SignUpNotifyStrategy implements NotifyStrategy { - - private final MessageSource messageSource; - private final NotifyEventTemplateGenerator template; - - @Override - public NotifyEventRequest apply(String targetPhoneNumber, NotifyEvent event) { - - String alimTalkContent = messageSource.getMessage("notify.signup.complete.alimtalk", null, - Locale.KOREA); - - NotifyButtonUrls btnUrls = NotifyButtonUrls.of( - NotifyButtonUrl.of(HOMEPAGE, HOMEPAGE) - ); - - NotifyEventSuccessMessageDto eventMessage = NotifyEventSuccessMessageDto.create( - 1, targetPhoneNumber, alimTalkContent, "", - "0", - btnUrls); - return template.getNotifyEventSuccessTemplate(SIGN_UP_TEMPLATE_ID, eventMessage); - } -} diff --git a/src/main/java/life/mosu/mosuserver/presentation/notify/NotifyEventListener.java b/src/main/java/life/mosu/mosuserver/presentation/notify/NotifyEventListener.java index bc5c33d7..c441e0c4 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/notify/NotifyEventListener.java +++ b/src/main/java/life/mosu/mosuserver/presentation/notify/NotifyEventListener.java @@ -2,7 +2,7 @@ import life.mosu.mosuserver.application.notify.NotifyService; import life.mosu.mosuserver.global.annotation.ReactiveEventListener; -import life.mosu.mosuserver.infra.notify.dto.NotifyEvent; +import life.mosu.mosuserver.infra.notify.dto.NotificationEvent; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -15,7 +15,7 @@ public class NotifyEventListener { private final NotifyService notifyService; @ReactiveEventListener - public void notify(NotifyEvent event) { + public void notify(NotificationEvent event) { notifyService.notify(event); log.info("Notify event: {}", event); }