Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
Expand Up @@ -92,4 +92,10 @@ public List<FoodTruckMenuResponse> searchFoodTruckMenus(Long foodTruckId, String

return foodTruckMenuService.searchFoodTruckMenus(foodTruckId, keyword, member);
}

public List<FoodTruckTopRateResponse> getTopRatedFoodTrucks(Long memberId) {
memberValidator.validateAndGetMember(memberId);

return foodTruckInfoService.getTopRatedFoodTrucks();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import konkuk.chacall.domain.foodtruck.presentation.dto.request.UpdateFoodTruckInfoRequest;
import konkuk.chacall.domain.foodtruck.presentation.dto.response.FoodTruckDetailResponse;
import konkuk.chacall.domain.foodtruck.presentation.dto.response.FoodTruckResponse;
import konkuk.chacall.domain.foodtruck.presentation.dto.response.FoodTruckTopRateResponse;
import konkuk.chacall.domain.member.domain.repository.SavedFoodTruckRepository;
import konkuk.chacall.domain.region.domain.model.Region;
import konkuk.chacall.domain.region.domain.repository.RegionRepository;
Expand All @@ -19,6 +20,7 @@
import konkuk.chacall.global.common.exception.EntityNotFoundException;
import konkuk.chacall.global.common.exception.code.ErrorCode;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Service;

Expand All @@ -37,6 +39,8 @@ public class FoodTruckInfoService {
private final AvailableDateRepository availableDateRepository;
private final RegionRepository regionRepository;

private static final int TOP_RATED_FOOD_TRUCK_LIMIT = 7;

public CursorPagingResponse<FoodTruckResponse> getFoodTrucks(Long memberId, FoodTruckSearchRequest request) {

Slice<FoodTruck> foodTruckSlice = foodTruckRepository.getFoodTrucks(request);
Expand Down Expand Up @@ -154,4 +158,10 @@ public FoodTruckDetailResponse getFoodTruckDetails(User member, Long foodTruckId

return FoodTruckDetailResponse.from(foodTruck, foodTruckServiceAreas, availableDates, isSaved);
}

public List<FoodTruckTopRateResponse> getTopRatedFoodTrucks() {
return foodTruckRepository.findTopRatedFoodTrucks(PageRequest.of(0, TOP_RATED_FOOD_TRUCK_LIMIT)).stream()
.map(FoodTruckTopRateResponse::from)
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,13 @@ boolean existsByFoodTruckIdAndOwnerIdAndFoodTruckStatus(

@EntityGraph(attributePaths = {"owner"})
List<FoodTruck> findAll();

@Query("""
select f
from FoodTruck f
where f.foodTruckStatus = 'APPROVED'
and f.foodTruckViewedStatus = 'ON'
order by f.ratingInfo.averageRating desc, f.ratingInfo.ratingCount desc
""")
List<FoodTruck> findTopRatedFoodTrucks(Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -158,4 +158,16 @@ public BaseResponse<List<FoodTruckMenuResponse>> searchFoodTruckMenus(
) {
return BaseResponse.ok(foodTruckService.searchFoodTruckMenus(foodTruckId, keyword, memberId));
}

@Operation(
summary = "[홈화면용] 평점 높은 푸드트럭 조회",
description = "평점이 높은 푸드트럭을 조회합니다."
)
@ExceptionDescription(SwaggerResponseDescription.GET_TOP_RATED_FOOD_TRUCKS)
@GetMapping("/top-rated")
public BaseResponse<List<FoodTruckTopRateResponse>> getTopRatedFoodTrucks(
@Parameter(hidden = true) @UserId final Long memberId
) {
return BaseResponse.ok(foodTruckService.getTopRatedFoodTrucks(memberId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package konkuk.chacall.domain.foodtruck.presentation.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import konkuk.chacall.domain.foodtruck.domain.model.FoodTruck;

public record FoodTruckTopRateResponse(
@Schema(description = "푸드트럭 식별자", example = "1")
Long foodTruckId,
@Schema(description = "푸드트럭 이름", example = "푸드트럭")
String name,
@Schema(description = "푸드트럭 대표 사진 URL", example = "http://image.png")
String photoUrl,
@Schema(description = "푸드트럭 평균 평점", example = "4.5")
Double averageRating
) {
public static FoodTruckTopRateResponse from(FoodTruck foodTruck) {
return new FoodTruckTopRateResponse(
foodTruck.getFoodTruckId(),
foodTruck.getFoodTruckInfo().getName(),
foodTruck.getFoodTruckInfo().getFoodTruckPhotoList().getMainPhotoUrl(),
foodTruck.getRatingInfo().getAverageRating()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,10 @@ public enum SwaggerResponseDescription {
USER_FORBIDDEN,
FOOD_TRUCK_STATUS_MISMATCH
))),
GET_TOP_RATED_FOOD_TRUCKS(new LinkedHashSet<>(Set.of(
USER_NOT_FOUND,
USER_FORBIDDEN
))),

// Default
DEFAULT(new LinkedHashSet<>())
Expand Down