Skip to content

Commit f69697e

Browse files
authored
Merge pull request #281 from GTable/refactor#278-limit-waitingNum
bug(Reservation): 유령 항목 삭제 로직 추가
2 parents 4e900af + c320e92 commit f69697e

9 files changed

Lines changed: 47 additions & 13 deletions

File tree

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import com.nowait.applicationadmin.reservation.dto.ReservationStatusSummaryDto;
2525
import com.nowait.applicationadmin.reservation.dto.ReservationStatusUpdateRequestDto;
2626
import com.nowait.applicationadmin.reservation.dto.WaitingUserResponse;
27-
import com.nowait.applicationadmin.reservation.repository.WaitingRedisRepository;
2827
import com.nowait.common.enums.ReservationStatus;
2928
import com.nowait.common.enums.Role;
3029
import com.nowait.domaincorerdb.reservation.entity.Reservation;
@@ -38,6 +37,8 @@
3837
import com.nowait.domaincorerdb.user.exception.UserNotFoundException;
3938
import com.nowait.domaincorerdb.user.repository.UserRepository;
4039
import com.nowait.domaincoreredis.common.util.RedisKeyUtils;
40+
import com.nowait.domaincoreredis.reservation.repository.WaitingPermitLuaRepository;
41+
import com.nowait.domaincoreredis.reservation.repository.WaitingRedisRepository;
4142

4243
import lombok.RequiredArgsConstructor;
4344

