AutomaticMessageTriggerServiceImpl.java
package com.deveagles.be15_deveagles_be.features.messages.command.application.service.impl;
import com.deveagles.be15_deveagles_be.common.exception.BusinessException;
import com.deveagles.be15_deveagles_be.common.exception.ErrorCode;
import com.deveagles.be15_deveagles_be.features.customers.command.domain.aggregate.Customer;
import com.deveagles.be15_deveagles_be.features.messages.command.application.dto.request.AutomaticCreateRequest;
import com.deveagles.be15_deveagles_be.features.messages.command.application.dto.request.SmsRequest;
import com.deveagles.be15_deveagles_be.features.messages.command.application.service.AutomaticMessageTriggerService;
import com.deveagles.be15_deveagles_be.features.messages.command.application.service.MessageCommandService;
import com.deveagles.be15_deveagles_be.features.messages.command.domain.aggregate.AutomaticEventType;
import com.deveagles.be15_deveagles_be.features.messages.command.domain.aggregate.MessageTemplate;
import com.deveagles.be15_deveagles_be.features.messages.command.domain.aggregate.MessageTemplateType;
import com.deveagles.be15_deveagles_be.features.messages.command.domain.repository.MessageTemplateRepository;
import com.deveagles.be15_deveagles_be.features.messages.query.repository.MessageTemplateQueryRepository;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class AutomaticMessageTriggerServiceImpl implements AutomaticMessageTriggerService {
private final MessageTemplateRepository messageTemplateRepository;
private final MessageTemplateQueryRepository messageTemplateQueryRepository;
private final MessageCommandService messageCommandService;
@Override
public void registerAutomaticMessage(Long shopId, AutomaticCreateRequest request) {
AutomaticEventType eventType = request.automaticEventType();
// 동일 이벤트 타입으로 이미 등록된 템플릿 있는지 확인
if (messageTemplateRepository.existsByShopIdAndAutomaticEventType(shopId, eventType)) {
throw new BusinessException(ErrorCode.AUTOMATIC_TEMPLATE_ALREADY_EXISTS);
}
// 템플릿 이름 자동 설정
String templateName =
switch (eventType) {
case NEW_CUSTOMER -> "신규 고객 자동 메시지";
case RESERVATION_CREATED -> "예약 등록 자동 메시지";
case SESSION_PASS_USED -> "횟수권 차감 자동 메시지";
case PREPAID_USED -> "선불권 차감 자동 메시지";
};
// 템플릿 생성
MessageTemplate template =
MessageTemplate.builder()
.shopId(shopId)
.templateName(templateName)
.templateContent(request.templateContent())
.templateType(MessageTemplateType.announcement)
.automaticEventType(eventType)
.isActive(request.isActive())
.build();
messageTemplateRepository.save(template);
}
@Override
public void triggerAutomaticSend(Customer customer, AutomaticEventType eventType) {
Optional<MessageTemplate> templateOpt =
messageTemplateQueryRepository.findActiveTemplate(customer.getShopId(), eventType);
if (templateOpt.isEmpty()) return;
MessageTemplate template = templateOpt.get();
SmsRequest request = SmsRequest.ofForAutoSend(template, customer); // ✅ 정적 팩토리 메서드 사용
messageCommandService.sendSms(customer.getShopId(), request);
}
}