Skip to content

Commit e444d99

Browse files
authored
Merge pull request #175 from GTable/refactor/#174-waiting-refactoring
Refactor: 웨이팅 로직 버그 해결 및 로직 개선
2 parents b331d3e + 2c29716 commit e444d99

16 files changed

Lines changed: 607 additions & 182 deletions

File tree

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/controller/ReservationController.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,15 @@
88
import org.springframework.web.bind.annotation.GetMapping;
99
import org.springframework.web.bind.annotation.PatchMapping;
1010
import org.springframework.web.bind.annotation.PathVariable;
11-
import org.springframework.web.bind.annotation.PostMapping;
1211
import org.springframework.web.bind.annotation.RequestBody;
1312
import org.springframework.web.bind.annotation.RequestMapping;
1413
import org.springframework.web.bind.annotation.RestController;
1514

16-
import com.nowait.applicationadmin.reservation.dto.CallingWaitingResponseDto;
1715
import com.nowait.applicationadmin.reservation.dto.EntryStatusResponseDto;
1816
import com.nowait.applicationadmin.reservation.dto.ReservationStatusRequest;
1917
import com.nowait.applicationadmin.reservation.dto.WaitingUserResponse;
2018
import com.nowait.applicationadmin.reservation.service.ReservationService;
2119
import com.nowait.common.api.ApiUtils;
22-
import com.nowait.common.enums.ReservationStatus;
2320
import com.nowait.domaincorerdb.user.entity.MemberDetails;
2421

