From 39b85601c12729f0d018893f292e675e1e3ade32 Mon Sep 17 00:00:00 2001 From: JSoi Date: Tue, 19 Jul 2022 02:08:54 +0900 Subject: [PATCH] =?UTF-8?q?#18=20[Refactor]=20Controller=20=EB=B0=8F=20DTO?= =?UTF-8?q?=20=EB=B3=91=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/controller/StoreController.java | 17 +- .../controller/StoreDetailController.java | 28 ---- .../mpnp/baechelin/store/domain/Store.java | 7 +- .../store/dto/StoreCardResponseDto.java | 4 +- .../baechelin/store/dto/StoreResponseDto.java | 63 -------- .../store/service/StoreDetailService.java | 92 ----------- .../baechelin/store/service/StoreService.java | 149 +++++++++++------- 7 files changed, 111 insertions(+), 249 deletions(-) delete mode 100644 src/main/java/com/mpnp/baechelin/store/controller/StoreDetailController.java delete mode 100644 src/main/java/com/mpnp/baechelin/store/dto/StoreResponseDto.java delete mode 100644 src/main/java/com/mpnp/baechelin/store/service/StoreDetailService.java diff --git a/src/main/java/com/mpnp/baechelin/store/controller/StoreController.java b/src/main/java/com/mpnp/baechelin/store/controller/StoreController.java index 346c28b..95b16e5 100644 --- a/src/main/java/com/mpnp/baechelin/store/controller/StoreController.java +++ b/src/main/java/com/mpnp/baechelin/store/controller/StoreController.java @@ -1,10 +1,7 @@ package com.mpnp.baechelin.store.controller; -import com.mpnp.baechelin.store.domain.Store; import com.mpnp.baechelin.store.dto.StoreCardResponseDto; import com.mpnp.baechelin.store.dto.StorePagedResponseDto; -import com.mpnp.baechelin.store.dto.StoreResponseDto; -import com.mpnp.baechelin.store.repository.StoreQueryRepository; import com.mpnp.baechelin.store.service.StoreService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -13,14 +10,10 @@ import org.springframework.data.web.PageableDefault; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.User; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.util.List; -import java.util.stream.Collectors; @Api(tags = {"매장 리스트를 반환하는 Controller"}) @RestController @@ -69,4 +62,12 @@ public List getStoreInRangeHighBookmark(@RequestParam(requ @AuthenticationPrincipal User user) { return storeService.getStoreInRangeHighBookmark(lat, lng, category, facility, limit, user == null ? null : user.getUsername()); } + + @ApiOperation(value = "업장 상세정보를 조회하는 메소드") + @GetMapping("/detail/{storeId}") + public StoreCardResponseDto getStore( + @PathVariable(required = false) int storeId, + @AuthenticationPrincipal User user) { + return storeService.getStore(storeId, user.getUsername()); + } } \ No newline at end of file diff --git a/src/main/java/com/mpnp/baechelin/store/controller/StoreDetailController.java b/src/main/java/com/mpnp/baechelin/store/controller/StoreDetailController.java deleted file mode 100644 index e976549..0000000 --- a/src/main/java/com/mpnp/baechelin/store/controller/StoreDetailController.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.mpnp.baechelin.store.controller; - -import com.mpnp.baechelin.store.dto.StoreResponseDto; -import com.mpnp.baechelin.store.service.StoreDetailService; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.security.core.userdetails.User; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/store") -public class StoreDetailController { - - private final StoreDetailService storeDetailService; - - @ApiOperation(value = "업장 상세정보를 조회하는 메소드") - @GetMapping("/detail/{storeId}") - public StoreResponseDto getStore( - @PathVariable(required = false) int storeId, - @AuthenticationPrincipal User user) { - return storeDetailService.getStore(storeId, user); - } -} diff --git a/src/main/java/com/mpnp/baechelin/store/domain/Store.java b/src/main/java/com/mpnp/baechelin/store/domain/Store.java index ea13851..2a85e65 100644 --- a/src/main/java/com/mpnp/baechelin/store/domain/Store.java +++ b/src/main/java/com/mpnp/baechelin/store/domain/Store.java @@ -1,6 +1,7 @@ package com.mpnp.baechelin.store.domain; import com.mpnp.baechelin.api.dto.PublicApiResponseDto; +import com.mpnp.baechelin.api.model.PublicApiForm; import com.mpnp.baechelin.bookmark.domain.Bookmark; import com.mpnp.baechelin.review.domain.Review; import lombok.*; @@ -108,6 +109,10 @@ public Store updatePointAvg(double changePoint){ return this; } - + public Store publicApiAndTagToStore(PublicApiForm.ServList servList, List barrierTagList) { + // TagList 매핑 및 생성 + // Store 매핑 및 생성 + return null; + } } \ No newline at end of file diff --git a/src/main/java/com/mpnp/baechelin/store/dto/StoreCardResponseDto.java b/src/main/java/com/mpnp/baechelin/store/dto/StoreCardResponseDto.java index 0d55157..ecf3321 100644 --- a/src/main/java/com/mpnp/baechelin/store/dto/StoreCardResponseDto.java +++ b/src/main/java/com/mpnp/baechelin/store/dto/StoreCardResponseDto.java @@ -31,7 +31,7 @@ public class StoreCardResponseDto implements Comparable { private String approach; private List storeImgList; private int bookmarkCount; - private boolean bookmark; + private String bookmark; @Builder.Default private double pointAvg = 0.0; @@ -51,7 +51,7 @@ public int compareTo(StoreCardResponseDto sad) { } - public StoreCardResponseDto(Store store, boolean isBookMark) { + public StoreCardResponseDto(Store store, String isBookMark) { this.storeId = store.getId(); this.category = store.getCategory(); this.name = store.getName(); diff --git a/src/main/java/com/mpnp/baechelin/store/dto/StoreResponseDto.java b/src/main/java/com/mpnp/baechelin/store/dto/StoreResponseDto.java deleted file mode 100644 index f4072ec..0000000 --- a/src/main/java/com/mpnp/baechelin/store/dto/StoreResponseDto.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.mpnp.baechelin.store.dto; - -import com.mpnp.baechelin.review.dto.ReviewResponseDto; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.math.BigDecimal; -import java.util.List; - -@Getter -@NoArgsConstructor -public class StoreResponseDto { - private int storeId; - private String category; - private String name; - private BigDecimal latitude; - private BigDecimal longitude; - private String address; - private String elevator; - private String toilet; - private String parking; - private String heightDifferent; - private String approach; - private String phoneNumber; - private List storeImgList; - private double pointAvg; - private String IsBookmark; - - @Builder - public StoreResponseDto( - int storeId, - String category, - String name, - BigDecimal latitude, - BigDecimal longitude, - String address, - String elevator, - String toilet, - String parking, - String phoneNumber, - String heightDifferent, - String approach, - List storeImgList, - double pointAvg, - String IsBookmark) { - this.storeId = storeId; - this.category = category; - this.name = name; - this.latitude = latitude; - this.longitude = longitude; - this.address = address; - this.elevator = elevator; - this.toilet = toilet; - this.parking = parking; - this.phoneNumber = phoneNumber; - this.heightDifferent = heightDifferent; - this.approach = approach; - this.storeImgList = storeImgList; - this.pointAvg = pointAvg; - this.IsBookmark = IsBookmark; - } -} diff --git a/src/main/java/com/mpnp/baechelin/store/service/StoreDetailService.java b/src/main/java/com/mpnp/baechelin/store/service/StoreDetailService.java deleted file mode 100644 index 599a4f9..0000000 --- a/src/main/java/com/mpnp/baechelin/store/service/StoreDetailService.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.mpnp.baechelin.store.service; - -import com.mpnp.baechelin.bookmark.domain.Bookmark; -import com.mpnp.baechelin.review.domain.Review; -import com.mpnp.baechelin.review.dto.ReviewResponseDto; -import com.mpnp.baechelin.store.domain.Store; -import com.mpnp.baechelin.store.domain.StoreImage; -import com.mpnp.baechelin.store.dto.StoreImgResponseDto; -import com.mpnp.baechelin.store.dto.StoreResponseDto; -import com.mpnp.baechelin.store.repository.StoreRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.security.core.userdetails.User; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -@Service -@RequiredArgsConstructor -@Transactional -public class StoreDetailService { - - private final StoreRepository storeRepository; - - /** - * 업장 상세 조회 - * @param storeId - * @param user - * @return - */ - public StoreResponseDto getStore(int storeId, User user) { - Store foundStore = storeRepository.findById(storeId).orElseThrow(() -> new IllegalArgumentException("해당하는 업장이 존재하지 않습니다.")); - - return storeToResDto(foundStore, user); - } - - public StoreResponseDto storeToResDto(Store store, User user) { - // StoreImage entity -> dto - List storeImageList = new ArrayList<>(); - for (StoreImage storeImage : store.getStoreImageList()) { - StoreImgResponseDto storeImgResponse = new StoreImgResponseDto(storeImage.getStoreImageUrl()); - storeImageList.add(storeImgResponse); - } - - List reviewList = store.getReviewList(); - - double totalPoint = 0; - double pointAvg; - if (reviewList.size() > 0) { - for (Review review : reviewList) { - totalPoint += review.getPoint(); - } - // 소숫점 첫째자리 수까지 별점 평균 구하기 - pointAvg = Double.parseDouble(String.format("%.1f", totalPoint / reviewList.size())); - } else { - // review가 없다면 별점 평균 0 - pointAvg = 0; - } - - // TODO 북마크 여부 가져오기 - String isBookmark = "N"; - for (Bookmark bookmark : store.getBookmarkList()) { - if (user == null) { - isBookmark = "N"; - } else { - if (bookmark.getStoreId().getId() == store.getId() - && bookmark.getUserId().getSocialId().equals(user.getUsername())) { - isBookmark = "Y"; - } - } - } - return StoreResponseDto.builder() - .storeId(store.getId()) - .category(store.getCategory()) - .name(store.getName()) - .latitude(store.getLatitude()) - .longitude(store.getLongitude()) - .address(store.getAddress()) - .elevator(store.getElevator()) - .toilet(store.getToilet()) - .parking(store.getParking()) - .phoneNumber(store.getPhoneNumber()) - .heightDifferent(store.getHeightDifferent()) - .approach(store.getApproach()) - .storeImgList(storeImageList) - .pointAvg(pointAvg) - .IsBookmark(isBookmark) - .build(); - } - -} diff --git a/src/main/java/com/mpnp/baechelin/store/service/StoreService.java b/src/main/java/com/mpnp/baechelin/store/service/StoreService.java index 2a36d0e..24d6392 100644 --- a/src/main/java/com/mpnp/baechelin/store/service/StoreService.java +++ b/src/main/java/com/mpnp/baechelin/store/service/StoreService.java @@ -1,13 +1,15 @@ package com.mpnp.baechelin.store.service; +import com.mpnp.baechelin.bookmark.domain.Bookmark; import com.mpnp.baechelin.bookmark.repository.BookmarkRepository; import com.mpnp.baechelin.config.QuerydslLocation; import com.mpnp.baechelin.review.domain.Review; import com.mpnp.baechelin.review.repository.ReviewRepository; import com.mpnp.baechelin.store.domain.Store; +import com.mpnp.baechelin.store.domain.StoreImage; import com.mpnp.baechelin.store.dto.StoreCardResponseDto; +import com.mpnp.baechelin.store.dto.StoreImgResponseDto; import com.mpnp.baechelin.store.dto.StorePagedResponseDto; -import com.mpnp.baechelin.store.dto.StoreResponseDto; import com.mpnp.baechelin.store.repository.StoreQueryRepository; import com.mpnp.baechelin.store.repository.StoreRepository; import com.mpnp.baechelin.user.domain.User; @@ -34,52 +36,19 @@ public class StoreService { private final UserRepository userRepository; private final BookmarkRepository bookmarkRepository; - public List getStoreList() { - List storeList = storeRepository.findAll(); - - List storeResponseList = new ArrayList<>(); - - for (Store store : storeList) { - storeResponseList.add(storeToResDto(store)); - } - - return storeResponseList; - } - - public StoreResponseDto storeToResDto(Store store) { - List reviewList = reviewRepository.findAllByStoreId(store); - - double totalPoint = 0; - - double pointAvg = 0; - if (reviewList.size() > 0) { - for (Review review : reviewList) { - totalPoint += review.getPoint(); - } - - pointAvg = Double.parseDouble(String.format("%.1f", totalPoint / reviewList.size())); - } else { - pointAvg = 0; - } - - return StoreResponseDto.builder() - .storeId(store.getId()) - .category(store.getCategory()) - .name(store.getName()) - .latitude(store.getLatitude()) - .longitude(store.getLongitude()) - .address(store.getAddress()) - .elevator(store.getElevator()) - .toilet(store.getToilet()) - .parking(store.getParking()) - .phoneNumber(store.getPhoneNumber()) - .heightDifferent(store.getHeightDifferent()) - .approach(store.getApproach()) - .storeImgList(null) - .pointAvg(pointAvg) - .build(); - } - + /** + * 위도, 경도 두 개를 받아와서 시설, 카테고리에 해당하는 업장을 필터링하는 메서드 + * + * @param latStart 남서쪽 위도 + * @param latEnd 북동쪽 위도 + * @param lngStart 남서쪽 경도 + * @param lngEnd 북동쪽 경도 + * @param category 업장 카테고리 + * @param facility 배리어 프리 태그 + * @param pageable 페이징 요소 + * @param socialId 유저 소셜 로그인 아이디 + * @return 조건을 만족하는 업장의 DTO + */ public StorePagedResponseDto getStoreInRange(BigDecimal latStart, BigDecimal latEnd, BigDecimal lngStart, BigDecimal lngEnd, String category, List facility, Pageable pageable, String socialId) { // public List getStoreInRange(BigDecimal latStart, BigDecimal latEnd, BigDecimal lngStart, BigDecimal lngEnd, String category, List facility, Pageable pageable, String socialId) { User targetUser = socialId == null ? null : userRepository.findBySocialId(socialId); @@ -88,6 +57,15 @@ public StorePagedResponseDto getStoreInRange(BigDecimal latStart, BigDecimal lat return getStoreCardPagedResponseDto(targetUser, betweenLngLat); } + /** + * @param lat 위도 + * @param lng 경도 + * @param category 업장 카테고리 + * @param facility 배리어 프리 태그 + * @param pageable 페이징 요소 + * @param socialId 유저 소셜 로그인 아이디 + * @return 위도, 경도, 카테고리, 배리어 프리, 페이징을 만족하는 배리어 프리 업장 리턴 + */ public StorePagedResponseDto getStoreInRangeMain(BigDecimal lat, BigDecimal lng, String category, List facility, Pageable pageable, String socialId) { BigDecimal[] range = QuerydslLocation.getRange(lat, lng, 10); return getStoreInRange(range[0], range[1], range[2], range[3], category, facility, pageable, socialId); @@ -100,6 +78,15 @@ public StorePagedResponseDto getStoreInRangeMap(BigDecimal lat, BigDecimal lng, return getStoreCardPagedResponseDto(targetUser, betweenLngLat); } + /** + * @param lat 위도 + * @param lng 경도 + * @param category 업장 카테고리 + * @param facility 배리어 프리 태그 + * @param pageable 페이징 요소 + * @param socialId 유저 소셜 로그인 아이디 + * @return 페이징이 적용된 높은 별점 순으로 정렬된 업장 리스트 리턴 + */ // public List getStoreInRangeHighPoint(BigDecimal lat, BigDecimal lng, String public StorePagedResponseDto getStoreInRangeHighPoint(BigDecimal lat, BigDecimal lng, String category, List facility, Pageable pageable, String socialId) { @@ -108,6 +95,15 @@ public StorePagedResponseDto getStoreInRangeHighPoint(BigDecimal lat, BigDecimal return getStoreCardPagedResponseDto(targetUser, resultList); } + /** + * @param lat 위도 + * @param lng 경도 + * @param category 업장 카테고리 + * @param facility 배리어 프리 태그 + * @param limit 표시할 업장의 개수 + * @param socialId 유저 소셜 아이디 + * @return 위도, 경도, 카테고리, 배리어 프리 태그에 해당하는 북마크가 높은 업장 리스트를 설정한 숫자만큼 리턴 + */ public List getStoreInRangeHighBookmark(BigDecimal lat, BigDecimal lng, String category, List facility, int limit, String socialId) { User targetUser = socialId == null ? null : userRepository.findBySocialId(socialId); @@ -115,32 +111,75 @@ public List getStoreInRangeHighBookmark(BigDecimal lat, Bi return getStoreCardResponseDtos(targetUser, highBookmarkResultList); } + /** + * @param targetUser 현재 접근하고 있는 유저 + * @param resultStoreList 업장 리스트 + * @return 접근하고 있는 유저가 보는 페이징된 업장을 가공(북마크 등)하여 DTO로 리턴 + */ private StorePagedResponseDto getStoreCardPagedResponseDto(User targetUser, Page resultStoreList) { List mappingResult = new ArrayList<>(); if (targetUser == null) { for (Store store : resultStoreList) { - mappingResult.add(new StoreCardResponseDto(store, false)); + mappingResult.add(new StoreCardResponseDto(store, "N")); } } else { for (Store store : resultStoreList) { boolean isBookmark = bookmarkRepository.existsByStoreIdAndUserId(store, targetUser); - mappingResult.add(new StoreCardResponseDto(store, isBookmark)); + mappingResult.add(new StoreCardResponseDto(store, isBookmark ? "Y" : "N")); } } return new StorePagedResponseDto(resultStoreList.hasNext(), mappingResult); } + /** + * @param targetUser 현재 접근하고 있는 유저 + * @param resultStoreList 업장 리스트 + * @return 접근하고 있는 유저가 보는 업장을 가공(북마크 등)하여 DTO로 리턴 + */ private List getStoreCardResponseDtos(User targetUser, List resultStoreList) { + List storeCardResponseList = new ArrayList<>(); if (targetUser == null) { - return resultStoreList.stream().map(store -> new StoreCardResponseDto(store, false)) + return resultStoreList.stream() + .map(store -> new StoreCardResponseDto(store, "N")) .collect(Collectors.toList()); } else { - return resultStoreList.stream().map(store -> { - long count = targetUser.getBookmarkList().stream() - .filter(b -> b.getUserId() == targetUser && b.getStoreId() == store).count(); - return new StoreCardResponseDto(store, count > 0); - }).collect(Collectors.toList()); + for (Store store : resultStoreList) { + String isBookmark = "N"; + for (Bookmark bookmark : store.getBookmarkList()) { + if (bookmark.getStoreId().getId() == store.getId() + && bookmark.getUserId().getSocialId().equals(targetUser.getSocialId())) { + isBookmark = "Y"; + } + storeCardResponseList.add(new StoreCardResponseDto(store, isBookmark)); + } + } + } + return storeCardResponseList; + } + + /** + * 업장 상세 조회 + * @param storeId 업장 아이디 + * @param socialId 유저 social 아이디 + * @return 업장 상세 정보 + */ + public StoreCardResponseDto getStore(int storeId, String socialId) { + Store store = storeRepository.findById(storeId).orElseThrow(() -> new IllegalArgumentException("해당하는 업장이 존재하지 않습니다.")); + User targetUser = socialId == null ? null : userRepository.findBySocialId(socialId); + + if (targetUser == null) { + return new StoreCardResponseDto(store, "N"); + } else { + String isBookmark = "N"; + for (Bookmark bookmark : store.getBookmarkList()) { + if (bookmark.getStoreId().getId() == store.getId() + && bookmark.getUserId().getSocialId().equals(socialId)) { + isBookmark = "Y"; + break; + } + } + return new StoreCardResponseDto(store, isBookmark); } } } \ No newline at end of file