Skip to content

Commit 95e9952

Browse files
authored
Merge pull request #366 from GTable/fix#365-cancel-bug
refactor: ReservationNotFoundException 터지는 경우 멱등키 롤백 로직 추가
2 parents dba48bc + d20c593 commit 95e9952

3 files changed

Lines changed: 25 additions & 7 deletions

File tree

nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/redis/WaitingIdempotencyRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,8 @@ public void saveIdempotencyInProgress(String key) {
8585
throw new IllegalArgumentException("Failed to serialize value for Redis", e);
8686
}
8787
}
88+
89+
public void deleteByRegisterKey(String key) {
90+
redisTemplate.delete(key);
91+
}
8892
}

nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/service/IdempotencyService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,11 @@ public void saveIdempotencyKeyInProgress(String idempotentKey) {
4848
}
4949
}
5050

51+
public void rollbackIdempotencyKey(String idempotentKey) {
52+
if (idempotentKey != null && !idempotentKey.isBlank()) {
53+
log.info("Rolling back idempotency key: {}", idempotentKey);
54+
waitingIdempotencyRepository.deleteByRegisterKey(idempotentKey);
55+
}
56+
}
57+
5158
}

nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/service/WaitingService.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,20 @@ public CancelWaitingResponse cancelWaiting(CustomOAuth2User oAuth2User, String p
142142
.orElseThrow(UserNotFoundException::new);
143143

144144
// DB 웨이팅 상태 취소 처리
145-
Reservation reservation = reservationRepository.findReservationByReservationNumber(request.getWaitingNumber())
146-
.orElseThrow(ReservationNotFoundException::new);
147-
148-
reservation.markAsCancelled(LocalDateTime.now());
149-
150-
// Redis 대기열 취소 이벤트 발행
151-
waitingRedisRepository.removeWaiting(storeId, user.getId());
145+
Reservation reservation;
146+
try {
147+
reservation = reservationRepository.findReservationByReservationNumber(request.getWaitingNumber())
148+
.orElseThrow(ReservationNotFoundException::new);
149+
150+
reservation.markAsCancelled(LocalDateTime.now());
151+
152+
// Redis 대기열 취소 이벤트 발행
153+
waitingRedisRepository.removeWaiting(storeId, user.getId());
154+
} catch (RuntimeException e) {
155+
// 롤백 처리
156+
idempotencyService.rollbackIdempotencyKey(httpServletRequest.getHeader("Idempotency-Key"));
157+
throw e;
158+
}
152159

153160
CancelWaitingResponse response = CancelWaitingResponse.builder()
154161
.waitingNumber(reservation.getReservationNumber())

0 commit comments

Comments
 (0)