Skip to content

Commit

Permalink
feat: 주소 조건으로 음식점 조회하는 기능 구현 (#529)
Browse files Browse the repository at this point in the history
  • Loading branch information
shin-mallang committed Sep 27, 2023
1 parent 63bab38 commit b6e1b62
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.celuveat.restaurant.command.application.RestaurantCorrectionService;
import com.celuveat.restaurant.command.application.RestaurantLikeService;
import com.celuveat.restaurant.command.application.RestaurantService;
import com.celuveat.restaurant.presentation.dto.AddressSearchCondRequest;
import com.celuveat.restaurant.presentation.dto.LocationSearchCondRequest;
import com.celuveat.restaurant.presentation.dto.RestaurantSearchCondRequest;
import com.celuveat.restaurant.presentation.dto.SuggestCorrectionRequest;
Expand Down Expand Up @@ -71,6 +72,18 @@ ResponseEntity<PageResponse<RestaurantSimpleResponse>> findAll(
return ResponseEntity.ok(PageResponse.from(result));
}

@GetMapping("/address")
ResponseEntity<PageResponse<RestaurantSimpleResponse>> findByAddress(
@LooseAuth Long memberId,
@ModelAttribute AddressSearchCondRequest addressSearchCondRequest,
@PageableDefault(size = 18) Pageable pageable
) {
Page<RestaurantSimpleResponse> result = restaurantQueryService.findAllByAddress(
addressSearchCondRequest.toCondition(), pageable, memberId
);
return ResponseEntity.ok(PageResponse.from(result));
}

@GetMapping("/like")
ResponseEntity<List<LikedRestaurantQueryResponse>> getLikedRestaurants(@Auth Long memberId) {
List<LikedRestaurantQueryResponse> result = restaurantQueryService.findAllLikedRestaurantByMemberId(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,82 @@
package com.celuveat.restaurant.presentation.dto;

import com.celuveat.common.exception.BaseException;
import com.celuveat.common.exception.BaseExceptionType;
import com.celuveat.restaurant.query.dao.RestaurantWithDistanceDao.AddressSearchCond;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpStatus;

public record AddressSearchCondRequest(
String value
) {

private static final Map<String, List<String>> mapping = new HashMap<>() {
{
put("잠실", List.of("서울 송파구 한가람로", "서울 송파구 석촌호수로", "서울 강남구 양재대로", "서울 강남구 도곡로", "서울 송파구 올림픽로", "서울 송파구 백제고분로", "서울 송파구 삼전로", "서울 송파구 잠실로"));
put("성수", List.of("서울 성동구 성수일로", "서울 성동구 성수이로", "서울 광진구 뚝섬로", "서울 광진구 광나루로", "서울 성동구 서울숲길", "서울 강남구 도산대로", "서울 강남구 가로수길", "서울 성동구 연무장길", "서울 광진구 강변북로"));
put("홍대,합정", List.of("서울 마포구 와우산로", "서울 마포구 홍익로", "서울 마포구 희우정로", "서울 마포구 어울마당로", "서울 마포구 월드컵로", "서울 마포구 성지3길"));
put("을지로,종로", List.of("서울 중구 을지로", "서울 중구 충무로", "서울 종로구 대학로", "서울 동대문구 청계천로", "서울 종로구 세종대로", "서울 종로구 창경궁로"));
put("압구정,청담", List.of("서울 강남구 도산대로", "서울 강남구 가로수길", "서울 강남구 압구정로", "서울 강남구 논현로"));
put("여의도", List.of("서울 영등포구 여의서로", "서울 영등포구 의사당대로", "서울 영등포구 여의공원로", "서울 동작구 여의대방로", "서울 영등포구 국제금융로", "서울 영등포구 여의동로", "서울 동작구 여의대방로"));
put("이태원", List.of("서울 용산구 회나무로", "서울 용산구 보광로", "서울 용산구 녹사평대로", "서울 용산구 이태원로", "서울 용산구 남산공원길"));
put("잠실", List.of(
"서울 송파구 한가람로", "서울 송파구 석촌호수로", "서울 강남구 양재대로",
"서울 강남구 도곡로", "서울 송파구 올림픽로", "서울 송파구 백제고분로",
"서울 송파구 삼전로", "서울 송파구 잠실로"));
put("성수", List.of(
"서울 성동구 성수일로", "서울 성동구 성수이로", "서울 광진구 뚝섬로",
"서울 광진구 광나루로", "서울 성동구 서울숲길", "서울 강남구 도산대로",
"서울 강남구 가로수길", "서울 성동구 연무장길", "서울 광진구 강변북로"));
put("홍대,합정", List.of(
"서울 마포구 와우산로", "서울 마포구 홍익로", "서울 마포구 희우정로",
"서울 마포구 어울마당로", "서울 마포구 월드컵로", "서울 마포구 성지3길"));
put("을지로,종로", List.of(
"서울 중구 을지로", "서울 중구 충무로", "서울 종로구 대학로",
"서울 동대문구 청계천로", "서울 종로구 세종대로", "서울 종로구 창경궁로"));
put("압구정,청담", List.of(
"서울 강남구 도산대로", "서울 강남구 가로수길", "서울 강남구 압구정로",
"서울 강남구 논현로"));
put("여의도", List.of(
"서울 영등포구 여의서로", "서울 영등포구 의사당대로", "서울 영등포구 여의공원로",
"서울 동작구 여의대방로", "서울 영등포구 국제금융로", "서울 영등포구 여의동로",
"서울 동작구 여의대방로"));
put("이태원", List.of(
"서울 용산구 회나무로", "서울 용산구 보광로", "서울 용산구 녹사평대로",
"서울 용산구 이태원로", "서울 용산구 남산공원길"));
put("속초,강릉,양양", List.of("강원 속초시", "강원 강릉시", "강원 양양군"));
put("부산", List.of("부산"));
put("제주", List.of("제주"));
}
};

public void toCondition() {
public AddressSearchCond toCondition() {
List<String> addresses = mapping.get(value);
if (addresses == null) {
throw new BadRequestException(value);
}
return new AddressSearchCond(addresses);
}

private static class BadRequestException extends BaseException {
private final BadRequestExceptionType badRequestExceptionType;

private BadRequestException(String value) {
this.badRequestExceptionType = new BadRequestExceptionType(value);
}

@Override
public BaseExceptionType exceptionType() {
return badRequestExceptionType;
}
}

private record BadRequestExceptionType(
String value
) implements BaseExceptionType {
@Override
public HttpStatus httpStatus() {
return HttpStatus.BAD_REQUEST;
}

@Override
public String errorMessage() {
return value + "에 대응되는 주소들이 없습니다.";
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.celuveat.restaurant.query.dao.RestaurantDetailResponseDao;
import com.celuveat.restaurant.query.dao.RestaurantLikeQueryResponseDao;
import com.celuveat.restaurant.query.dao.RestaurantSimpleResponseDao;
import com.celuveat.restaurant.query.dao.RestaurantWithDistanceDao.AddressSearchCond;
import com.celuveat.restaurant.query.dao.RestaurantWithDistanceDao.LocationSearchCond;
import com.celuveat.restaurant.query.dao.RestaurantWithDistanceDao.RestaurantSearchCond;
import com.celuveat.restaurant.query.dto.LikedRestaurantQueryResponse;
Expand Down Expand Up @@ -55,6 +56,14 @@ public Page<RestaurantSimpleResponse> findAllWithMemberLiked(
return RestaurantRelocator.relocateCelebDataFirstInResponsesByCelebId(celebId, response);
}

public Page<RestaurantSimpleResponse> findAllByAddress(
AddressSearchCond addressSearchCond,
Pageable pageable,
@Nullable Long memberId
) {
return restaurantSimpleResponseDao.findAllByAddress(addressSearchCond, pageable, memberId);
}

public Page<RestaurantSimpleResponse> findAllNearByDistanceWithoutSpecificRestaurant(
long restaurantId,
int distance,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

import static com.celuveat.common.util.StreamUtil.groupBySameOrder;
import static java.util.function.Function.identity;
import static java.util.stream.Collectors.*;
import static java.util.stream.Collectors.toMap;
import static java.util.stream.Collectors.toSet;

import com.celuveat.celeb.command.domain.Celeb;
import com.celuveat.common.domain.BaseEntity;
import com.celuveat.restaurant.command.domain.RestaurantImage;
import com.celuveat.restaurant.command.domain.RestaurantLike;
import com.celuveat.restaurant.query.dao.RestaurantWithDistanceDao.AddressSearchCond;
import com.celuveat.restaurant.query.dao.RestaurantWithDistanceDao.LocationSearchCond;
import com.celuveat.restaurant.query.dao.RestaurantWithDistanceDao.RestaurantSearchCond;
import com.celuveat.restaurant.query.dao.support.RestaurantImageQueryDaoSupport;
Expand All @@ -17,7 +18,7 @@
import com.celuveat.restaurant.query.dto.RestaurantWithDistance;
import com.celuveat.video.command.domain.Video;
import com.celuveat.video.query.dao.VideoQueryDaoSupport;
import io.micrometer.common.lang.Nullable;
import jakarta.annotation.Nullable;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
Expand Down Expand Up @@ -60,6 +61,16 @@ public Page<RestaurantSimpleResponse> findAllNearByDistanceWithoutSpecificRestau
return toSimpleResponse(memberId, restaurants);
}

public Page<RestaurantSimpleResponse> findAllByAddress(
AddressSearchCond addressSearchCond,
Pageable pageable,
@Nullable Long memberId
) {
Page<RestaurantWithDistance> restaurants =
restaurantWithDistanceDao.searchByAddress(addressSearchCond, pageable);
return toSimpleResponse(memberId, restaurants);
}

private Page<RestaurantSimpleResponse> toSimpleResponse(
@Nullable Long memberId, Page<RestaurantWithDistance> restaurants
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.celuveat.restaurant.fixture;

import com.celuveat.common.util.Base64Util;
import com.celuveat.restaurant.command.domain.Restaurant;
import com.celuveat.restaurant.command.domain.RestaurantImage;
import com.celuveat.restaurant.query.dto.CelebQueryResponse;
Expand Down Expand Up @@ -155,7 +156,7 @@ public static List<RestaurantSimpleResponse> toSimpleResponse(
restaurant.phoneNumber(),
restaurant.naverMapUrl(),
restaurant.viewCount(),
null,
0,
false,
restaurant.likeCount(),
videos.get(restaurant).stream().map(Video::celeb).map(celeb -> new CelebQueryResponse(
Expand All @@ -166,7 +167,7 @@ public static List<RestaurantSimpleResponse> toSimpleResponse(
)).toList(),
images.get(restaurant).stream().map(image -> new RestaurantImageQueryResponse(
image.id(),
image.name(),
Base64Util.encode(image.name()),
image.author(),
image.socialMedia().name()
)).toList()
Expand Down

0 comments on commit b6e1b62

Please sign in to comment.