package com.eactive.ext.kjb.ums; import com.eactive.apim.portal.template.entity.MessageCode; import com.eactive.apim.portal.template.entity.MessageRequest; import com.eactive.apim.portal.template.repository.MessageRequestRepository; import com.eactive.ext.kjb.common.KjbEaiBatchException; import com.eactive.ext.kjb.common.KjbProperty; import com.eactive.ext.kjb.utils.ValidationUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import java.nio.file.Path; import java.nio.file.Paths; import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; @Slf4j public class KjbEmailSendModule { public final static int[] ALLOW_CHANNELS = { MessageCode.Channels.EMAIL.getValue() }; private static KjbEmailSendModule instance = null; private static KjbProperty prop; private final MessageRequestRepository repo; public static synchronized KjbEmailSendModule getInstance(KjbProperty property, MessageRequestRepository messageRequestRepository) { ValidationUtil.validateOrThrow(property); if (instance == null) { instance = new KjbEmailSendModule(property, messageRequestRepository); } return instance; } public static boolean isAllowChannel(MessageRequest message) { for (int channel : ALLOW_CHANNELS) { if ((message.getMessageCode().getChannels() & channel) == channel) { return true; } } return false; } public static void environmentCheck() { if (StringUtils.isEmpty(prop.getEaiBatchUrl())) { log.warn("EAI_BATCH_URL 가 설정되지 않음. 실제 EAI 배치 연동 없이 동작함"); } log.info("EAI Batch URL: {}", prop.getEaiBatchUrl()); log.info("EAI Batch Send Dir: {}", prop.getUmsEaiBatchSendDir()); // 디렉토리 검사(쓰기 권한 포함) Path sendDirPath = Paths.get(prop.getUmsEaiBatchSendDir()); if (!sendDirPath.toFile().exists()) { // 생성 시도 boolean created = sendDirPath.toFile().mkdirs(); if (!created) { log.error("EAI_BATCH_SEND_DIR 디렉토리를 생성할 수 없음: {}", prop.getUmsEaiBatchSendDir()); throw new IllegalStateException("EAI_BATCH_SEND_DIR 디렉토리를 생성할 수 없음: " + prop.getUmsEaiBatchSendDir()); } } if (!sendDirPath.toFile().isDirectory()) { log.error("EAI_BATCH_SEND_DIR 가 디렉토리가 아님: {}", prop.getUmsEaiBatchSendDir()); throw new IllegalStateException("EAI_BATCH_SEND_DIR 가 디렉토리가 아님: " + prop.getUmsEaiBatchSendDir()); } if (!sendDirPath.toFile().canWrite()) { log.error("EAI_BATCH_SEND_DIR 에 쓰기 권한이 없음: {}", prop.getUmsEaiBatchSendDir()); throw new IllegalStateException("EAI_BATCH_SEND_DIR 에 쓰기 권한이 없음: " + prop.getUmsEaiBatchSendDir()); } // 백업 디렉토리 Path backupDirPath = Paths.get(prop.getUmsEaiBatchBackupDir()); if (!backupDirPath.toFile().exists()) { // 생성 시도 boolean created = backupDirPath.toFile().mkdirs(); if (!created) { log.error("EAI_BATCH_BACKUP_DIR 디렉토리를 생성할 수 없음: {}", prop.getUmsEaiBatchBackupDir()); throw new IllegalStateException("EAI_BATCH_BACKUP_DIR 디렉토리를 생성할 수 없음: " + prop.getUmsEaiBatchBackupDir()); } } if (!backupDirPath.toFile().isDirectory()) { log.error("EAI_BATCH_BACKUP_DIR 가 디렉토리가 아님: {}", prop.getUmsEaiBatchBackupDir()); throw new IllegalStateException("EAI_BATCH_BACKUP_DIR 가 디렉토리가 아님: " + prop.getUmsEaiBatchBackupDir()); } if (!backupDirPath.toFile().canWrite()) { log.error("EAI_BATCH_BACKUP_DIR 에 쓰기 권한이 없음: {}", prop.getUmsEaiBatchBackupDir()); throw new IllegalStateException("EAI_BATCH_BACKUP_DIR 에 쓰기 권한이 없음: " + prop.getUmsEaiBatchBackupDir()); } log.info("KjbEmailSendModule - Environment check passed."); } private KjbEmailSendModule(KjbProperty property, MessageRequestRepository repo) { this.repo = repo; if (property != null && prop == null) { prop = property; } environmentCheck(); } public void sendEmail(MessageRequest messageRequest) throws KjbEaiBatchException { String serviceId = "UNKNOWN"; serviceId = messageRequest.getMessageCode().getServiceId(); messageRequest.setServiceId(serviceId); if (StringUtils.isEmpty(serviceId)) { throw new IllegalArgumentException("MessageRequest MessageCode serviceId is required"); } if (MessageCode.Channels.EMAIL.getValue() != (messageRequest.getMessageCode().getChannels() & MessageCode.Channels.EMAIL.getValue())) { log.error("지원하지 않는 발송 채널 - {}", messageRequest.getMessageCode()); throw new IllegalArgumentException("지원하지 않는 발송 채널 - " + messageRequest.getMessageCode()); } if (repo != null) { repo.save(messageRequest); } EmailJob job = EmailJob.create(prop, messageRequest, repo); job.sendEmail(); log.debug("JSON : {}", job.generateJSON(true)); } }