Skip to content

Commit d8132ac

Browse files
committed
refactor: 웨이팅 주점 정보 조회 로직 구현
1 parent 86d03ac commit d8132ac

7 files changed

Lines changed: 228 additions & 1 deletion

File tree

nowait-app-user-api/src/main/java/com/nowait/applicationuser/waiting/controller/WaitingController.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.nowait.applicationuser.waiting.controller;
22

3+
import java.util.List;
4+
35
import org.springframework.http.ResponseEntity;
46
import org.springframework.security.core.annotation.AuthenticationPrincipal;
57
import org.springframework.web.bind.annotation.DeleteMapping;
@@ -12,6 +14,7 @@
1214

1315
import com.nowait.applicationuser.waiting.dto.CancelWaitingRequest;
1416
import com.nowait.applicationuser.waiting.dto.CancelWaitingResponse;
17+
import com.nowait.applicationuser.waiting.dto.GetMyWaitingInfoResponse;
1518
import com.nowait.applicationuser.waiting.dto.GetWaitingSizeResponse;
1619
import com.nowait.applicationuser.waiting.dto.RegisterWaitingRequest;
1720
import com.nowait.applicationuser.waiting.dto.RegisterWaitingResponse;
@@ -34,6 +37,24 @@ public class WaitingController {
3437
/**
3538
* 대기열 리팩토링용 API
3639
*/
40+
@GetMapping()
41+
@Operation(summary = "대기열 리팩토링용 API", description = "전체 대기 목록 조회")
42+
public ResponseEntity<?> getMyWaitingInfo(
43+
@AuthenticationPrincipal CustomOAuth2User customOAuth2User
44+
) {
45+
List<GetMyWaitingInfoResponse> response = waitingService.getMyWaitingInfo(
46+
customOAuth2User
47+
);
48+
49+
return ResponseEntity
50+
.ok()
51+
.body(
52+
ApiUtils.success(
53+
response
54+
)
55+
);
56+
}
57+
3758
@PostMapping("/{publicCode}")
3859
@Operation(summary = "대기열 리팩토링용 API", description = "대기열 리팩토링용 API")
3960
public ResponseEntity<?> registerWaiting(
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.nowait.applicationuser.waiting.dto;
2+
3+
import java.time.LocalDateTime;
4+
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
8+
@Getter
9+
@Builder
10+
public class GetMyWaitingInfoResponse {
11+
private String reservationId;
12+
private Long storeId;
13+
private String storeName;
14+
private String departmentName;
15+
private Integer rank;
16+
private Integer teamsAhead;
17+
private Integer partySize;
18+
private String status;
19+
private LocalDateTime registeredAt;
20+
private String location;
21+
private String profileImageUrl;
22+
private String bannerImageUrl;
23+
}

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.time.LocalDateTime;
44
import java.time.format.DateTimeFormatter;
5+
import java.util.List;
56
import java.util.Optional;
67

78
import org.springframework.context.ApplicationEventPublisher;
@@ -10,6 +11,7 @@
1011

1112
import com.nowait.applicationuser.waiting.dto.CancelWaitingRequest;
1213
import com.nowait.applicationuser.waiting.dto.CancelWaitingResponse;
14+
import com.nowait.applicationuser.waiting.dto.GetMyWaitingInfoResponse;
1315
import com.nowait.applicationuser.waiting.dto.GetWaitingSizeResponse;
1416
import com.nowait.applicationuser.waiting.dto.RegisterWaitingRequest;
1517
import com.nowait.applicationuser.waiting.dto.RegisterWaitingResponse;
@@ -21,6 +23,7 @@
2123
import com.nowait.domaincorerdb.department.entity.Department;
2224
import com.nowait.domaincorerdb.department.exception.DepartmentNotFoundException;
2325
import com.nowait.domaincorerdb.department.repository.DepartmentRepository;
26+
import com.nowait.domaincorerdb.reservation.dto.GetMyWaitingBaseDto;
2427
import com.nowait.domaincorerdb.reservation.entity.Reservation;
2528
import com.nowait.domaincorerdb.reservation.exception.ReservationNotFoundException;
2629
import com.nowait.domaincorerdb.reservation.repository.ReservationRepository;
@@ -161,6 +164,38 @@ public CancelWaitingResponse cancelWaiting(CustomOAuth2User oAuth2User, String p
161164
return response;
162165
}
163166

167+
// 웨이팅 목록 조회
168+
public List<GetMyWaitingInfoResponse> getMyWaitingInfo(CustomOAuth2User oAuth2User) {
169+
User user = userRepository.findById(oAuth2User.getUserId())
170+
.orElseThrow(UserNotFoundException::new);
171+
172+
Long userId = user.getId();
173+
174+
List<GetMyWaitingBaseDto> waitingInfoList = reservationRepository.findMyWaitingInfo(userId);
175+
176+
return waitingInfoList.stream()
177+
.map(dto -> {
178+
Long storeId = dto.getStoreId();
179+
Long rank = waitingRedisRepository.getWaitingCount(storeId);
180+
181+
return GetMyWaitingInfoResponse.builder()
182+
.reservationId(dto.getReservationId())
183+
.storeId(dto.getStoreId())
184+
.storeName(dto.getStoreName())
185+
.departmentName(dto.getDepartmentName())
186+
.rank(rank.intValue())
187+
.teamsAhead(rank.intValue() - 1)
188+
.partySize(dto.getPartySize())
189+
.status(dto.getStatus().name())
190+
.registeredAt(dto.getRegisteredAt())
191+
.location(dto.getLocation())
192+
.profileImageUrl(dto.getProfileImageUrl())
193+
.bannerImageUrl(dto.getBannerImageUrl())
194+
.build();
195+
})
196+
.toList();
197+
}
198+
164199
// 현재 대기 인원 수 조회
165200
public GetWaitingSizeResponse getWaitingCount(CustomOAuth2User oAuth2User, String publicCode) {
166201

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.nowait.domaincorerdb.reservation.dto;
2+
3+
import java.time.LocalDateTime;
4+
import java.util.List;
5+
6+
import com.nowait.common.enums.ReservationStatus;
7+
import com.querydsl.core.annotations.QueryProjection;
8+
9+
import io.swagger.v3.oas.annotations.media.Schema;
10+
import lombok.Getter;
11+
12+
@Getter
13+
public class GetMyWaitingBaseDto {
14+
private final String reservationId;
15+
private final Long storeId;
16+
private final String storeName;
17+
private final String departmentName;
18+
private final Integer partySize;
19+
private final ReservationStatus status;
20+
private final LocalDateTime registeredAt;
21+
private final String location;
22+
private final String profileImageUrl;
23+
private final String bannerImageUrl;
24+
25+
@QueryProjection
26+
public GetMyWaitingBaseDto(
27+
String reservationId,
28+
Long storeId,
29+
String storeName,
30+
String departmentName,
31+
Integer partySize,
32+
ReservationStatus status,
33+
LocalDateTime registeredAt,
34+
String location,
35+
String profileImageUrl,
36+
String bannerImageUrl
37+
) {
38+
this.reservationId = reservationId;
39+
this.storeId = storeId;
40+
this.storeName = storeName;
41+
this.departmentName = departmentName;
42+
this.partySize = partySize;
43+
this.status = status;
44+
this.registeredAt = registeredAt;
45+
this.location = location;
46+
this.profileImageUrl = profileImageUrl == null ? "" : profileImageUrl;
47+
this.bannerImageUrl = bannerImageUrl == null ? "" : bannerImageUrl;
48+
}
49+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.nowait.domaincorerdb.reservation.repository;
2+
3+
import java.util.List;
4+
5+
import org.springframework.stereotype.Repository;
6+
7+
import com.nowait.domaincorerdb.reservation.dto.GetMyWaitingBaseDto;
8+
9+
@Repository
10+
public interface ReservationCustomRepository {
11+
List<GetMyWaitingBaseDto> findMyWaitingInfo(Long userId);
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.nowait.domaincorerdb.reservation.repository;
2+
3+
import java.time.LocalDate;
4+
import java.time.LocalDateTime;
5+
import java.time.LocalTime;
6+
import java.util.List;
7+
8+
import org.springframework.stereotype.Repository;
9+
10+
import com.nowait.common.enums.ReservationStatus;
11+
import com.nowait.domaincorerdb.department.entity.QDepartment;
12+
import com.nowait.domaincorerdb.reservation.dto.GetMyWaitingBaseDto;
13+
import com.nowait.domaincorerdb.reservation.dto.QGetMyWaitingBaseDto;
14+
import com.nowait.domaincorerdb.reservation.entity.QReservation;
15+
import com.nowait.domaincorerdb.store.entity.ImageType;
16+
import com.nowait.domaincorerdb.store.entity.QStore;
17+
import com.nowait.domaincorerdb.store.entity.QStoreImage;
18+
import com.nowait.domaincorerdb.user.entity.QUser;
19+
import com.querydsl.jpa.JPAExpressions;
20+
import com.querydsl.jpa.impl.JPAQueryFactory;
21+
22+
import lombok.RequiredArgsConstructor;
23+
24+
@Repository
25+
@RequiredArgsConstructor
26+
public class ReservationCustomRepositoryImpl implements ReservationCustomRepository {
27+
28+
private final JPAQueryFactory queryFactory;
29+
30+
private final QReservation reservation = QReservation.reservation;
31+
private final QStore store = QStore.store;
32+
private final QDepartment department = QDepartment.department;
33+
private final QUser user = QUser.user;
34+
private final QStoreImage storeImage = QStoreImage.storeImage;
35+
36+
37+
@Override
38+
public List<GetMyWaitingBaseDto> findMyWaitingInfo(Long userId) {
39+
40+
LocalDateTime startOfDay = LocalDate.now().atStartOfDay();
41+
LocalDateTime endOfDay = LocalDate.now().atTime(LocalTime.MAX);
42+
43+
QStoreImage subStoreImage = new QStoreImage("subStoreImage");
44+
45+
return queryFactory
46+
.select(new QGetMyWaitingBaseDto(
47+
reservation.reservationNumber,
48+
store.storeId,
49+
store.name,
50+
department.name,
51+
reservation.partySize,
52+
reservation.status,
53+
reservation.requestedAt,
54+
store.location,
55+
storeImage.imageUrl,
56+
57+
JPAExpressions
58+
.select(subStoreImage.imageUrl)
59+
.from(subStoreImage)
60+
.where(
61+
subStoreImage.store.storeId.eq(store.storeId),
62+
subStoreImage.imageType.eq(ImageType.BANNER)
63+
)
64+
.limit(1)
65+
))
66+
.from(reservation)
67+
.join(reservation.store, store)
68+
.join(reservation.user, user)
69+
.leftJoin(department)
70+
.on(store.departmentId.eq(department.id))
71+
.leftJoin(storeImage)
72+
.on(
73+
storeImage.store.storeId.eq(store.storeId),
74+
storeImage.imageType.eq(ImageType.PROFILE)
75+
)
76+
.where(
77+
reservation.user.id.eq(userId),
78+
reservation.status.in(
79+
ReservationStatus.WAITING,
80+
ReservationStatus.CALLING
81+
),
82+
reservation.requestedAt.between(startOfDay, endOfDay),
83+
store.deleted.isFalse()
84+
)
85+
.fetch();
86+
}
87+
}

nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import com.nowait.domaincorerdb.user.entity.User;
1414

1515
@Repository
16-
public interface ReservationRepository extends JpaRepository<Reservation, Long> {
16+
public interface ReservationRepository extends JpaRepository<Reservation, Long>, ReservationCustomRepository {
1717
List<Reservation> findAllByStore_StoreIdOrderByRequestedAtAsc(Long storeId);
1818

1919
boolean existsByUserAndStoreAndStatusIn(User user, Store store, List<ReservationStatus> statuses);

0 commit comments

Comments
 (0)