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
4 changes: 3 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@ dependencies {
// QueryDSL
implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta'
annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta'
annotationProcessor 'jakarta.annotation:jakarta.annotation-api'

annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
annotationProcessor 'jakarta.annotation:jakarta.annotation-api'

// dotenv
implementation 'io.github.cdimascio:java-dotenv:+'
Expand Down Expand Up @@ -81,3 +82,4 @@ dependencies {
tasks.named('test') {
useJUnitPlatform()
}

Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.sparta.spring_deep._delivery.admin.review;


import com.sparta.spring_deep._delivery.domain.review.ReviewResponseDto;
import com.sparta.spring_deep._delivery.domain.review.dto.ReviewResponseDto;
import com.sparta.spring_deep._delivery.domain.user.entity.User;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.sparta.spring_deep._delivery.admin.review;

import com.sparta.spring_deep._delivery.domain.review.Review;
import com.sparta.spring_deep._delivery.domain.review.model.Review;
import java.util.List;
import java.util.UUID;
import org.springframework.data.domain.Page;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.DateTimePath;
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.sparta.spring_deep._delivery.domain.review.QReview;
import com.sparta.spring_deep._delivery.domain.review.model.QReview;
import java.time.LocalDateTime;
import java.util.List;
import lombok.RequiredArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.sparta.spring_deep._delivery.admin.review;

import com.sparta.spring_deep._delivery.domain.review.Review;
import com.sparta.spring_deep._delivery.domain.review.model.Review;
import java.time.LocalDateTime;
import java.util.UUID;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import com.sparta.spring_deep._delivery.domain.order.Order;
import com.sparta.spring_deep._delivery.domain.order.OrderRepository;
import com.sparta.spring_deep._delivery.domain.review.Review;
import com.sparta.spring_deep._delivery.domain.review.ReviewResponseDto;
import com.sparta.spring_deep._delivery.domain.review.model.Review;
import com.sparta.spring_deep._delivery.domain.review.dto.ReviewResponseDto;
import com.sparta.spring_deep._delivery.domain.user.entity.User;
import com.sparta.spring_deep._delivery.exception.ResourceNotFoundException;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
import com.sparta.spring_deep._delivery.domain.payment.PaymentService;
import com.sparta.spring_deep._delivery.domain.restaurant.Restaurant;
import com.sparta.spring_deep._delivery.domain.restaurant.RestaurantRepository;
import com.sparta.spring_deep._delivery.domain.review.Review;
import com.sparta.spring_deep._delivery.domain.review.ReviewRepository;
import com.sparta.spring_deep._delivery.domain.review.model.Review;
import com.sparta.spring_deep._delivery.domain.review.repository.ReviewRepository;
import com.sparta.spring_deep._delivery.domain.user.entity.User;
import com.sparta.spring_deep._delivery.domain.user.entity.UserRole;
import com.sparta.spring_deep._delivery.domain.user.repository.UserRepository;
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package com.sparta.spring_deep._delivery.domain.review;
package com.sparta.spring_deep._delivery.domain.review.controller;

import com.sparta.spring_deep._delivery.domain.review.dto.ReviewRequestDto;
import com.sparta.spring_deep._delivery.domain.review.dto.ReviewResponseDto;
import com.sparta.spring_deep._delivery.domain.review.dto.ReviewRestaurantResponseDto;
import com.sparta.spring_deep._delivery.domain.review.service.ReviewService;
import com.sparta.spring_deep._delivery.domain.user.details.UserDetailsImpl;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -34,33 +38,26 @@ public ResponseEntity<ReviewResponseDto> createReview(
@AuthenticationPrincipal UserDetailsImpl userDetails,
@RequestBody ReviewRequestDto requestDto) {

log.info("리뷰 작성 : {}", requestDto);

ReviewResponseDto responseDto = reviewService.createReview(requestDto,
userDetails.getUser());
return ResponseEntity.status(HttpStatus.CREATED).body(responseDto);
}

// 특정 음식점 리뷰 조회
@GetMapping("/reviews/{restaurantId}/search")
public ResponseEntity<Page<ReviewResponseDto>> searchReview(
public ResponseEntity<ReviewRestaurantResponseDto> searchReview(
@PathVariable String restaurantId,
@PageableDefault(sort = "createdAt", size = 10, page = 0, direction = Direction.DESC) Pageable pageable
) {

log.info("특정 음식점 리뷰 조회 - restaurantId :{}", restaurantId);

Page<ReviewResponseDto> responseDtos = reviewService.getReviews(
ReviewRestaurantResponseDto responseDto = reviewService.getReviews(
UUID.fromString(restaurantId), pageable);

return ResponseEntity.status(HttpStatus.OK).body(responseDtos);
return ResponseEntity.status(HttpStatus.OK).body(responseDto);
}

// 리뷰 조회
@GetMapping("/reviews/{reviewId}")
public ResponseEntity<ReviewResponseDto> getReview(@PathVariable String reviewId) {
log.info("리뷰 조회 - reviewId :{}", reviewId);

ReviewResponseDto responseDto = reviewService.getReview(UUID.fromString(reviewId));

return ResponseEntity.status(HttpStatus.OK).body(responseDto);
Expand All @@ -72,7 +69,6 @@ public ResponseEntity<ReviewResponseDto> updateReview(
@AuthenticationPrincipal UserDetailsImpl userDetails,
@PathVariable String reviewId,
@RequestBody ReviewRequestDto requestDto) {
log.info("리뷰 수정 :{}", reviewId);

ReviewResponseDto responseDto = reviewService.updateReview(UUID.fromString(reviewId),
requestDto.getComment(), requestDto.getRating(), userDetails.getUser());
Expand All @@ -85,7 +81,6 @@ public ResponseEntity<ReviewResponseDto> updateReview(
public ResponseEntity<String> deleteReview(
@AuthenticationPrincipal UserDetailsImpl userDetails,
@PathVariable String reviewId) {
log.info("리뷰 삭제 - reviewId :{}", reviewId);

return reviewService.deleteReview(UUID.fromString(reviewId), userDetails.getUser());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sparta.spring_deep._delivery.domain.review;
package com.sparta.spring_deep._delivery.domain.review.dto;

import java.util.UUID;
import lombok.AllArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.sparta.spring_deep._delivery.domain.review;
package com.sparta.spring_deep._delivery.domain.review.dto;

import com.sparta.spring_deep._delivery.domain.review.model.Review;
import java.time.LocalDateTime;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;

@Data
@Getter
@AllArgsConstructor
public class ReviewResponseDto {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.sparta.spring_deep._delivery.domain.review.dto;

import com.sparta.spring_deep._delivery.domain.review.model.Review;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import lombok.Getter;

@Getter
public class ReviewRestaurantResponseDto {

private UUID restaurantId;
private List<ReviewResponseDto> reviews = new ArrayList<>();

private Double AvgRating;

public ReviewRestaurantResponseDto(List<ReviewResponseDto> reviews, Double AvgRating, UUID restaurantId) {
this.restaurantId = restaurantId;
this.AvgRating = AvgRating;
this.reviews =reviews;
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sparta.spring_deep._delivery.domain.review;
package com.sparta.spring_deep._delivery.domain.review.dto;

import lombok.Data;
import lombok.RequiredArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sparta.spring_deep._delivery.domain.review;
package com.sparta.spring_deep._delivery.domain.review.model;

import com.sparta.spring_deep._delivery.common.BaseEntity;
import com.sparta.spring_deep._delivery.domain.order.Order;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.sparta.spring_deep._delivery.domain.review.repository;

import com.sparta.spring_deep._delivery.domain.review.model.Review;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

public interface ReviewRepository extends JpaRepository<Review, UUID>, ReviewRepositoryCustom {

Optional<Review> findByIdAndIsDeletedFalse(UUID reviewId);

List<Review> findAllByOrderId(UUID orderId);

@Query("SELECT AVG(r.rating) FROM Review r WHERE r.isDeleted = false")
double findAverageRating();
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.sparta.spring_deep._delivery.domain.review;
package com.sparta.spring_deep._delivery.domain.review.repository;

import com.sparta.spring_deep._delivery.domain.review.model.Review;
import java.util.UUID;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package com.sparta.spring_deep._delivery.domain.review;
package com.sparta.spring_deep._delivery.domain.review.repository;

import static com.sparta.spring_deep._delivery.domain.order.QOrder.order;
import static com.sparta.spring_deep._delivery.domain.restaurant.QRestaurant.restaurant;
import static com.sparta.spring_deep._delivery.domain.review.QReview.review;
import static com.sparta.spring_deep._delivery.domain.review.model.QReview.review;

import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.sparta.spring_deep._delivery.domain.review.model.Review;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
Expand All @@ -24,7 +25,7 @@ public class ReviewRepositoryCustomImpl implements ReviewRepositoryCustom {
@Override
public Page<Review> searchReviews(UUID restaurantId, Pageable pageable) {
log.info("searchReviews");

// pageable의 정렬 조건 처리 (기본은 createdAt 내림차순)
List<OrderSpecifier<?>> orderSpecifiers = new ArrayList<>();
pageable.getSort().forEach(sort -> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package com.sparta.spring_deep._delivery.domain.review;
package com.sparta.spring_deep._delivery.domain.review.service;

import static com.sparta.spring_deep._delivery.util.AuthTools.ownerCheck;

import com.sparta.spring_deep._delivery.domain.order.Order;
import com.sparta.spring_deep._delivery.domain.order.OrderRepository;
import com.sparta.spring_deep._delivery.domain.order.OrderStatusEnum;
import com.sparta.spring_deep._delivery.domain.restaurant.RestaurantRepository;
import com.sparta.spring_deep._delivery.domain.review.dto.ReviewRequestDto;
import com.sparta.spring_deep._delivery.domain.review.dto.ReviewResponseDto;
import com.sparta.spring_deep._delivery.domain.review.dto.ReviewRestaurantResponseDto;
import com.sparta.spring_deep._delivery.domain.review.model.Review;
import com.sparta.spring_deep._delivery.domain.review.repository.ReviewRepository;
import com.sparta.spring_deep._delivery.domain.user.entity.User;
import com.sparta.spring_deep._delivery.exception.DeletedDataAccessException;
import com.sparta.spring_deep._delivery.exception.OperationNotAllowedException;
import com.sparta.spring_deep._delivery.exception.ResourceNotFoundException;
import java.util.List;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -30,46 +36,50 @@ public class ReviewService {

// 리뷰 작성
public ReviewResponseDto createReview(ReviewRequestDto requestDto, User user) {
log.info("리뷰 작성");
log.info("createReview");

Order order = orderRepository.findByIdAndIsDeletedFalse(requestDto.getOrderId())
.orElseThrow(ResourceNotFoundException::new);

ownerCheck(order.getCustomer(), user);

if (!order.getStatus().equals(OrderStatusEnum.DELIVERED)) {
log.error("배송 완료만 리뷰작성 가능");
log.error("배송 완료만 리뷰작성 가능합니다.");
throw new OperationNotAllowedException();
}

Review review = reviewRepository.save(
new Review(order, user, requestDto.getRating(), requestDto.getComment()));
Review review = new Review(order, user, requestDto.getRating(), requestDto.getComment());
reviewRepository.save(review);

return new ReviewResponseDto(review);
}

// 특정 음식점 리뷰 조회
@Transactional(readOnly = true)
public Page<ReviewResponseDto> getReviews(UUID restaurantId, Pageable pageable) {
log.info("특정 음식점 리뷰 조회");
public ReviewRestaurantResponseDto getReviews(UUID restaurantId, Pageable pageable) {
log.info("getReviews");

restaurantRepository.findByIdAndIsDeletedFalse(restaurantId)
.orElseThrow(ResourceNotFoundException::new);

Page<Review> reviews = reviewRepository.searchReviews(restaurantId, pageable);
List<ReviewResponseDto> reviews = reviewRepository.searchReviews(restaurantId, pageable)
.map(ReviewResponseDto::new)
.stream().toList();
// 리뷰 평점 조회
double rating = reviewRepository.findAverageRating();

return reviews.map(ReviewResponseDto::new);
return new ReviewRestaurantResponseDto(reviews, rating, restaurantId);
}

// 리뷰 조회
@Transactional(readOnly = true)
public ReviewResponseDto getReview(UUID reviewId) {
log.info("리뷰 조회");

Review review = reviewRepository.findByIdAndIsDeletedFalse(reviewId);
Review review = reviewRepository.findByIdAndIsDeletedFalse(reviewId)
.orElseThrow(ResourceNotFoundException::new);

Order order = review.getOrder();
if (order.getIsDeleted()) {
if(review.getOrder().getIsDeleted()){
throw new DeletedDataAccessException();
}

Expand All @@ -81,12 +91,8 @@ public ReviewResponseDto getReview(UUID reviewId) {
public ReviewResponseDto updateReview(UUID reviewId, String comment, int rating, User user) {
log.info("리뷰 수정");

Review review = reviewRepository.findByIdAndIsDeletedFalse(reviewId);

if (review == null) {
log.error("존재하지 않는 리뷰");
throw new ResourceNotFoundException();
}
Review review = reviewRepository.findByIdAndIsDeletedFalse(reviewId)
.orElseThrow(ResourceNotFoundException::new);

ownerCheck(user, review.getUser());

Expand All @@ -100,12 +106,8 @@ public ReviewResponseDto updateReview(UUID reviewId, String comment, int rating,
public ResponseEntity<String> deleteReview(UUID reviewId, User user) {
log.info("리뷰 삭제");

Review review = reviewRepository.findByIdAndIsDeletedFalse(reviewId);

if (review == null) {
log.error("존재하지 않는 리뷰");
throw new ResourceNotFoundException();
}
Review review = reviewRepository.findByIdAndIsDeletedFalse(reviewId)
.orElseThrow(ResourceNotFoundException::new);

ownerCheck(user, review.getUser());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
import com.sparta.spring_deep._delivery.domain.restaurant.RestaurantRepository;
import com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress.RestaurantAddress;
import com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress.RestaurantAddressRepository;
import com.sparta.spring_deep._delivery.domain.review.dto.ReviewRequestDto;
import com.sparta.spring_deep._delivery.domain.review.model.Review;
import com.sparta.spring_deep._delivery.domain.review.repository.ReviewRepository;
import com.sparta.spring_deep._delivery.domain.user.entity.User;
import com.sparta.spring_deep._delivery.domain.user.entity.UserRole;
import com.sparta.spring_deep._delivery.domain.user.repository.UserRepository;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import com.sparta.spring_deep._delivery.domain.restaurant.Restaurant;
import com.sparta.spring_deep._delivery.domain.restaurant.Restaurant.CategoryEnum;
import com.sparta.spring_deep._delivery.domain.restaurant.restaurantAddress.RestaurantAddress;
import com.sparta.spring_deep._delivery.domain.review.Review;
import com.sparta.spring_deep._delivery.domain.review.model.Review;
import com.sparta.spring_deep._delivery.domain.user.details.UserDetailsImpl;
import com.sparta.spring_deep._delivery.domain.user.entity.IsPublic;
import com.sparta.spring_deep._delivery.domain.user.entity.User;
Expand Down
Loading