Skip to content
Open
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
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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() }
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Map<String, Long>> 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<Long> 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) {}
}
// DTO: memberId 제거
public record CreateReviewReq(Long storeId, float star, String content) {}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -33,4 +41,4 @@ public Long createReview(Long memberId, Long storeId, float star, String content

return reviewRepository.save(review).getId();
}
}
}