Skip to content

Commit

Permalink
Merge pull request #13 from Malloc72P/backend-nas
Browse files Browse the repository at this point in the history
상세보기 서비스 기능 구현
  • Loading branch information
ChoiGiSung authored Apr 22, 2021
2 parents d20b021 + b35657f commit 5bbebc6
Show file tree
Hide file tree
Showing 13 changed files with 276 additions and 59 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.codesquad.sidedish.category.controller;

import com.codesquad.sidedish.category.domain.SidedishItemDetailDTO;
import com.codesquad.sidedish.category.domain.dto.SidedishItemDetailListDTO;
import com.codesquad.sidedish.category.domain.dto.SidedishItemPreviewDTO;
import com.codesquad.sidedish.category.domain.dto.SidedishItemPreviewListDTO;
Expand All @@ -25,14 +26,13 @@ public SidedishCategoryController(SidedishItemService itemService) {
public ResponseEntity<SidedishItemPreviewListDTO> previewDish(@PathVariable String category) {
List<SidedishItemPreviewDTO> previewDTOs = itemService.showItemList(category);
SidedishItemPreviewListDTO previewListDTO = new SidedishItemPreviewListDTO(previewDTOs);
return new ResponseEntity(previewListDTO, HttpStatus.OK);
return new ResponseEntity<>(previewListDTO, HttpStatus.OK);
}

@GetMapping("/{category}/{id}")
public ResponseEntity<SidedishItemDetailDTO> previewDish(@PathVariable String category, @PathVariable Long id) {
public ResponseEntity<SidedishItemDetailListDTO> detailDish(@PathVariable String category, @PathVariable Long id) {
SidedishItemDetailDTO detailDTOs = itemService.showItem(category, id);
SidedishItemDetailListDTO detailListDTO =new SidedishItemDetailListDTO(detailDTOs);
return new ResponseEntity(detailListDTO, HttpStatus.OK);
SidedishItemDetailListDTO detailListDTO = new SidedishItemDetailListDTO(detailDTOs);
return new ResponseEntity<>(detailListDTO, HttpStatus.OK);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface SidedishCategoryRepository extends CrudRepository<SidedishCategory, Long> {

SidedishCategory findByCategoryName(String categoryName);

}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ public class SidedishItem {

private List<SidedishItemImage> sidedishItemImages = new ArrayList<>();

public SidedishItem(String itemName, String itemDescription, int itemSalePrice, int itemNormalPrice, int itemQuantity, int itemPointRate, String itemDeliveryInfo, String itemDeliveryFee) {
public SidedishItem(String itemName, String itemDescription, int itemSalePrice, int itemNormalPrice,
int itemQuantity, int itemPointRate, String itemDeliveryInfo, String itemDeliveryFee) {
this.itemName = itemName;
this.itemDescription = itemDescription;
this.itemSalePrice = itemSalePrice;
Expand All @@ -40,6 +41,14 @@ public SidedishItem(String itemName, String itemDescription, int itemSalePrice,
this.itemDeliveryFee = itemDeliveryFee;
}

public boolean isSameId(Long itemId) {
return id.equals(itemId);
}

public boolean isPurchasable() {
return itemQuantity > 0;
}

public void addEvent(SidedishEvent sidedishEvent) {
SidedishEventItem eventItem = new SidedishEventItem(sidedishEvent.getId());
eventItems.add(eventItem);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package com.codesquad.sidedish.category.domain;

import com.codesquad.sidedish.event.domain.SidedishEventDTO;
import com.codesquad.sidedish.image.domain.SidedishImage;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class SidedishItemDetailDTO {

private Long id;
private List<String> detailImages;
private List<String> descriptionImages;
private String name;
private String description;
private int normalPrice;
private int salePrice;
private Set<SidedishEventDTO> eventBadgeList;
private int PointRate;
private boolean isPurchasable;
private String DeliveryInfo;
private String DeliveryFee;

public SidedishItemDetailDTO(SidedishItem sidedishItem, Set<SidedishEventDTO> eventBadgeList,
List<SidedishImage> detailImages, List<SidedishImage> descriptionImages) {
this.id = sidedishItem.getId();
this.name = sidedishItem.getItemName();
this.description = sidedishItem.getItemDescription();
this.normalPrice = sidedishItem.getItemNormalPrice();
this.salePrice = sidedishItem.getItemSalePrice();
this.PointRate = sidedishItem.getPointRate();
this.DeliveryInfo = sidedishItem.getItemDeliveryInfo();
this.DeliveryFee = sidedishItem.getItemDeliveryFee();

this.detailImages = detailImages.stream().map(SidedishImage::getImageUrl).collect(Collectors.toList());
this.descriptionImages = descriptionImages.stream().map(SidedishImage::getImageUrl).collect(Collectors.toList());

this.isPurchasable = sidedishItem.isPurchasable();
this.eventBadgeList = eventBadgeList;
}

@Override
public String toString() {
return "SidedishItemDetailDTO{" +
"id=" + id +
", detailImages=" + detailImages + '\n' +
", descriptionImages=" + descriptionImages + '\n' +
", name='" + name + '\n' +
", description='" + description + '\n' +
", normalPrice=" + normalPrice +
", salePrice=" + salePrice +
", eventBadgeList=" + eventBadgeList +
", PointRate=" + PointRate +
", isPurchasable=" + isPurchasable +
", DeliveryInfo='" + DeliveryInfo + '\n' +
", DeliveryFee='" + DeliveryFee + '\n' +
'}';
}

public Long getId() {
return id;
}

public List<String> getDetailImages() {
return detailImages;
}

public List<String> getDescriptionImages() {
return descriptionImages;
}

public String getName() {
return name;
}

public String getDescription() {
return description;
}

public int getNormalPrice() {
return normalPrice;
}

public int getSalePrice() {
return salePrice;
}

public Set<SidedishEventDTO> getEventBadgeList() {
return eventBadgeList;
}

public int getPointRate() {
return PointRate;
}

public boolean isPurchasable() {
return isPurchasable;
}

public String getDeliveryInfo() {
return DeliveryInfo;
}

public String getDeliveryFee() {
return DeliveryFee;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.codesquad.sidedish.category.domain.dto;

import com.codesquad.sidedish.category.domain.SidedishItemDetailDTO;

import java.util.ArrayList;
import java.util.List;

Expand All @@ -10,4 +12,8 @@ public class SidedishItemDetailListDTO {
public SidedishItemDetailListDTO(SidedishItemDetailDTO item) {
this.item = item;
}

public SidedishItemDetailDTO getItem() {
return item;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,44 +10,62 @@

public class SidedishItemPreviewDTO {

private Long id;
private String thumbnailImage;
private String name;
private String description;
private int salePrice;
private int normalPrice;
private int Quantity;
private int PointRate;
private String DeliveryInfo;
private String DeliveryFee;

private int salePrice;
private Set<SidedishEventDTO> eventBadgeList;
private String thumbnailImage;

public SidedishItemPreviewDTO(SidedishItem item, Set<SidedishEventDTO> eventBadgeList, SidedishImage thumbnailImageUrl) {
this.id = item.getId();
this.thumbnailImage = thumbnailImageUrl.getImageUrl();
this.name = item.getItemName();
this.description = item.getItemDescription();
this.salePrice = item.getItemSalePrice();
this.normalPrice = item.getItemNormalPrice();
this.Quantity = item.getItemQuantity();
this.PointRate = item.getPointRate();
this.DeliveryInfo = item.getItemDeliveryInfo();
this.DeliveryFee = item.getItemDeliveryFee();
this.salePrice = item.getItemSalePrice();
this.eventBadgeList = eventBadgeList;
this.thumbnailImage = thumbnailImageUrl.getImageUrl();
}

@Override
public String toString() {
return "SidedishItemDTO{" +
"name='" + name + '\'' +
", description='" + description + '\n' +
", salePrice=" + salePrice +
return "SidedishItemPreviewDTO{" +
"id=" + id +
", thumbnailImage='" + thumbnailImage + '\'' +
", name='" + name + '\'' +
", description='" + description + '\'' +
", normalPrice=" + normalPrice +
", Quantity=" + Quantity +
", PointRate=" + PointRate +
", DeliveryInfo='" + DeliveryInfo + '\n' +
", DeliveryFee='" + DeliveryFee + '\n' +
", eventBadgeList=" + eventBadgeList + '\n' +
", thumbnailImage=" + thumbnailImage + '\n' +
", salePrice=" + salePrice +
", eventBadgeList=" + eventBadgeList +
'}';
}

public Long getId() {
return id;
}

public String getThumbnailImage() {
return thumbnailImage;
}

public String getName() {
return name;
}

public String getDescription() {
return description;
}

public int getNormalPrice() {
return normalPrice;
}

public int getSalePrice() {
return salePrice;
}

public Set<SidedishEventDTO> getEventBadgeList() {
return eventBadgeList;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,7 @@ private void addDTO(List<SidedishItemPreviewDTO> previewDTOs){
}
}

public List<SidedishItemPreviewDTO> getItems() {
return items;
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
package com.codesquad.sidedish.category.service;

import com.codesquad.sidedish.category.domain.SidedishCategoryRepository;
import com.codesquad.sidedish.category.domain.SidedishCategory;
import com.codesquad.sidedish.category.domain.SidedishItem;
import com.codesquad.sidedish.category.domain.SidedishItemPreviewDTO;
import com.codesquad.sidedish.category.domain.*;
import com.codesquad.sidedish.category.domain.dto.SidedishItemPreviewDTO;
import com.codesquad.sidedish.category.exception.EmptyItemException;
import com.codesquad.sidedish.event.domain.SidedishEvent;
import com.codesquad.sidedish.event.domain.SidedishEventDTO;
import com.codesquad.sidedish.event.domain.SidedishEventItem;
import com.codesquad.sidedish.event.domain.SidedishEventRepository;
import com.codesquad.sidedish.image.domain.SidedishImage;
import com.codesquad.sidedish.image.domain.SidedishImageRepository;
import com.codesquad.sidedish.image.domain.SidedishImageTypeEnum;
import com.codesquad.sidedish.image.domain.SidedishItemImage;
import com.codesquad.sidedish.image.exception.ImageNotFoundException;
import org.springframework.stereotype.Service;
Expand All @@ -31,32 +30,73 @@ public SidedishItemService(SidedishCategoryRepository sidedishCategoryRepository
this.sidedishImageRepository = sidedishImageRepository;
}

public List<SidedishItemPreviewDTO> showItemList(String categoryName){

public List<SidedishItemPreviewDTO> showItemList(String categoryName) {
SidedishCategory category = sidedishCategoryRepository.findByCategoryName(categoryName);
List<SidedishItem> items = category.getSidedishItemList();

List<SidedishItemPreviewDTO> itemDTOs = new ArrayList<>();
Map<Long, SidedishEvent> events = new HashMap<>();

for(SidedishItem item : items){
for(SidedishEventItem eventItem : item.getEventItems()){
Long eventId = eventItem.getSidedishEvent();
if(!events.containsKey(eventId)){
events.put(eventId,sidedishEventRepository.findById(eventId).orElseThrow(EmptyItemException::new));
}
}
Map<Long, SidedishEvent> eventMap = new HashMap<>();

Set<SidedishEventDTO> eventSet = item.getEventItems().stream()
.map(eventItem -> events.get(eventItem.getSidedishEvent()))
.map(SidedishEventDTO::new)
.collect(Collectors.toSet());
SidedishItemImage thumbnailItemImage = item.getSidedishItemImages().stream().filter(SidedishItemImage::isThumbnailImage).findFirst().orElseThrow(ImageNotFoundException::new);
SidedishImage thumbnailImage = sidedishImageRepository.findById(thumbnailItemImage.getSidedishImage()).orElseThrow(ImageNotFoundException::new);
for (SidedishItem item : items) {
Set<SidedishEventDTO> eventSet = createEventDtoSet(item, eventMap);
SidedishImage thumbnailImage = findThumbnailImage(item);
itemDTOs.add(new SidedishItemPreviewDTO(item, eventSet, thumbnailImage));
}
return itemDTOs;
}

public SidedishItemDetailDTO showItem(String categoryName, Long itemId) {
SidedishCategory sidedishCategory = sidedishCategoryRepository.findByCategoryName(categoryName);
SidedishItem sidedishItem = sidedishCategory.getSidedishItemList().stream()
.filter(item -> item.isSameId(itemId))
.findFirst()
.orElseThrow(EmptyItemException::new);

Set<SidedishEventDTO> eventSet = createEventDtoSet(sidedishItem);
List<SidedishImage> detailImages = findImagesByType(sidedishItem, SidedishImageTypeEnum.DETAIL);
List<SidedishImage> descriptionImages = findImagesByType(sidedishItem, SidedishImageTypeEnum.DESCRIPTION);

return new SidedishItemDetailDTO(sidedishItem, eventSet, detailImages, descriptionImages);
}

private SidedishImage findThumbnailImage(SidedishItem item) {
SidedishItemImage sidedishItemImage = item.getSidedishItemImages().stream()
.filter(SidedishItemImage::isThumbnailImage)
.findFirst()
.orElseThrow(ImageNotFoundException::new);
return sidedishImageRepository.findById(sidedishItemImage.getSidedishImage())
.orElseThrow(ImageNotFoundException::new);
}

private List<SidedishImage> findImagesByType(SidedishItem item, SidedishImageTypeEnum imageTypeEnum) {
List<Long> itemImageList = item.getSidedishItemImages().stream()
.filter(image -> image.isSameType(imageTypeEnum))
.map(SidedishItemImage::getSidedishImage)
.collect(Collectors.toList());
return sidedishImageRepository.findAllById(itemImageList);
}

private Set<SidedishEventDTO> createEventDtoSet(SidedishItem item, Map<Long, SidedishEvent> eventMap) {
for (SidedishEventItem eventItem : item.getEventItems()) {
Long eventId = eventItem.getSidedishEvent();
if (!eventMap.containsKey(eventId)) {
eventMap.put(eventId, sidedishEventRepository.findById(eventId).orElseThrow(EmptyItemException::new));
}
}
return item.getEventItems().stream()
.map(eventItem -> eventMap.get(eventItem.getSidedishEvent()))
.map(SidedishEventDTO::new)
.collect(Collectors.toSet());
}

private Set<SidedishEventDTO> createEventDtoSet(SidedishItem item) {
Set<SidedishEventDTO> eventDtoSet = new HashSet<>();
for (SidedishEventItem eventItem : item.getEventItems()) {
Long eventId = eventItem.getSidedishEvent();
SidedishEvent sidedishEvent = sidedishEventRepository.findById(eventId).orElseThrow(EmptyItemException::new);
eventDtoSet.add(new SidedishEventDTO(sidedishEvent));
}
return eventDtoSet;
}

}
Loading

0 comments on commit 5bbebc6

Please sign in to comment.