Skip to content

Commit

Permalink
rename: 디렉토리 구조 및 파일 이름 변경
Browse files Browse the repository at this point in the history
  • Loading branch information
nohy6630 committed Jun 19, 2024
1 parent 2fc57cb commit 0af40c3
Show file tree
Hide file tree
Showing 12 changed files with 113 additions and 117 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.yeongjin.alarmserver.domain.api.controller;
package com.yeongjin.alarmserver.domain.alarm.controller;

import com.yeongjin.alarmserver.domain.api.dto.request.ImmediateEmailReq;
import com.yeongjin.alarmserver.domain.api.dto.request.ScheduledEmailReq;
import com.yeongjin.alarmserver.domain.api.service.EmailAlarmService;
import com.yeongjin.alarmserver.domain.alarm.dto.request.SendImmediateAlarmReq;
import com.yeongjin.alarmserver.domain.alarm.dto.request.SendScheduledAlarmReq;
import com.yeongjin.alarmserver.domain.alarm.service.SendAlarmService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
Expand All @@ -16,20 +16,20 @@
@RestController
@RequiredArgsConstructor
@RequestMapping("/emails")
public class EmailAlarmController {
private final EmailAlarmService emailAlarmService;
public class SendAlarmController {
private final SendAlarmService sendAlarmService;

@PostMapping("/immediate")
public ResponseEntity<Void> sendImmediateEmail(@RequestBody @Valid ImmediateEmailReq immediateEmailReq) {
Long alarmId = emailAlarmService.sendImmediateEmail(immediateEmailReq);
public ResponseEntity<Void> sendImmediateEmail(@RequestBody @Valid SendImmediateAlarmReq sendImmediateAlarmReq) {
Long alarmId = sendAlarmService.sendImmediateEmail(sendImmediateAlarmReq);
return ResponseEntity
.created(URI.create("/emails/" + alarmId))
.build();
}

@PostMapping("/scheduled")
public ResponseEntity<Void> sendScheduledEmail(@RequestBody @Valid ScheduledEmailReq scheduledEmailReq) {
Long alarmId = emailAlarmService.sendScheduledEmail(scheduledEmailReq);
public ResponseEntity<Void> sendScheduledEmail(@RequestBody @Valid SendScheduledAlarmReq sendScheduledAlarmReq) {
Long alarmId = sendAlarmService.sendScheduledEmail(sendScheduledAlarmReq);
return ResponseEntity
.created(URI.create("/emails/" + alarmId))
.build();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.yeongjin.alarmserver.domain.api.dto.request;
package com.yeongjin.alarmserver.domain.alarm.dto.request;

import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
Expand All @@ -10,7 +10,7 @@

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class ImmediateEmailReq {
public class SendImmediateAlarmReq {
@Size(min = 1, message = "at least one recipient must be selected")
private List<String> recipients;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.yeongjin.alarmserver.domain.api.dto.request;
package com.yeongjin.alarmserver.domain.alarm.dto.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotEmpty;
Expand All @@ -13,7 +13,7 @@

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class ScheduledEmailReq {
public class SendScheduledAlarmReq {
@Size(min = 1, message = "at least one recipient must be selected")
private List<String> recipients;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.yeongjin.alarmserver.domain.api.entity;
package com.yeongjin.alarmserver.domain.alarm.entity;


import jakarta.persistence.*;
Expand All @@ -16,7 +16,7 @@
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
@Comment("메일")
public class EmailAlarm {
public class Alarm {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Expand All @@ -36,9 +36,9 @@ public class EmailAlarm {
@Comment("발송 여부")
private boolean isSent;

public static EmailAlarm ofImmediate(List<String> recipients, String subject, String content) {
public static Alarm ofImmediate(List<String> recipients, String subject, String content) {
LocalDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Seoul")).toLocalDateTime();
return EmailAlarm.builder()
return Alarm.builder()
.recipients(recipients)
.subject(subject)
.content(content)
Expand All @@ -47,8 +47,8 @@ public static EmailAlarm ofImmediate(List<String> recipients, String subject, St
.build();
}

public static EmailAlarm ofScheduled(List<String> recipients, String subject, String content, LocalDateTime sendTime) {
return EmailAlarm.builder()
public static Alarm ofScheduled(List<String> recipients, String subject, String content, LocalDateTime sendTime) {
return Alarm.builder()
.recipients(recipients)
.subject(subject)
.content(content)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.yeongjin.alarmserver.domain.alarm.repository;

import com.yeongjin.alarmserver.domain.alarm.entity.Alarm;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.time.LocalDateTime;
import java.util.List;

public interface AlarmRepository extends JpaRepository<Alarm, Long> {
@Query("select e.id from Alarm e where e.isSent = true")
List<Long> findIdsIsSent();

@Query("select e from Alarm e where e.sendTime <= :sendTime and e.isSent = false")
List<Alarm> findEmailsToSend(LocalDateTime sendTime);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.yeongjin.alarmserver.domain.emailCleaner.service;
package com.yeongjin.alarmserver.domain.alarm.service;

import com.yeongjin.alarmserver.domain.repository.EmailAlarmRepository;
import com.yeongjin.alarmserver.domain.alarm.repository.AlarmRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
Expand All @@ -12,12 +12,12 @@
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class CleanDBService {
private final EmailAlarmRepository emailAlarmRepository;
private final AlarmRepository alarmRepository;

@Scheduled(cron = "0 0 3 * * *", zone = "Asia/Seoul")
@Transactional
public void deleteSentEmails() {
List<Long> ids = emailAlarmRepository.findIdsIsSent();
emailAlarmRepository.deleteAllByIdInBatch(ids);
List<Long> ids = alarmRepository.findIdsIsSent();
alarmRepository.deleteAllByIdInBatch(ids);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package com.yeongjin.alarmserver.domain.emailScheduler.service;
package com.yeongjin.alarmserver.domain.alarm.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yeongjin.alarmserver.domain.api.entity.EmailAlarm;
import com.yeongjin.alarmserver.domain.emailSender.service.SendEmailSubscriber;
import com.yeongjin.alarmserver.domain.repository.EmailAlarmRepository;
import com.yeongjin.alarmserver.domain.alarm.entity.Alarm;
import com.yeongjin.alarmserver.domain.alarm.repository.AlarmRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.stream.StreamRecords;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.scheduling.annotation.Scheduled;
Expand All @@ -22,9 +20,9 @@
@Service
@RequiredArgsConstructor
@Slf4j
public class SendEmailPublisher {
public class SendAlarmPublisher {
private final RedisTemplate<String, Object> redisTemplate;
private final EmailAlarmRepository emailAlarmRepository;
private final AlarmRepository alarmRepository;
private final ObjectMapper objectMapper;
private final ChannelTopic channelTopic;

Expand All @@ -33,16 +31,16 @@ public class SendEmailPublisher {
public void scanDatabase() {
LocalDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Seoul")).toLocalDateTime().withSecond(0);
log.info("Scan Database at " + now);
List<EmailAlarm> emailAlarms = emailAlarmRepository.findEmailsToSend(now);
for (EmailAlarm emailAlarm : emailAlarms) {
emailAlarm.setSent();
publishToRedis(emailAlarm);
List<Alarm> alarms = alarmRepository.findEmailsToSend(now);
for (Alarm alarm : alarms) {
alarm.setSent();
publishToRedis(alarm);
}
}

public void publishToRedis(EmailAlarm emailAlarm) {
public void publishToRedis(Alarm alarm) {
try {
String message = objectMapper.writeValueAsString(emailAlarm);
String message = objectMapper.writeValueAsString(alarm);
redisTemplate.convertAndSend(channelTopic.getTopic(), message);
} catch (JsonProcessingException e) {
log.warn("Publish Message Failed");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.yeongjin.alarmserver.domain.alarm.service;

import com.yeongjin.alarmserver.domain.alarm.dto.request.SendImmediateAlarmReq;
import com.yeongjin.alarmserver.domain.alarm.dto.request.SendScheduledAlarmReq;
import com.yeongjin.alarmserver.domain.alarm.entity.Alarm;
import com.yeongjin.alarmserver.domain.alarm.repository.AlarmRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
@Slf4j
public class SendAlarmService {
private final AlarmRepository alarmRepository;
private final SendAlarmPublisher sendEmailPublisher;
private final SendAlarmSubscriber sendAlarmSubscriber;
private final JavaMailSender javaMailSender;

@Transactional
public Long sendImmediateEmail(SendImmediateAlarmReq sendImmediateAlarmReq) {
Alarm alarm = alarmRepository.save(
Alarm.ofImmediate(
sendImmediateAlarmReq.getRecipients(),
sendImmediateAlarmReq.getSubject(),
sendImmediateAlarmReq.getContent()
)
);
alarm.setSent();
sendEmailPublisher.publishToRedis(alarm);
return alarm.getId();
}

@Transactional
public Long sendScheduledEmail(SendScheduledAlarmReq sendScheduledAlarmReq) {
Alarm alarm = alarmRepository.save(
Alarm.ofScheduled(
sendScheduledAlarmReq.getRecipients(),
sendScheduledAlarmReq.getSubject(),
sendScheduledAlarmReq.getContent(),
sendScheduledAlarmReq.getSendTime().withSecond(0)
)
);
return alarm.getId();
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.yeongjin.alarmserver.domain.emailSender.service;
package com.yeongjin.alarmserver.domain.alarm.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yeongjin.alarmserver.domain.api.entity.EmailAlarm;
import com.yeongjin.alarmserver.domain.alarm.entity.Alarm;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
Expand All @@ -14,26 +14,26 @@
@Service
@RequiredArgsConstructor
@Slf4j
public class SendEmailSubscriber {
public class SendAlarmSubscriber {
private final JavaMailSender javaMailSender;
private final ObjectMapper objectMapper;

public void sendEmail(String message, String channel) throws JsonProcessingException {
log.info("Received message: " + message + " from channel: " + channel);
EmailAlarm emailAlarm = objectMapper.readValue(message, EmailAlarm.class);
Alarm alarm = objectMapper.readValue(message, Alarm.class);
try {
javaMailSender.send(createMimeMessage(emailAlarm));
javaMailSender.send(createMimeMessage(alarm));
} catch (MessagingException e) {
log.warn("Create Mime Message Failed");
}
}

private MimeMessage createMimeMessage(EmailAlarm emailAlarm) throws MessagingException {
private MimeMessage createMimeMessage(Alarm alarm) throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, false, "UTF-8");
mimeMessageHelper.setTo(emailAlarm.getRecipients().toArray(new String[0]));
mimeMessageHelper.setSubject(emailAlarm.getSubject());
mimeMessageHelper.setText(emailAlarm.getContent(), false);
mimeMessageHelper.setTo(alarm.getRecipients().toArray(new String[0]));
mimeMessageHelper.setSubject(alarm.getSubject());
mimeMessageHelper.setText(alarm.getContent(), false);
return mimeMessage;
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.yeongjin.alarmserver.global.config;

import com.yeongjin.alarmserver.domain.emailSender.service.SendEmailSubscriber;
import com.yeongjin.alarmserver.domain.alarm.service.SendAlarmSubscriber;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand Down Expand Up @@ -35,8 +35,8 @@ public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisC
}

@Bean
public MessageListenerAdapter messageListenerAdapter(SendEmailSubscriber sendEmailSubscriber) {
return new MessageListenerAdapter(sendEmailSubscriber, "sendEmail");
public MessageListenerAdapter messageListenerAdapter(SendAlarmSubscriber sendAlarmSubscriber) {
return new MessageListenerAdapter(sendAlarmSubscriber, "sendEmail");
}

@Bean
Expand Down

0 comments on commit 0af40c3

Please sign in to comment.