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 @@ -24,7 +24,6 @@
import com.nowait.applicationadmin.reservation.dto.ReservationStatusSummaryDto;
import com.nowait.applicationadmin.reservation.dto.ReservationStatusUpdateRequestDto;
import com.nowait.applicationadmin.reservation.dto.WaitingUserResponse;
import com.nowait.applicationadmin.reservation.repository.WaitingRedisRepository;
import com.nowait.common.enums.ReservationStatus;
import com.nowait.common.enums.Role;
import com.nowait.domaincorerdb.reservation.entity.Reservation;
Expand All @@ -38,6 +37,8 @@
import com.nowait.domaincorerdb.user.exception.UserNotFoundException;
import com.nowait.domaincorerdb.user.repository.UserRepository;
import com.nowait.domaincoreredis.common.util.RedisKeyUtils;
import com.nowait.domaincoreredis.reservation.repository.WaitingPermitLuaRepository;
import com.nowait.domaincoreredis.reservation.repository.WaitingRedisRepository;

import lombok.RequiredArgsConstructor;

Expand All @@ -49,6 +50,7 @@ public class ReservationService {
private final UserRepository userRepository;
private final WaitingRedisRepository waitingRedisRepository;
private final StoreRepository storeRepository;
private final WaitingPermitLuaRepository waitingPermitLuaRepository;
private final RedisTemplate redisTemplate;

//TODO 성능 비교를 위해 남겨둔 로직
Expand Down Expand Up @@ -242,6 +244,12 @@ public EntryStatusResponseDto processEntryStatus(Long storeId, String userId, Me
if (ReservationStatus.WAITING.name().equals(currStatus) || ReservationStatus.CALLING.name()
.equals(currStatus)) {

if (reservationNumber != null) {
waitingPermitLuaRepository.removeActiveMember(
userId, String.valueOf(storeId), reservationNumber
);
}

// 새 Reservation 생성 & 저장
Reservation r = Reservation.builder()
.reservationNumber(reservationNumber)
Expand All @@ -259,6 +267,12 @@ public EntryStatusResponseDto processEntryStatus(Long storeId, String userId, Me
waitingRedisRepository.deleteWaiting(storeId, userId);
return EntryStatusResponseDto.fromEntity(saved);
} else {
if (reservationNumber != null) {
try {
waitingPermitLuaRepository.removeActiveMember(userId, String.valueOf(storeId), reservationNumber);
} catch (Exception ignore) {}
}

// 2) 이미 취소(CANCELLED)된 경우: DB 레코드 찾아 바로 CONFIRMED 로 전환
// TODO 메서드로 분리
LocalDateTime start = LocalDate.now().atStartOfDay();
Expand All @@ -283,6 +297,12 @@ public EntryStatusResponseDto processEntryStatus(Long storeId, String userId, Me
throw new IllegalStateException("WAITING/CALLING 상태에서만 취소 가능합니다.");
}

if (reservationNumber != null) {
waitingPermitLuaRepository.removeActiveMember(
userId, String.valueOf(storeId), reservationNumber
);
}

Reservation r = Reservation.builder()
.reservationNumber(reservationNumber)
.store(storeRepository.getReferenceById(storeId))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@

import com.nowait.applicationadmin.reservation.dto.EntryStatusResponseDto;
import com.nowait.applicationadmin.reservation.dto.WaitingUserResponse;
import com.nowait.applicationadmin.reservation.repository.WaitingRedisRepository;
import com.nowait.applicationadmin.reservation.service.ReservationService;
import com.nowait.common.enums.ReservationStatus;
import com.nowait.common.enums.Role;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.nowait.applicationadmin.reservation;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.BDDMockito.*;

import org.junit.jupiter.api.BeforeEach;
Expand All @@ -13,8 +12,6 @@
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;

import com.nowait.applicationadmin.reservation.repository.WaitingRedisRepository;

public class WaitingRedisRepositoryTest {
@Mock
private StringRedisTemplate template;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import com.nowait.applicationuser.reservation.dto.ReservationCreateRequestDto;
import com.nowait.applicationuser.reservation.dto.ReservationCreateResponseDto;
import com.nowait.applicationuser.reservation.dto.WaitingResponseDto;
import com.nowait.applicationuser.reservation.repository.WaitingPermitLuaRepository;
import com.nowait.applicationuser.reservation.repository.WaitingUserRedisRepository;
import com.nowait.common.enums.ReservationStatus;
import com.nowait.common.enums.Role;
Expand All @@ -45,6 +44,7 @@
import com.nowait.domaincorerdb.user.exception.UserNotFoundException;
import com.nowait.domaincorerdb.user.repository.UserRepository;
import com.nowait.domaincoreredis.common.util.RedisKeyUtils;
import com.nowait.domaincoreredis.reservation.repository.WaitingPermitLuaRepository;
import com.nowait.domainuserrdb.oauth.dto.CustomOAuth2User;

import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -218,7 +218,6 @@ public boolean cancelWaiting(Long storeId, CustomOAuth2User customOAuth2User) {
.build();

reservationRepository.save(reservation);

waitingPermitLuaRepository.removeActiveMember(userId, String.valueOf(storeId), reservationNumber);
return true;
// return removed;
Expand All @@ -232,6 +231,11 @@ public List<MyWaitingQueueDto> getAllMyWaitings(CustomOAuth2User customOAuth2Use
if (members.isEmpty())
return Collections.emptyList();

Map<Long, String> activeResIdByStore = members.stream()
.map(m -> m.split(":", 2))
.filter(a -> a.length == 2)
.collect(Collectors.toMap(a -> Long.parseLong(a[0]), a -> a[1], (a, b) -> a));

// 1) 현재 SCAN 기반으로 얻어온 storeId 리스트
// List<Long> storeIds = waitingUserRedisRepository.getUserWaitingStoreIds(userId);
// if (storeIds.isEmpty())
Expand Down Expand Up @@ -298,6 +302,23 @@ public List<MyWaitingQueueDto> getAllMyWaitings(CustomOAuth2User customOAuth2Use
String status = (String)it.next();
String reservationId = (String)it.next();


String activeReservationId = activeResIdByStore.get(storeId);
// 유령 감지: 큐에 없음/번호 불일치/번호 null
boolean zombie = (rankObj == null) || (reservationId == null) ||
(activeReservationId != null && !activeReservationId.equals(reservationId));
if (zombie) {
try {
String toRemove = (activeReservationId != null) ? activeReservationId
: (reservationId != null ? reservationId : null);
if (toRemove != null) {
waitingPermitLuaRepository.removeActiveMember(userId, String.valueOf(storeId), toRemove);
}
} catch (Exception ignore) {}
continue; // 목록에서 제외
}


int rank = (rankObj != null ? rankObj.intValue() + 1 : 0);
int teamsAhead = (rankObj != null ? rankObj.intValue() : 0);
int partySize = (partyStr != null ? Integer.parseInt(partyStr) : 0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@

import com.nowait.applicationuser.reservation.dto.ReservationCreateRequestDto;
import com.nowait.applicationuser.reservation.dto.WaitingResponseDto;
import com.nowait.applicationuser.reservation.repository.WaitingPermitLuaRepository;
import com.nowait.applicationuser.reservation.repository.WaitingUserRedisRepository;
import com.nowait.common.enums.Role;
import com.nowait.domaincoreredis.common.util.RedisKeyUtils;
Expand All @@ -37,6 +36,7 @@
import com.nowait.domaincorerdb.user.repository.UserRepository;
import com.nowait.domaincorerdb.store.entity.Store;
import com.nowait.domaincorerdb.user.entity.User;
import com.nowait.domaincoreredis.reservation.repository.WaitingPermitLuaRepository;
import com.nowait.domainuserrdb.oauth.dto.CustomOAuth2User;
import com.redis.testcontainers.RedisContainer;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import com.nowait.applicationuser.reservation.dto.ReservationCreateRequestDto;
import com.nowait.applicationuser.reservation.dto.ReservationCreateResponseDto;
import com.nowait.applicationuser.reservation.dto.WaitingResponseDto;
import com.nowait.applicationuser.reservation.repository.WaitingPermitLuaRepository;
import com.nowait.applicationuser.reservation.repository.WaitingUserRedisRepository;
import com.nowait.common.enums.ReservationStatus;
import com.nowait.common.enums.Role;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

import com.nowait.applicationuser.reservation.repository.WaitingPermitLuaRepository;
import com.nowait.domaincoreredis.common.util.RedisKeyUtils;

@Testcontainers
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.nowait.applicationuser.reservation.repository;
package com.nowait.domaincoreredis.reservation.repository;

import java.nio.charset.StandardCharsets;
import java.time.Duration;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.nowait.applicationadmin.reservation.repository;
package com.nowait.domaincoreredis.reservation.repository;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

Expand Down