Skip to content

Commit

Permalink
Feat: Review CRUD 기능 구현,
Browse files Browse the repository at this point in the history
Stock 객체 생성,
secret.yml 파일 생성 및 스웨거를 위한 @operation 추가
  • Loading branch information
oo-ni committed Jan 25, 2024
1 parent 896cbca commit 3d43bf0
Show file tree
Hide file tree
Showing 17 changed files with 257 additions and 27 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,6 @@ out/

### VS Code ###
.vscode/

### etc ###
secret.yml
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ dependencies {
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-api:2.1.0'

// MySQL
runtimeOnly 'com.mysql:mysql-connector-j'

}

tasks.named('test') {
Expand Down
40 changes: 23 additions & 17 deletions src/main/java/kea/dpang/item/controller/ItemController.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
import kea.dpang.item.dto.*;
import kea.dpang.item.entity.Item;
import kea.dpang.item.service.ItemServiceImpl;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
Expand All @@ -22,6 +24,20 @@ public class ItemController {

private final ItemServiceImpl itemService;

@PostMapping
@Operation(summary = "상품 등록", description = "상품 정보를 시스템에 추가합니다.")
public ResponseEntity<ItemResponseDto> createItem(@RequestBody ItemCreateDto itemCreateDto) {
ItemResponseDto item = itemService.createItem(itemCreateDto);
log.info("새로운 상품 등록 완료. 상품 ID: {}", item.getItemId());

URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{itemId}")
.buildAndExpand(item.getItemId())
.toUri();

return ResponseEntity.created(location).body(item);
}

@GetMapping("/{itemId}")
@Operation(summary = "상품 상세 정보 조회", description = "상품의 상세 정보를 조회합니다.")
public ResponseEntity<ItemResponseDto> getItem(@PathVariable Long itemId) {
Expand All @@ -48,24 +64,10 @@ public ResponseEntity<List<PopularItemDto>> getPopularItems() {
return ResponseEntity.ok(popularItems);
}

@PostMapping
@Operation(summary = "상품 등록", description = "상품 정보를 시스템에 추가합니다.")
public ResponseEntity<ItemResponseDto> createItem(@RequestBody ItemCreateDto createItemDto) {
ItemResponseDto item = itemService.createItem(createItemDto);
log.info("새로운 상품 등록 완료. 상품 ID: {}", item.getItemId());

URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{itemId}")
.buildAndExpand(item.getItemId())
.toUri();

return ResponseEntity.created(location).body(item);
}

@PutMapping("/{itemId}")
@Operation(summary = "상품 수정", description = "기존 상품 정보를 업데이트합니다.")
public ResponseEntity<ItemResponseDto> updateItem(@PathVariable Long itemId, @RequestBody ItemUpdateDto updateItemDto) {
ItemResponseDto item = itemService.updateItem(itemId, updateItemDto);
public ResponseEntity<ItemResponseDto> updateItem(@PathVariable Long itemId, @RequestBody ItemUpdateDto itemUpdateDto) {
ItemResponseDto item = itemService.updateItem(itemId, itemUpdateDto);
log.info("상품 정보 업데이트 완료. 상품 ID: {}", item.getItemId());

return ResponseEntity.ok(item);
Expand All @@ -89,6 +91,7 @@ public ResponseEntity<Void> incrementItemView(@PathVariable Long itemId) {
}

@GetMapping("/cart")
@Operation(summary = "장바구니 조회", description = "장바구니의 상품 정보 목록을 조회 합니다.")
public ResponseEntity<List<ReadCartItemDto>> getCartItemInfo(@RequestParam("itemIds") List<Long> itemIds) {

// 상품 ID 목록에 해당하는 상품을 찾습니다.
Expand All @@ -104,6 +107,7 @@ public ResponseEntity<List<ReadCartItemDto>> getCartItemInfo(@RequestParam("item
}

@GetMapping("/cart/{itemId}")
@Operation(summary = "장바구니 상품 조회", description = "장바구니의 상품 별 상세 정보를 조회 합니다.")
public ResponseEntity<ReadCartItemDto> getCartItemInfo(@PathVariable("itemId") Long itemId) {

// item
Expand All @@ -115,6 +119,7 @@ public ResponseEntity<ReadCartItemDto> getCartItemInfo(@PathVariable("itemId") L
}

@GetMapping("/wishlist")
@Operation(summary = "위시리스트 조회", description = "위시리스트의 상품 정보 목록을 조회합니다.")
public ResponseEntity<List<ReadWishlistItemDto>> getWishlistItemInfo(@RequestParam("itemIds") List<Long> itemIds) {

// 상품 ID 목록에 해당하는 상품을 찾습니다.
Expand All @@ -129,7 +134,8 @@ public ResponseEntity<List<ReadWishlistItemDto>> getWishlistItemInfo(@RequestPar
return ResponseEntity.ok(itemInfoDtos);
}

@GetMapping("/cart/{itemId}")
@GetMapping("/wishlist/{itemId}")
@Operation(summary = "위시리스트 상품 조회", description = "위시리스트의 상품 별 상세 정보를 조회합니다.")
public ResponseEntity<ReadWishlistItemDto> getWishlistItemInfo(@PathVariable("itemId") Long itemId) {

// 상품 ID 목록에 해당하는 상품을 찾습니다.
Expand Down
59 changes: 59 additions & 0 deletions src/main/java/kea/dpang/item/controller/ReviewController.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,63 @@
package kea.dpang.item.controller;

import io.swagger.v3.oas.annotations.Operation;
import kea.dpang.item.dto.*;
import kea.dpang.item.service.ReviewServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;

import java.net.URI;

@RestController
@RequiredArgsConstructor
@RequestMapping("/reviews")
@Slf4j
public class ReviewController {

private final ReviewServiceImpl reviewService;

@PostMapping
@Operation(summary = "리뷰 등록", description = "리뷰 정보를 시스템에 추가합니다.")
public ResponseEntity<ReviewResponseDto> createReview(@RequestBody ReviewCreateDto reviewCreateDto) {
ReviewResponseDto review = reviewService.createReview(reviewCreateDto);
log.info("새로운 리뷰 등록 완료. 리뷰 ID: {}", review.getReviewId());

URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{reviewId}")
.buildAndExpand(review.getReviewId())
.toUri();

return ResponseEntity.created(location).body(review);
}

@GetMapping("/{reviewId}")
@Operation(summary = "리뷰 조회", description = "리뷰를 조회합니다.")
public ResponseEntity<ReviewResponseDto> getReview(@PathVariable Long reviewId) {
ReviewResponseDto review = reviewService.getReview(reviewId);
log.info("리뷰 정보 조회 완료. 리뷰 ID: {}", review.getReviewId());

return ResponseEntity.ok(review);
}

@PutMapping("/{reviewId}")
@Operation(summary = "리뷰 수정", description = "기존 리뷰 정보를 업데이트합니다.")
public ResponseEntity<ReviewResponseDto> updateReview(@PathVariable Long reviewId, @RequestBody ReviewUpdateDto reviewUpdateDto) {
ReviewResponseDto review = reviewService.updateReview(reviewId, reviewUpdateDto);
log.info("리뷰 정보 업데이트 완료. 리뷰 ID: {}", review.getReviewId());

return ResponseEntity.ok(review);
}

@DeleteMapping("/{reviewId}")
@Operation(summary = "리뷰 삭제", description = "리뷰 정보를 시스템에서 제거합니다.")
public ResponseEntity<Void> deleteReview(@PathVariable Long reviewId) {
reviewService.deleteReview(reviewId);
log.info("리뷰 삭제 완료. 리뷰 ID: {}", reviewId);

return ResponseEntity.noContent().build();
}
}
2 changes: 1 addition & 1 deletion src/main/java/kea/dpang/item/dto/ReadCartItemDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ public class ReadCartItemDto {

private final String thumbnailImage; // 상품 이미지 URL
private final String itemName; // 상품 이름
private final Long discountPrice; // 상품 가격
private final int discountPrice; // 상품 가격

public ReadCartItemDto(Item item) {
this.thumbnailImage = item.getThumbnailImage();
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/kea/dpang/item/dto/ReviewResponseDto.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package kea.dpang.item.dto;

import kea.dpang.item.entity.Item;
import kea.dpang.item.entity.Review;
import lombok.AllArgsConstructor;
import lombok.Data;

Expand All @@ -11,5 +13,13 @@ public class ReviewResponseDto {
private Long itemId;
private String content;
private Double rating;

public ReviewResponseDto(Review review) {
this.reviewId = review.getReviewId();
this.reviewerId = review.getReviewerId();
this.itemId = review.getItemId();
this.content = review.getContent();
this.rating = review.getRating();
}
}

20 changes: 20 additions & 0 deletions src/main/java/kea/dpang/item/entity/Review.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

import jakarta.persistence.*;
import kea.dpang.item.base.BaseEntity;
import kea.dpang.item.dto.ItemCreateDto;
import kea.dpang.item.dto.ItemUpdateDto;
import kea.dpang.item.dto.ReviewCreateDto;
import kea.dpang.item.dto.ReviewUpdateDto;
import lombok.*;

@Getter
Expand Down Expand Up @@ -32,4 +36,20 @@ public class Review extends BaseEntity {
// 평점
@Column(name = "rating", nullable = false)
private Double rating;

public static Review from(ReviewCreateDto dto) {
return Review.builder()
.reviewerId(dto.getReviewerId())
.itemId(dto.getItemId())
.content(dto.getContent())
.rating(dto.getRating())
.build();
}

public void updateInformation(ReviewUpdateDto dto) {
this.reviewId = dto.getReviewId();
this.content = dto.getContent();
this.rating = dto.getRating();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package kea.dpang.item.exception;

import lombok.Getter;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@Getter
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ReviewNotFoundException extends RuntimeException {
private final Long reviewId;

public ReviewNotFoundException(Long reviewId) {
super(String.format("상품을 찾을 수 없음: 상품 ID - '%s'", reviewId));
this.reviewId = reviewId;
}
}
2 changes: 2 additions & 0 deletions src/main/java/kea/dpang/item/repository/ItemRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import kea.dpang.item.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ItemRepository extends JpaRepository<Item, Long> {
List<Item> findCartItemsByItemId(List<Long> itemId);

Expand Down
8 changes: 5 additions & 3 deletions src/main/java/kea/dpang/item/service/ItemService.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package kea.dpang.item.service;

import kea.dpang.item.dto.CreateItemDto;
import kea.dpang.item.dto.ItemDetailDto;
import kea.dpang.item.dto.UpdateItemDto;
import kea.dpang.item.dto.ItemCreateDto;
import kea.dpang.item.dto.ItemResponseDto;
import kea.dpang.item.dto.ItemThumbnailDto;
import kea.dpang.item.dto.ItemUpdateDto;
import kea.dpang.item.dto.PopularItemDto;
import kea.dpang.item.entity.Item;

import java.util.List;
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/kea/dpang/item/service/ItemServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
import kea.dpang.item.entity.Item;
import kea.dpang.item.exception.ItemNotFoundException;
import kea.dpang.item.repository.ItemRepository;
import kea.dpang.item.repository.ReviewRepository;

import lombok.RequiredArgsConstructor;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.ZSetOperations;
Expand All @@ -21,7 +22,6 @@
public class ItemServiceImpl implements ItemService {

private final ItemRepository itemRepository;
private final ReviewRepository reviewRepository;
private static final String ITEM_VIEW_COUNT_KEY = "item:viewCount";
private final StringRedisTemplate redisTemplate;

Expand Down Expand Up @@ -101,8 +101,8 @@ public void deleteItem(Long itemId) {

// 상품 정보 목록 조회
@Override
public List<Item> getCartItems(List<Long> itemId) {
return itemRepository.findCartItemsByItemId(itemId);
public List<Item> getCartItems(List<Long> itemIds) {
return itemRepository.findCartItemsByItemId(itemIds);
}

// 상품 정보 조회
Expand Down
36 changes: 36 additions & 0 deletions src/main/java/kea/dpang/item/service/ReviewService.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,40 @@
package kea.dpang.item.service;

import kea.dpang.item.dto.ReviewCreateDto;
import kea.dpang.item.dto.ReviewResponseDto;
import kea.dpang.item.dto.ReviewUpdateDto;
import kea.dpang.item.entity.Review;

public interface ReviewService {
/**
* 주어진 ID에 해당하는 리뷰의 정보를 조회합니다.
*
* @param reviewId 조회할 리뷰의 ID
* @return 조회된 리뷰의 정보가 담긴 Detail DTO
*/
ReviewResponseDto getReview(Long reviewId);

/**
* 새로운 리뷰을 등록합니다.
*
* @param reviewCreateDto 등록할 리뷰의 정보가 담긴 DTO
* @return 등록된 리뷰의 정보가 담긴 Detail DTO
*/
ReviewResponseDto createReview(ReviewCreateDto reviewCreateDto);

/**
* 리뷰의 정보를 업데이트합니다.
*
* @param reviewId 업데이트할 리뷰의 ID
* @param reviewUpdateDto 업데이트할 리뷰의 정보가 담긴 DTO
* @return 업데이트된 리뷰의 정보가 담긴 Detail DTO
*/
ReviewResponseDto updateReview(Long reviewId, ReviewUpdateDto reviewUpdateDto);

/**
* 주어진 ID에 해당하는 리뷰을 삭제합니다.
*
* @param reviewId 삭제할 리뷰의 ID
*/
void deleteReview(Long reviewId);
}
Loading

0 comments on commit 3d43bf0

Please sign in to comment.