diff --git a/src/main/java/com/anywayclear/controller/ReviewController.java b/src/main/java/com/anywayclear/controller/ReviewController.java index 1b8db02..5df9942 100644 --- a/src/main/java/com/anywayclear/controller/ReviewController.java +++ b/src/main/java/com/anywayclear/controller/ReviewController.java @@ -1,8 +1,7 @@ package com.anywayclear.controller; -import com.anywayclear.dto.request.ReviewCreateRequest; +import com.anywayclear.dto.request.ReviewRequest; import com.anywayclear.dto.response.ReviewResponse; -import com.anywayclear.entity.Member; import com.anywayclear.service.ReviewService; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -18,12 +17,36 @@ public ReviewController(ReviewService reviewService) { this.reviewService = reviewService; } - @PostMapping("/{auctionId}") - public ResponseEntity createReview( - @RequestBody ReviewCreateRequest request, - @PathVariable("auctionId") Long auctionId, + @GetMapping("/{dealId}") + public ResponseEntity getReview( + @PathVariable("dealId") Long dealId) { + reviewService.getReview(dealId); + return ResponseEntity.ok(reviewService.getReview(dealId)); + } + + @PostMapping("/{dealId}") + public ResponseEntity createReview( + @RequestBody ReviewRequest request, + @PathVariable("dealId") Long dealId, @AuthenticationPrincipal OAuth2User oAuth2User){ String reviewerId = (String) oAuth2User.getAttributes().get("userId"); - return ResponseEntity.ok(reviewService.createReview(reviewerId, auctionId, request)); + return ResponseEntity.ok(reviewService.createReview(reviewerId, dealId, request)); + } + + @PatchMapping("/{reviewId}") + public ResponseEntity updateReview( + @RequestBody ReviewRequest request, + @PathVariable("reviewId") Long reviewId, + @AuthenticationPrincipal OAuth2User oAuth2User) { + String reviewerId = (String) oAuth2User.getAttributes().get("userId"); + return ResponseEntity.ok(reviewService.updateReview(request,reviewId, reviewerId)); + } + + @DeleteMapping("/{reviewId}") + public ResponseEntity deleteReview( + @PathVariable("reviewId") Long reviewId, + @AuthenticationPrincipal OAuth2User oAuth2User) { + String reviewerId = (String) oAuth2User.getAttributes().get("userId"); + return ResponseEntity.ok(reviewService.deleteReview(reviewId, reviewerId)); } } diff --git a/src/main/java/com/anywayclear/dto/request/ReviewCreateRequest.java b/src/main/java/com/anywayclear/dto/request/ReviewRequest.java similarity index 59% rename from src/main/java/com/anywayclear/dto/request/ReviewCreateRequest.java rename to src/main/java/com/anywayclear/dto/request/ReviewRequest.java index 162ffe2..e03a0c9 100644 --- a/src/main/java/com/anywayclear/dto/request/ReviewCreateRequest.java +++ b/src/main/java/com/anywayclear/dto/request/ReviewRequest.java @@ -1,22 +1,17 @@ package com.anywayclear.dto.request; -import com.anywayclear.entity.Auction; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import org.springframework.data.annotation.CreatedDate; -import javax.persistence.*; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; @Getter @Setter @NoArgsConstructor -public class ReviewCreateRequest { +public class ReviewRequest { @NotBlank @@ -26,7 +21,7 @@ public class ReviewCreateRequest { private int score; @Builder - public ReviewCreateRequest(String comment, int score) { + public ReviewRequest(String comment, int score) { this.comment = comment; this.score = score; } diff --git a/src/main/java/com/anywayclear/dto/response/DealResponse.java b/src/main/java/com/anywayclear/dto/response/DealResponse.java index a1593a2..eab5771 100644 --- a/src/main/java/com/anywayclear/dto/response/DealResponse.java +++ b/src/main/java/com/anywayclear/dto/response/DealResponse.java @@ -2,7 +2,6 @@ import com.anywayclear.entity.Deal; import com.anywayclear.entity.Member; -import com.anywayclear.entity.Produce; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -14,10 +13,10 @@ public class DealResponse { private boolean isPaid; private Member consumer; private Member seller; - private Produce produce; + private ProduceResponse produce; @Builder - public DealResponse(int endPrice, boolean isPaid, Member consumer, Member seller, Produce produce) { + public DealResponse(int endPrice, boolean isPaid, Member consumer, Member seller, ProduceResponse produce) { this.endPrice = endPrice; this.isPaid = isPaid; this.consumer = consumer; @@ -31,7 +30,7 @@ public static DealResponse toResponse(Deal deal) { .isPaid(deal.isPaid()) .consumer(deal.getConsumer()) .seller(deal.getSeller()) - .produce(deal.getProduce()) + .produce(ProduceResponse.toResponse(deal.getProduce())) .build(); } } diff --git a/src/main/java/com/anywayclear/dto/response/ReviewResponse.java b/src/main/java/com/anywayclear/dto/response/ReviewResponse.java index ae474fe..b034665 100644 --- a/src/main/java/com/anywayclear/dto/response/ReviewResponse.java +++ b/src/main/java/com/anywayclear/dto/response/ReviewResponse.java @@ -1,15 +1,10 @@ package com.anywayclear.dto.response; -import com.anywayclear.entity.Auction; -import com.anywayclear.entity.Member; import com.anywayclear.entity.Review; import lombok.Builder; import lombok.Getter; -import org.springframework.data.annotation.CreatedDate; -import javax.persistence.*; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; @Getter public class ReviewResponse { @@ -18,17 +13,17 @@ public class ReviewResponse { private String comment; private int score; private LocalDateTime createdAt; - private AuctionResponse auction; + private DealResponse deal; private String memberUserId; private String memberNickname; @Builder - public ReviewResponse(Long id, String comment, int score, LocalDateTime createdAt,String createdDate, AuctionResponse auction, String memberUserId, String memberNickname) { + public ReviewResponse(Long id, String comment, int score, LocalDateTime createdAt, DealResponse deal, String memberUserId, String memberNickname) { this.id = id; this.comment = comment; this.score = score; this.createdAt = createdAt; - this.auction = auction; + this.deal = deal; this.memberUserId = memberUserId; this.memberNickname = memberNickname; } @@ -39,7 +34,7 @@ public static ReviewResponse toResponse(Review review) { .comment(review.getComment()) .score(review.getScore()) .createdAt(review.getCreatedAt()) - .auction(AuctionResponse.toResponse(review.getAuction())) + .deal(DealResponse.toResponse(review.getDeal())) .memberUserId(review.getMember().getUserId()) .memberNickname(review.getMember().getNickname()) .build(); diff --git a/src/main/java/com/anywayclear/entity/Auction.java b/src/main/java/com/anywayclear/entity/Auction.java index 87da034..0fa9eb4 100644 --- a/src/main/java/com/anywayclear/entity/Auction.java +++ b/src/main/java/com/anywayclear/entity/Auction.java @@ -20,10 +20,6 @@ public class Auction extends BaseTime{ @JoinColumn(name = "produce_id") private Produce produce; - @OneToOne - @JoinColumn(name = "review_id", referencedColumnName = "id") - private Review review; - private int price; private String nickname; diff --git a/src/main/java/com/anywayclear/entity/Deal.java b/src/main/java/com/anywayclear/entity/Deal.java index de6914f..64d0492 100644 --- a/src/main/java/com/anywayclear/entity/Deal.java +++ b/src/main/java/com/anywayclear/entity/Deal.java @@ -37,6 +37,10 @@ public class Deal { @JoinColumn(name = "produce_id", referencedColumnName = "id") private Produce produce; + @OneToOne + @JoinColumn(name = "review_id", referencedColumnName = "id") + private Review review; + @Builder public Deal(int endPrice, Member consumer, Member seller, Produce produce) { this.endPrice = endPrice; diff --git a/src/main/java/com/anywayclear/entity/Review.java b/src/main/java/com/anywayclear/entity/Review.java index 6fc705f..7dffd65 100644 --- a/src/main/java/com/anywayclear/entity/Review.java +++ b/src/main/java/com/anywayclear/entity/Review.java @@ -1,15 +1,12 @@ package com.anywayclear.entity; -import com.anywayclear.dto.request.ReviewCreateRequest; +import com.anywayclear.dto.request.ReviewRequest; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import org.springframework.data.annotation.CreatedDate; import javax.persistence.*; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; @Getter @Setter @@ -29,22 +26,22 @@ public class Review extends BaseTime{ private int score; @OneToOne - @JoinColumn(name = "auction_id", referencedColumnName = "id") - private Auction auction; + @JoinColumn(name = "deal_id", referencedColumnName = "id") + private Deal deal; @OneToOne @JoinColumn(name = "member_id", referencedColumnName = "id") private Member member; @Builder - public Review(String comment, int score, Auction auction, Member member) { + public Review(String comment, int score, Deal deal, Member member) { this.comment = comment; this.score = score; - this.auction = auction; + this.deal = deal; this.member = member; } - public static Review toEntity(ReviewCreateRequest request) { + public static Review toEntity(ReviewRequest request) { return Review.builder() .comment(request.getComment()) .score(request.getScore()) diff --git a/src/main/java/com/anywayclear/exception/ExceptionCode.java b/src/main/java/com/anywayclear/exception/ExceptionCode.java index 19d9223..e659e32 100644 --- a/src/main/java/com/anywayclear/exception/ExceptionCode.java +++ b/src/main/java/com/anywayclear/exception/ExceptionCode.java @@ -32,6 +32,8 @@ public enum ExceptionCode { // 404 Not Found : 요청한 URI에 대한 리소스 없음 INVALID_RESOURCE(NOT_FOUND, "요청한 리소스가 없습니다", 404), + INVALID_REVIEW(NOT_FOUND, "존재하지 않는 리뷰입니다", 404), + INVALID_DEAL(NOT_FOUND, "존재하지 않는 거래입니다", 404), // 405 Method Not Allowed : 사용 불가능한 Method 이용 INVALID_METHOD(METHOD_NOT_ALLOWED, "지원하지 않는 Method 입니다.", 405), diff --git a/src/main/java/com/anywayclear/service/ReviewService.java b/src/main/java/com/anywayclear/service/ReviewService.java index 70c8d59..8064b7d 100644 --- a/src/main/java/com/anywayclear/service/ReviewService.java +++ b/src/main/java/com/anywayclear/service/ReviewService.java @@ -1,13 +1,15 @@ package com.anywayclear.service; -import com.anywayclear.dto.request.ReviewCreateRequest; +import com.anywayclear.dto.request.ReviewRequest; import com.anywayclear.dto.response.ReviewResponse; import com.anywayclear.entity.Auction; +import com.anywayclear.entity.Deal; import com.anywayclear.entity.Member; import com.anywayclear.entity.Review; import com.anywayclear.exception.CustomException; import com.anywayclear.exception.ExceptionCode; import com.anywayclear.repository.AuctionRepository; +import com.anywayclear.repository.DealRepository; import com.anywayclear.repository.MemberRepository; import com.anywayclear.repository.ReviewRepository; import org.springframework.stereotype.Service; @@ -17,24 +19,68 @@ public class ReviewService { private final MemberRepository memberRepository; - private final AuctionRepository auctionRepository; + private final DealRepository dealRepository; private final ReviewRepository reviewRepository; - public ReviewService(MemberRepository memberRepository, AuctionRepository auctionRepository, ReviewRepository reviewRepository) { + public ReviewService(MemberRepository memberRepository, DealRepository dealRepository, ReviewRepository reviewRepository) { this.memberRepository = memberRepository; - this.auctionRepository = auctionRepository; + this.dealRepository = dealRepository; this.reviewRepository = reviewRepository; } @Transactional - public ReviewResponse createReview(String reviewerId, Long auctionId, ReviewCreateRequest request) { + public Long createReview(String reviewerId, Long dealId, ReviewRequest request) { Review review = reviewRepository.save(Review.toEntity(request)); Member reviewer = memberRepository.findByUserId(reviewerId).orElseThrow(() -> new CustomException(ExceptionCode.INVALID_MEMBER)); - Auction auction = auctionRepository.findById(auctionId).orElseThrow(() -> new CustomException(ExceptionCode.INVALID_AUCTION_ID)); + Deal deal = dealRepository.findById(dealId).orElseThrow(() -> new CustomException(ExceptionCode.INVALID_RESOURCE)); review.setMember(reviewer); - review.setAuction(auction); + review.setDeal(deal); + deal.setReview(review); + + return review.getId(); + } + + @Transactional + public Long updateReview(ReviewRequest request, Long reviewId, String reviewerId) { + Review review = reviewRepository.findById(reviewId).orElseThrow(() -> new CustomException(ExceptionCode.INVALID_REVIEW)); + + if (!review.getMember().getUserId().equals(reviewerId)) { + throw new CustomException(ExceptionCode.INVALID_AUTH); + } + + review.setComment(request.getComment()); + review.setScore(request.getScore()); + + return reviewId; + } + + public Long deleteReview(Long reviewId, String reviewerId) { + Review review = reviewRepository.findById(reviewId).orElseThrow(() -> new CustomException(ExceptionCode.INVALID_REVIEW)); + + if (!review.getMember().getUserId().equals(reviewerId)) { + throw new CustomException(ExceptionCode.INVALID_AUTH); + } + + Deal deal = review.getDeal(); + System.out.println(deal); + deal.setReview(null); + + dealRepository.save(deal); + reviewRepository.delete(review); + + return reviewId; + } + + @Transactional + public ReviewResponse getReview(Long dealId) { + + Deal deal = dealRepository.findById(dealId).orElseThrow(() -> new CustomException(ExceptionCode.INVALID_DEAL)); + + Review review = deal.getReview(); + + if (review == null) return null; return ReviewResponse.toResponse(review); }