diff --git a/src/main/java/com/gdsc/jmt/domain/group/command/controller/response/FindGroupResponse.java b/src/main/java/com/gdsc/jmt/domain/group/command/controller/response/FindGroupResponse.java index 8f495c4..f53b7f3 100644 --- a/src/main/java/com/gdsc/jmt/domain/group/command/controller/response/FindGroupResponse.java +++ b/src/main/java/com/gdsc/jmt/domain/group/command/controller/response/FindGroupResponse.java @@ -16,4 +16,6 @@ public class FindGroupResponse { private boolean isPrivateGroup; private String groupProfileImageUrl; private String groupBackgroundImageUrl; + private int memberCnt; + private int restaurantCnt; } diff --git a/src/main/java/com/gdsc/jmt/domain/group/command/service/GroupService.java b/src/main/java/com/gdsc/jmt/domain/group/command/service/GroupService.java index 5fbfc72..0968179 100644 --- a/src/main/java/com/gdsc/jmt/domain/group/command/service/GroupService.java +++ b/src/main/java/com/gdsc/jmt/domain/group/command/service/GroupService.java @@ -9,6 +9,7 @@ import com.gdsc.jmt.domain.group.repository.GroupUserRepository; import com.gdsc.jmt.domain.restaurant.query.entity.RecommendRestaurantEntity; import com.gdsc.jmt.domain.restaurant.query.entity.RestaurantPhotoEntity; +import com.gdsc.jmt.domain.restaurant.query.repository.RecommendRestaurantRepository; import com.gdsc.jmt.domain.user.query.entity.UserEntity; import com.gdsc.jmt.domain.user.query.repository.UserRepository; import com.gdsc.jmt.global.exception.ApiException; @@ -38,6 +39,8 @@ public class GroupService { private final GroupRepository groupRepository; private final GroupUserRepository groupUserRepository; + private final RecommendRestaurantRepository recommendRestaurantRepository; + private final S3FileService s3FileService; @Transactional @@ -75,6 +78,9 @@ public FindGroupResponse findGroupById(long groupId) { } GroupEntity groupEntity = groupEntityResult.get(); + int memberCnt = groupUserRepository.countByGroupId(groupId); + int restaurantCnt = recommendRestaurantRepository.countByGroup(groupEntity); + return FindGroupResponse.builder() .groupId(groupEntity.getGid()) .groupName(groupEntity.getGroupName()) @@ -82,6 +88,8 @@ public FindGroupResponse findGroupById(long groupId) { .isPrivateGroup(groupEntity.isPrivateFlag()) .groupBackgroundImageUrl(groupEntity.getGroupBackgroundImageUrl()) .groupProfileImageUrl(groupEntity.getGroupProfileImageUrl()) + .memberCnt(memberCnt) + .restaurantCnt(restaurantCnt) .build(); } diff --git a/src/main/java/com/gdsc/jmt/domain/group/repository/GroupUserRepository.java b/src/main/java/com/gdsc/jmt/domain/group/repository/GroupUserRepository.java index 84f68aa..e0d6edb 100644 --- a/src/main/java/com/gdsc/jmt/domain/group/repository/GroupUserRepository.java +++ b/src/main/java/com/gdsc/jmt/domain/group/repository/GroupUserRepository.java @@ -10,4 +10,6 @@ public interface GroupUserRepository extends JpaRepository findByUserId(long userId); Optional findByGroupIdAndUserId(long groupId, long userId); + + int countByGroupId(long groupId); } diff --git a/src/main/java/com/gdsc/jmt/domain/restaurant/query/controller/RestaurantQueryController.java b/src/main/java/com/gdsc/jmt/domain/restaurant/query/controller/RestaurantQueryController.java index 40e4a6d..d51e6c0 100644 --- a/src/main/java/com/gdsc/jmt/domain/restaurant/query/controller/RestaurantQueryController.java +++ b/src/main/java/com/gdsc/jmt/domain/restaurant/query/controller/RestaurantQueryController.java @@ -3,13 +3,10 @@ import com.gdsc.jmt.domain.restaurant.command.dto.request.CreateRestaurantReviewRequest; import com.gdsc.jmt.domain.restaurant.query.controller.springdocs.FindAllRestaurantSpringDocs; import com.gdsc.jmt.domain.restaurant.query.controller.springdocs.FindRestaurantsByUserIdSpringDocs; -import com.gdsc.jmt.domain.restaurant.query.dto.request.RestaurantSearchInUserIdRequest; -import com.gdsc.jmt.domain.restaurant.query.dto.request.RestaurantSearchRequest; +import com.gdsc.jmt.domain.restaurant.query.dto.request.*; import com.gdsc.jmt.domain.restaurant.query.dto.response.*; import com.gdsc.jmt.domain.restaurant.query.controller.springdocs.CheckRecommendRestaurantExistingSpringDocs; import com.gdsc.jmt.domain.restaurant.query.controller.springdocs.FindRestaurantLocationSpringDocs; -import com.gdsc.jmt.domain.restaurant.query.dto.request.FindRestaurantLocationListRequest; -import com.gdsc.jmt.domain.restaurant.query.dto.request.RestaurantSearchMapRequest; import com.gdsc.jmt.domain.restaurant.query.service.RestaurantFilterService; import com.gdsc.jmt.domain.restaurant.query.service.RestaurantQueryService; import com.gdsc.jmt.domain.restaurant.util.KakaoSearchDocumentResponse; @@ -65,10 +62,10 @@ public JMTApiResponse checkRecommendRestaurantExisting(@PathVariable String k return JMTApiResponse.createResponseWithMessage(true, RestaurantMessage.RECOMMEND_RESTAURANT_REGISTERABLE); } - @GetMapping("restaurant/{recommendRestaurantId}") + @PostMapping("restaurant/{recommendRestaurantId}") @FindDetailRestaurantSpringDocs - public JMTApiResponse getDetailRestaurant(@PathVariable Long recommendRestaurantId) { - FindDetailRestaurantItem response = restaurantQueryService.findDetailRestaurant(recommendRestaurantId); + public JMTApiResponse getDetailRestaurant(@PathVariable Long recommendRestaurantId, @RequestBody FindDetailRestaurantRequest request) { + FindDetailRestaurantItem response = restaurantQueryService.findDetailRestaurant(recommendRestaurantId, request); return JMTApiResponse.createResponseWithMessage(response, RestaurantMessage.DETAIL_RESTAURANT_FIND_SUCCESS); } diff --git a/src/main/java/com/gdsc/jmt/domain/restaurant/query/dto/request/FindDetailRestaurantRequest.java b/src/main/java/com/gdsc/jmt/domain/restaurant/query/dto/request/FindDetailRestaurantRequest.java new file mode 100644 index 0000000..b25a52c --- /dev/null +++ b/src/main/java/com/gdsc/jmt/domain/restaurant/query/dto/request/FindDetailRestaurantRequest.java @@ -0,0 +1,8 @@ +package com.gdsc.jmt.domain.restaurant.query.dto.request; + +import lombok.Data; + +@Data +public class FindDetailRestaurantRequest { + private MapLocation userLocation; +} diff --git a/src/main/java/com/gdsc/jmt/domain/restaurant/query/dto/response/FindDetailRestaurantItem.java b/src/main/java/com/gdsc/jmt/domain/restaurant/query/dto/response/FindDetailRestaurantItem.java index 8e0ca8a..9a2d63f 100644 --- a/src/main/java/com/gdsc/jmt/domain/restaurant/query/dto/response/FindDetailRestaurantItem.java +++ b/src/main/java/com/gdsc/jmt/domain/restaurant/query/dto/response/FindDetailRestaurantItem.java @@ -23,6 +23,7 @@ public record FindDetailRestaurantItem( //식당 등록한 유저 정보 Long userId, String userNickName, - String userProfileImageUrl + String userProfileImageUrl, + String differenceInDistance ) { } \ No newline at end of file diff --git a/src/main/java/com/gdsc/jmt/domain/restaurant/query/entity/RecommendRestaurantEntity.java b/src/main/java/com/gdsc/jmt/domain/restaurant/query/entity/RecommendRestaurantEntity.java index 9c3b4b3..ef1a0c2 100644 --- a/src/main/java/com/gdsc/jmt/domain/restaurant/query/entity/RecommendRestaurantEntity.java +++ b/src/main/java/com/gdsc/jmt/domain/restaurant/query/entity/RecommendRestaurantEntity.java @@ -79,7 +79,7 @@ public void initPictures(List pictures) { this.pictures = pictures; } - public FindDetailRestaurantItem toResponse() { + public FindDetailRestaurantItem toResponse(String differenceInDistance) { return new FindDetailRestaurantItem( this.restaurant.getName(), this.restaurant.getPlaceUrl(), @@ -96,7 +96,8 @@ public FindDetailRestaurantItem toResponse() { this.pictures.stream().map(RestaurantPhotoEntity::getImageUrl).toList(), this.user.getId(), this.user.getNickname(), - this.user.getProfileImageUrl() + this.user.getProfileImageUrl(), + differenceInDistance ); } diff --git a/src/main/java/com/gdsc/jmt/domain/restaurant/query/entity/calculate/RecommendRestaurantWithDistanceDTO.java b/src/main/java/com/gdsc/jmt/domain/restaurant/query/entity/calculate/RecommendRestaurantWithDistanceDTO.java index 4d2d019..381c725 100644 --- a/src/main/java/com/gdsc/jmt/domain/restaurant/query/entity/calculate/RecommendRestaurantWithDistanceDTO.java +++ b/src/main/java/com/gdsc/jmt/domain/restaurant/query/entity/calculate/RecommendRestaurantWithDistanceDTO.java @@ -1,5 +1,6 @@ package com.gdsc.jmt.domain.restaurant.query.entity.calculate; +import com.gdsc.jmt.domain.restaurant.query.dto.response.FindDetailRestaurantItem; import com.gdsc.jmt.domain.restaurant.query.dto.response.FindRestaurantItems; import com.gdsc.jmt.domain.restaurant.query.entity.RecommendRestaurantEntity; @@ -21,4 +22,8 @@ public RecommendRestaurantWithDistanceDTO(RecommendRestaurantEntity recommendRes public FindRestaurantItems convertToFindItems() { return FindRestaurantItems.createWithDistance(recommendRestaurant.convertToFindItems(), differenceInDistance); } + + public FindDetailRestaurantItem convertDetailItem() { + return this.recommendRestaurant.toResponse(this.differenceInDistance); + } } diff --git a/src/main/java/com/gdsc/jmt/domain/restaurant/query/repository/RecommendRestaurantRepository.java b/src/main/java/com/gdsc/jmt/domain/restaurant/query/repository/RecommendRestaurantRepository.java index 62c8184..a41cd41 100644 --- a/src/main/java/com/gdsc/jmt/domain/restaurant/query/repository/RecommendRestaurantRepository.java +++ b/src/main/java/com/gdsc/jmt/domain/restaurant/query/repository/RecommendRestaurantRepository.java @@ -1,5 +1,6 @@ package com.gdsc.jmt.domain.restaurant.query.repository; +import com.gdsc.jmt.domain.group.entity.GroupEntity; import com.gdsc.jmt.domain.restaurant.query.entity.RecommendRestaurantEntity; import com.gdsc.jmt.domain.restaurant.query.entity.RestaurantEntity; import com.gdsc.jmt.domain.restaurant.query.entity.calculate.RecommendRestaurantWithDistanceDTO; @@ -16,6 +17,13 @@ import org.springframework.lang.Nullable; public interface RecommendRestaurantRepository extends JpaRepository, JpaSpecificationExecutor { + + + @Query("select NEW com.gdsc.jmt.domain.restaurant.query.entity.calculate.RecommendRestaurantWithDistanceDTO(reRestaurant, ST_DISTANCE_SPHERE(reRestaurant.restaurant.location, ST_GeomFromText(:userLocation))) " + + "from RecommendRestaurantEntity reRestaurant " + + "where reRestaurant.id = :id") + Optional findByIdWithUserLocation(Long id, String userLocation); + Optional findByRestaurant(RestaurantEntity restaurant); @Query("select NEW com.gdsc.jmt.domain.restaurant.query.entity.calculate.RecommendRestaurantWithDistanceDTO(reRestaurant, ST_DISTANCE_SPHERE(reRestaurant.restaurant.location, ST_GeomFromText(:userLocation))) " + @@ -27,4 +35,6 @@ public interface RecommendRestaurantRepository extends JpaRepository findAll(Specification spec, Pageable pageable); + + int countByGroup(GroupEntity group); } diff --git a/src/main/java/com/gdsc/jmt/domain/restaurant/query/service/RestaurantQueryService.java b/src/main/java/com/gdsc/jmt/domain/restaurant/query/service/RestaurantQueryService.java index c41aeaa..e851628 100644 --- a/src/main/java/com/gdsc/jmt/domain/restaurant/query/service/RestaurantQueryService.java +++ b/src/main/java/com/gdsc/jmt/domain/restaurant/query/service/RestaurantQueryService.java @@ -71,12 +71,13 @@ private RestaurantEntity findRestaurant(final String kakaoSubId) { return isExisting.orElse(null); } - public FindDetailRestaurantItem findDetailRestaurant(Long recommendRestaurantId) { - Optional isExisting = recommendRestaurantRepository.findById(recommendRestaurantId); + public FindDetailRestaurantItem findDetailRestaurant(Long recommendRestaurantId, FindDetailRestaurantRequest request) { + String userLocation = "POINT(" + request.getUserLocation().x() + " " + request.getUserLocation().y() + ")"; + Optional isExisting = recommendRestaurantRepository.findByIdWithUserLocation(recommendRestaurantId, userLocation); if(isExisting.isEmpty()) { throw new ApiException(RestaurantMessage.RECOMMEND_RESTAURANT_NOT_FOUND); } - return isExisting.get().toResponse(); + return isExisting.get().convertDetailItem(); } public FindAllRestaurantResponse findAll(final Pageable pageable) {