From 441cbed1d5925a1002741f56a21a27b62a1dfeac Mon Sep 17 00:00:00 2001 From: Seungwan Yoo Date: Sun, 6 Oct 2024 15:26:01 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=EC=A0=90=ED=8F=AC=20=EC=A1=B0=ED=9A=8C=203?= =?UTF-8?q?=EB=8B=A8=EA=B3=84=20=EA=B5=AC=EB=B6=84=20=EB=B0=8F=20=EC=84=B8?= =?UTF-8?q?=EB=B6=80=20=EA=B5=AC=ED=98=84=20-=201.=20=EC=A7=80=EB=8F=84?= =?UTF-8?q?=EC=83=81=20=EC=9E=90=EC=8B=A0=20=EC=A3=BC=EB=B3=80=EC=9D=98=20?= =?UTF-8?q?=EC=A0=90=ED=8F=AC=20=EC=A1=B0=ED=9A=8C=20(=EB=B6=81=EB=A7=88?= =?UTF-8?q?=ED=81=AC=20=EB=90=9C=20=EC=A0=90=ED=8F=AC=EB=8A=94=20=EB=B3=84?= =?UTF-8?q?=EB=8F=84=20=EC=95=84=EC=9D=B4=EC=BD=98=20=ED=91=9C=EC=8B=9C)?= =?UTF-8?q?=20-=202.=20=EC=A7=80=EB=8F=84=EC=83=81=20=EC=A0=90=ED=8F=AC=20?= =?UTF-8?q?=EB=A7=88=EC=BB=A4=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20=EA=B0=84?= =?UTF-8?q?=EB=9E=B5=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20(/api/sto?= =?UTF-8?q?re/{id}/summary)=20-=203.=20=EC=A0=90=ED=8F=AC=20=EC=84=B8?= =?UTF-8?q?=EB=B6=80=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/store/StoreController.java | 19 +++++---- .../dongyang/dongpo/domain/store/Store.java | 34 +++++++++++++--- .../dongpo/domain/store/StoreReview.java | 13 +++++-- .../dongyang/dongpo/dto/store/ReviewDto.java | 9 +++-- .../dongyang/dongpo/dto/store/StoreDto.java | 1 + .../dongpo/dto/store/StoreIndexDto.java | 8 ++++ .../bookmark/BookmarkRepository.java | 3 ++ .../service/bookmark/BookmarkService.java | 4 ++ .../service/store/StoreReviewService.java | 11 ++++++ .../dongpo/service/store/StoreService.java | 39 ++++++++++++++----- .../service/store/StoreServiceTest.java | 8 +++- 11 files changed, 119 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/dongyang/dongpo/controller/store/StoreController.java b/src/main/java/com/dongyang/dongpo/controller/store/StoreController.java index 5bc2003..97eccee 100644 --- a/src/main/java/com/dongyang/dongpo/controller/store/StoreController.java +++ b/src/main/java/com/dongyang/dongpo/controller/store/StoreController.java @@ -3,9 +3,7 @@ import com.dongyang.dongpo.apiresponse.ApiResponse; import com.dongyang.dongpo.domain.member.Member; import com.dongyang.dongpo.dto.location.LatLong; -import com.dongyang.dongpo.dto.store.StoreDto; -import com.dongyang.dongpo.dto.store.StoreRegisterDto; -import com.dongyang.dongpo.dto.store.StoreUpdateDto; +import com.dongyang.dongpo.dto.store.*; import com.dongyang.dongpo.service.store.StoreService; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; @@ -30,14 +28,21 @@ public class StoreController { @GetMapping("") @Operation(summary = "현재 위치 기준 주변 점포 조회") - public ResponseEntity>> getStoresByCurrentLocation(@ModelAttribute LatLong latLong) { - return ResponseEntity.ok(new ApiResponse<>(storeService.findStoresByCurrentLocation(latLong))); + public ResponseEntity>> getStoresByCurrentLocation(@ModelAttribute LatLong latLong, + @AuthenticationPrincipal Member member) { + return ResponseEntity.ok(new ApiResponse<>(storeService.findStoresByCurrentLocation(latLong, member))); + } + + @GetMapping("/{id}/summary") + @Operation(summary = "점포 간략 정보 조회") + public ResponseEntity> getStoreSummary(@PathVariable Long id, @AuthenticationPrincipal Member member) { + return ResponseEntity.ok(new ApiResponse<>(storeService.getStoreSummary(id, member))); } @GetMapping("/{id}") @Operation(summary = "점포 상세 조회") - public ResponseEntity> detailStore(@PathVariable Long id) throws Exception { - return ResponseEntity.ok(new ApiResponse<>(storeService.detailStore(id))); + public ResponseEntity> detailStore(@PathVariable Long id, @AuthenticationPrincipal Member member) { + return ResponseEntity.ok(new ApiResponse<>(storeService.detailStore(id, member))); } @PostMapping("") diff --git a/src/main/java/com/dongyang/dongpo/domain/store/Store.java b/src/main/java/com/dongyang/dongpo/domain/store/Store.java index 5285371..15dcd69 100644 --- a/src/main/java/com/dongyang/dongpo/domain/store/Store.java +++ b/src/main/java/com/dongyang/dongpo/domain/store/Store.java @@ -1,11 +1,7 @@ package com.dongyang.dongpo.domain.store; import com.dongyang.dongpo.domain.member.Member; -import com.dongyang.dongpo.dto.store.OpenPossibility; -import com.dongyang.dongpo.dto.store.ReviewDto; -import com.dongyang.dongpo.dto.store.StoreDto; -import com.dongyang.dongpo.dto.store.StoreIndexDto; -import com.dongyang.dongpo.dto.store.StoreUpdateDto; +import com.dongyang.dongpo.dto.store.*; import jakarta.persistence.*; import lombok.*; @@ -122,8 +118,33 @@ public StoreIndexDto toIndexResponse() { .registerDate(registerDate) .build(); } + + public StoreIndexDto toIndexResponse(OpenPossibility openPossibility, Boolean isBookmarked, List reviewPics) { + return StoreIndexDto.builder() + .id(id) + .name(name) + .address(address) + .registerDate(registerDate) + .status(status) + .openPossibility(openPossibility) + .isBookmarked(isBookmarked) + .reviewPics(reviewPics) + .build(); + } + + public StoreIndexDto toIndexResponse(Boolean isBookmarked, OpenPossibility openPossibility) { + return StoreIndexDto.builder() + .id(id) + .name(name) + .latitude(latitude) + .longitude(longitude) + .status(status) + .openPossibility(openPossibility) + .isBookmarked(isBookmarked) + .build(); + } - public StoreDto toResponse(OpenPossibility openPossibility) { + public StoreDto toResponse(OpenPossibility openPossibility, boolean isBookmarked) { List operatingDayValues = this.storeOperatingDays.stream() .map(StoreOperatingDay::getOperatingDay) .collect(Collectors.toList()); @@ -152,6 +173,7 @@ public StoreDto toResponse(OpenPossibility openPossibility) { .status(status) .reviews(reviewDtos) .openPossibility(openPossibility) + .isBookmarked(isBookmarked) .build(); } diff --git a/src/main/java/com/dongyang/dongpo/domain/store/StoreReview.java b/src/main/java/com/dongyang/dongpo/domain/store/StoreReview.java index 6a5a942..5669313 100644 --- a/src/main/java/com/dongyang/dongpo/domain/store/StoreReview.java +++ b/src/main/java/com/dongyang/dongpo/domain/store/StoreReview.java @@ -6,6 +6,8 @@ import lombok.*; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; @Entity @Getter @@ -31,9 +33,6 @@ public class StoreReview { @Column(columnDefinition = "TEXT") private String text; - @Column(length = 128) - private String reviewPic; - @Column(columnDefinition = "DATETIME DEFAULT CURRENT_TIMESTAMP") @Builder.Default private LocalDateTime registerDate = LocalDateTime.now(); @@ -49,11 +48,17 @@ public class StoreReview { @Builder.Default private Integer reportCount = 0; + @OneToMany(mappedBy = "reviewId", fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @Builder.Default + private List reviewPics = new ArrayList<>(); + public enum ReviewStatus { VISIBLE, HIDDEN, DELETED } public ReviewDto toResponse(){ + List reviewOnlyPic = reviewPics.stream().map(StoreReviewPic::getPicUrl).toList(); + return ReviewDto.builder() .id(id) .registerDate(registerDate) @@ -61,7 +66,7 @@ public ReviewDto toResponse(){ .text(text) .memberId(member.getId()) .storeId(store.getId()) - .reviewPic(reviewPic) + .reviewPics(reviewOnlyPic) .build(); } diff --git a/src/main/java/com/dongyang/dongpo/dto/store/ReviewDto.java b/src/main/java/com/dongyang/dongpo/dto/store/ReviewDto.java index 6a3a4f7..830b41a 100644 --- a/src/main/java/com/dongyang/dongpo/dto/store/ReviewDto.java +++ b/src/main/java/com/dongyang/dongpo/dto/store/ReviewDto.java @@ -3,6 +3,7 @@ import com.dongyang.dongpo.domain.member.Member; import com.dongyang.dongpo.domain.store.Store; import com.dongyang.dongpo.domain.store.StoreReview; +import com.dongyang.dongpo.domain.store.StoreReviewPic; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.AllArgsConstructor; import lombok.Builder; @@ -10,6 +11,7 @@ import lombok.NoArgsConstructor; import java.time.LocalDateTime; +import java.util.List; @Data @Builder @@ -22,7 +24,7 @@ public class ReviewDto { private Long memberId; private Integer reviewStar; private String text; - private String reviewPic; + private List reviewPics; private LocalDateTime registerDate; private StoreReview.ReviewStatus status; private Integer reportCount; @@ -33,19 +35,20 @@ public StoreReview toEntity(Store store, Member member){ .member(member) .store(store) .text(text) - .reviewPic(reviewPic) .reviewStar(reviewStar) .build(); } public static ReviewDto toDto(StoreReview storeReview){ + List picUrlList = storeReview.getReviewPics().stream().map(StoreReviewPic::getPicUrl).toList(); + return ReviewDto.builder() .id(storeReview.getId()) .storeId(storeReview.getStore().getId()) .memberId(storeReview.getMember().getId()) .reviewStar(storeReview.getReviewStar()) .text(storeReview.getText()) - .reviewPic(storeReview.getReviewPic()) + .reviewPics(picUrlList) .registerDate(storeReview.getRegisterDate()) .status(storeReview.getStatus()) .reportCount(storeReview.getReportCount()) diff --git a/src/main/java/com/dongyang/dongpo/dto/store/StoreDto.java b/src/main/java/com/dongyang/dongpo/dto/store/StoreDto.java index 20bad66..f7ca7d9 100644 --- a/src/main/java/com/dongyang/dongpo/dto/store/StoreDto.java +++ b/src/main/java/com/dongyang/dongpo/dto/store/StoreDto.java @@ -31,4 +31,5 @@ public class StoreDto { private List payMethods; private List reviews; private OpenPossibility openPossibility; + private Boolean isBookmarked; } diff --git a/src/main/java/com/dongyang/dongpo/dto/store/StoreIndexDto.java b/src/main/java/com/dongyang/dongpo/dto/store/StoreIndexDto.java index e89bee0..689bf7b 100644 --- a/src/main/java/com/dongyang/dongpo/dto/store/StoreIndexDto.java +++ b/src/main/java/com/dongyang/dongpo/dto/store/StoreIndexDto.java @@ -1,5 +1,6 @@ package com.dongyang.dongpo.dto.store; +import com.dongyang.dongpo.domain.store.Store; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.AllArgsConstructor; import lombok.Builder; @@ -7,6 +8,7 @@ import lombok.NoArgsConstructor; import java.time.LocalDateTime; +import java.util.List; @Data @Builder @@ -16,6 +18,12 @@ public class StoreIndexDto { private Long id; private String name; + private Double latitude; + private Double longitude; private String address; private LocalDateTime registerDate; + private Store.StoreStatus status; + private OpenPossibility openPossibility; + private Boolean isBookmarked; + private List reviewPics; } diff --git a/src/main/java/com/dongyang/dongpo/repository/bookmark/BookmarkRepository.java b/src/main/java/com/dongyang/dongpo/repository/bookmark/BookmarkRepository.java index 1f2da8e..7c6f8ea 100644 --- a/src/main/java/com/dongyang/dongpo/repository/bookmark/BookmarkRepository.java +++ b/src/main/java/com/dongyang/dongpo/repository/bookmark/BookmarkRepository.java @@ -2,6 +2,7 @@ import com.dongyang.dongpo.domain.member.Member; +import com.dongyang.dongpo.domain.store.Store; import com.dongyang.dongpo.domain.store.StoreBookmark; import org.springframework.data.jpa.repository.JpaRepository; @@ -11,4 +12,6 @@ public interface BookmarkRepository extends JpaRepository { List findByMemberId(Long id); List findByMember(Member member); + + boolean existsByStoreAndMember(Store store, Member member); } diff --git a/src/main/java/com/dongyang/dongpo/service/bookmark/BookmarkService.java b/src/main/java/com/dongyang/dongpo/service/bookmark/BookmarkService.java index d412248..befdce1 100644 --- a/src/main/java/com/dongyang/dongpo/service/bookmark/BookmarkService.java +++ b/src/main/java/com/dongyang/dongpo/service/bookmark/BookmarkService.java @@ -61,4 +61,8 @@ public void deleteBookmark(Long id, Member member) { bookmarkRepository.delete(bookmark); log.info("Member Id : {} is Delete Bookmark Id : {}", member.getId(), id); } + + public boolean isStoreBookmarkedByMember(Store store, Member member) { + return bookmarkRepository.existsByStoreAndMember(store, member); + } } diff --git a/src/main/java/com/dongyang/dongpo/service/store/StoreReviewService.java b/src/main/java/com/dongyang/dongpo/service/store/StoreReviewService.java index 964885f..7edbcd0 100644 --- a/src/main/java/com/dongyang/dongpo/service/store/StoreReviewService.java +++ b/src/main/java/com/dongyang/dongpo/service/store/StoreReviewService.java @@ -4,6 +4,7 @@ import com.dongyang.dongpo.domain.member.Title; import com.dongyang.dongpo.domain.store.Store; import com.dongyang.dongpo.domain.store.StoreReview; +import com.dongyang.dongpo.domain.store.StoreReviewPic; import com.dongyang.dongpo.dto.store.ReviewDto; import com.dongyang.dongpo.exception.CustomException; import com.dongyang.dongpo.exception.ErrorCode; @@ -17,6 +18,8 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; @Service @Transactional(readOnly = true) @@ -61,4 +64,12 @@ public ReviewDto findOne(Long id){ return review.toResponse(); } + + public List getReviewPicsByStoreId(Long id) { + return reviewRepository.findByStoreId(id).stream() + .flatMap(storeReview -> storeReview.getReviewPics().stream()) + .map(StoreReviewPic::getPicUrl) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/dongyang/dongpo/service/store/StoreService.java b/src/main/java/com/dongyang/dongpo/service/store/StoreService.java index c1486dc..437cd9d 100644 --- a/src/main/java/com/dongyang/dongpo/service/store/StoreService.java +++ b/src/main/java/com/dongyang/dongpo/service/store/StoreService.java @@ -5,6 +5,7 @@ import com.dongyang.dongpo.domain.store.Store; import com.dongyang.dongpo.domain.store.StoreOperatingDay; import com.dongyang.dongpo.domain.store.StorePayMethod; +import com.dongyang.dongpo.dto.bookmark.BookmarkDto; import com.dongyang.dongpo.dto.location.CoordinateRange; import com.dongyang.dongpo.dto.location.LatLong; import com.dongyang.dongpo.dto.store.*; @@ -13,6 +14,7 @@ import com.dongyang.dongpo.repository.store.StoreOperatingDayRepository; import com.dongyang.dongpo.repository.store.StorePayMethodRepository; import com.dongyang.dongpo.repository.store.StoreRepository; +import com.dongyang.dongpo.service.bookmark.BookmarkService; import com.dongyang.dongpo.service.location.LocationService; import com.dongyang.dongpo.service.open.OpenPossibilityService; import com.dongyang.dongpo.service.title.TitleService; @@ -24,6 +26,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -37,6 +40,8 @@ public class StoreService { private final LocationService locationService; private final TitleService titleService; private final OpenPossibilityService openPossibilityService; + private final BookmarkService bookmarkService; + private final StoreReviewService storeReviewService; @Transactional @@ -80,22 +85,38 @@ public List findAll() { return storeResponse; } - public List findStoresByCurrentLocation(LatLong latLong) { + public List findStoresByCurrentLocation(LatLong latLong, Member member) { CoordinateRange coordinateRange = locationService.calcCoordinateRangeByCurrentLocation(latLong); - List stores = new ArrayList<>(); - for (Store store : storeRepository.findStoresWithinRange(coordinateRange.getMinLat(), coordinateRange.getMaxLat(), - coordinateRange.getMinLong(), coordinateRange.getMaxLong()) - ) stores.add(store.toResponse()); - return stores; + List myBookmarks = bookmarkService.getMyBookmarks(member); + + return storeRepository.findStoresWithinRange(coordinateRange.getMinLat(), coordinateRange.getMaxLat(), + coordinateRange.getMinLong(), coordinateRange.getMaxLong()) + .stream() + .map(store -> { + boolean isBookmarked = myBookmarks.stream() + .anyMatch(bookmark -> store.getId().equals(bookmark.getStoreId())); + + return store.toIndexResponse(isBookmarked, openPossibilityService.getOpenPossibility(store)); + }) + .collect(Collectors.toList()); + } + + public StoreIndexDto getStoreSummary(Long id, Member member) { + Store store = storeRepository.findById(id) + .orElseThrow(() -> new CustomException(ErrorCode.STORE_NOT_FOUND)); + + return store.toIndexResponse(openPossibilityService.getOpenPossibility(store), + bookmarkService.isStoreBookmarkedByMember(store, member), + storeReviewService.getReviewPicsByStoreId(id)); } - public StoreDto detailStore(Long id) { + public StoreDto detailStore(Long id, Member member) { Store store = storeRepository.findById(id) .orElseThrow(() -> new CustomException(ErrorCode.STORE_NOT_FOUND)); - OpenPossibility openPossibility = openPossibilityService.getOpenPossibility(store); - return store.toResponse(openPossibility); + return store.toResponse(openPossibilityService.getOpenPossibility(store), + bookmarkService.isStoreBookmarkedByMember(store, member)); } @Transactional diff --git a/src/test/java/com/dongyang/dongpo/service/store/StoreServiceTest.java b/src/test/java/com/dongyang/dongpo/service/store/StoreServiceTest.java index 2e64634..1f03859 100644 --- a/src/test/java/com/dongyang/dongpo/service/store/StoreServiceTest.java +++ b/src/test/java/com/dongyang/dongpo/service/store/StoreServiceTest.java @@ -11,6 +11,7 @@ import com.dongyang.dongpo.repository.store.StoreOperatingDayRepository; import com.dongyang.dongpo.repository.store.StorePayMethodRepository; import com.dongyang.dongpo.repository.store.StoreRepository; +import com.dongyang.dongpo.service.bookmark.BookmarkService; import com.dongyang.dongpo.service.location.LocationService; import com.dongyang.dongpo.service.open.OpenPossibilityService; import org.junit.jupiter.api.DisplayName; @@ -49,6 +50,9 @@ class StoreServiceTest { @Mock private OpenPossibilityService openPossibilityService; + @Mock + private BookmarkService bookmarkService; + @Test @DisplayName("점포_등록") @@ -94,14 +98,16 @@ void findStoresByCurrentLocation() { void detailStore() { // given Store store = mock(Store.class); + Member member = mock(Member.class); Optional optionalStore = Optional.of(store); OpenPossibility openPossibility = mock(OpenPossibility.class); when(storeRepository.findById(any())).thenReturn(optionalStore); when(openPossibilityService.getOpenPossibility(any())).thenReturn(openPossibility); + when(bookmarkService.isStoreBookmarkedByMember(any(), any())).thenReturn(true); // when - storeService.detailStore(store.getId()); + storeService.detailStore(store.getId(), member); // then verify(storeRepository).findById(any()); From ebfd122c76311f264cd8bea424099c0c3aee9e47 Mon Sep 17 00:00:00 2001 From: Seungwan Yoo Date: Sun, 6 Oct 2024 18:36:27 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=EA=B0=84=EB=9E=B5=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/dongyang/dongpo/domain/store/Store.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/dongyang/dongpo/domain/store/Store.java b/src/main/java/com/dongyang/dongpo/domain/store/Store.java index 15dcd69..384f185 100644 --- a/src/main/java/com/dongyang/dongpo/domain/store/Store.java +++ b/src/main/java/com/dongyang/dongpo/domain/store/Store.java @@ -124,7 +124,6 @@ public StoreIndexDto toIndexResponse(OpenPossibility openPossibility, Boolean is .id(id) .name(name) .address(address) - .registerDate(registerDate) .status(status) .openPossibility(openPossibility) .isBookmarked(isBookmarked) From 34ed5071ce0ad0d7ef149c54215221e38b1869dd Mon Sep 17 00:00:00 2001 From: Seungwan Yoo Date: Sun, 6 Oct 2024 22:36:01 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=EC=A0=90=ED=8F=AC=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=88=98=EC=A0=95=20-=20=EC=B5=9C?= =?UTF-8?q?=EC=8B=A0=20=EB=A6=AC=EB=B7=B0=203=EA=B0=9C=EB=A7=8C=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20-=20=EB=A6=AC=EB=B7=B0=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=EC=9E=90=EC=9D=98=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=82=AC?= =?UTF-8?q?=EC=A7=84=20=EC=9D=91=EB=8B=B5=20=EC=B6=94=EA=B0=80=20-=20?= =?UTF-8?q?=EB=B0=A9=EB=AC=B8=20=EC=84=B1=EA=B3=B5,=20=EC=8B=A4=ED=8C=A8?= =?UTF-8?q?=20=ED=9A=9F=EC=88=98=20=EC=9D=91=EB=8B=B5=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20-=20=EC=BF=BC=EB=A6=AC=20=EC=B5=9C=EC=A0=81=ED=99=94=20?= =?UTF-8?q?=ED=95=84=EC=9A=94(=EC=A4=91=EC=9A=94...)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dongyang/dongpo/domain/store/Store.java | 16 ++++++++++++++++ .../dongpo/domain/store/StoreReview.java | 1 + .../com/dongyang/dongpo/dto/store/ReviewDto.java | 1 + .../com/dongyang/dongpo/dto/store/StoreDto.java | 2 ++ 4 files changed, 20 insertions(+) diff --git a/src/main/java/com/dongyang/dongpo/domain/store/Store.java b/src/main/java/com/dongyang/dongpo/domain/store/Store.java index 384f185..8243067 100644 --- a/src/main/java/com/dongyang/dongpo/domain/store/Store.java +++ b/src/main/java/com/dongyang/dongpo/domain/store/Store.java @@ -8,6 +8,7 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -66,6 +67,9 @@ public class Store { @Builder.Default private List reviews = new ArrayList<>(); + @OneToMany(mappedBy = "store", fetch = FetchType.LAZY, cascade = CascadeType.ALL) + private List storeVisitCerts = new ArrayList<>(); + public enum StoreStatus { ACTIVE, INACTIVE, HIDDEN, CLOSED } @@ -153,9 +157,19 @@ public StoreDto toResponse(OpenPossibility openPossibility, boolean isBookmarked .collect(Collectors.toList()); List reviewDtos = this.reviews.stream() + .sorted(Comparator.comparingLong(StoreReview::getId).reversed()) .map(StoreReview::toResponse) + .limit(3) .toList(); + Long visitSuccessfulCount = storeVisitCerts.stream() + .filter(StoreVisitCert::getIsVisitSuccessful) + .count(); + + Long visitFailCount = storeVisitCerts.stream() + .filter(cert -> !cert.getIsVisitSuccessful()) + .count(); + return StoreDto.builder() .id(id) .name(name) @@ -173,6 +187,8 @@ public StoreDto toResponse(OpenPossibility openPossibility, boolean isBookmarked .reviews(reviewDtos) .openPossibility(openPossibility) .isBookmarked(isBookmarked) + .visitSuccessfulCount(visitSuccessfulCount) + .visitFailCount(visitFailCount) .build(); } diff --git a/src/main/java/com/dongyang/dongpo/domain/store/StoreReview.java b/src/main/java/com/dongyang/dongpo/domain/store/StoreReview.java index 5669313..00aee80 100644 --- a/src/main/java/com/dongyang/dongpo/domain/store/StoreReview.java +++ b/src/main/java/com/dongyang/dongpo/domain/store/StoreReview.java @@ -65,6 +65,7 @@ public ReviewDto toResponse(){ .reviewStar(reviewStar) .text(text) .memberId(member.getId()) + .memberProfilePic(member.getProfilePic()) .storeId(store.getId()) .reviewPics(reviewOnlyPic) .build(); diff --git a/src/main/java/com/dongyang/dongpo/dto/store/ReviewDto.java b/src/main/java/com/dongyang/dongpo/dto/store/ReviewDto.java index 830b41a..1516669 100644 --- a/src/main/java/com/dongyang/dongpo/dto/store/ReviewDto.java +++ b/src/main/java/com/dongyang/dongpo/dto/store/ReviewDto.java @@ -22,6 +22,7 @@ public class ReviewDto { private Long id; private Long storeId; private Long memberId; + private String memberProfilePic; private Integer reviewStar; private String text; private List reviewPics; diff --git a/src/main/java/com/dongyang/dongpo/dto/store/StoreDto.java b/src/main/java/com/dongyang/dongpo/dto/store/StoreDto.java index f7ca7d9..6ae5f4d 100644 --- a/src/main/java/com/dongyang/dongpo/dto/store/StoreDto.java +++ b/src/main/java/com/dongyang/dongpo/dto/store/StoreDto.java @@ -32,4 +32,6 @@ public class StoreDto { private List reviews; private OpenPossibility openPossibility; private Boolean isBookmarked; + private Long visitSuccessfulCount; + private Long visitFailCount; }