diff --git a/src/main/java/com/example/sabujak/fcm/service/FCMNotificationEventListener.java b/src/main/java/com/example/sabujak/fcm/service/FCMNotificationEventListener.java index 4571117..2f033f2 100644 --- a/src/main/java/com/example/sabujak/fcm/service/FCMNotificationEventListener.java +++ b/src/main/java/com/example/sabujak/fcm/service/FCMNotificationEventListener.java @@ -4,6 +4,7 @@ import com.example.sabujak.notification.entity.NotificationType; import com.example.sabujak.notification.service.NotificationService; import com.example.sabujak.post.dto.SaveCommentEvent; +import com.example.sabujak.reservation.dto.event.CancelRechargeRoomNotification; import com.example.sabujak.reservation.dto.event.FindRechargingRoomEntryNotificationMemberEvent; import com.example.sabujak.reservation.dto.event.ReserveMeetingRoomEvent; import com.example.sabujak.reservation.dto.event.FindMeetingRoomEntryNotificationMembersEvent; @@ -40,6 +41,7 @@ public void saveAndSendFCMNotificationForComment(SaveCommentEvent event) { String targetUrl = event.targetUrl(); log.info("Start Preparing FCM Notification For Comment. " + "Writer Email: [{}], Notification Content: [{}], Target URL: [{}]", email, content, targetUrl); + saveNotification(DEFAULT_TITLE, content, targetUrl, COMMUNITY, event.writer()); sendFCMNotification(email, createFCMMessage(email, DEFAULT_TITLE, content, targetUrl)); } @@ -52,13 +54,16 @@ public void saveAndSendFCMNotificationForMeetingRoomInvitation(ReserveMeetingRoo if (participants.isEmpty()) { return; } + String content = event.invitationContent(); String targetUrl = event.targetUrl(); log.info("Start Preparing FCM Notification For Meeting Room Invitation. " + "Notification Content: [{}], Target URL: [{}]", content, targetUrl); + for (Member participant : participants) { String email = participant.getMemberEmail(); log.info("Notification Target Participant Email: [{}]", email); + saveNotification(MEETING_ROOM_INVITATION_TITLE, content, targetUrl, RESERVATION, participant); sendFCMNotificationAsync(email, createFCMMessage(email, MEETING_ROOM_INVITATION_TITLE, content, targetUrl)); } @@ -68,17 +73,20 @@ public void saveAndSendFCMNotificationForMeetingRoomInvitation(ReserveMeetingRoo @Order(2) @Async public void saveAndSendFCMNotificationForRechargingRoomCancellation(ReserveMeetingRoomEvent event) { - List cancelers = event.cancelers(); - if (cancelers.isEmpty()) { + List cancelRechargeRoomNotifications = event.cancelRechargeRoomNotifications(); + if (cancelRechargeRoomNotifications.isEmpty()) { return; } - String content = event.cancellationContent(); + String targetUrl = event.targetUrl(); - log.info("Start Preparing FCM Notification For Recharging Room Cancellation. " + - "Notification Content: [{}], Target URL: [{}]", content, targetUrl); - for (Member canceler : cancelers) { + log.info("Start Preparing FCM Notification For Recharging Room Cancellation. Target URL: [{}]", targetUrl); + + for (CancelRechargeRoomNotification cancelRechargeRoomNotification : cancelRechargeRoomNotifications) { + Member canceler = cancelRechargeRoomNotification.member(); String email = canceler.getMemberEmail(); - log.info("Notification Target Canceler Email: [{}]", email); + String content = cancelRechargeRoomNotification.cancellationContent(); + log.info("Notification Content: [{}], Notification Target Canceler Email: [{}]", content, email); + saveNotification(RECHARGING_ROOM_CANCELLATION_TITLE, content, targetUrl, RESERVATION, canceler); sendFCMNotificationAsync(email, createFCMMessage(email, RECHARGING_ROOM_CANCELLATION_TITLE, content, targetUrl)); } @@ -90,9 +98,11 @@ public void saveAndSendFCMNotificationForMeetingRoomEntry(FindMeetingRoomEntryNo String targetUrl = event.targetUrl(); log.info("Start Preparing FCM Notification For Meeting Room Entry. " + "Notification Content: [{}], Target URL: [{}]", content, targetUrl); + for (Member member : event.members()) { String email = member.getMemberEmail(); log.info("Notification Target Member Email: [{}]", email); + saveNotification(MEETING_ROOM_RESERVATION_TITLE, content, targetUrl, RESERVATION, member); sendFCMNotificationAsync(email, createFCMMessage(email, MEETING_ROOM_RESERVATION_TITLE, content, targetUrl)); } @@ -105,6 +115,7 @@ public void saveAndSendFCMNotificationForRechargingRoomEntry(FindRechargingRoomE String targetUrl = event.targetUrl(); log.info("Start Preparing FCM Notification For Recharging Room Entry. " + "Member Email: [{}], Notification Content: [{}], Target URL: [{}]", email, content, targetUrl); + saveNotification(RECHARGING_ROOM_RESERVATION_TITLE, content, targetUrl, RESERVATION, event.member()); sendFCMNotification(email, createFCMMessage(email, RECHARGING_ROOM_RESERVATION_TITLE, content, targetUrl)); } diff --git a/src/main/java/com/example/sabujak/post/service/PostFacade.java b/src/main/java/com/example/sabujak/post/service/PostFacade.java index 5dfaab2..8ef9d83 100644 --- a/src/main/java/com/example/sabujak/post/service/PostFacade.java +++ b/src/main/java/com/example/sabujak/post/service/PostFacade.java @@ -153,7 +153,7 @@ public void saveComment(Long postId, SaveCommentRequest saveCommentRequest, Stri log.info("Checking If Commenter Is Writer. Commenter: [{}], Writer: [{}]", commenterEmail, writerEmail); if(!commenterEmail.equals(writerEmail)) { log.info("Creating and Publishing Event for Writer Notification."); - String content = createCommentContent(post.getTitle(), commenter.getMemberName()); + String content = createCommentContent(post.getTitle(), commenter.getMemberNickname()); String targetUrl = createTargetUrl(post.getId()); publisher.publishEvent(new SaveCommentEvent(targetUrl, content, writerEmail, writer)); } diff --git a/src/main/java/com/example/sabujak/reservation/dto/event/CancelRechargeRoomNotification.java b/src/main/java/com/example/sabujak/reservation/dto/event/CancelRechargeRoomNotification.java new file mode 100644 index 0000000..716e563 --- /dev/null +++ b/src/main/java/com/example/sabujak/reservation/dto/event/CancelRechargeRoomNotification.java @@ -0,0 +1,9 @@ +package com.example.sabujak.reservation.dto.event; + +import com.example.sabujak.member.entity.Member; + +public record CancelRechargeRoomNotification( + Member member, + String cancellationContent +) { +} diff --git a/src/main/java/com/example/sabujak/reservation/dto/event/ReserveMeetingRoomEvent.java b/src/main/java/com/example/sabujak/reservation/dto/event/ReserveMeetingRoomEvent.java index bca6f5d..9bfa41d 100644 --- a/src/main/java/com/example/sabujak/reservation/dto/event/ReserveMeetingRoomEvent.java +++ b/src/main/java/com/example/sabujak/reservation/dto/event/ReserveMeetingRoomEvent.java @@ -1,6 +1,7 @@ package com.example.sabujak.reservation.dto.event; import com.example.sabujak.member.entity.Member; + import java.time.LocalDateTime; import java.util.List; @@ -9,9 +10,8 @@ public record ReserveMeetingRoomEvent( LocalDateTime reservationDate, String targetUrl, String invitationContent, - String cancellationContent, String reservationContent, List participants, - List cancelers + List cancelRechargeRoomNotifications ) implements ReserveEvent { } diff --git a/src/main/java/com/example/sabujak/reservation/service/ReservationService.java b/src/main/java/com/example/sabujak/reservation/service/ReservationService.java index 721e73e..f5f869d 100644 --- a/src/main/java/com/example/sabujak/reservation/service/ReservationService.java +++ b/src/main/java/com/example/sabujak/reservation/service/ReservationService.java @@ -3,6 +3,7 @@ import com.example.sabujak.common.dto.ToastType; import com.example.sabujak.member.entity.Member; import com.example.sabujak.member.repository.MemberRepository; +import com.example.sabujak.reservation.dto.event.CancelRechargeRoomNotification; import com.example.sabujak.reservation.dto.event.FindMeetingRoomEntryNotificationMembersEvent; import com.example.sabujak.reservation.dto.event.FindRechargingRoomEntryNotificationMemberEvent; import com.example.sabujak.reservation.dto.event.ReserveMeetingRoomEvent; @@ -102,13 +103,13 @@ else if (verifyOverlappingMeetingRoom(participants, meetingRoomDto.startAt(), me members.add(representative); List membersOverlappingRechargingRoomReservations = reservationRepository.findOverlappingRechargingRoomReservationInMembers(members, meetingRoomDto.startAt(), meetingRoomDto.endAt()); - List cancelers = handleOverlappingRechargingRoomReservations(membersOverlappingRechargingRoomReservations, now); + List cancelRechargeRoomNotifications = handleOverlappingRechargingRoomReservations(membersOverlappingRechargingRoomReservations, now); Reservation reservation = meetingRoomDto.toReservationEntity(meetingRoom, representative, participants); reservationRepository.save(reservation); - publisher.publishEvent(createReserveMeetingRoomEvent(reservation, meetingRoom, participants, cancelers)); + publisher.publishEvent(createReserveMeetingRoomEvent(reservation, meetingRoom, participants, cancelRechargeRoomNotifications)); } private boolean verifyOverlappingMeetingRoom(Member representative, LocalDateTime startAt, LocalDateTime endAt) { @@ -125,8 +126,8 @@ private boolean verifyOverlappingMeetingRoom(List participants, LocalDat return false; } - private List handleOverlappingRechargingRoomReservations(List overlappingRechargingRoomReservations, LocalDateTime now) { - List cancelers = new ArrayList<>(); + private List handleOverlappingRechargingRoomReservations(List overlappingRechargingRoomReservations, LocalDateTime now) { + List cancelRechargeRoomNotifications = new ArrayList<>(); for (Reservation reservation : overlappingRechargingRoomReservations) { // 예약 시간이 겹치는데 이미 시작한 경우 종료 처리 if (reservation.getReservationStartDateTime().isBefore(now)) { @@ -136,11 +137,14 @@ private List handleOverlappingRechargingRoomReservations(List { memberReservation.cancelReservation(); - cancelers.add(memberReservation.getMember()); + cancelRechargeRoomNotifications.add(new CancelRechargeRoomNotification( + memberReservation.getMember(), + createRechargingRoomCancellationNotificationContent(reservation.getReservationStartDateTime()) + )); }); } } - return cancelers; + return cancelRechargeRoomNotifications; } @Transactional @@ -487,7 +491,7 @@ private boolean verifyOverlappingMeetingRoom(Member member, LocalDateTime startA return false; } - private ReserveMeetingRoomEvent createReserveMeetingRoomEvent(Reservation reservation, MeetingRoom meetingRoom, List participants, List cancelers) { + private ReserveMeetingRoomEvent createReserveMeetingRoomEvent(Reservation reservation, MeetingRoom meetingRoom, List participants, List cancelRechargeRoomNotifications) { Long reservationId = reservation.getReservationId(); LocalDateTime reservationDate = reservation.getReservationStartDateTime(); log.info("Create Reserve Meeting Room Event For Publication. " + @@ -498,12 +502,10 @@ private ReserveMeetingRoomEvent createReserveMeetingRoomEvent(Reservation reserv log.info("Branch Name: [{}], Space Name: [{}]", branchName, spaceName); String invitationContent = createMeetingRoomInvitationContent(reservationDate); - String cancellationContent = createRechargingRoomCancellationNotificationContent(reservationDate); String reservationContent = createMeetingRoomReservationContent(reservationDate, branchName, spaceName); - log.info("Invitation Content: [{}], Cancellation Content: [{}], Reservation Content: [{}]", - invitationContent, cancellationContent, reservationContent); + log.info("Invitation Content: [{}], Reservation Content: [{}]", invitationContent, reservationContent); - return new ReserveMeetingRoomEvent(reservationId, reservationDate, "", invitationContent, cancellationContent, reservationContent, participants, cancelers); + return new ReserveMeetingRoomEvent(reservationId, reservationDate, "", invitationContent, reservationContent, participants, cancelRechargeRoomNotifications); } private ReserveRechargingRoomEvent createReserveRechargingRoomEvent(Reservation reservation, RechargingRoom rechargingRoom, Member member) {