@@ -49,6 +50,7 @@ public class ReservationService {
4950
private final UserRepository userRepository;
5051
private final WaitingRedisRepository waitingRedisRepository;
5152
private final StoreRepository storeRepository;
53+
private final WaitingPermitLuaRepository waitingPermitLuaRepository;
5254
private final RedisTemplate redisTemplate;
5355

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

247+
if (reservationNumber != null) {
248+
waitingPermitLuaRepository.removeActiveMember(
249+
userId, String.valueOf(storeId), reservationNumber
250+
);
251+
}
252+
245253
// 새 Reservation 생성 & 저장
246254
Reservation r = Reservation.builder()
247255
.reservationNumber(reservationNumber)
@@ -259,6 +267,12 @@ public EntryStatusResponseDto processEntryStatus(Long storeId, String userId, Me
259267
waitingRedisRepository.deleteWaiting(storeId, userId);
260268
return EntryStatusResponseDto.fromEntity(saved);
261269
} else {
270+
if (reservationNumber != null) {
271+
try {
272+
waitingPermitLuaRepository.removeActiveMember(userId, String.valueOf(storeId), reservationNumber);
273+
} catch (Exception ignore) {}
274+
}
275+
262276
// 2) 이미 취소(CANCELLED)된 경우: DB 레코드 찾아 바로 CONFIRMED 로 전환
263277
// TODO 메서드로 분리
264278
LocalDateTime start = LocalDate.now().atStartOfDay();
@@ -283,6 +297,12 @@ public EntryStatusResponseDto processEntryStatus(Long storeId, String userId, Me
283297
throw new IllegalStateException("WAITING/CALLING 상태에서만 취소 가능합니다.");
284298
}
285299

300+
if (reservationNumber != null) {
301+
waitingPermitLuaRepository.removeActiveMember(
302+
userId, String.valueOf(storeId), reservationNumber
303+
);
304+
}
305+
286306
Reservation r = Reservation.builder()
287307
.reservationNumber(reservationNumber)
288308
.store(storeRepository.getReferenceById(storeId))

nowait-app-admin-api/src/test/java/com/nowait/applicationadmin/reservation/ReservationServiceTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727
import com.nowait.applicationadmin.reservation.dto.EntryStatusResponseDto;
2828
import com.nowait.applicationadmin.reservation.dto.WaitingUserResponse;
29-
import com.nowait.applicationadmin.reservation.repository.WaitingRedisRepository;
3029
import com.nowait.applicationadmin.reservation.service.ReservationService;
3130
import com.nowait.common.enums.ReservationStatus;
3231
import com.nowait.common.enums.Role;

nowait-app-admin-api/src/test/java/com/nowait/applicationadmin/reservation/WaitingRedisRepositoryTest.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.nowait.applicationadmin.reservation;
22

3-
import static org.assertj.core.api.Assertions.*;
43
import static org.mockito.BDDMockito.*;
54

65
import org.junit.jupiter.api.BeforeEach;
@@ -13,8 +12,6 @@
1312
import org.springframework.data.redis.core.StringRedisTemplate;
1413
import org.springframework.data.redis.core.ZSetOperations;
1514

16-
import com.nowait.applicationadmin.reservation.repository.WaitingRedisRepository;
17-
1815
public class WaitingRedisRepositoryTest {
1916
@Mock
2017
private StringRedisTemplate template;

nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/service/ReservationService.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import com.nowait.applicationuser.reservation.dto.ReservationCreateRequestDto;
2323
import com.nowait.applicationuser.reservation.dto.ReservationCreateResponseDto;
2424
import com.nowait.applicationuser.reservation.dto.WaitingResponseDto;
25-
import com.nowait.applicationuser.reservation.repository.WaitingPermitLuaRepository;
2625
import com.nowait.applicationuser.reservation.repository.WaitingUserRedisRepository;
2726
import com.nowait.common.enums.ReservationStatus;
2827
import com.nowait.common.enums.Role;
@@ -45,6 +44,7 @@
4544
import com.nowait.domaincorerdb.user.exception.UserNotFoundException;
4645
import com.nowait.domaincorerdb.user.repository.UserRepository;
4746
import com.nowait.domaincoreredis.common.util.RedisKeyUtils;
47+
import com.nowait.domaincoreredis.reservation.repository.WaitingPermitLuaRepository;
4848
import com.nowait.domainuserrdb.oauth.dto.CustomOAuth2User;
4949

5050
import lombok.RequiredArgsConstructor;
@@ -218,7 +218,6 @@ public boolean cancelWaiting(Long storeId, CustomOAuth2User customOAuth2User) {
218218
.build();
219219

220220
reservationRepository.save(reservation);
221-
222221
waitingPermitLuaRepository.removeActiveMember(userId, String.valueOf(storeId), reservationNumber);
223222
return true;
224223
// return removed;
@@ -232,6 +231,11 @@ public List<MyWaitingQueueDto> getAllMyWaitings(CustomOAuth2User customOAuth2Use
232231
if (members.isEmpty())
233232
return Collections.emptyList();
234233

234+
Map<Long, String> activeResIdByStore = members.stream()
235+
.map(m -> m.split(":", 2))
236+
.filter(a -> a.length == 2)
237+
.collect(Collectors.toMap(a -> Long.parseLong(a[0]), a -> a[1], (a, b) -> a));
238+
235239
// 1) 현재 SCAN 기반으로 얻어온 storeId 리스트
236240
// List<Long> storeIds = waitingUserRedisRepository.getUserWaitingStoreIds(userId);
237241
// if (storeIds.isEmpty())
@@ -298,6 +302,23 @@ public List<MyWaitingQueueDto> getAllMyWaitings(CustomOAuth2User customOAuth2Use
298302
String status = (String)it.next();
299303
String reservationId = (String)it.next();
300304

305+
306+
String activeReservationId = activeResIdByStore.get(storeId);
307+
// 유령 감지: 큐에 없음/번호 불일치/번호 null
308+
boolean zombie = (rankObj == null) || (reservationId == null) ||
309+
(activeReservationId != null && !activeReservationId.equals(reservationId));
310+
if (zombie) {
311+
try {
312+
String toRemove = (activeReservationId != null) ? activeReservationId
313+
: (reservationId != null ? reservationId : null);
314+
if (toRemove != null) {
315+
waitingPermitLuaRepository.removeActiveMember(userId, String.valueOf(storeId), toRemove);
316+
}
317+
} catch (Exception ignore) {}
318+
continue; // 목록에서 제외
319+
}
320+
321+
301322
int rank = (rankObj != null ? rankObj.intValue() + 1 : 0);
302323
int teamsAhead = (rankObj != null ? rankObj.intValue() : 0);
303324
int partySize = (partyStr != null ? Integer.parseInt(partyStr) : 0);

nowait-app-user-api/src/test/java/com/nowait/applicationuser/reservation/service/ReservationServiceConcurrencyTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727
import com.nowait.applicationuser.reservation.dto.ReservationCreateRequestDto;
2828
import com.nowait.applicationuser.reservation.dto.WaitingResponseDto;
29-
import com.nowait.applicationuser.reservation.repository.WaitingPermitLuaRepository;
3029
import com.nowait.applicationuser.reservation.repository.WaitingUserRedisRepository;
3130
import com.nowait.common.enums.Role;
3231
import com.nowait.domaincoreredis.common.util.RedisKeyUtils;
@@ -37,6 +36,7 @@
3736
import com.nowait.domaincorerdb.user.repository.UserRepository;
3837
import com.nowait.domaincorerdb.store.entity.Store;
3938
import com.nowait.domaincorerdb.user.entity.User;
39+
import com.nowait.domaincoreredis.reservation.repository.WaitingPermitLuaRepository;
4040
import com.nowait.domainuserrdb.oauth.dto.CustomOAuth2User;
4141
import com.redis.testcontainers.RedisContainer;
4242

nowait-app-user-api/src/test/java/com/nowait/applicationuser/reservation/service/ReservationServiceTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import com.nowait.applicationuser.reservation.dto.ReservationCreateRequestDto;
2424
import com.nowait.applicationuser.reservation.dto.ReservationCreateResponseDto;
2525
import com.nowait.applicationuser.reservation.dto.WaitingResponseDto;
26-
import com.nowait.applicationuser.reservation.repository.WaitingPermitLuaRepository;
2726
import com.nowait.applicationuser.reservation.repository.WaitingUserRedisRepository;
2827
import com.nowait.common.enums.ReservationStatus;
2928
import com.nowait.common.enums.Role;

nowait-app-user-api/src/test/java/com/nowait/applicationuser/reservation/service/WaitingPermitLuaRepositoryTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import org.testcontainers.junit.jupiter.Container;
1515
import org.testcontainers.junit.jupiter.Testcontainers;
1616

17-
import com.nowait.applicationuser.reservation.repository.WaitingPermitLuaRepository;
1817
import com.nowait.domaincoreredis.common.util.RedisKeyUtils;
1918

2019
@Testcontainers

nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/repository/WaitingPermitLuaRepository.java renamed to nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/reservation/repository/WaitingPermitLuaRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.nowait.applicationuser.reservation.repository;
1+
package com.nowait.domaincoreredis.reservation.repository;
22

33
import java.nio.charset.StandardCharsets;
44
import java.time.Duration;

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/repository/WaitingRedisRepository.java renamed to nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/reservation/repository/WaitingRedisRepository.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
package com.nowait.applicationadmin.reservation.repository;
1+
package com.nowait.domaincoreredis.reservation.repository;
22

33
import java.util.ArrayList;
4-
import java.util.Date;
54
import java.util.List;
65
import java.util.Set;
76

0 commit comments

Comments
 (0)