2522
import io.swagger.v3.oas.annotations.Operation;
@@ -40,7 +37,13 @@ public class ReservationController {
4037
@ApiResponse(responseCode = "200", description = "주점별 전체 대기 리스트 조회")
4138
public ResponseEntity<?> getWaitingUsersWithScore(@PathVariable Long storeId) {
4239
List<WaitingUserResponse> response = reservationService.getAllWaitingUserDetails(storeId);
43-
return ResponseEntity.ok(response);
40+
return ResponseEntity
41+
.ok()
42+
.body(
43+
ApiUtils.success(
44+
response
45+
)
46+
);
4447
}
4548

4649
@GetMapping("/admin/{storeId}/completed")
@@ -51,7 +54,13 @@ public ResponseEntity<?> getCompletedReservationList(
5154
@AuthenticationPrincipal MemberDetails memberDetails
5255
) {
5356
List<WaitingUserResponse> response = reservationService.getCompletedWaitingUserDetails(storeId);
54-
return ResponseEntity.ok(response);
57+
return ResponseEntity
58+
.ok()
59+
.body(
60+
ApiUtils.success(
61+
response
62+
)
63+
);
5564
}
5665

5766
// @PatchMapping("/admin/{storeId}/call/{userId}")

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/EntryStatusResponseDto.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import java.time.LocalDateTime;
44

5+
import com.nowait.common.enums.ReservationStatus;
6+
import com.nowait.domaincorerdb.reservation.entity.Reservation;
7+
58
import io.swagger.v3.oas.annotations.media.Schema;
69
import lombok.Builder;
710
import lombok.Getter;
@@ -11,7 +14,10 @@
1114
@Builder
1215
public class EntryStatusResponseDto {
1316
@Schema(description = "예약 ID", example = "1201")
14-
private String id; // reservationId
17+
private String reservationId; // reservationId
18+
19+
@Schema(description = "예약 번호", example = "23-240504-0001")
20+
private String reservationNumber;
1521

1622
@Schema(description = "유저 ID", example = "16")
1723
private String userId;
@@ -25,6 +31,15 @@ public class EntryStatusResponseDto {
2531
@Schema(description = "대기 등록 시각", example = "2025-07-22T16:00:00")
2632
private LocalDateTime createdAt;
2733

34+
@Schema(description = "호출 시각", example = "2025-07-22T16:00:00")
35+
private LocalDateTime calledAt; // 호출 시각
36+
37+
@Schema(description = "입장 완료 처리 시각", example = "2025-07-22T16:00:00")
38+
private LocalDateTime confirmedAt; // 완료 시각
39+
40+
@Schema(description = "웨이팅 취소 시각", example = "2025-07-22T16:00:00")
41+
private LocalDateTime cancelledAt; // 취소 시각
42+
2843
@Schema(description = "대기 상태", example = "CALLING")
2944
private String status;
3045

@@ -33,5 +48,26 @@ public class EntryStatusResponseDto {
3348

3449
@Schema(description = "호출 메시지", example = "호출 메시지")
3550
private String message;
51+
52+
public static EntryStatusResponseDto fromEntity(Reservation r) {
53+
return EntryStatusResponseDto.builder()
54+
.reservationId(r.getId().toString())
55+
.reservationNumber(r.getReservationNumber())
56+
.userId(r.getUser().getId().toString())
57+
.partySize(r.getPartySize())
58+
.userName(r.getUser().getNickname())
59+
.createdAt(r.getRequestedAt())
60+
.status(r.getStatus().name())
61+
.calledAt(r.getCalledAt())
62+
.confirmedAt(r.getConfirmedAt())
63+
.cancelledAt(r.getCancelledAt())
64+
.message(switch (r.getStatus()) {
65+
case CALLING -> r.getUser().getNickname() + "님을 호출하였습니다.";
66+
case CONFIRMED -> r.getUser().getNickname() + "님의 입장이 완료되었습니다.";
67+
case CANCELLED -> r.getUser().getNickname() + "님의 예약이 취소되었습니다.";
68+
default -> "";
69+
})
70+
.build();
71+
}
3672
}
3773

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/WaitingUserResponse.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
@Schema(description = "대기 사용자 응답 DTO")
1717
public class WaitingUserResponse {
1818

19-
@Schema(description = "예약 ID", example = "1201")
20-
private String id; // reservationId
19+
@Schema(description = "예약 ID", example = "16-20240201-0002")
20+
private String reservationNumber;
2121

2222
@Schema(description = "유저 ID", example = "16")
2323
private String userId;
@@ -39,12 +39,24 @@ public class WaitingUserResponse {
3939

4040
public static WaitingUserResponse fromEntity(Reservation reservation) {
4141
return WaitingUserResponse.builder()
42-
.id(reservation.getId().toString())
42+
.reservationNumber(reservation.getReservationNumber())
4343
.userId(reservation.getUser().getId().toString())
4444
.partySize(reservation.getPartySize())
4545
.userName(reservation.getUser().getNickname())
4646
.createdAt(reservation.getRequestedAt())
4747
.status(reservation.getStatus().name())
4848
.build();
4949
}
50+
51+
public static WaitingUserResponse fromRedis(String reservationId, String userId, Integer partySize, String userName, LocalDateTime createdAt, String status, Double score) {
52+
return WaitingUserResponse.builder()
53+
.reservationNumber(reservationId)
54+
.userId(userId)
55+
.partySize(partySize)
56+
.userName(userName)
57+
.createdAt(createdAt)
58+
.status(status)
59+
.score(score)
60+
.build();
61+
}
5062
}

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/repository/WaitingRedisRepository.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.nowait.applicationadmin.reservation.repository;
22

3-
import java.time.Duration;
43
import java.util.ArrayList;
4+
import java.util.Date;
55
import java.util.List;
66
import java.util.Set;
77

@@ -16,6 +16,7 @@
1616
@Repository
1717
@RequiredArgsConstructor
1818
public class WaitingRedisRepository {
19+
1920
private final StringRedisTemplate redisTemplate;
2021

2122
// 대기열 전체 인원수 조회
@@ -54,6 +55,19 @@ public Integer getWaitingPartySize(Long storeId, String userId) {
5455
return value == null ? null : Integer.valueOf(value.toString());
5556
}
5657

58+
// ReservationNumber 조회
59+
public String getReservationId(Long storeId, String userId) {
60+
String status = getWaitingStatus(storeId, userId);
61+
if (!"WAITING".equals(status) && !"CALLING".equals(status)) {
62+
// 이미 종료된 대기라면, 예약 번호도 없던 것처럼 취급
63+
return null;
64+
}
65+
String numberMapKey = RedisKeyUtils.buildReservationNumberKey(storeId);
66+
Object val = redisTemplate.opsForHash().get(numberMapKey, userId);
67+
68+
return val != null ? val.toString() : null;
69+
}
70+
5771
public void deleteWaiting(Long storeId, String userId) {
5872
String statusKey = RedisKeyUtils.buildWaitingStatusKeyPrefix() + storeId;
5973
redisTemplate.opsForHash().delete(statusKey, userId);
@@ -63,6 +77,26 @@ public void deleteWaiting(Long storeId, String userId) {
6377

6478
String partyKey = RedisKeyUtils.buildWaitingPartySizeKeyPrefix() + storeId;
6579
redisTemplate.opsForHash().delete(partyKey, userId);
80+
81+
String numberMapKey = RedisKeyUtils.buildReservationNumberKey(storeId);
82+
redisTemplate.opsForHash().delete(numberMapKey, userId);
83+
84+
String key = RedisKeyUtils.buildWaitingCalledAtKeyPrefix() + storeId;
85+
redisTemplate.opsForHash().delete(key, userId);
86+
}
87+
88+
// 호출 시각 기록
89+
public void setWaitingCalledAt(Long storeId, String userId, long timestamp) {
90+
String key = RedisKeyUtils.buildWaitingCalledAtKeyPrefix() + storeId;
91+
redisTemplate.opsForHash().put(key, userId, String.valueOf(timestamp));
92+
93+
redisTemplate.expireAt(key, RedisKeyUtils.expireAtNext03());
94+
}
95+
96+
public Long getWaitingCalledAt(Long storeId, String userId) {
97+
String key = RedisKeyUtils.buildWaitingCalledAtKeyPrefix() + storeId;
98+
Object val = redisTemplate.opsForHash().get(key, userId);
99+
return val == null ? null : Long.valueOf(val.toString());
66100
}
67101
}
68102

0 commit comments

Comments
 (0)