-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
- Loading branch information
Showing
18 changed files
with
426 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
62 changes: 62 additions & 0 deletions
62
soridam-api/src/main/java/sorisoop/soridam/api/review/ReviewApiController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
package sorisoop.soridam.api.review; | ||
|
||
import static org.springframework.http.HttpStatus.CREATED; | ||
|
||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.DeleteMapping; | ||
import org.springframework.web.bind.annotation.PathVariable; | ||
import org.springframework.web.bind.annotation.PostMapping; | ||
import org.springframework.web.bind.annotation.PutMapping; | ||
import org.springframework.web.bind.annotation.RequestBody; | ||
import org.springframework.web.bind.annotation.RequestMapping; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
import io.swagger.v3.oas.annotations.Operation; | ||
import io.swagger.v3.oas.annotations.Parameter; | ||
import io.swagger.v3.oas.annotations.responses.ApiResponse; | ||
import io.swagger.v3.oas.annotations.tags.Tag; | ||
import jakarta.validation.Valid; | ||
import lombok.RequiredArgsConstructor; | ||
import sorisoop.soridam.api.review.application.ReviewFacade; | ||
import sorisoop.soridam.api.review.presentation.request.ReviewCreateRequest; | ||
import sorisoop.soridam.api.review.presentation.request.ReviewUpdateRequest; | ||
import sorisoop.soridam.api.review.presentation.response.ReviewPersistResponse; | ||
|
||
@RestController | ||
@RequiredArgsConstructor | ||
@RequestMapping("/api/reviews") | ||
@Tag(name = "Review", description = "리뷰 API") | ||
public class ReviewApiController { | ||
private final ReviewFacade reviewFacade; | ||
|
||
@Operation(summary = "리뷰 생성 API", description = "리뷰를 생성합니다.") | ||
@ApiResponse(responseCode = "201", description = "리뷰 생성 성공") | ||
@PostMapping | ||
public ResponseEntity<ReviewPersistResponse> createReview( | ||
@Valid @RequestBody ReviewCreateRequest request) { | ||
ReviewPersistResponse response = reviewFacade.create(request); | ||
return ResponseEntity.status(CREATED).body(response); | ||
} | ||
|
||
@Operation(summary = "리뷰 업데이트 API", description = "리뷰를 업데이트합니다.") | ||
@ApiResponse(responseCode = "200", description = "리뷰 업데이트 성공") | ||
@PutMapping("/{reviewId}") | ||
public ResponseEntity<Void> updateReview( | ||
@Parameter(description = "리뷰 ID", example = "123", required = true) | ||
@PathVariable String reviewId, | ||
@Valid @RequestBody ReviewUpdateRequest request) { | ||
reviewFacade.update(reviewId, request); | ||
return ResponseEntity.ok().build(); | ||
} | ||
|
||
@Operation(summary = "리뷰 삭제 API", description = "리뷰를 삭제합니다.") | ||
@ApiResponse(responseCode = "204", description = "리뷰 삭제 성공") | ||
@DeleteMapping("/{reviewId}") | ||
public ResponseEntity<Void> deleteReview( | ||
@Parameter(description = "리뷰 ID", example = "123", required = true) | ||
@PathVariable String reviewId) { | ||
reviewFacade.delete(reviewId); | ||
return ResponseEntity.noContent().build(); | ||
} | ||
} | ||
|
47 changes: 47 additions & 0 deletions
47
soridam-api/src/main/java/sorisoop/soridam/api/review/application/ReviewFacade.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
package sorisoop.soridam.api.review.application; | ||
|
||
import org.springframework.stereotype.Component; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
import sorisoop.soridam.api.review.presentation.request.ReviewCreateRequest; | ||
import sorisoop.soridam.api.review.presentation.request.ReviewUpdateRequest; | ||
import sorisoop.soridam.api.review.presentation.response.ReviewPersistResponse; | ||
import sorisoop.soridam.domain.review.application.ReviewCommandService; | ||
import sorisoop.soridam.domain.review.application.ReviewQueryService; | ||
import sorisoop.soridam.domain.review.domain.Review; | ||
import sorisoop.soridam.domain.user.application.UserQueryService; | ||
import sorisoop.soridam.domain.user.domain.User; | ||
|
||
@Component | ||
@RequiredArgsConstructor | ||
public class ReviewFacade { | ||
private final ReviewCommandService reviewCommandService; | ||
private final ReviewQueryService reviewQueryService; | ||
private final UserQueryService userQueryService; | ||
|
||
public ReviewPersistResponse create(ReviewCreateRequest request) { | ||
User author = userQueryService.me(); | ||
|
||
Review review = reviewCommandService.create( | ||
request.targetId(), | ||
request.reviewType(), | ||
author.getId(), | ||
request.content(), | ||
request.rating() | ||
); | ||
|
||
return ReviewPersistResponse.from(review); | ||
} | ||
|
||
public void update(String reviewId, ReviewUpdateRequest request) { | ||
User user = userQueryService.me(); | ||
Review review = reviewQueryService.getById(reviewId); | ||
reviewCommandService.update(user, review, request.content(), request.rating()); | ||
} | ||
|
||
public void delete(String reviewId) { | ||
User user = userQueryService.me(); | ||
Review review = reviewQueryService.getById(reviewId); | ||
reviewCommandService.delete(user, review); | ||
} | ||
} |
34 changes: 34 additions & 0 deletions
34
...i/src/main/java/sorisoop/soridam/api/review/presentation/request/ReviewCreateRequest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
package sorisoop.soridam.api.review.presentation.request; | ||
|
||
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; | ||
|
||
import java.math.BigDecimal; | ||
|
||
import io.swagger.v3.oas.annotations.media.Schema; | ||
import jakarta.validation.constraints.DecimalMax; | ||
import jakarta.validation.constraints.DecimalMin; | ||
import jakarta.validation.constraints.NotBlank; | ||
import jakarta.validation.constraints.NotNull; | ||
import lombok.Builder; | ||
import sorisoop.soridam.globalutil.uuid.UuidPrefix; | ||
|
||
@Builder | ||
public record ReviewCreateRequest( | ||
@Schema(description = "게시글 ID", example = "uuid", requiredMode = REQUIRED) | ||
@NotBlank | ||
String targetId, | ||
|
||
@Schema(description = "게시글 타입", example = "NOISE", requiredMode = REQUIRED) | ||
@NotNull | ||
UuidPrefix reviewType, | ||
|
||
@Schema(description = "작성 내용", example = "content", requiredMode = REQUIRED) | ||
String content, | ||
|
||
@Schema(description = "평점", example = "5.0", requiredMode = REQUIRED) | ||
@NotNull | ||
@DecimalMin(value = "0.0") | ||
@DecimalMax(value = "5.0") | ||
BigDecimal rating | ||
) { | ||
} |
22 changes: 22 additions & 0 deletions
22
...i/src/main/java/sorisoop/soridam/api/review/presentation/request/ReviewUpdateRequest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
package sorisoop.soridam.api.review.presentation.request; | ||
|
||
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; | ||
|
||
import java.math.BigDecimal; | ||
|
||
import io.swagger.v3.oas.annotations.media.Schema; | ||
import jakarta.validation.constraints.DecimalMax; | ||
import jakarta.validation.constraints.DecimalMin; | ||
import jakarta.validation.constraints.NotNull; | ||
|
||
public record ReviewUpdateRequest( | ||
@Schema(description = "수정한 작성 내용", example = "content", requiredMode = REQUIRED) | ||
String content, | ||
|
||
@Schema(description = "평점", example = "5.0", requiredMode = REQUIRED) | ||
@NotNull | ||
@DecimalMin(value = "0.0") | ||
@DecimalMax(value = "5.0") | ||
BigDecimal rating | ||
) { | ||
} |
19 changes: 19 additions & 0 deletions
19
...rc/main/java/sorisoop/soridam/api/review/presentation/response/ReviewPersistResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package sorisoop.soridam.api.review.presentation.response; | ||
|
||
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; | ||
|
||
import io.swagger.v3.oas.annotations.media.Schema; | ||
import lombok.Builder; | ||
import sorisoop.soridam.domain.review.domain.Review; | ||
|
||
@Builder | ||
public record ReviewPersistResponse( | ||
@Schema(description = "review ID", example = "asdfjklsadjklsamlsdfsldm", requiredMode = REQUIRED) | ||
String id | ||
) { | ||
public static ReviewPersistResponse from(Review review){ | ||
return ReviewPersistResponse.builder() | ||
.id(review.extractUuid()) | ||
.build(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
44 changes: 44 additions & 0 deletions
44
...domain/src/main/java/sorisoop/soridam/domain/review/application/ReviewCommandService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
package sorisoop.soridam.domain.review.application; | ||
|
||
import java.math.BigDecimal; | ||
|
||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
import sorisoop.soridam.domain.review.domain.Review; | ||
import sorisoop.soridam.domain.review.domain.ReviewRepository; | ||
import sorisoop.soridam.domain.user.domain.User; | ||
import sorisoop.soridam.domain.user.exception.InvalidUserException; | ||
import sorisoop.soridam.globalutil.user.UserUtil; | ||
import sorisoop.soridam.globalutil.uuid.UuidPrefix; | ||
|
||
@Service | ||
@Transactional | ||
@RequiredArgsConstructor | ||
public class ReviewCommandService { | ||
private final ReviewRepository reviewRepository; | ||
|
||
public Review create(String targetId, UuidPrefix reviewType, | ||
String authorId, String content, BigDecimal rating) { | ||
Review review = Review.create(targetId, reviewType, authorId, content, rating); | ||
return reviewRepository.save(review); | ||
} | ||
|
||
public void update(User user, Review review, String content, BigDecimal rating) { | ||
validateUser(user.getId(), review.getAuthorId()); | ||
review.updateContent(content); | ||
review.updateRating(rating); | ||
} | ||
|
||
public void delete(User user, Review review) { | ||
validateUser(user.getId(), review.getAuthorId()); | ||
reviewRepository.delete(review); | ||
} | ||
|
||
private void validateUser(String user1, String user2) { | ||
if (!UserUtil.isSameUser(user1, user2)) { | ||
throw new InvalidUserException(); | ||
} | ||
} | ||
} |
19 changes: 19 additions & 0 deletions
19
...m-domain/src/main/java/sorisoop/soridam/domain/review/application/ReviewQueryService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package sorisoop.soridam.domain.review.application; | ||
|
||
import org.springframework.stereotype.Service; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
import sorisoop.soridam.domain.review.domain.Review; | ||
import sorisoop.soridam.domain.review.domain.ReviewRepository; | ||
import sorisoop.soridam.domain.review.exception.ReviewNotFoundException; | ||
|
||
@Service | ||
@RequiredArgsConstructor | ||
public class ReviewQueryService { | ||
private final ReviewRepository reviewRepository; | ||
|
||
public Review getById(String id) { | ||
return reviewRepository.findById(id) | ||
.orElseThrow(ReviewNotFoundException::new); | ||
} | ||
} |
66 changes: 66 additions & 0 deletions
66
soridam-domain/src/main/java/sorisoop/soridam/domain/review/domain/Review.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
package sorisoop.soridam.domain.review.domain; | ||
|
||
import static jakarta.persistence.EnumType.STRING; | ||
import static lombok.AccessLevel.PROTECTED; | ||
import static sorisoop.soridam.globalutil.uuid.UuidPrefix.REVIEW; | ||
import static sorisoop.soridam.globalutil.uuid.UuidPrefix.USER; | ||
|
||
import java.math.BigDecimal; | ||
|
||
import jakarta.persistence.Column; | ||
import jakarta.persistence.Entity; | ||
import jakarta.persistence.Enumerated; | ||
import jakarta.persistence.Id; | ||
import lombok.AllArgsConstructor; | ||
import lombok.Builder; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
import sorisoop.soridam.common.domain.BaseTimeEntity; | ||
import sorisoop.soridam.common.domain.UuidExtractable; | ||
import sorisoop.soridam.globalutil.uuid.PrefixedUuid; | ||
import sorisoop.soridam.globalutil.uuid.UuidPrefix; | ||
|
||
@Entity | ||
@Getter | ||
@Builder | ||
@NoArgsConstructor(access = PROTECTED) | ||
@AllArgsConstructor(access = PROTECTED) | ||
public class Review extends BaseTimeEntity implements UuidExtractable { | ||
@Id | ||
@PrefixedUuid(REVIEW) | ||
private String id; | ||
|
||
@Column(nullable = false) | ||
private String targetId; | ||
|
||
@Enumerated(STRING) | ||
@Column(nullable = false, length = 25) | ||
private UuidPrefix reviewType; | ||
|
||
@Column(nullable = false) | ||
private String authorId; | ||
|
||
@Column(nullable = false, columnDefinition = "TEXT") | ||
private String content; | ||
|
||
@Column(nullable = false, precision = 2, scale = 1) | ||
private BigDecimal rating; | ||
|
||
public static Review create(String targetId, UuidPrefix reviewType, String authorId, String content, BigDecimal rating) { | ||
return Review.builder() | ||
.targetId(reviewType.getPrefix() + targetId) | ||
.reviewType(reviewType) | ||
.authorId(USER.getPrefix() + authorId) | ||
.content(content) | ||
.rating(rating) | ||
.build(); | ||
} | ||
|
||
public void updateContent(String content) { | ||
this.content = content; | ||
} | ||
|
||
public void updateRating(BigDecimal rating) { | ||
this.rating = rating; | ||
} | ||
} |
11 changes: 11 additions & 0 deletions
11
soridam-domain/src/main/java/sorisoop/soridam/domain/review/domain/ReviewRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package sorisoop.soridam.domain.review.domain; | ||
|
||
import java.util.Optional; | ||
|
||
public interface ReviewRepository { | ||
Review save(Review review); | ||
|
||
Optional<Review> findById(String id); | ||
|
||
void delete(Review review); | ||
} |
13 changes: 13 additions & 0 deletions
13
soridam-domain/src/main/java/sorisoop/soridam/domain/review/domain/ReviewType.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package sorisoop.soridam.domain.review.domain; | ||
|
||
import lombok.AllArgsConstructor; | ||
import lombok.Getter; | ||
|
||
@Getter | ||
@AllArgsConstructor | ||
public enum ReviewType { | ||
NOISE("소음"), | ||
; | ||
|
||
private String description; | ||
} |
Oops, something went wrong.