diff --git a/application/src/main/java/org/depromeet/spot/application/review/CreateReviewController.java b/application/src/main/java/org/depromeet/spot/application/review/CreateReviewController.java index c7d8b011..fd437ae9 100644 --- a/application/src/main/java/org/depromeet/spot/application/review/CreateReviewController.java +++ b/application/src/main/java/org/depromeet/spot/application/review/CreateReviewController.java @@ -37,7 +37,7 @@ public BaseReviewResponse create( @PathVariable @Positive @NotNull final Long blockId, @PathVariable @Positive @NotNull final Integer seatNumber, @Parameter(hidden = true) Long memberId, - @RequestBody @Valid @NotNull CreateReviewRequest request) { + @RequestBody @Valid CreateReviewRequest request) { CreateReviewUsecase.CreateReviewResult result = createReviewUsecase.create(blockId, seatNumber, memberId, request.toCommand()); return BaseReviewResponse.from(result.review()); diff --git a/application/src/main/java/org/depromeet/spot/application/review/dto/request/CreateReviewRequest.java b/application/src/main/java/org/depromeet/spot/application/review/dto/request/CreateReviewRequest.java index a767e396..a0d10284 100644 --- a/application/src/main/java/org/depromeet/spot/application/review/dto/request/CreateReviewRequest.java +++ b/application/src/main/java/org/depromeet/spot/application/review/dto/request/CreateReviewRequest.java @@ -1,19 +1,25 @@ package org.depromeet.spot.application.review.dto.request; -import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.List; +import jakarta.validation.constraints.NotNull; + import org.depromeet.spot.common.exception.review.ReviewException.InvalidReviewDateTimeFormatException; +import org.depromeet.spot.common.exception.review.ReviewException.InvalidReviewKeywordsException; import org.depromeet.spot.usecase.port.in.review.CreateReviewUsecase.CreateReviewCommand; public record CreateReviewRequest( - List images, List good, List bad, String content, String dateTime) { + @NotNull List images, + List good, + List bad, + String content, + @NotNull String dateTime) { public CreateReviewCommand toCommand() { + validateGoodAndBad(); return CreateReviewCommand.builder() .images(images) .good(good) @@ -23,12 +29,16 @@ public CreateReviewCommand toCommand() { .build(); } - private LocalDateTime toLocalDateTime(String dateStr) { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yy.MM.dd"); + private void validateGoodAndBad() { + if ((good == null || good.isEmpty()) && (bad == null || bad.isEmpty())) { + throw new InvalidReviewKeywordsException(); + } + } + + private LocalDateTime toLocalDateTime(String dateTimeStr) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); try { - LocalDate date = LocalDate.parse(dateStr, formatter); - // 시간 정보가 없으므로 자정(00:00)으로 설정 - return LocalDateTime.of(date, LocalTime.MIDNIGHT); + return LocalDateTime.parse(dateTimeStr, formatter); } catch (DateTimeParseException e) { throw new InvalidReviewDateTimeFormatException(); } diff --git a/common/src/main/java/org/depromeet/spot/common/exception/review/ReviewErrorCode.java b/common/src/main/java/org/depromeet/spot/common/exception/review/ReviewErrorCode.java index 4e12bf4c..b412bc6c 100644 --- a/common/src/main/java/org/depromeet/spot/common/exception/review/ReviewErrorCode.java +++ b/common/src/main/java/org/depromeet/spot/common/exception/review/ReviewErrorCode.java @@ -10,7 +10,9 @@ public enum ReviewErrorCode implements ErrorCode { REVIEW_NOT_FOUND(HttpStatus.NOT_FOUND, "RV001", "요청한 리뷰를 찾을 수 없습니다."), INVALID_REVIEW_DATA(HttpStatus.BAD_REQUEST, "RV002", "유효하지 않은 리뷰 데이터입니다."), INVALID_REVIEW_DATETIME_FORMAT( - HttpStatus.BAD_REQUEST, "RV003", "리뷰 작성일시는 yyyy-MM-dd HH:mm 포맷이어야 합니다."); + HttpStatus.BAD_REQUEST, "RV003", "리뷰 작성일시는 yyyy-MM-dd HH:mm 포맷이어야 합니다."), + INVALID_REVIEW_KEYWORDS( + HttpStatus.BAD_REQUEST, "RV004", "리뷰의 'good' 또는 'bad' 중 적어도 하나는 제공되어야 합니다."); private final HttpStatus status; private final String code; diff --git a/common/src/main/java/org/depromeet/spot/common/exception/review/ReviewException.java b/common/src/main/java/org/depromeet/spot/common/exception/review/ReviewException.java index e15f9cfc..296d8123 100644 --- a/common/src/main/java/org/depromeet/spot/common/exception/review/ReviewException.java +++ b/common/src/main/java/org/depromeet/spot/common/exception/review/ReviewException.java @@ -36,4 +36,14 @@ public InvalidReviewDateTimeFormatException(String str) { super(ReviewErrorCode.INVALID_REVIEW_DATETIME_FORMAT.appended(str)); } } + + public static class InvalidReviewKeywordsException extends ReviewException { + public InvalidReviewKeywordsException() { + super(ReviewErrorCode.INVALID_REVIEW_KEYWORDS); + } + + public InvalidReviewKeywordsException(String str) { + super(ReviewErrorCode.INVALID_REVIEW_KEYWORDS.appended(str)); + } + } }