[Feature] system messages 구현 - #79
Conversation
# Conflicts: # manabom/src/main/java/mannabom_server/manabom/application/chat/service/ChatRoomService.java # manabom/src/main/java/mannabom_server/manabom/application/chat/service/ChatService.java # manabom/src/main/java/mannabom_server/manabom/domain/chat/repository/ChatRoomRepository.java
|
Warning Review limit reached
Next review available in: 15 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (12)
Walkthrough채팅 시스템 메시지와 푸시 전달이 구조화된 이벤트와 메타데이터를 사용하도록 변경되었습니다. 미팅 취소 투표, 인증 만료 알림, 빠른 매칭 채팅방 라우팅과 상태 전이가 추가되었습니다. 관련 DTO, 저장소, 마이그레이션, 테스트도 추가되었습니다. Changes구조화된 채팅 메시지와 알림
미팅 취소
미팅 인증과 매칭
Estimated code review effort: 5 (Critical) | ~120 minutes Possibly related PRs
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 13
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
manabom/src/main/java/mannabom_server/manabom/application/chat/service/ChatRoomService.java (1)
212-239: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win1:1 매칭방에서 한쪽이 나가면 상대방은 영구히 "나가기"를 못하게 됩니다.
새로 추가된
room.getChatStatus() == ChatStatus.DISABLED가드(216-218)가chatMember조회/deactivate()보다 먼저 실행됩니다.LOVEVIEW_MATCH/PROFILE_MATCH케이스(236-238)는 나갈 때room.deactivate()를 호출해 방을 DISABLED로 만드는데, 이 상태에서 상대방이 뒤늦게leaveChatRoom을 호출하면 이 가드에서 즉시IllegalStateException이 발생해 자신의ChatMember를 정리(deactivate)할 기회조차 얻지 못합니다. 결과적으로 상대방의 멤버십 레코드는 계속 ACTIVATE로 남고, 클라이언트의 "나가기" 요청은 항상 실패합니다.가드를 멤버십 정리 이후로 옮기면, 자기 멤버십 정리는 항상 성공하고 중복되는 방 상태 변경(삭제/비활성화)만 건너뛸 수 있습니다.
🐛 제안하는 수정
public void leaveChatRoom(Long roomId, Long userId){ ChatRoom room = chatRoomRepository.findById(roomId) .orElseThrow(()-> new IllegalArgumentException("채팅방 나가기: 존재하지 않는 채팅방아이디 입니다.")); - if (room.getChatStatus() == ChatStatus.DISABLED) { - throw new IllegalStateException("비활성화된 채팅방에서는 나갈 수 없습니다."); - } - ChatMember chatMember = chatMemberRepository.findByRoomIdAndUser_UserIdAndStatus(roomId, userId, ChatMemberStatus.ACTIVATE) .orElseThrow(()-> new IllegalArgumentException("방에 참여중인 유저가 아닙니다.")); chatMember.deactivate(); + if (room.getChatStatus() == ChatStatus.DISABLED) { + log.info("이미 비활성화된 채팅방의 멤버십만 정리합니다: roomId={}, userId={}", roomId, userId); + return; + } Long referenceId=null; switch (room.getType()){🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@manabom/src/main/java/mannabom_server/manabom/application/chat/service/ChatRoomService.java` around lines 212 - 239, Move the ChatStatus.DISABLED guard in leaveChatRoom after the active ChatMember lookup and chatMember.deactivate() call, so users can always clean up their membership. Ensure subsequent room deletion or deactivation logic is skipped when the room is already disabled, while preserving the existing behavior for active rooms.
🧹 Nitpick comments (4)
manabom/src/main/java/mannabom_server/manabom/application/meeting/service/MeetingService.java (1)
236-253: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
joinMatchingChatRoomIfFastEntry와resolveCurrentChatRoomId의 매치 조회 로직 중복두 메서드가 거의 동일한
meetingMatchRepository.findByMeetingIdAndStatus(meeting.getId(), MatchingStatus.SUCCEEDED).orElseThrow(...)패턴을 반복하고 있고, 예외 메시지만 다릅니다("빠른 입장 미팅과..."vs"매칭된 미팅과..."). 공통 private 헬퍼로 추출하면 유지보수성이 좋아집니다.♻️ 리팩터링 제안
+ private MeetingMatch findSucceededMatchOrThrow(Long meetingId, String errorMessage) { + return meetingMatchRepository.findByMeetingIdAndStatus(meetingId, MatchingStatus.SUCCEEDED) + .orElseThrow(() -> new IllegalStateException(errorMessage)); + } private Long joinMatchingChatRoomIfFastEntry(...) { if (!isFastMatchingEntry) { return null; } - var match = meetingMatchRepository.findByMeetingIdAndStatus( - meeting.getId(), - MatchingStatus.SUCCEEDED - ) - .orElseThrow(() -> new IllegalStateException( - "빠른 입장 미팅과 연결된 성사된 매칭을 찾을 수 없습니다." - )); + var match = findSucceededMatchOrThrow(meeting.getId(), "빠른 입장 미팅과 연결된 성사된 매칭을 찾을 수 없습니다."); return chatRoomService.joinMatchingChatRoom(match, user); }Also applies to: 301-315
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@manabom/src/main/java/mannabom_server/manabom/application/meeting/service/MeetingService.java` around lines 236 - 253, Extract the duplicated successful-match lookup from joinMatchingChatRoomIfFastEntry and resolveCurrentChatRoomId into a shared private helper in MeetingService. Have the helper query findByMeetingIdAndStatus with MatchingStatus.SUCCEEDED and accept the required context-specific exception message, then update both callers to use it while preserving their existing messages and behavior.manabom/src/main/java/mannabom_server/manabom/application/like/service/LikeService.java (1)
159-176: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
LikeService와MessageRequestService의createChatRoom이 완전히 중복. 두 서비스의 privatecreateChatRoom메서드는LikeSource/MessageSource타입만 다를 뿐 조회·분기·호출 로직이 동일합니다. 공통 헬퍼로 추출해 중복을 제거할 수 있습니다.
manabom/src/main/java/mannabom_server/manabom/application/like/service/LikeService.java#L159-L176:createChatRoom로직을 공용 헬퍼(예: 추천 이력 조회 +actorUserId전달을 캡슐화하는 별도 컴포넌트)로 위임하도록 리팩터링.manabom/src/main/java/mannabom_server/manabom/application/messageRequest/service/MessageRequestService.java#L160-L177: 동일한 공용 헬퍼를 재사용하도록 리팩터링.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@manabom/src/main/java/mannabom_server/manabom/application/like/service/LikeService.java` around lines 159 - 176, Extract the duplicated createChatRoom logic from LikeService.java lines 159-176 and MessageRequestService.java lines 160-177 into a shared helper component that handles recommendation-history lookup, source branching, and actorUserId propagation; update both services’ createChatRoom methods to delegate to it while preserving their existing LikeSource/MessageSource behavior.manabom/src/main/resources/db/migration/V26__add_structured_system_message_fields.sql (1)
8-14: 🩺 Stability & Availability | 🔵 Trivial | 🏗️ Heavy lift운영 중 쓰기 차단 가능성이 있는 DDL을 온라인 배포 방식으로 분리해 주세요.
대규모 운영 테이블에서는 FK/CHECK의 즉시 검증과 일반 인덱스 생성이 전체 스캔 및 쓰기 잠금을 유발할 수 있습니다.
manabom/src/main/resources/db/migration/V26__add_structured_system_message_fields.sql#L8-L14: FK는NOT VALID후 별도 검증하고 partial index는 concurrent 생성으로 분리해 주세요.manabom/src/main/resources/db/migration/V26__add_structured_system_message_fields.sql#L20-L22: FK 추가의 검증과 잠금 영향을 배포 전략에 반영해 주세요.manabom/src/main/resources/db/migration/V22__move_meeting_cancellation_to_match.sql#L7-L25: FK/CHECK와 두 인덱스의 온라인 생성 및 트랜잭션 분리를 확인해 주세요.manabom/src/main/resources/db/migration/V23__remove_withdrawn_cancellation_status.sql#L4-L11: CHECK 검증을 데이터 정리와 분리해 잠금 시간을 줄여 주세요.manabom/src/main/resources/db/migration/V25__add_meeting_verification_failure_notification.sql#L4-L6: partial index를CREATE INDEX CONCURRENTLY로 생성할 수 있는지 확인해 주세요.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@manabom/src/main/resources/db/migration/V26__add_structured_system_message_fields.sql` around lines 8 - 14, 온라인 배포가 가능하도록 각 마이그레이션의 DDL을 검증·생성 단계와 트랜잭션에서 분리하세요. manabom/src/main/resources/db/migration/V26__add_structured_system_message_fields.sql#L8-L14의 fk_chat_message_actor는 NOT VALID로 추가 후 별도 검증하고 idx_chat_messages_system_event_type은 CREATE INDEX CONCURRENTLY로 생성하세요. 같은 파일 `#L20-L22의` FK 검증 및 잠금 영향도 동일한 배포 전략에 반영하세요. manabom/src/main/resources/db/migration/V22__move_meeting_cancellation_to_match.sql#L7-L25의 FK/CHECK와 두 인덱스는 온라인 생성 및 트랜잭션 분리를 적용하고, manabom/src/main/resources/db/migration/V23__remove_withdrawn_cancellation_status.sql#L4-L11에서는 CHECK 검증을 데이터 정리와 분리하세요. manabom/src/main/resources/db/migration/V25__add_meeting_verification_failure_notification.sql#L4-L6의 partial index도 CREATE INDEX CONCURRENTLY 사용과 트랜잭션 제약을 반영하세요.Source: Linters/SAST tools
manabom/src/test/java/mannabom_server/manabom/application/meeting/service/MeetingCancellationExpirationServiceTest.java (1)
38-52: 📐 Maintainability & Code Quality | 🔵 Trivial발행된
ChatSystemMessageEvent의 내용에 대한 검증이 없습니다.
expiresPendingRequestInItsOwnProcessingStep테스트는 상태 전이만 검증하고,eventPublisher.publishEvent(...)로 전달되는 이벤트의 타입(MEETING_CANCELLATION_EXPIRED), roomId, recipients, data 내용은 검증하지 않습니다.ArgumentCaptor로 캡처해 검증을 추가하면 회귀를 더 잘 잡을 수 있습니다.✅ 제안 예시
+ ArgumentCaptor<ChatSystemMessageEvent> captor = ArgumentCaptor.forClass(ChatSystemMessageEvent.class); + verify(eventPublisher).publishEvent(captor.capture()); + assertThat(captor.getValue().getType()).isEqualTo(SystemMessageType.MEETING_CANCELLATION_EXPIRED);🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@manabom/src/test/java/mannabom_server/manabom/application/meeting/service/MeetingCancellationExpirationServiceTest.java` around lines 38 - 52, Update expiresPendingRequestInItsOwnProcessingStep to capture the ChatSystemMessageEvent passed to eventPublisher.publishEvent(...), then assert its MEETING_CANCELLATION_EXPIRED type, roomId, recipients, and data contents alongside the existing status assertions.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@manabom/src/main/java/mannabom_server/manabom/application/chat/service/SystemMessageService.java`:
- Around line 82-118: Update recordMatchFailure to label both meetings with
MATCH_TIMED_OUT when match2Decision is AUTO_REJECTED, including the opponent
message type selection. Preserve the existing failedMeeting/opponentType
behavior for other decision combinations.
In
`@manabom/src/main/java/mannabom_server/manabom/application/meeting/dto/response/MeetingCancellationResponse.java`:
- Around line 28-54: Update MeetingCancellationResponse.of to count REJECT
decisions from votes and expose that count through a rejectedMemberCount
response field, including the builder mapping and any corresponding DTO
accessors. Preserve the existing agreed, pending, total, and vote-list behavior
so all vote decisions are represented and their counts sum to totalMemberCount.
In
`@manabom/src/main/java/mannabom_server/manabom/application/meeting/service/MeetingCancellationExpirationService.java`:
- Around line 42-61: MeetingCancellationExpirationService의
MEETING_CANCELLATION_EXPIRED 발행 로직을
MeetingCancellationService.expireIfNecessary()와 동일하게 맞추세요. recipients는
ChatMember가 아닌 MeetingMember 기준으로 산출하고, data에 기존 requestId/status와 함께 expiresAt을
포함하도록 수정하세요.
In
`@manabom/src/main/java/mannabom_server/manabom/application/meeting/service/MeetingCancellationService.java`:
- Around line 225-239: MeetingCancellationService의 expireIfNecessary()가 직접 만료
처리와 이벤트 발행을 수행하지 않도록 수정하고, 중복 로직을 담당하는
MeetingCancellationExpirationService.expire()에 위임하세요. 만료 시 해당 서비스의 단일 처리 경로와 동일한
payload가 사용되도록 기존 recipients 계산 및 publishCancellationEvent 호출을 제거하거나 통합하세요.
- Around line 158-166: In MeetingCancellationService, reorder the approval flow
so publishCancellationEvent with MEETING_CANCELLATION_APPROVED executes before
approveCancellation(request, now), including the equivalent flow referenced
around lines 204–223. Preserve the existing arguments and approval behavior
while ensuring the system message is recorded before chat rooms are disabled.
- Around line 135-142: Update vote() so it checks whether the cancellation
request is expired without mutating state before throwing for a non-PENDING
status. Move expireIfNecessary(request, now) out of the precondition path and
invoke it only when the vote can proceed, preserving the existing expiration
update and event publication without rolling it back due to the
IllegalStateException.
In
`@manabom/src/main/java/mannabom_server/manabom/application/meeting/service/MeetingService.java`:
- Around line 193-198: Update the enterRoomById and enterRoomByCode flows in
MeetingService so chatRoomService.joinChatRoom(meeting, user) is skipped when
isFastMatchingEntry is true, while preserving the existing join behavior for
regular entries and the subsequent matching-room flow.
In
`@manabom/src/main/java/mannabom_server/manabom/application/meeting/service/MeetingVerificationService.java`:
- Around line 254-267: Update the MEETING_VERIFICATION_SUCCEEDED event in
MeetingVerificationService to always use the current request’s userId as
actorUserId. Remove the fallback to verification.getStartedBy(), while
preserving the existing event payload and success flow.
In
`@manabom/src/main/java/mannabom_server/manabom/application/notification/service/NotificationService.java`:
- Around line 28-50: Separate push delivery in
NotificationService.sendNotification from the database transaction that saves
the Notification, ensuring FCM RuntimeException failures do not roll back
notification or chat-message persistence. Keep notificationRepository.save
within the existing transactional flow, and invoke pushService.sendToUser
through an independent after-commit or non-transactional failure-handling path
with logging or retry support.
In
`@manabom/src/main/java/mannabom_server/manabom/presentation/notification/controller/NotificationController.java`:
- Around line 14-29: Remove the unauthenticated sendTestNotification test
endpoint before deployment, or protect it with authentication and an explicit
administrator authorization check before invoking
notificationService.sendNotification. Ensure arbitrary targetUserId values
cannot be used by unauthenticated or non-admin callers.
In
`@manabom/src/main/resources/db/migration/V22__move_meeting_cancellation_to_match.sql`:
- Around line 1-18: Update the V22 migration to preserve existing
meeting_id-based cancellation requests by backfilling meeting_match_id through
the available meeting-to-match relationship, or add the required legacy mapping
so those rows remain discoverable by meetingMatch-based entity, repository, and
service flows. Ensure the migration satisfies chk_cancellation_request_target
and keeps existing requests eligible for cancellation voting and expiration
processing.
In
`@manabom/src/main/resources/db/migration/V23__remove_withdrawn_cancellation_status.sql`:
- Around line 1-11: Update the V23 migration before recreating
chk_cancellation_request_status to handle existing WITHDRAWN rows: convert them
to the policy-approved terminal status or add the required pre-validation that
prevents the constraint from being applied with invalid data. Ensure the
migration succeeds when legacy WITHDRAWN records exist.
In
`@manabom/src/main/resources/db/migration/V24__add_unique_active_chat_member.sql`:
- Around line 1-3: Update the V24 migration to create the partial unique index
with PostgreSQL’s concurrent index creation syntax, and configure Flyway with
spring.flyway.execute-in-transaction=false so this migration runs outside a
transaction.
---
Outside diff comments:
In
`@manabom/src/main/java/mannabom_server/manabom/application/chat/service/ChatRoomService.java`:
- Around line 212-239: Move the ChatStatus.DISABLED guard in leaveChatRoom after
the active ChatMember lookup and chatMember.deactivate() call, so users can
always clean up their membership. Ensure subsequent room deletion or
deactivation logic is skipped when the room is already disabled, while
preserving the existing behavior for active rooms.
---
Nitpick comments:
In
`@manabom/src/main/java/mannabom_server/manabom/application/like/service/LikeService.java`:
- Around line 159-176: Extract the duplicated createChatRoom logic from
LikeService.java lines 159-176 and MessageRequestService.java lines 160-177 into
a shared helper component that handles recommendation-history lookup, source
branching, and actorUserId propagation; update both services’ createChatRoom
methods to delegate to it while preserving their existing
LikeSource/MessageSource behavior.
In
`@manabom/src/main/java/mannabom_server/manabom/application/meeting/service/MeetingService.java`:
- Around line 236-253: Extract the duplicated successful-match lookup from
joinMatchingChatRoomIfFastEntry and resolveCurrentChatRoomId into a shared
private helper in MeetingService. Have the helper query findByMeetingIdAndStatus
with MatchingStatus.SUCCEEDED and accept the required context-specific exception
message, then update both callers to use it while preserving their existing
messages and behavior.
In
`@manabom/src/main/resources/db/migration/V26__add_structured_system_message_fields.sql`:
- Around line 8-14: 온라인 배포가 가능하도록 각 마이그레이션의 DDL을 검증·생성 단계와 트랜잭션에서 분리하세요.
manabom/src/main/resources/db/migration/V26__add_structured_system_message_fields.sql#L8-L14의
fk_chat_message_actor는 NOT VALID로 추가 후 별도 검증하고
idx_chat_messages_system_event_type은 CREATE INDEX CONCURRENTLY로 생성하세요. 같은 파일
`#L20-L22의` FK 검증 및 잠금 영향도 동일한 배포 전략에 반영하세요.
manabom/src/main/resources/db/migration/V22__move_meeting_cancellation_to_match.sql#L7-L25의
FK/CHECK와 두 인덱스는 온라인 생성 및 트랜잭션 분리를 적용하고,
manabom/src/main/resources/db/migration/V23__remove_withdrawn_cancellation_status.sql#L4-L11에서는
CHECK 검증을 데이터 정리와 분리하세요.
manabom/src/main/resources/db/migration/V25__add_meeting_verification_failure_notification.sql#L4-L6의
partial index도 CREATE INDEX CONCURRENTLY 사용과 트랜잭션 제약을 반영하세요.
In
`@manabom/src/test/java/mannabom_server/manabom/application/meeting/service/MeetingCancellationExpirationServiceTest.java`:
- Around line 38-52: Update expiresPendingRequestInItsOwnProcessingStep to
capture the ChatSystemMessageEvent passed to eventPublisher.publishEvent(...),
then assert its MEETING_CANCELLATION_EXPIRED type, roomId, recipients, and data
contents alongside the existing status assertions.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: f05ba588-9796-4bf8-b4cc-a2676f38a2d1
📒 Files selected for processing (75)
manabom/src/main/java/mannabom_server/manabom/application/chat/dto/event/ChatSystemMessageEvent.javamanabom/src/main/java/mannabom_server/manabom/application/chat/dto/response/ChatMessageEvent.javamanabom/src/main/java/mannabom_server/manabom/application/chat/dto/response/ChatMessageResponse.javamanabom/src/main/java/mannabom_server/manabom/application/chat/dto/response/ChatRoomListResponse.javamanabom/src/main/java/mannabom_server/manabom/application/chat/handler/ChatSystemMessageEventHandler.javamanabom/src/main/java/mannabom_server/manabom/application/chat/message/SystemMessageType.javamanabom/src/main/java/mannabom_server/manabom/application/chat/service/ChatRoomService.javamanabom/src/main/java/mannabom_server/manabom/application/chat/service/ChatService.javamanabom/src/main/java/mannabom_server/manabom/application/chat/service/SystemMessageService.javamanabom/src/main/java/mannabom_server/manabom/application/like/service/LikeService.javamanabom/src/main/java/mannabom_server/manabom/application/matching/service/PhotoRequestService.javamanabom/src/main/java/mannabom_server/manabom/application/meeting/dto/request/MeetingCancellationVoteRequest.javamanabom/src/main/java/mannabom_server/manabom/application/meeting/dto/response/MeetingCancellationResponse.javamanabom/src/main/java/mannabom_server/manabom/application/meeting/dto/response/MeetingCancellationVoteResponse.javamanabom/src/main/java/mannabom_server/manabom/application/meeting/scheduler/MeetingCancellationScheduler.javamanabom/src/main/java/mannabom_server/manabom/application/meeting/scheduler/MeetingVerificationScheduler.javamanabom/src/main/java/mannabom_server/manabom/application/meeting/service/MeetingCancellationExpirationService.javamanabom/src/main/java/mannabom_server/manabom/application/meeting/service/MeetingCancellationService.javamanabom/src/main/java/mannabom_server/manabom/application/meeting/service/MeetingMatchingService.javamanabom/src/main/java/mannabom_server/manabom/application/meeting/service/MeetingService.javamanabom/src/main/java/mannabom_server/manabom/application/meeting/service/MeetingVerificationExpirationService.javamanabom/src/main/java/mannabom_server/manabom/application/meeting/service/MeetingVerificationService.javamanabom/src/main/java/mannabom_server/manabom/application/messageRequest/service/MessageRequestService.javamanabom/src/main/java/mannabom_server/manabom/application/notification/dto/MatchSuccessEvent.javamanabom/src/main/java/mannabom_server/manabom/application/notification/dto/SseData.javamanabom/src/main/java/mannabom_server/manabom/application/notification/handler/NotificationEventListener.javamanabom/src/main/java/mannabom_server/manabom/application/notification/service/NotificationService.javamanabom/src/main/java/mannabom_server/manabom/application/notification/service/SseService.javamanabom/src/main/java/mannabom_server/manabom/application/pushService/service/pushSender/FcmPushSender.javamanabom/src/main/java/mannabom_server/manabom/domain/chat/entity/ChatMessage.javamanabom/src/main/java/mannabom_server/manabom/domain/chat/repository/ChatMemberRepository.javamanabom/src/main/java/mannabom_server/manabom/domain/chat/repository/ChatMessageRepository.javamanabom/src/main/java/mannabom_server/manabom/domain/chat/repository/ChatRoomRepository.javamanabom/src/main/java/mannabom_server/manabom/domain/meeting/entity/Meeting.javamanabom/src/main/java/mannabom_server/manabom/domain/meeting/entity/MeetingCancellationRequest.javamanabom/src/main/java/mannabom_server/manabom/domain/meeting/entity/MeetingCancellationVote.javamanabom/src/main/java/mannabom_server/manabom/domain/meeting/entity/MeetingVerification.javamanabom/src/main/java/mannabom_server/manabom/domain/meeting/enums/CancellationVoteDecision.javamanabom/src/main/java/mannabom_server/manabom/domain/meeting/enums/MeetingCancellationStatus.javamanabom/src/main/java/mannabom_server/manabom/domain/meeting/enums/MeetingStatus.javamanabom/src/main/java/mannabom_server/manabom/domain/meeting/enums/SseEventName.javamanabom/src/main/java/mannabom_server/manabom/domain/meeting/repository/MeetingCancellationRequestRepository.javamanabom/src/main/java/mannabom_server/manabom/domain/meeting/repository/MeetingCancellationVoteRepository.javamanabom/src/main/java/mannabom_server/manabom/domain/meeting/repository/MeetingMatchRepository.javamanabom/src/main/java/mannabom_server/manabom/domain/meeting/repository/MeetingVerificationRepository.javamanabom/src/main/java/mannabom_server/manabom/domain/notification/entity/Notification.javamanabom/src/main/java/mannabom_server/manabom/domain/notification/entity/SseEventCache.javamanabom/src/main/java/mannabom_server/manabom/domain/notification/enums/NotificationType.javamanabom/src/main/java/mannabom_server/manabom/domain/notification/repository/EmitterRepository.javamanabom/src/main/java/mannabom_server/manabom/domain/notification/repository/SseEventCacheRepository.javamanabom/src/main/java/mannabom_server/manabom/infrastructure/security/websocket/StompAuthChannelInterceptor.javamanabom/src/main/java/mannabom_server/manabom/presentation/meeting/controller/MeetingController.javamanabom/src/main/java/mannabom_server/manabom/presentation/meeting/controller/MeetingMatchingController.javamanabom/src/main/java/mannabom_server/manabom/presentation/notification/controller/NotificationController.javamanabom/src/main/resources/db/migration/V21__add_meeting_cancellation_tables.sqlmanabom/src/main/resources/db/migration/V22__move_meeting_cancellation_to_match.sqlmanabom/src/main/resources/db/migration/V23__remove_withdrawn_cancellation_status.sqlmanabom/src/main/resources/db/migration/V24__add_unique_active_chat_member.sqlmanabom/src/main/resources/db/migration/V25__add_meeting_verification_failure_notification.sqlmanabom/src/main/resources/db/migration/V26__add_structured_system_message_fields.sqlmanabom/src/main/resources/db/migration/V27__persist_meeting_verification_result.sqlmanabom/src/test/java/mannabom_server/manabom/application/chat/dto/response/ChatMessageResponseTest.javamanabom/src/test/java/mannabom_server/manabom/application/chat/handler/ChatSystemMessageEventHandlerTest.javamanabom/src/test/java/mannabom_server/manabom/application/chat/message/SystemMessageTypeTest.javamanabom/src/test/java/mannabom_server/manabom/application/chat/service/ChatRoomServiceTest.javamanabom/src/test/java/mannabom_server/manabom/application/chat/service/ChatServiceTest.javamanabom/src/test/java/mannabom_server/manabom/application/chat/service/SystemMessageServiceTest.javamanabom/src/test/java/mannabom_server/manabom/application/matching/service/PhotoRequestServiceTest.javamanabom/src/test/java/mannabom_server/manabom/application/meeting/service/MeetingCancellationExpirationServiceTest.javamanabom/src/test/java/mannabom_server/manabom/application/meeting/service/MeetingCancellationServiceTest.javamanabom/src/test/java/mannabom_server/manabom/application/meeting/service/MeetingVerificationExpirationServiceTest.javamanabom/src/test/java/mannabom_server/manabom/application/notification/service/NotificationServiceTest.javamanabom/src/test/java/mannabom_server/manabom/domain/meeting/MeetingCancellationDomainTest.javamanabom/src/test/java/mannabom_server/manabom/domain/meeting/MeetingMemberLeaveStatusTest.javamanabom/src/test/java/mannabom_server/manabom/domain/meeting/MeetingVerificationTest.java
💤 Files with no reviewable changes (8)
- manabom/src/main/java/mannabom_server/manabom/application/notification/dto/SseData.java
- manabom/src/main/java/mannabom_server/manabom/domain/notification/entity/SseEventCache.java
- manabom/src/main/java/mannabom_server/manabom/presentation/meeting/controller/MeetingMatchingController.java
- manabom/src/main/java/mannabom_server/manabom/domain/notification/repository/SseEventCacheRepository.java
- manabom/src/main/java/mannabom_server/manabom/domain/meeting/enums/SseEventName.java
- manabom/src/main/java/mannabom_server/manabom/application/notification/handler/NotificationEventListener.java
- manabom/src/main/java/mannabom_server/manabom/domain/notification/repository/EmitterRepository.java
- manabom/src/main/java/mannabom_server/manabom/application/notification/service/SseService.java
작업 내용
Summary by CodeRabbit
새 기능
개선 사항