Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feat] 식당 세부 정보 조회 api #55

Merged
merged 10 commits into from
Jul 13, 2024
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.hankki.hankkiserver.api.menu.service;

import lombok.RequiredArgsConstructor;
import org.hankki.hankkiserver.domain.menu.model.Menu;
import org.hankki.hankkiserver.domain.menu.repository.MenuRepository;
import org.hankki.hankkiserver.domain.store.model.Store;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@RequiredArgsConstructor
public class MenuFinder {

private final MenuRepository menuRepository;

public List<Menu> findAllByStore(Store store) {
return menuRepository.findAllByStore(store);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,13 @@ public class StoreController {
private final StoreQueryService storeQueryService;
private final HeartCommandService heartCommandService;

@GetMapping("/stores/{id}")
public HankkiResponse<StoreGetResponse> getStore(@PathVariable final Long id) {
return HankkiResponse.success(CommonSuccessCode.OK, storeQueryService.getStoreInformation(id));
}

@GetMapping("/stores/{id}/thumbnail")
public HankkiResponse<StoreThumbnailResponse> getStoreThumbnail(@PathVariable Long id) {
public HankkiResponse<StoreThumbnailResponse> getStoreThumbnail(@PathVariable final Long id) {
return HankkiResponse.success(CommonSuccessCode.OK, storeQueryService.getStoreThumbnail(id));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,17 @@ public class StoreFinder {

private final StoreRepository storeRepository;

protected Store findByIdWhereDeletedIsFalse(Long id) {
public Store getStoreReference(final Long id) {
return storeRepository.getReferenceById(id);
}

protected Store findByIdWhereDeletedIsFalse(final Long id) {
return storeRepository.findByIdAndIsDeletedIsFalse(id)
.orElseThrow(() -> new NotFoundException(StoreErrorCode.STORE_NOT_FOUND));
}

public Store getStoreReference(final Long id) {
return storeRepository.getReferenceById(id);
protected Store findByIdWithHeartAndIsDeletedFalse(final Long id) {
return storeRepository.findByIdWithHeartAndIsDeletedFalse(id)
.orElseThrow(() -> new NotFoundException(StoreErrorCode.STORE_NOT_FOUND));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,43 @@


import lombok.RequiredArgsConstructor;
import org.hankki.hankkiserver.api.menu.service.MenuFinder;
import org.hankki.hankkiserver.api.store.parameter.PriceCategory;
import org.hankki.hankkiserver.api.store.parameter.SortOption;
import org.hankki.hankkiserver.api.store.service.response.*;
import org.hankki.hankkiserver.domain.heart.model.Heart;
import org.hankki.hankkiserver.domain.store.model.Store;
import org.hankki.hankkiserver.domain.store.model.StoreCategory;
import org.hankki.hankkiserver.domain.store.model.StoreImage;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.List;

@Service
@RequiredArgsConstructor
public class StoreQueryService {

private final StoreFinder storeFinder;
private final MenuFinder menuFinder;

@Transactional(readOnly = true)//주어진 pk를 가진 식당의 정보를 조회 이때 식당의 상태가 is_deleted면 404를 나타낸다.
public StoreThumbnailResponse getStoreThumbnail(Long id) {
@Transactional(readOnly = true)
public StoreThumbnailResponse getStoreThumbnail(final Long id) {
return StoreThumbnailResponse.of(storeFinder.findByIdWhereDeletedIsFalse(id));
}

@Transactional(readOnly = true)
public StoreGetResponse getStoreInformation(final Long id) {

Store store = storeFinder.findByIdWithHeartAndIsDeletedFalse(id);

return StoreGetResponse.of(store,
isLiked(id, store),
getImageUrlsFromStore(store),
getMenus(store));
}

public CategoriesResponse getCategories() {
return new CategoriesResponse(Arrays.stream(StoreCategory.values())
.map(CategoryResponse::of)
Expand All @@ -39,4 +56,22 @@ public PriceCategoriesResponse getPriceCategories() {
.map(PriceCategoryResponse::of)
.toList());
}

private List<String> getImageUrlsFromStore(final Store store) {
return store.getImages().stream()
.map(StoreImage::getImageUrl)
.toList();
}

private List<MenuResponse> getMenus(final Store store) {
return menuFinder.findAllByStore(store).stream().map(MenuResponse::of).toList();
}

private boolean isLiked(final Long id, final Store store) {
return store.getHearts().stream().anyMatch(heart -> isLiked(id, heart));
}

private static boolean isLiked(final Long id, final Heart heart) {
return heart.getUser().getId().equals(id);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.hankki.hankkiserver.api.store.service.response;

import org.hankki.hankkiserver.domain.menu.model.Menu;

public record MenuResponse(
String name,
int price
) {
public static MenuResponse of(Menu menu) {
return new MenuResponse(menu.getName(), menu.getPrice());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.hankki.hankkiserver.api.store.service.response;

import org.hankki.hankkiserver.domain.store.model.Store;

import java.util.List;

public record StoreGetResponse(
String name,
String category,
int heartCount,
boolean isLiked,
List<String> imageUrls,
List<MenuResponse> menus
) {
public static StoreGetResponse of(final Store store, final boolean isLiked, final List<String> imageUrls, final List<MenuResponse> menus) {
return new StoreGetResponse(store.getName(),
store.getCategory().getName(),
store.getHeartCount(),
isLiked,
imageUrls,
menus);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public record StoreThumbnailResponse(
int lowestPrice,
int heartCount
) {
public static StoreThumbnailResponse of(Store store) {
public static StoreThumbnailResponse of(final Store store) {
return new StoreThumbnailResponse(
store.getId(),
store.getName(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package org.hankki.hankkiserver.domain.menu.repository;

import org.hankki.hankkiserver.domain.menu.model.Menu;
import org.hankki.hankkiserver.domain.store.model.Store;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface MenuRepository extends JpaRepository<Menu, Long> {
List<Menu> findAllByStore(Store store);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import lombok.NoArgsConstructor;
import org.hankki.hankkiserver.domain.common.BaseTimeEntity;
import org.hankki.hankkiserver.domain.common.Point;
import org.hankki.hankkiserver.domain.heart.model.Heart;

import java.util.List;

@Entity
@Getter
Expand All @@ -17,6 +20,12 @@ public class Store extends BaseTimeEntity {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@OneToMany(mappedBy = "store")
private List<Heart> hearts;

@OneToMany(mappedBy = "store")
private List<StoreImage> images;

@Embedded
private Point point;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ public class StoreImage extends BaseCreatedAtEntity {
private Store store;

@Column(nullable = false)
private String image_url;
private String imageUrl;

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,7 @@
public interface StoreRepository extends JpaRepository<Store, Long> {
@Query("select s from Store s where s.id = :id and s.isDeleted = false")
Optional<Store> findByIdAndIsDeletedIsFalse(Long id);

@Query("select s from Store s join fetch s.hearts where s.id = :id and s.isDeleted = false")
Optional<Store> findByIdWithHeartAndIsDeletedFalse(Long id);
}
Loading