diff --git a/build.gradle b/build.gradle index c88d74c..7689545 100644 --- a/build.gradle +++ b/build.gradle @@ -36,6 +36,7 @@ dependencies { annotationProcessor "io.github.openfeign.querydsl:querydsl-apt:7.0:jpa" annotationProcessor "jakarta.persistence:jakarta.persistence-api:3.1.0" annotationProcessor "jakarta.annotation:jakarta.annotation-api:2.1.1" + implementation 'org.springframework.boot:spring-boot-starter-validation' } tasks.named('test') { useJUnitPlatform() } diff --git a/src/main/java/com/example/umc9th/domain/review/controller/ReviewController.java b/src/main/java/com/example/umc9th/domain/review/controller/ReviewController.java index 11198b7..805484a 100644 --- a/src/main/java/com/example/umc9th/domain/review/controller/ReviewController.java +++ b/src/main/java/com/example/umc9th/domain/review/controller/ReviewController.java @@ -1,26 +1,34 @@ package com.example.umc9th.domain.review.controller; import com.example.umc9th.domain.review.service.ReviewService; +import com.example.umc9th.global.apiPayload.ApiResponse; +import com.example.umc9th.global.apiPayload.code.GeneralSuccessCode; import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @RequestMapping("/api/reviews") public class ReviewController { + private final ReviewService reviewService; @PostMapping - public ResponseEntity> create(@RequestBody CreateReviewReq req) { - Long id = reviewService.createReview(req.memberId(), req.storeId(), req.star(), req.content()); - return ResponseEntity.ok(Map.of("reviewId", id)); + public ApiResponse create(@RequestBody CreateReviewReq req) { + + // memberId는 받지 않고 서비스에서 하드코딩함 + Long reviewId = reviewService.createReview( + req.storeId(), + req.star(), + req.content() + ); + + return ApiResponse.onSuccess( + GeneralSuccessCode.CREATED, + reviewId + ); } - public record CreateReviewReq(Long memberId, Long storeId, float star, String content) {} -} \ No newline at end of file + // DTO: memberId 제거 + public record CreateReviewReq(Long storeId, float star, String content) {} +} diff --git a/src/main/java/com/example/umc9th/domain/review/converter/ReviewConverter.java b/src/main/java/com/example/umc9th/domain/review/converter/ReviewConverter.java new file mode 100644 index 0000000..40139a8 --- /dev/null +++ b/src/main/java/com/example/umc9th/domain/review/converter/ReviewConverter.java @@ -0,0 +1,17 @@ +package com.example.umc9th.domain.review.converter; + +import com.example.umc9th.domain.review.dto.ReviewResDTO; +import com.example.umc9th.domain.review.entity.Review; + +public class ReviewConverter { + + public static ReviewResDTO.Create toCreateDTO(Review review) { + return ReviewResDTO.Create.builder() + .reviewId(review.getId()) + .storeId(review.getStore().getId()) + .memberId(review.getMember().getId()) + .star(review.getStar()) + .content(review.getContent()) + .build(); + } +} diff --git a/src/main/java/com/example/umc9th/domain/review/dto/ReviewReqDTO.java b/src/main/java/com/example/umc9th/domain/review/dto/ReviewReqDTO.java new file mode 100644 index 0000000..94acf5a --- /dev/null +++ b/src/main/java/com/example/umc9th/domain/review/dto/ReviewReqDTO.java @@ -0,0 +1,22 @@ +package com.example.umc9th.domain.review.dto; + +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class ReviewReqDTO { + + @Getter + @NoArgsConstructor + public static class Create { + + @Min(1) + @Max(5) + private Integer star; // DTO도 star로 통일! + + @NotBlank + private String content; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/umc9th/domain/review/dto/ReviewResDTO.java b/src/main/java/com/example/umc9th/domain/review/dto/ReviewResDTO.java new file mode 100644 index 0000000..8702326 --- /dev/null +++ b/src/main/java/com/example/umc9th/domain/review/dto/ReviewResDTO.java @@ -0,0 +1,22 @@ +package com.example.umc9th.domain.review.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class ReviewResDTO { + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class Create { + + private Long reviewId; + private Long storeId; + private Long memberId; + private float star; + private String content; + } +} diff --git a/src/main/java/com/example/umc9th/domain/review/service/ReviewService.java b/src/main/java/com/example/umc9th/domain/review/service/ReviewService.java index bd60669..2414372 100644 --- a/src/main/java/com/example/umc9th/domain/review/service/ReviewService.java +++ b/src/main/java/com/example/umc9th/domain/review/service/ReviewService.java @@ -6,23 +6,31 @@ import com.example.umc9th.domain.review.repository.ReviewRepository; import com.example.umc9th.domain.store.entity.Store; import com.example.umc9th.domain.store.repository.StoreRepository; -import org.springframework.transaction.annotation.Transactional; +import com.example.umc9th.global.apiPayload.code.GeneralErrorCode; +import com.example.umc9th.global.apiPayload.exception.GeneralException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @Transactional public class ReviewService { + private final ReviewRepository reviewRepository; private final MemberRepository memberRepository; private final StoreRepository storeRepository; - public Long createReview(Long memberId, Long storeId, float star, String content) { - Member member = memberRepository.findById(memberId) - .orElseThrow(() -> new IllegalArgumentException("member not found")); + public Long createReview(Long storeId, float star, String content) { + + // 로그인 미구현 → 과제 요구사항: DB에 있는 유저 한 명 하드코딩 + Long hardCodedMemberId = 1L; + + Member member = memberRepository.findById(hardCodedMemberId) + .orElseThrow(() -> new GeneralException(GeneralErrorCode.NOT_FOUND)); + Store store = storeRepository.findById(storeId) - .orElseThrow(() -> new IllegalArgumentException("store not found")); + .orElseThrow(() -> new GeneralException(GeneralErrorCode.NOT_FOUND)); Review review = Review.builder() .member(member) @@ -33,4 +41,4 @@ public Long createReview(Long memberId, Long storeId, float star, String content return reviewRepository.save(review).getId(); } -} \ No newline at end of file +}