diff --git a/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/EventPayloads.java b/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/EventPayloads.java index 341a840d..fd1ccd9c 100644 --- a/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/EventPayloads.java +++ b/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/EventPayloads.java @@ -29,4 +29,10 @@ record MemberUpdatedEventPayload( String schoolCode ) implements EventPayload { } + + record MemberDeletedEventPayload( + Long memberId, + String memberName + ) implements EventPayload { + } } diff --git a/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/SolvedRankEventMonolithListener.java b/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/SolvedRankEventMonolithListener.java index c09ad341..0748e038 100644 --- a/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/SolvedRankEventMonolithListener.java +++ b/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/SolvedRankEventMonolithListener.java @@ -8,6 +8,7 @@ import kr.co.mathrank.common.event.publisher.monolith.MonolithEvent; import kr.co.mathrank.domain.rank.dto.SolverUpdateCommand; import kr.co.mathrank.domain.rank.service.SolveLogRegisterService; +import kr.co.mathrank.domain.rank.service.SolverDeleteService; import kr.co.mathrank.domain.rank.service.SolverUpdateService; import lombok.RequiredArgsConstructor; @@ -16,6 +17,7 @@ class SolvedRankEventMonolithListener { private final SolveLogRegisterService solveLogRegisterService; private final SolverUpdateService solverUpdateService; + private final SolverDeleteService solverDeleteService; @EventListener @Async @@ -44,4 +46,15 @@ public void consumeMemberUpdatedEvent(final MonolithEvent monolithEvent) { solverUpdateService.updateSolver(new SolverUpdateCommand(Long.parseLong(payload.memberId()), payload.name(), payload.schoolCode())); } + + @EventListener + @Async + public void consumeMemberRemovedEvent(final MonolithEvent monolithEvent) { + if (!monolithEvent.isExpectedTopic("mathrank-member-removed")) { + return; + } + final Event deletedEventPayload = Event.fromJson(monolithEvent.payload(), EventPayloads.MemberDeletedEventPayload.class); + + solverDeleteService.delete(deletedEventPayload.getPayload().memberId()); + } } diff --git a/domain/mathrank-auth-domain/src/main/java/kr/co/mathrank/domain/auth/service/MemberDeleteService.java b/domain/mathrank-auth-domain/src/main/java/kr/co/mathrank/domain/auth/service/MemberDeleteService.java index af8f7e2a..2bc9490e 100644 --- a/domain/mathrank-auth-domain/src/main/java/kr/co/mathrank/domain/auth/service/MemberDeleteService.java +++ b/domain/mathrank-auth-domain/src/main/java/kr/co/mathrank/domain/auth/service/MemberDeleteService.java @@ -6,6 +6,8 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; +import kr.co.mathrank.common.event.EventPayload; +import kr.co.mathrank.common.outbox.TransactionalOutboxPublisher; import kr.co.mathrank.domain.auth.client.OAuthClientManager; import kr.co.mathrank.domain.auth.dto.MemberDeleteCommand; import kr.co.mathrank.domain.auth.entity.Member; @@ -24,6 +26,7 @@ public class MemberDeleteService { private final MemberRepository memberRepository; private final OAuthClientManager oAuthClientManager; private final RefreshTokenRepository refreshTokenRepository; + private final TransactionalOutboxPublisher outboxPublisher; @Transactional public void delete(@NotNull @Valid final MemberDeleteCommand command) { @@ -36,6 +39,7 @@ public void delete(@NotNull @Valid final MemberDeleteCommand command) { throw new UnRegisterMemberException("oauth 연동 해제중 에러 발생했습니다. 잠시 후 다시 시도해주세요"); } refreshTokenRepository.expire(member.getId()); + outboxPublisher.publish("mathrank-member-removed", MemberDeletedEventPayload.from(member)); log.info("[MemberDeleteService.delete] member delete success - memberId: {}", command.targetMemberId()); } @@ -46,4 +50,13 @@ private Member getMember(final Long targetMemberId) { return new CannotFoundMemberException(); }); } + + record MemberDeletedEventPayload( + Long memberId, + String memberName + ) implements EventPayload { + static MemberDeletedEventPayload from(final Member member) { + return new MemberDeletedEventPayload(member.getId(), member.getName()); + } + } } diff --git a/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java b/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java new file mode 100644 index 00000000..26da8e10 --- /dev/null +++ b/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java @@ -0,0 +1,30 @@ +package kr.co.mathrank.domain.rank.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import kr.co.mathrank.domain.rank.repository.SolverRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@Validated +@RequiredArgsConstructor +public class SolverDeleteService { + private final SolverRepository solverRepository; + + @Transactional + public void delete(@NotNull @Valid final Long memberId) { + solverRepository.findByMemberId(memberId) + .ifPresentOrElse(solver -> { + solverRepository.delete(solver); + log.info("[SolverDeleteService.delete] solver deleted - memberId: {}", memberId); + }, () -> { + log.info("[SolverDeleteService.delete] cannot found solver - memberId: {}", memberId); + }); + } +}