Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: 리차징룸 자동 취소 시 회원마다 알림 내용 동적으로 관리 + 댓글 알림은 닉네임으로 표시 #143

Merged
merged 4 commits into from
Jun 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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));
}
Expand All @@ -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));
}
Expand All @@ -68,17 +73,20 @@ public void saveAndSendFCMNotificationForMeetingRoomInvitation(ReserveMeetingRoo
@Order(2)
@Async
public void saveAndSendFCMNotificationForRechargingRoomCancellation(ReserveMeetingRoomEvent event) {
List<Member> cancelers = event.cancelers();
if (cancelers.isEmpty()) {
List<CancelRechargeRoomNotification> 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));
}
Expand All @@ -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));
}
Expand All @@ -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));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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
) {
}
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -9,9 +10,8 @@ public record ReserveMeetingRoomEvent(
LocalDateTime reservationDate,
String targetUrl,
String invitationContent,
String cancellationContent,
String reservationContent,
List<Member> participants,
List<Member> cancelers
List<CancelRechargeRoomNotification> cancelRechargeRoomNotifications
) implements ReserveEvent {
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -102,13 +103,13 @@ else if (verifyOverlappingMeetingRoom(participants, meetingRoomDto.startAt(), me
members.add(representative);

List<Reservation> membersOverlappingRechargingRoomReservations = reservationRepository.findOverlappingRechargingRoomReservationInMembers(members, meetingRoomDto.startAt(), meetingRoomDto.endAt());
List<Member> cancelers = handleOverlappingRechargingRoomReservations(membersOverlappingRechargingRoomReservations, now);
List<CancelRechargeRoomNotification> 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) {
Expand All @@ -125,8 +126,8 @@ private boolean verifyOverlappingMeetingRoom(List<Member> participants, LocalDat
return false;
}

private List<Member> handleOverlappingRechargingRoomReservations(List<Reservation> overlappingRechargingRoomReservations, LocalDateTime now) {
List<Member> cancelers = new ArrayList<>();
private List<CancelRechargeRoomNotification> handleOverlappingRechargingRoomReservations(List<Reservation> overlappingRechargingRoomReservations, LocalDateTime now) {
List<CancelRechargeRoomNotification> cancelRechargeRoomNotifications = new ArrayList<>();
for (Reservation reservation : overlappingRechargingRoomReservations) {
// 예약 시간이 겹치는데 이미 시작한 경우 종료 처리
if (reservation.getReservationStartDateTime().isBefore(now)) {
Expand All @@ -136,11 +137,14 @@ private List<Member> handleOverlappingRechargingRoomReservations(List<Reservatio
else {
reservation.getMemberReservations().forEach(memberReservation -> {
memberReservation.cancelReservation();
cancelers.add(memberReservation.getMember());
cancelRechargeRoomNotifications.add(new CancelRechargeRoomNotification(
memberReservation.getMember(),
createRechargingRoomCancellationNotificationContent(reservation.getReservationStartDateTime())
));
});
}
}
return cancelers;
return cancelRechargeRoomNotifications;
}

@Transactional
Expand Down Expand Up @@ -487,7 +491,7 @@ private boolean verifyOverlappingMeetingRoom(Member member, LocalDateTime startA
return false;
}

private ReserveMeetingRoomEvent createReserveMeetingRoomEvent(Reservation reservation, MeetingRoom meetingRoom, List<Member> participants, List<Member> cancelers) {
private ReserveMeetingRoomEvent createReserveMeetingRoomEvent(Reservation reservation, MeetingRoom meetingRoom, List<Member> participants, List<CancelRechargeRoomNotification> cancelRechargeRoomNotifications) {
Long reservationId = reservation.getReservationId();
LocalDateTime reservationDate = reservation.getReservationStartDateTime();
log.info("Create Reserve Meeting Room Event For Publication. " +
Expand All @@ -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) {
Expand Down
Loading