From e1debac433c6b8a5bd9139e58fee06258169bc28 Mon Sep 17 00:00:00 2001 From: jeonghyemin Date: Fri, 25 Jul 2025 16:23:53 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix(Reservation):=EC=98=88=EC=95=BD=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 예약 상태 변경 시 날짜만 다른 객체 구분 가능하도록 수정 --- .../service/ReservationService.java | 20 +++++++++++++++---- .../controller/ReservationController.java | 2 -- .../repository/ReservationRepository.java | 4 ++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java index 5a168a9f..46c73dbb 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java @@ -1,6 +1,8 @@ package com.nowait.applicationadmin.reservation.service; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -150,7 +152,7 @@ public CallingWaitingResponseDto callWaiting(Long storeId, String userId, Member .orElse( Reservation.builder() .store(storeRepository.getReferenceById(storeId)) - .user(user) + .user(userRepository.findById(Long.valueOf(userId)).get()) .requestedAt(LocalDateTime.now()) .partySize(partySize) .build() @@ -174,11 +176,21 @@ public String processEntryStatus(Long storeId, String userId, MemberDetails memb throw new ReservationViewUnauthorizedException(); } // 1. DB status 업데이트 - Reservation reservation = reservationRepository.findByStore_StoreIdAndUserId(storeId, Long.valueOf(userId)) - .orElseThrow(() -> new IllegalArgumentException("해당 예약이 존재하지 않습니다.")); - reservation.updateStatus(status); + LocalDate today = LocalDate.now(); + LocalDateTime startOfDay = today.atStartOfDay(); + LocalDateTime endOfDay = today.atTime(LocalTime.MAX); + + Reservation reservation = reservationRepository + .findByStore_StoreIdAndUserIdAndRequestedAtBetween( + storeId, + Long.valueOf(userId), + startOfDay, + endOfDay + ) + .orElseThrow(() -> new IllegalArgumentException("오늘 날짜의 예약이 존재하지 않습니다.")); // 2. Redis에서 삭제 waitingRedisRepository.deleteWaiting(storeId, userId); + reservation.updateStatus(status); // 메시지 동적 반환 String action = (status == ReservationStatus.CONFIRMED) ? "입장 완료" : "입장 취소"; diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/controller/ReservationController.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/controller/ReservationController.java index 70899d83..10434638 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/controller/ReservationController.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/controller/ReservationController.java @@ -35,8 +35,6 @@ public class ReservationController { private final ReservationService reservationService; @PostMapping("/create/{storeId}") - @Operation(summary = "예약 생성", description = "특정 주점에 대한 예약하기 생성") - @ApiResponse(responseCode = "201", description = "예약 생성") public ResponseEntity create( @PathVariable Long storeId, @AuthenticationPrincipal CustomOAuth2User customOAuth2User, diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java index ec39267c..fb64426a 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java @@ -1,5 +1,6 @@ package com.nowait.domaincorerdb.reservation.repository; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -18,6 +19,9 @@ public interface ReservationRepository extends JpaRepository Optional findByStore_StoreIdAndUserId(Long storeId, Long userId); + Optional findByStore_StoreIdAndUserIdAndRequestedAtBetween(Long storeId, Long userId, LocalDateTime start, LocalDateTime end); + + List findAllByStore_StoreId(Long storeId); } From a2524b309acc9f66afdf1e85437ca229d4c7a938 Mon Sep 17 00:00:00 2001 From: jeonghyemin Date: Fri, 25 Jul 2025 17:36:41 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix(Reservation):=EC=98=88=EC=95=BD=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 예약 상태 변경 시 날짜만 다른 객체 구분 가능하도록 수정 --- .../controller/ReservationController.java | 33 ++-- .../dto/EntryStatusResponseDto.java | 37 +++++ .../service/ReservationService.java | 145 ++++++++++++------ .../repository/ReservationRepository.java | 7 + 4 files changed, 156 insertions(+), 66 deletions(-) create mode 100644 nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/EntryStatusResponseDto.java diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/controller/ReservationController.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/controller/ReservationController.java index d0925567..8e134c97 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/controller/ReservationController.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/controller/ReservationController.java @@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.RestController; import com.nowait.applicationadmin.reservation.dto.CallingWaitingResponseDto; +import com.nowait.applicationadmin.reservation.dto.EntryStatusResponseDto; import com.nowait.applicationadmin.reservation.dto.WaitingUserResponse; import com.nowait.applicationadmin.reservation.service.ReservationService; import com.nowait.common.api.ApiUtils; @@ -51,21 +52,21 @@ public ResponseEntity getCompletedReservationList( return ResponseEntity.ok(response); } - @PatchMapping("/admin/{storeId}/call/{userId}") - @Operation(summary = "예약팀 호출", description = "특정 예약에 대한 호출 진행(호출하는 순간 10분 타임어택)") - @ApiResponse(responseCode = "200", description = "예약팀 상태 변경 : WAITING -> CALLING") - public ResponseEntity callWaiting(@PathVariable Long storeId, - @PathVariable String userId, - @AuthenticationPrincipal MemberDetails memberDetails) { - CallingWaitingResponseDto response = reservationService.callWaiting(storeId, userId, memberDetails); - return ResponseEntity - .status(HttpStatus.OK) - .body( - ApiUtils.success( - response - ) - ); - } + // @PatchMapping("/admin/{storeId}/call/{userId}") + // @Operation(summary = "예약팀 호출", description = "특정 예약에 대한 호출 진행(호출하는 순간 10분 타임어택)") + // @ApiResponse(responseCode = "200", description = "예약팀 상태 변경 : WAITING -> CALLING") + // public ResponseEntity callWaiting(@PathVariable Long storeId, + // @PathVariable String userId, + // @AuthenticationPrincipal MemberDetails memberDetails) { + // CallingWaitingResponseDto response = reservationService.callWaiting(storeId, userId, memberDetails); + // return ResponseEntity + // .status(HttpStatus.OK) + // .body( + // ApiUtils.success( + // response + // ) + // ); + // } @PatchMapping("/admin/update/{storeId}/{userId}/{status}") @Operation(summary = "예약팀 상태 업데이트 처리", description = "특정 예약에 대한 입장 완료 처리") @ApiResponse(responseCode = "200", description = "예약팀 상태 변경 : CALLING -> CONFIRMED") @@ -75,7 +76,7 @@ public ResponseEntity updateEntry( @PathVariable ReservationStatus status, @AuthenticationPrincipal MemberDetails memberDetails ) { - String response = reservationService.processEntryStatus(storeId, userId, memberDetails,status); + EntryStatusResponseDto response = reservationService.processEntryStatus(storeId, userId, memberDetails,status); return ResponseEntity .status(HttpStatus.OK) .body( diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/EntryStatusResponseDto.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/EntryStatusResponseDto.java new file mode 100644 index 00000000..907b924b --- /dev/null +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/EntryStatusResponseDto.java @@ -0,0 +1,37 @@ +package com.nowait.applicationadmin.reservation.dto; + +import java.time.LocalDateTime; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Getter; + +// DTO: 호출 시각(calledAt) 또는 완료 메시지(message)를 선택적으로 담습니다. +@Getter +@Builder +public class EntryStatusResponseDto { + @Schema(description = "예약 ID", example = "1201") + private String id; // reservationId + + @Schema(description = "유저 ID", example = "16") + private String userId; + + @Schema(description = "파티 인원", example = "3") + private Integer partySize; + + @Schema(description = "사용자 이름(닉네임)", example = "혜민이") + private String userName; + + @Schema(description = "대기 등록 시각", example = "2025-07-22T16:00:00") + private LocalDateTime createdAt; + + @Schema(description = "대기 상태", example = "CALLING") + private String status; + + @Schema(description = "대기 순번/점수", example = "2.0") + private Double score; + + @Schema(description = "호출 메시지", example = "호출 메시지") + private String message; +} + diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java index 46c73dbb..1b887b28 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java @@ -13,6 +13,7 @@ import com.nowait.applicationadmin.reservation.dto.CallGetResponseDto; import com.nowait.applicationadmin.reservation.dto.CallingWaitingResponseDto; +import com.nowait.applicationadmin.reservation.dto.EntryStatusResponseDto; import com.nowait.applicationadmin.reservation.dto.ReservationGetResponseDto; import com.nowait.applicationadmin.reservation.dto.ReservationStatusSummaryDto; import com.nowait.applicationadmin.reservation.dto.ReservationStatusUpdateRequestDto; @@ -25,6 +26,7 @@ import com.nowait.domaincorerdb.reservation.exception.ReservationUpdateUnauthorizedException; import com.nowait.domaincorerdb.reservation.exception.ReservationViewUnauthorizedException; import com.nowait.domaincorerdb.reservation.repository.ReservationRepository; +import com.nowait.domaincorerdb.store.entity.Store; import com.nowait.domaincorerdb.store.repository.StoreRepository; import com.nowait.domaincorerdb.user.entity.MemberDetails; import com.nowait.domaincorerdb.user.entity.User; @@ -134,69 +136,112 @@ public List getCompletedWaitingUserDetails(Long storeId) { .toList(); } - // 대기 객체 호출 (WAITING -> CALLING) - @Transactional - public CallingWaitingResponseDto callWaiting(Long storeId, String userId, MemberDetails memberDetails) { - User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new); - if (!Role.SUPER_ADMIN.equals(user.getRole()) && !user.getStoreId().equals(storeId)) { - throw new ReservationViewUnauthorizedException(); - } - String status = waitingRedisRepository.getWaitingStatus(storeId, userId); - if (!"WAITING".equals(status)) { - throw new IllegalStateException("이미 호출되었거나 없는 예약입니다."); - } - Integer partySize = waitingRedisRepository.getWaitingPartySize(storeId, userId); - waitingRedisRepository.setWaitingStatus(storeId, userId, "CALLING"); - // [2] DB에 상태 영구 저장 (없으면 생성, 있으면 상태만 변경) - Reservation reservation = reservationRepository.findByStore_StoreIdAndUserId(storeId, Long.valueOf(userId)) - .orElse( - Reservation.builder() - .store(storeRepository.getReferenceById(storeId)) - .user(userRepository.findById(Long.valueOf(userId)).get()) - .requestedAt(LocalDateTime.now()) - .partySize(partySize) - .build() - ); - reservation.updateStatus(ReservationStatus.CALLING); // setter 대신 빌더로 새 객체 or withStatus 패턴 추천 - reservationRepository.save(reservation); - return CallingWaitingResponseDto.builder() - .storeId(storeId) - .userId(userId) - .status(reservation.getStatus().name()) - .calledAt(reservation.getRequestedAt()) - .build(); - } - // 대기 객체 상태 변경 - @Transactional - public String processEntryStatus(Long storeId, String userId, MemberDetails memberDetails, ReservationStatus status) { - // (권한 체크 필요시 여기에 추가) - User user = userRepository.findById(memberDetails.getId()) + + private User authorize(Long storeId, MemberDetails member) { + User u = userRepository.findById(member.getId()) .orElseThrow(UserNotFoundException::new); - if (!Role.SUPER_ADMIN.equals(user.getRole()) && !user.getStoreId().equals(storeId)) { + if (!Role.SUPER_ADMIN.equals(u.getRole()) && !storeId.equals(u.getStoreId())) { throw new ReservationViewUnauthorizedException(); } - // 1. DB status 업데이트 - LocalDate today = LocalDate.now(); - LocalDateTime startOfDay = today.atStartOfDay(); - LocalDateTime endOfDay = today.atTime(LocalTime.MAX); + return u; + } + + // 공통: 오늘 날짜 예약 조회 + private Reservation findTodayReservation(Long storeId, String userId) { + LocalDateTime startOfDay = LocalDate.now().atStartOfDay(); + LocalDateTime endOfDay = LocalDate.now().atTime(LocalTime.MAX); - Reservation reservation = reservationRepository - .findByStore_StoreIdAndUserIdAndRequestedAtBetween( + return reservationRepository + .findByStore_StoreIdAndUserIdAndStatusInAndRequestedAtBetween( storeId, Long.valueOf(userId), + List.of(ReservationStatus.WAITING, ReservationStatus.CALLING), startOfDay, endOfDay ) .orElseThrow(() -> new IllegalArgumentException("오늘 날짜의 예약이 존재하지 않습니다.")); - // 2. Redis에서 삭제 - waitingRedisRepository.deleteWaiting(storeId, userId); - reservation.updateStatus(status); + } + + /** + * 상태를 하나의 메서드에서 처리합니다. + * - CALLING : Redis 상태를 CALLING으로 변경 → DB 저장 → calledAt 반환 + * - CONFIRMED : Redis에서 삭제 → DB 저장 → 완료 메시지 반환 + * - CANCELLED : Redis에서 삭제 → DB 저장 → 취소 메시지 반환 + */ + @Transactional + public EntryStatusResponseDto processEntryStatus( + Long storeId, + String userId, + MemberDetails member, + ReservationStatus newStatus + ) { + User manager = authorize(storeId, member); + User user = userRepository.findById(Long.valueOf(userId)).orElseThrow(UserNotFoundException::new); + + String message = null; + Reservation reservation; + + switch (newStatus) { + case CALLING: + // 1) Redis 상태 검사 & 변경 + String curr = waitingRedisRepository.getWaitingStatus(storeId, userId); + if (!ReservationStatus.WAITING.name().equals(curr)) { + throw new IllegalStateException("이미 호출되었거나 없는 예약입니다."); + } + waitingRedisRepository.setWaitingStatus(storeId, userId, ReservationStatus.CALLING.name()); - // 메시지 동적 반환 - String action = (status == ReservationStatus.CONFIRMED) ? "입장 완료" : "입장 취소"; - return user.getNickname() + "님의 예약이 " + action + " 처리되었습니다."; + // 2) 파티 인원, 호출 시각 + Integer partySize = waitingRedisRepository.getWaitingPartySize(storeId, userId); + LocalDateTime now = LocalDateTime.now(); + + // 3) DB에 무조건 새로 저장 + Store store = storeRepository.getReferenceById(storeId); + reservation = Reservation.builder() + .store(store) + .user(user) + .partySize(partySize) + .requestedAt(now) + .status(ReservationStatus.CALLING) + .build(); + reservationRepository.save(reservation); + + break; + + case CONFIRMED: + case CANCELLED: + // 1) Redis에서 제거 + waitingRedisRepository.deleteWaiting(storeId, userId); + + // 2) 오늘 날짜 예약 조회 & 상태 변경 + reservation = findTodayReservation(storeId, userId); + reservation.updateStatus(newStatus); + reservationRepository.save(reservation); + + // 3) 완료/취소 메시지 + message = String.format( + "%s님의 예약이 %s 처리되었습니다.", + user.getNickname(), + newStatus == ReservationStatus.CONFIRMED ? "입장 완료" : "입장 취소" + ); + break; + + default: + throw new IllegalArgumentException("지원하지 않는 상태입니다: " + newStatus); + } + + // 5) 공통 DTO 반환 + return EntryStatusResponseDto.builder() + .id( reservation.getId().toString()) + .userId( userId) + .partySize( reservation.getPartySize()) + .userName( user.getNickname()) + .createdAt( reservation.getRequestedAt()) + .status( reservation.getStatus().name()) + .message( message) + .build(); } + } diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java index fb64426a..b3f167af 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java @@ -21,6 +21,13 @@ public interface ReservationRepository extends JpaRepository Optional findByStore_StoreIdAndUserIdAndRequestedAtBetween(Long storeId, Long userId, LocalDateTime start, LocalDateTime end); + Optional findByStore_StoreIdAndUserIdAndStatusInAndRequestedAtBetween( + Long storeId, + Long userId, + List statuses, + LocalDateTime start, + LocalDateTime end + ); List findAllByStore_StoreId(Long storeId); From 5d2d29f63160354c62c8d0649ff658fd5cea9f6f Mon Sep 17 00:00:00 2001 From: jeonghyemin Date: Fri, 25 Jul 2025 18:00:19 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat(Store):=EC=8A=A4=ED=86=A0=EC=96=B4=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20=EB=B6=81?= =?UTF-8?q?=EB=A7=88=ED=81=AC=EC=97=AC=EB=B6=80=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/controller/StoreController.java | 6 ++-- .../store/dto/StorePageReadDto.java | 32 +++++++++++++++++++ .../store/service/StoreService.java | 3 +- .../store/service/StoreServiceImpl.java | 20 +++++++++--- 4 files changed, 54 insertions(+), 7 deletions(-) diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java index 40be962e..e092e31e 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java @@ -3,6 +3,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -12,6 +13,7 @@ import com.nowait.applicationuser.store.dto.StoreWaitingInfo; import com.nowait.applicationuser.store.service.StoreService; import com.nowait.common.api.ApiUtils; +import com.nowait.domainuserrdb.oauth.dto.CustomOAuth2User; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -48,12 +50,12 @@ public ResponseEntity getAllStoresByPageAndDeparments(Pageable pageable) { @GetMapping("/{storeId}") @Operation(summary = "주점 ID로 주점 상세 조회", description = "특정 주점을 ID로 조회합니다.") @ApiResponse(responseCode = "200", description = "주점 상세 조회 성공") - public ResponseEntity getStoreById(@PathVariable Long storeId) { + public ResponseEntity getStoreById(@PathVariable Long storeId, @AuthenticationPrincipal CustomOAuth2User customOAuth2User) { return ResponseEntity .status(HttpStatus.OK) .body( ApiUtils.success( - storeService.getStoreByStoreId(storeId) + storeService.getStoreByStoreId(storeId, customOAuth2User) ) ); } diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StorePageReadDto.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StorePageReadDto.java index 29cd7194..2d25e23e 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StorePageReadDto.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StorePageReadDto.java @@ -26,6 +26,7 @@ public class StorePageReadDto { private Boolean isActive; private Boolean deleted; private LocalDateTime createdAt; + private Boolean isBookmarked; public static StorePageReadDto fromEntity(Store store, List allImages, String departmentName, Long waitingCount) { @@ -51,6 +52,37 @@ public static StorePageReadDto fromEntity(Store store, List allImages, String departmentName, Long waitingCount, Boolean isBookmarked + ) { + + StoreImageUploadResponse profile = allImages.stream() + .filter(image -> image.getImageType() == ImageType.PROFILE) + .findFirst() + .orElse(null); + + List banners = allImages.stream() + .filter(image -> image.getImageType() == ImageType.BANNER) + .toList(); + + return StorePageReadDto.builder() + .createdAt(store.getCreatedAt()) + .storeId(store.getStoreId()) + .waitingCount(waitingCount) + .departmentId(store.getDepartmentId()) + .departmentName(departmentName) + .name(store.getName()) + .location(store.getLocation()) + .description(store.getDescription()) + .isActive(store.getIsActive()) + .deleted(store.getDeleted()) + .profileImage(profile) + .bannerImages(banners) + .isBookmarked(isBookmarked) .build(); } } diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java index 35588fce..772d0e74 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java @@ -9,12 +9,13 @@ import com.nowait.applicationuser.store.dto.StoreReadDto; import com.nowait.applicationuser.store.dto.StoreReadResponse; import com.nowait.applicationuser.store.dto.StoreWaitingInfo; +import com.nowait.domainuserrdb.oauth.dto.CustomOAuth2User; public interface StoreService { StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable pageable); - StorePageReadDto getStoreByStoreId(Long storeId); + StorePageReadDto getStoreByStoreId(Long storeId, CustomOAuth2User customOAuth2User); List searchByKeywordNative(String name); diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java index d2e9a51e..08eb23bb 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java @@ -5,7 +5,6 @@ import java.util.Comparator; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -17,6 +16,7 @@ import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.ScanOptions; import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -33,7 +33,12 @@ import com.nowait.domaincorerdb.store.exception.StoreParamEmptyException; import com.nowait.domaincorerdb.store.repository.StoreImageRepository; import com.nowait.domaincorerdb.store.repository.StoreRepository; +import com.nowait.domaincorerdb.user.entity.User; +import com.nowait.domaincorerdb.user.exception.UserNotFoundException; +import com.nowait.domaincorerdb.user.repository.UserRepository; import com.nowait.domaincoreredis.common.util.RedisKeyUtils; +import com.nowait.domainuserrdb.bookmark.repository.BookmarkRepository; +import com.nowait.domainuserrdb.oauth.dto.CustomOAuth2User; import lombok.RequiredArgsConstructor; @@ -45,7 +50,8 @@ public class StoreServiceImpl implements StoreService { private final StoreImageRepository storeImageRepository; private final DepartmentRepository departmentRepository; private final StringRedisTemplate redisTemplate; - + private final BookmarkRepository bookmarkRepository; + private final UserRepository userRepository; @Override @Transactional(readOnly = true) @@ -115,8 +121,10 @@ public StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable page @Override @Transactional(readOnly = true) - public StorePageReadDto getStoreByStoreId(Long storeId) { + public StorePageReadDto getStoreByStoreId(Long storeId, CustomOAuth2User customOAuth2User) { if (storeId == null) throw new StoreParamEmptyException(); + User user = userRepository.findById(customOAuth2User.getUserId()) + .orElseThrow(UserNotFoundException::new); Store store = storeRepository.findByStoreIdAndDeletedFalse(storeId) .orElseThrow(StoreNotFoundException::new); @@ -139,7 +147,11 @@ public StorePageReadDto getStoreByStoreId(Long storeId) { .map(StoreImageUploadResponse::fromEntity) .toList(); - return StorePageReadDto.fromEntity(store, imageDto, departmentName, waitingSize); + if (bookmarkRepository.existsByUserAndStore(user, store)) { + return StorePageReadDto.fromEntityWithBookmark(store, imageDto, departmentName, waitingSize, true); + } else { + return StorePageReadDto.fromEntity(store, imageDto, departmentName, waitingSize); + } } @Override