Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,20 +1,35 @@
package com.eodigo.domain.restaurant.controller

import com.eodigo.common.exception.ErrorResponse
import com.eodigo.domain.restaurant.dto.SearchRequest
import com.eodigo.domain.restaurant.dto.StoreDetailDto
import com.eodigo.domain.restaurant.dto.StoreDto
import com.eodigo.domain.restaurant.service.StoreService
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.media.Content
import io.swagger.v3.oas.annotations.media.ExampleObject
import io.swagger.v3.oas.annotations.media.Schema
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses
import io.swagger.v3.oas.annotations.tags.Tag
import jakarta.validation.Valid
import org.springframework.http.ResponseEntity
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.*

@Tag(name = "외식 API", description = "외식 정보 관련 API")
@RestController
@RequestMapping("/api/v1/stores")
@Validated
class StoreController(private val storeService: StoreService) {

/** 메뉴명, 위치, 지도 경계 등을 기반으로 매장 리스트를 검색 */
@Operation(
summary = "위치 기반 메뉴 최저가 매장 리스트 검색",
description = "메뉴명, 위치, 지도 경계 등을 기반으로 최저가 매장 리스트를 검색합니다.",
)
@ApiResponses(
value = [ApiResponse(responseCode = "200", description = "해당 메뉴 최저가 매장 리스트 조회 성공")]
)
@GetMapping("/search")
fun searchStores(
@Valid @ModelAttribute request: SearchRequest
Expand All @@ -23,7 +38,32 @@ class StoreController(private val storeService: StoreService) {
return ResponseEntity.ok(stores)
}

/** 매장 상세 정보 조회 */
@Operation(summary = "매장 상세 정보 조회", description = "해당 ID의 매장의 상세 정보를 조회합니다.")
@ApiResponses(
value =
[
ApiResponse(responseCode = "200", description = "해당 ID의 매장 상세 정보 조회 성공"),
ApiResponse(
responseCode = "404",
description = "해당 정보 없음",
content =
[
Content(
schema = Schema(implementation = ErrorResponse::class),
examples =
[
ExampleObject(
name = "Store Not Found",
description = "존재하지 않는 매장 ID",
value =
"{\"status\": 404, \"code\": \"S001\", \"message\": \"해당 매장을 찾을 수 없습니다.\"}",
)
],
)
],
),
]
)
@GetMapping("/{storeId}")
fun getStoreDetails(
@Valid @PathVariable storeId: Long,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,25 @@ class StoreService(
it.store.category == request.category
}

// 가게별로 그룹화한 뒤, 각 가게에서 가장 저렴한 메뉴 하나만 선택
val cheapestMenuByStore =
menus
.groupBy { it.store }
.mapValues { (_, menusInStore) -> menusInStore.minByOrNull { it.price } }
.filterValues { it != null }
.map { it.key to it.value!! }

Comment thread
min-0 marked this conversation as resolved.
// 지도 경계값 내의 매장 필터링
val locationFilteredMenus =
menus.filter { menu ->
val store = menu.store
cheapestMenuByStore.filter { (store, _) ->
store.latitude >= request.southWestLat &&
store.latitude <= request.northEastLat &&
store.longitude >= request.southWestLng &&
store.longitude <= request.northEastLng
}

val storeDtoList =
locationFilteredMenus.map { menu ->
val store = menu.store
locationFilteredMenus.map { (store, menu) ->
val distance =
calculateDistance(
lat1 = request.userLat,
Expand Down