Skip to content

Commit 7ec1986

Browse files
authored
Merge pull request #16 from gdsc-ssu/feat/#15
[Feat/#15] 대화 내용 요약본 이메일 전송 기능 구현
2 parents f7fe1e7 + 0cb0a63 commit 7ec1986

File tree

21 files changed

+221
-52
lines changed

21 files changed

+221
-52
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ dependencies {
4747

4848
//.env
4949
implementation 'io.github.cdimascio:java-dotenv:5.2.2'
50+
51+
// email
52+
implementation 'org.springframework.boot:spring-boot-starter-mail'
5053
}
5154

5255
dependencyManagement {

src/main/java/com/gdg/poppet/auth/domain/converter/AuthConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.gdg.poppet.auth.domain.converter;
22

3-
import com.gdg.poppet.user.domain.enums.EmailPeriod;
3+
import com.gdg.poppet.email.domain.enums.EmailPeriod;
44
import com.gdg.poppet.user.domain.enums.Gender;
55
import com.gdg.poppet.user.domain.model.User;
66

src/main/java/com/gdg/poppet/chat/domain/model/ChatRoom.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,17 @@ public class ChatRoom extends BaseEntity {
2828

2929
private String username; // TODO: user 간접 참조
3030

31+
@Column(name = "is_mail_sent", nullable = false, columnDefinition = "BOOLEAN DEFAULT false")
32+
private boolean isMailSent;
33+
3134
@OneToMany(mappedBy = "chatRoom", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
3235
private List<Chat> chats;
3336

3437
public boolean isValidChatRoom(LocalDate emailPeriodDate) {
3538
return !getCreatedAt().toLocalDate().isBefore(emailPeriodDate);
3639
}
40+
41+
public void updateIsMailSent() {
42+
isMailSent = true;
43+
}
3744
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,11 @@ public interface ChatRoomRepository extends JpaRepository<ChatRoom, Long> {
2424
"FROM ChatRoom cr " +
2525
"WHERE cr.chatRoomId = :chatRoomId")
2626
void deleteChatRoomByChatRoomId(@Param(value = "chatRoomId") Long chatRoomId);
27+
28+
@Query(value = "SELECT cr " +
29+
"FROM ChatRoom cr " +
30+
"WHERE cr.username = :username " +
31+
"AND cr.isMailSent = FALSE " +
32+
"ORDER BY cr.createdAt DESC")
33+
List<ChatRoom> findByUsernameAndCreatedAtAndIsMailSent(@Param(value = "username") String username);
2734
}

src/main/java/com/gdg/poppet/user/application/dto/request/EmailRequestDto.java renamed to src/main/java/com/gdg/poppet/email/application/dto/request/EmailRequestDto.java

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

33
import jakarta.validation.constraints.NotBlank;
44
import lombok.Getter;

src/main/java/com/gdg/poppet/user/application/dto/response/EmailDto.java renamed to src/main/java/com/gdg/poppet/email/application/dto/response/EmailDto.java

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

33
import lombok.AllArgsConstructor;
44
import lombok.Builder;

src/main/java/com/gdg/poppet/user/application/dto/response/EmailPeriodDto.java renamed to src/main/java/com/gdg/poppet/email/application/dto/response/EmailPeriodDto.java

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

33
import lombok.AllArgsConstructor;
44
import lombok.Builder;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.gdg.poppet.email.application.event;
2+
3+
import com.gdg.poppet.chat.domain.model.ChatRoom;
4+
import com.gdg.poppet.user.domain.model.User;
5+
import lombok.Getter;
6+
7+
@Getter
8+
public class EmailSendEvent {
9+
private final User user;
10+
private final ChatRoom chatRoom;
11+
12+
public EmailSendEvent(User user, ChatRoom chatRoom) {
13+
this.user = user;
14+
this.chatRoom = chatRoom;
15+
}
16+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.gdg.poppet.email.application.service;
2+
3+
import com.gdg.poppet.email.application.dto.request.EmailRequestDto;
4+
import com.gdg.poppet.email.application.dto.response.EmailDto;
5+
import com.gdg.poppet.email.application.dto.response.EmailPeriodDto;
6+
import org.springframework.stereotype.Service;
7+
8+
import java.util.List;
9+
10+
@Service
11+
public interface EmailService {
12+
EmailPeriodDto getEmailPeriod(String name);
13+
EmailPeriodDto patchEmailPeriod(String name, int period);
14+
15+
List<EmailDto> getEmailAddressList(String name);
16+
List<EmailDto> postEmailAddress(String name, EmailRequestDto emailRequestDto);
17+
void patchEmailAddress(String name, Long emailId, EmailRequestDto emailRequestDto);
18+
void deleteEmailAddress(String name, Long emailId);
19+
20+
void sendEmail(String username);
21+
}

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

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,38 @@
1-
package com.gdg.poppet.user.application.service;
1+
package com.gdg.poppet.email.application.service;
22

3+
import com.gdg.poppet.chat.domain.model.ChatRoom;
4+
import com.gdg.poppet.chat.domain.repository.ChatRoomRepository;
5+
import com.gdg.poppet.email.application.event.EmailSendEvent;
6+
import com.gdg.poppet.email.infra.application.EmailSendService;
37
import com.gdg.poppet.global.exception.GlobalException;
48
import com.gdg.poppet.global.status.ErrorStatus;
5-
import com.gdg.poppet.user.application.dto.request.EmailRequestDto;
6-
import com.gdg.poppet.user.application.dto.response.EmailDto;
7-
import com.gdg.poppet.user.application.dto.response.EmailPeriodDto;
8-
import com.gdg.poppet.user.domain.converter.EmailConverter;
9-
import com.gdg.poppet.user.domain.model.Email;
9+
import com.gdg.poppet.email.application.dto.request.EmailRequestDto;
10+
import com.gdg.poppet.email.application.dto.response.EmailDto;
11+
import com.gdg.poppet.email.application.dto.response.EmailPeriodDto;
12+
import com.gdg.poppet.email.domain.converter.EmailConverter;
13+
import com.gdg.poppet.email.domain.model.Email;
1014
import com.gdg.poppet.user.domain.model.User;
11-
import com.gdg.poppet.user.domain.repository.EmailRepository;
15+
import com.gdg.poppet.email.domain.repository.EmailRepository;
1216
import com.gdg.poppet.user.domain.repository.UserRepository;
1317
import lombok.RequiredArgsConstructor;
18+
import lombok.extern.slf4j.Slf4j;
19+
import org.springframework.context.ApplicationEventPublisher;
1420
import org.springframework.stereotype.Service;
1521
import org.springframework.transaction.annotation.Transactional;
1622

1723
import java.util.List;
1824
import java.util.stream.Collectors;
1925

26+
@Slf4j
2027
@Service
2128
@RequiredArgsConstructor
2229
public class EmailServiceImpl implements EmailService {
2330

2431
private final UserRepository userRepository;
2532
private final EmailRepository emailRepository;
33+
private final ChatRoomRepository chatRoomRepository;
34+
private final EmailSendService emailSendService;
35+
private final ApplicationEventPublisher applicationEventPublisher;
2636

2737
/**
2838
* 사용자의 이메일 전송 주기를 반환한다.
@@ -58,7 +68,7 @@ public EmailPeriodDto patchEmailPeriod(String username, int period) {
5868
* @return 사용자가 등록한 보호자 이메일 리스트
5969
*/
6070
@Override
61-
public List<EmailDto> getEmailList(String username) {
71+
public List<EmailDto> getEmailAddressList(String username) {
6272
User user = getUser(username);
6373
List<Email> emailList = emailRepository.findByUser(user);
6474

@@ -76,7 +86,7 @@ public List<EmailDto> getEmailList(String username) {
7686
*/
7787
@Transactional
7888
@Override
79-
public List<EmailDto> postEmail(String username, EmailRequestDto emailRequestDto) {
89+
public List<EmailDto> postEmailAddress(String username, EmailRequestDto emailRequestDto) {
8090
User user = getUser(username);
8191

8292
validateDuplicateEmail(emailRequestDto.getNewEmail(), user);
@@ -103,7 +113,7 @@ public List<EmailDto> postEmail(String username, EmailRequestDto emailRequestDto
103113
*/
104114
@Transactional
105115
@Override
106-
public void patchEmail(String username, Long emailId, EmailRequestDto emailRequestDto) {
116+
public void patchEmailAddress(String username, Long emailId, EmailRequestDto emailRequestDto) {
107117
User user = getUser(username);
108118
Email email = getEmail(emailId);
109119

@@ -123,14 +133,39 @@ public void patchEmail(String username, Long emailId, EmailRequestDto emailReque
123133
*/
124134
@Transactional
125135
@Override
126-
public void deleteEmail(String username, Long emailId) {
136+
public void deleteEmailAddress(String username, Long emailId) {
127137
User user = getUser(username);
128138
Email email = getEmail(emailId);
129139
validateIsUserAuthorizedForEmail(user, email);
130140

131141
emailRepository.delete(email);
132142
}
133143

144+
/**
145+
* 유저의 이메일 전송 주기에 따라, 주기 내에 생성된 이메일의 요약 내용을 이메일로 전송한다.
146+
*/
147+
@Transactional
148+
@Override
149+
public void sendEmail(String username) {
150+
// TODO: user data 얻는 과정 수정
151+
User user = getUser(username);
152+
153+
// 가장 최근 생성되고 메일을 보내지 않은 채팅방 조회
154+
List<ChatRoom> chatRooms = chatRoomRepository.findByUsernameAndCreatedAtAndIsMailSent(username);
155+
if (chatRooms.isEmpty()) return;
156+
157+
// 메일 보낼 채팅방 요약 내용 추출
158+
ChatRoom chatRoom = chatRooms.get(0);
159+
String chatSummary = chatRoom.getSummary();
160+
if (chatSummary == null) return;
161+
162+
// 메일 보냄 여부 수정
163+
chatRoom.updateIsMailSent();
164+
165+
// 메일 전송 이벤트 발행
166+
applicationEventPublisher.publishEvent(new EmailSendEvent(user, chatRoom));
167+
}
168+
134169
private void validateIsUserAuthorizedForEmail(User user, Email email) {
135170
if (!email.getUser().equals(user)) {
136171
throw new GlobalException(ErrorStatus.USER_EMAIL_FORBIDDEN);

0 commit comments

Comments
 (0)