스터디 수정 추가 알림
- 새 모임 추가
- 모임 변경
- 모임 취소
모임 참가 신청
- 참가 신청 수락
- 참가 신청 거절
새 모임 추가, 모임 변경, 모임 취소시 알림 이벤트를 발생시키기 위해 EventService에서 이벤트 추가
package me.weekbelt.studyolle.modules.event;
@Service
@Transactional
@RequiredArgsConstructor
public class EventService {
// ......
private final ApplicationEventPublisher eventPublisher; // 추가
public Event createEvent(Event event, Study study, Account account) {
event.setCreatedBy(account);
event.setCreatedDateTime(LocalDateTime.now());
event.setStudy(study);
eventPublisher.publishEvent(new StudyUpdateEvent(event.getStudy(), // 추가
"'" + event.getTitle() + "' 모임을 만들었습니다."));
return eventRepository.save(event);
}
public void updateEvent(Event event, EventForm eventForm) {
modelMapper.map(eventForm, event);
event.acceptWaitingList();
eventPublisher.publishEvent(new StudyUpdateEvent(event.getStudy(), // 추가
"'" + event.getTitle() + "' 모임 정보를 수정했으니 확인하세요."));
}
public void deleteEvent(Event event) {
eventRepository.delete(event);
eventPublisher.publishEvent(new StudyUpdateEvent(event.getStudy(), // 추가
"'" + event.getTitle() + "' 모임을 취소했습니다.));
}
// .............
}
모임 신청 수락/거절의 상속구조를 받기 위해 EnrollmentEvent 추상 클래스 생성
package me.weekbelt.studyolle.modules.event.event;
@Getter
@RequiredArgsConstructor
public abstract class EnrollmentEvent {
protected final Enrollment enrollment;
protected final String message;
}
모임 신청 수락시 EnrollmentAcceptedEvent 클래스 생성
package me.weekbelt.studyolle.modules.event.event;
import me.weekbelt.studyolle.modules.event.Enrollment;
public class EnrollmentAcceptedEvent extends EnrollmentEvent{
public EnrollmentAcceptedEvent(Enrollment enrollment) {
super(enrollment, "모임 참가 신청을 확인했습니다. 모임에 참석하세요.");
}
}
모임 신청 거절시 EnrollmentRejectedEvent 클래스 생성
package me.weekbelt.studyolle.modules.event.event;
public class EnrollmentRejectedEvent extends EnrollmentEvent{
public EnrollmentRejectedEvent(Enrollment enrollment) {
super(enrollment, "모임 참가 신청을 거절했습니다.");
}
}
모임 신청 수락/거절 이벤트 추가
package me.weekbelt.studyolle.modules.event;
@Service
@Transactional
@RequiredArgsConstructor
public class EventService {
// ......
public void acceptEnrollment(Event event, Enrollment enrollment) {
event.accept(enrollment);
eventPublisher.publishEvent(new EnrollmentAcceptedEvent(enrollment)); // 추가
}
public void rejectEnrollment(Event event, Enrollment enrollment) {
event.reject(enrollment);
eventPublisher.publishEvent(new EnrollmentRejectedEvent(enrollment)); // 추가
}
// ......
}
이벤트를 처리할 이벤트 리스너 생성
package me.weekbelt.studyolle.modules.event.event;
@RequiredArgsConstructor
@Slf4j
@Async
@Transactional
@Component
public class EnrollmentEventListener {
private final NotificationRepository notificationRepository;
private final AppProperties appProperties;
private final TemplateEngine templateEngine;
private final EmailService emailService;
@EventListener
public void handleEnrollmentEvent(EnrollmentEvent enrollmentEvent) {
Enrollment enrollment = enrollmentEvent.getEnrollment();
Account account = enrollment.getAccount();
Event event = enrollment.getEvent();
Study study = event.getStudy();
if (account.isStudyEnrollmentResultByEmail()) {
sendEmail(enrollmentEvent, account, event, study);
}
if (account.isStudyEnrollmentResultByWeb()) {
createNotification(enrollmentEvent, account, event, study);
}
}
private void sendEmail(EnrollmentEvent enrollmentEvent, Account account, Event event, Study study) {
Context context = new Context();
context.setVariable("nickname", account.getNickname());
context.setVariable("link", "/study/" + study.getEncodedPath() + "/events/" + event.getId());
context.setVariable("linkName", study.getTitle());
context.setVariable("message", enrollmentEvent.getMessage());
context.setVariable("host", appProperties.getHost());
String message = templateEngine.process("mail/simple-link", context);
EmailMessage emailMessage = EmailMessage.builder()
.subject("스터디올래, " + event.getTitle() + " 모임 참가 신청 결과입니다.")
.to(account.getEmail())
.message(message)
.build();
emailService.sendEmail(emailMessage);
}
private void createNotification(EnrollmentEvent enrollmentEvent, Account account, Event event, Study study) {
Notification notification = new Notification();
notification.setTitle(study.getTitle() + " / " + event.getTitle());
notification.setLink("/study/" + study.getEncodedPath() + "/events/" + event.getId());
notification.setChecked(false);
notification.setCreatedDateTime(LocalDateTime.now());
notification.setMessage(enrollmentEvent.getMessage());
notification.setAccount(account);
notification.setNotificationType(NotificationType.EVENT_ENROLLMENT);
notificationRepository.save(notification);
}
}
참고: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1#
'스프링과 JPA 기반 웹 어플리케이션 개발 > 7부 알림' 카테고리의 다른 글
76. 관심있는 스터디 변경 알림 (0) | 2020.05.12 |
---|---|
75. 알림 목록 조회 및 삭게 (0) | 2020.05.12 |
74. 스터디 알림 아이콘 변경 (0) | 2020.05.12 |
73. 스터디 개설 알림 (0) | 2020.05.11 |
72. 알림 처리 설계 (0) | 2020.05.11 |