Skip to content
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 @@ -29,4 +29,10 @@ record MemberUpdatedEventPayload(
String schoolCode
) implements EventPayload {
}

record MemberDeletedEventPayload(
Long memberId,
String memberName
) implements EventPayload {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -16,6 +17,7 @@
class SolvedRankEventMonolithListener {
private final SolveLogRegisterService solveLogRegisterService;
private final SolverUpdateService solverUpdateService;
private final SolverDeleteService solverDeleteService;

@EventListener
@Async
Expand Down Expand Up @@ -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<EventPayloads.MemberDeletedEventPayload> deletedEventPayload = Event.fromJson(monolithEvent.payload(), EventPayloads.MemberDeletedEventPayload.class);

solverDeleteService.delete(deletedEventPayload.getPayload().memberId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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) {
Expand All @@ -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());
}

Expand All @@ -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());
}
}
}
Original file line number Diff line number Diff line change
@@ -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);
});
}
}