Skip to content

Commit 33b26bb

Browse files
authored
Merge pull request #20 from gdsc-ssu/feat/#19
2 parents 0044865 + e98ffe0 commit 33b26bb

File tree

15 files changed

+128
-64
lines changed

15 files changed

+128
-64
lines changed

src/main/java/com/gdg/poppet/PoppetApplication.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
55
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
6+
import org.springframework.scheduling.annotation.EnableScheduling;
67

78
@SpringBootApplication
89
@EnableJpaAuditing
10+
@EnableScheduling
911
public class PoppetApplication {
1012

1113
public static void main(String[] args) {

src/main/java/com/gdg/poppet/chat/domain/repository/ChatRoomRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,5 @@ public interface ChatRoomRepository extends JpaRepository<ChatRoom, Long> {
3030
"WHERE cr.username = :username " +
3131
"AND cr.isMailSent = FALSE " +
3232
"ORDER BY cr.createdAt DESC")
33-
List<ChatRoom> findByUsernameAndCreatedAtAndIsMailSent(@Param(value = "username") String username);
33+
List<ChatRoom> findByUsernameAndCreatedAtAndNotMailSent(@Param(value = "username") String username);
3434
}

src/main/java/com/gdg/poppet/email/application/service/EmailService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ public interface EmailService {
1717
void patchEmailAddress(String name, Long emailId, EmailRequestDto emailRequestDto);
1818
void deleteEmailAddress(String name, Long emailId);
1919

20-
void sendEmail(String username);
20+
void sendEmail();
2121
}

src/main/java/com/gdg/poppet/email/application/service/EmailServiceImpl.java

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.gdg.poppet.chat.domain.model.ChatRoom;
44
import com.gdg.poppet.chat.domain.repository.ChatRoomRepository;
55
import com.gdg.poppet.email.application.event.EmailSendEvent;
6-
import com.gdg.poppet.email.infra.application.EmailSendService;
76
import com.gdg.poppet.global.exception.GlobalException;
87
import com.gdg.poppet.global.status.ErrorStatus;
98
import com.gdg.poppet.email.application.dto.request.EmailRequestDto;
@@ -31,7 +30,6 @@ public class EmailServiceImpl implements EmailService {
3130
private final UserRepository userRepository;
3231
private final EmailRepository emailRepository;
3332
private final ChatRoomRepository chatRoomRepository;
34-
private final EmailSendService emailSendService;
3533
private final ApplicationEventPublisher applicationEventPublisher;
3634

3735
/**
@@ -146,24 +144,24 @@ public void deleteEmailAddress(String username, Long emailId) {
146144
*/
147145
@Transactional
148146
@Override
149-
public void sendEmail(String username) {
150-
// TODO: user data 얻는 과정 수정
151-
User user = getUser(username);
147+
public void sendEmail() {
148+
for (User user : userRepository.findAll()) {
152149

153-
// 가장 최근 생성되고 메일을 보내지 않은 채팅방 조회
154-
List<ChatRoom> chatRooms = chatRoomRepository.findByUsernameAndCreatedAtAndIsMailSent(username);
155-
if (chatRooms.isEmpty()) return;
150+
// 가장 최근 생성되고 메일을 보내지 않은 채팅방 조회
151+
List<ChatRoom> chatRooms = chatRoomRepository.findByUsernameAndCreatedAtAndNotMailSent(user.getUsername());
152+
if (chatRooms.isEmpty()) return;
156153

157-
// 메일 보낼 채팅방 요약 내용 추출
158-
ChatRoom chatRoom = chatRooms.get(0);
159-
String chatSummary = chatRoom.getSummary();
160-
if (chatSummary == null) return;
154+
// 메일 보낼 채팅방 요약 내용 추출
155+
ChatRoom chatRoom = chatRooms.get(0);
156+
String chatSummary = chatRoom.getSummary();
157+
if (chatSummary == null) return;
161158

162-
// 메일 보냄 여부 수정
163-
chatRoom.updateIsMailSent();
159+
// 메일 보냄 여부 수정
160+
chatRoom.updateIsMailSent();
164161

165-
// 메일 전송 이벤트 발행
166-
applicationEventPublisher.publishEvent(new EmailSendEvent(user, chatRoom));
162+
// 메일 전송 이벤트 발행
163+
applicationEventPublisher.publishEvent(new EmailSendEvent(user, chatRoom));
164+
}
167165
}
168166

169167
private void validateIsUserAuthorizedForEmail(User user, Email email) {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.gdg.poppet.email.infra.scheduler;
2+
3+
import com.gdg.poppet.email.application.service.EmailService;
4+
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.scheduling.annotation.Scheduled;
7+
import org.springframework.stereotype.Component;
8+
9+
import java.time.LocalDateTime;
10+
11+
@Slf4j
12+
@Component
13+
@RequiredArgsConstructor
14+
public class EmailSendScheduler {
15+
private final EmailService emailService;
16+
17+
// 매일 12시에 스케쥴러 수행
18+
@Scheduled(cron = "0 0 12 * * *")
19+
public void sendUnsentEmails() {
20+
emailService.sendEmail();
21+
log.info("[*] {} Email 전송 완료", LocalDateTime.now());
22+
}
23+
}

src/main/java/com/gdg/poppet/email/infra/application/EmailSendEventListener.java renamed to src/main/java/com/gdg/poppet/email/infra/sender/listener/EmailSendEventListener.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
package com.gdg.poppet.email.infra.application;
1+
package com.gdg.poppet.email.infra.sender.listener;
22

33
import com.gdg.poppet.chat.domain.model.ChatRoom;
44
import com.gdg.poppet.email.application.event.EmailSendEvent;
55
import com.gdg.poppet.email.domain.model.Email;
6+
import com.gdg.poppet.email.infra.sender.service.EmailSendService;
7+
import com.gdg.poppet.email.infra.template.EmailTemplateGenerator;
68
import com.gdg.poppet.user.domain.model.User;
79
import lombok.RequiredArgsConstructor;
810
import lombok.extern.slf4j.Slf4j;
@@ -18,14 +20,14 @@
1820
public class EmailSendEventListener {
1921

2022
private final EmailSendService emailSendService;
21-
private final EmailTemplateService emailTemplateService;
23+
private final EmailTemplateGenerator emailTemplateGenerator;
2224

2325
@Async
2426
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
2527
public void handleEmailSendEvent(EmailSendEvent event) {
2628
User user = event.getUser();
2729
ChatRoom chatRoom = event.getChatRoom();
28-
ByteArrayResource body = emailTemplateService.makeEmailBackground(user, chatRoom);
30+
ByteArrayResource body = emailTemplateGenerator.makeEmailBackground(user, chatRoom);
2931

3032
for (Email email : user.getEmails()) {
3133
try {

src/main/java/com/gdg/poppet/email/infra/application/EmailSendService.java renamed to src/main/java/com/gdg/poppet/email/infra/sender/service/EmailSendService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.gdg.poppet.email.infra.application;
1+
package com.gdg.poppet.email.infra.sender.service;
22

33
import jakarta.mail.MessagingException;
44
import jakarta.mail.internet.MimeMessage;

src/main/java/com/gdg/poppet/email/infra/application/ContentStream.java renamed to src/main/java/com/gdg/poppet/email/infra/template/ContentStream.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
package com.gdg.poppet.email.infra.application;
1+
package com.gdg.poppet.email.infra.template;
22

3+
import com.gdg.poppet.email.infra.template.v1.RGB;
34
import lombok.Getter;
45
import org.apache.pdfbox.pdmodel.PDPageContentStream;
56
import org.apache.pdfbox.pdmodel.font.PDFont;
@@ -27,9 +28,9 @@ public void setFontSize(int fontSize){
2728
}
2829
}
2930

30-
public void setColor(float r, float g, float b){
31+
public void setColor(RGB rgb){
3132
try {
32-
this.pageContentStream.setNonStrokingColor(r, g, b);
33+
this.pageContentStream.setNonStrokingColor(rgb.r(), rgb.g(), rgb.b());
3334
} catch (IOException e) {
3435
throw new RuntimeException(e);
3536
}

src/main/java/com/gdg/poppet/email/infra/application/EmailTemplateService.java renamed to src/main/java/com/gdg/poppet/email/infra/template/EmailTemplateGenerator.java

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
package com.gdg.poppet.email.infra.application;
1+
package com.gdg.poppet.email.infra.template;
22

33
import com.gdg.poppet.chat.domain.model.ChatRoom;
4+
import com.gdg.poppet.email.infra.template.v1.TemplateV1;
5+
import com.gdg.poppet.email.infra.template.v1.TemplateV1Config;
6+
import com.gdg.poppet.email.infra.template.v1.TemplateV1Pos;
47
import com.gdg.poppet.user.domain.model.User;
58
import lombok.NoArgsConstructor;
69
import lombok.extern.slf4j.Slf4j;
@@ -25,14 +28,14 @@
2528
@Slf4j
2629
@Component
2730
@NoArgsConstructor
28-
public class EmailTemplateService {
31+
public class EmailTemplateGenerator {
2932

3033
private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
31-
private final int fontSize = 18;
34+
private final TemplateV1Config templateV1Config = new TemplateV1().getConfig();
3235

3336
public ByteArrayResource makeEmailBackground(User user, ChatRoom chatRoom) {
3437
// 배경용 PDF 파일 로드
35-
PDDocument doc = loadPDDocument("email/email_background.pdf");
38+
PDDocument doc = loadPDDocument("email/" + templateV1Config.BACKGROUND_FILE_NAME());
3639

3740
// 배경용 PDF 편집
3841
drawBackgroundImg(doc, user, chatRoom);
@@ -73,12 +76,10 @@ private void drawBackgroundImg(PDDocument doc, User user, ChatRoom chatRoom) {
7376

7477
try {
7578
PDPageContentStream pageContentStream = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true, true);
76-
InputStream fontFile = loadFontFile("fonts/Pretendard.ttf");
79+
InputStream fontFile = loadFontFile("fonts/" + templateV1Config.FONT_NAME());
7780
PDFont font = PDType0Font.load(doc, fontFile);
7881

7982
ContentStream contentStream = new ContentStream(pageContentStream, font);
80-
contentStream.setFontSize(fontSize);
81-
contentStream.setColor(0.3f, 0.3f, 0.3f);
8283

8384
drawUserInfo(contentStream, user.getUsername(), user.getEmailPeriod().getValue());
8485
drawDateTime(contentStream, chatRoom.getCreatedAt());
@@ -91,30 +92,21 @@ private void drawBackgroundImg(PDDocument doc, User user, ChatRoom chatRoom) {
9192
}
9293

9394
private void drawUserInfo(ContentStream contentStream, String username, int emailPeriod) {
94-
int nameX = 273;
95-
int nameY = 556;
96-
int periodX = 343;
97-
int periodY = 522;
95+
contentStream.setFontSize(TemplateV1Pos.USERNAME.fontSize);
96+
contentStream.setColor(TemplateV1Pos.USERNAME.color);
9897

99-
contentStream.writeText(nameX, nameY, username);
100-
contentStream.writeText(periodX, periodY, emailPeriod + "일");
98+
contentStream.writeText(TemplateV1Pos.USERNAME.x, TemplateV1Pos.USERNAME.y, username);
99+
contentStream.writeText(TemplateV1Pos.EMAIL_PERIOD.x, TemplateV1Pos.EMAIL_PERIOD.y, emailPeriod + "일");
101100
}
102101

103102
private void drawDateTime(ContentStream contentStream, LocalDateTime createdAt) {
104-
int createdAtX = 308;
105-
int createdAtY = 488;
106-
int nowY = 454;
107-
108-
contentStream.writeText(createdAtX, createdAtY, dateTimeFormatter.format(createdAt));
109-
contentStream.writeText(createdAtX, nowY, dateTimeFormatter.format(LocalDateTime.now()));
103+
contentStream.writeText(TemplateV1Pos.CREATED_AT.x, TemplateV1Pos.CREATED_AT.y, dateTimeFormatter.format(createdAt));
104+
contentStream.writeText(TemplateV1Pos.NOW.x, TemplateV1Pos.NOW.y, dateTimeFormatter.format(LocalDateTime.now()));
110105
}
111106

112107
private void drawSummary(ContentStream contentStream, String summary) {
113-
contentStream.setFontSize(16);
114-
int summaryX = 215;
115-
int summaryY = 299;
116-
int lineHeight = 50;
117-
int maxChars = 45;
108+
contentStream.setFontSize(TemplateV1Pos.SUMMARY.fontSize);
109+
contentStream.setColor(TemplateV1Pos.SUMMARY.color);
118110

119111
// 개행문자 제거
120112
StringBuilder summaryStringBuilder = new StringBuilder();
@@ -123,13 +115,13 @@ private void drawSummary(ContentStream contentStream, String summary) {
123115
}
124116
String summaryLine = summaryStringBuilder.toString();
125117

126-
// 45자 단위로 문장 분리
118+
// 글자수 단위로 문장 분리
127119
List<String> texts = new ArrayList<>();
128-
for (int start = 0; start < summaryLine.length(); start += maxChars) {
129-
int end = Math.min(summaryLine.length(), start + maxChars);
130-
texts.add(summaryLine.substring(start, end));
120+
for (int start = 0; start < summaryLine.length(); start += templateV1Config.MAX_CHARS_IN_LINE()) {
121+
int end = Math.min(summaryLine.length(), start + templateV1Config.MAX_CHARS_IN_LINE());
122+
texts.add(summaryLine.substring(start, end).strip());
131123
}
132-
contentStream.writeWrappedText(summaryX, summaryY, lineHeight, texts);
124+
contentStream.writeWrappedText(TemplateV1Pos.SUMMARY.x, TemplateV1Pos.SUMMARY.y, templateV1Config.LINE_HEIGHT(), texts);
133125
}
134126

135127
private PDDocument loadPDDocument(String path){
@@ -151,4 +143,4 @@ private InputStream loadFontFile(String path){
151143
return null;
152144
}
153145
}
154-
}
146+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.gdg.poppet.email.infra.template.v1;
2+
3+
public record RGB(float r, float g, float b) {
4+
}

0 commit comments

Comments
 (0)