Skip to content

Commit

Permalink
FIX: (#145) 리뷰 도메인 표현 계층을 재정의한다
Browse files Browse the repository at this point in the history
  • Loading branch information
anxi01 committed Feb 20, 2025
1 parent 09a6172 commit 33825c5
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 232 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,94 +3,45 @@
import com.zerozero.configuration.argumentresolver.LoginUser;
import com.zerozero.configuration.interceptor.Authorization;
import com.zerozero.configuration.swagger.ApiErrorCode;
import com.zerozero.core.application.BaseRequest;
import com.zerozero.core.application.BaseResponse;
import com.zerozero.core.domain.entity.User;
import com.zerozero.core.domain.vo.ZeroDrink;
import com.zerozero.core.domain.vo.ZeroDrink.Type;
import com.zerozero.core.exception.error.GlobalErrorCode;
import com.zerozero.review.application.CreateStoreReviewUseCase;
import com.zerozero.review.application.CreateStoreReviewUseCase.CreateStoreReviewErrorCode;
import com.zerozero.core.support.error.GlobalErrorType;
import com.zerozero.core.support.response.ApiResponse;
import com.zerozero.review.application.ReviewService;
import com.zerozero.review.exception.ReviewErrorType;
import com.zerozero.review.presentation.request.ReviewRequest;
import com.zerozero.user.domain.model.User;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.*;
import lombok.experimental.SuperBuilder;
import org.springframework.http.ResponseEntity;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

@RestController
@RequiredArgsConstructor
@Tag(name = "Review", description = "리뷰")
public class CreateStoreReviewController {

private final CreateStoreReviewUseCase createStoreReviewUseCase;

@Operation(
summary = "리뷰 등록 API",
description = "판매점에 대한 리뷰를 등록합니다.",
operationId = "/review"
)
@ApiErrorCode({GlobalErrorCode.class, CreateStoreReviewErrorCode.class})
@Authorization
@PostMapping("/review")
public ResponseEntity<CreateStoreReviewResponse> createStoreReview(@RequestParam @Schema(description = "판매점 ID") UUID storeId,
@RequestBody CreateStoreReviewRequest request,
@Parameter(hidden = true) @LoginUser User user) {
CreateStoreReviewUseCase.CreateStoreReviewResponse createStoreReviewResponse = createStoreReviewUseCase.execute(
CreateStoreReviewUseCase.CreateStoreReviewRequest.builder()
.storeId(storeId)
.content(request.getContent())
.zeroDrinks(Optional.ofNullable(request.getZeroDrinks())
.map(zeroDrinks -> zeroDrinks.stream().map(zeroDrink -> ZeroDrink.builder()
.type(zeroDrink)
.build())
.toArray(ZeroDrink[]::new))
.orElse(null))
.user(user)
.build());
if (createStoreReviewResponse == null || !createStoreReviewResponse.isSuccess()) {
Optional.ofNullable(createStoreReviewResponse)
.map(BaseResponse::getErrorCode)
.ifPresentOrElse(errorCode -> {
throw errorCode.toException();
}, () -> {
throw GlobalErrorCode.INTERNAL_ERROR.toException();
});
private final ReviewService reviewService;

@Operation(
summary = "리뷰 등록 API",
description = "판매점에 대한 리뷰를 등록합니다.",
operationId = "/review"
)
@ApiErrorCode({GlobalErrorType.class, ReviewErrorType.class})
@Authorization
@PostMapping("/review")
public ApiResponse<?> createStoreReview(@RequestParam @Schema(description = "판매점 ID") UUID storeId,
@Valid @RequestBody ReviewRequest reviewRequest,
@Parameter(hidden = true) @LoginUser User user) {
reviewService.createStoreReview(storeId, reviewRequest, user);
return ApiResponse.success();
}
return ResponseEntity.ok().build();
}

@ToString
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Schema(description = "리뷰 등록 응답")
public static class CreateStoreReviewResponse extends BaseResponse<GlobalErrorCode> {
}

@ToString
@Getter
@Setter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Schema(description = "리뷰 등록 요청")
public static class CreateStoreReviewRequest implements BaseRequest {

@Schema(description = "리뷰 내용", example = "제로콜라 판매 중!")
private String content;

@Schema(description = "제로 음료수 목록", example = "[\"COCA_COLA_ZERO\", \"PEPSI_ZERO\", \"SPRITE_ZERO\"]")
private List<Type> zeroDrinks;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,66 +3,41 @@
import com.zerozero.configuration.argumentresolver.LoginUser;
import com.zerozero.configuration.interceptor.Authorization;
import com.zerozero.configuration.swagger.ApiErrorCode;
import com.zerozero.core.application.BaseResponse;
import com.zerozero.core.domain.entity.User;
import com.zerozero.core.exception.error.GlobalErrorCode;
import com.zerozero.review.application.DeleteStoreReviewUseCase;
import com.zerozero.review.application.DeleteStoreReviewUseCase.DeleteStoreReviewErrorCode;
import com.zerozero.core.support.error.GlobalErrorType;
import com.zerozero.core.support.response.ApiResponse;
import com.zerozero.review.domain.service.DeleteStoreReviewUseCase;
import com.zerozero.review.exception.ReviewErrorType;
import com.zerozero.user.domain.model.User;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.*;
import lombok.experimental.SuperBuilder;
import org.springframework.http.ResponseEntity;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;
import java.util.UUID;

@RestController
@RequiredArgsConstructor
@Tag(name = "Review", description = "리뷰")
public class DeleteStoreReviewController {

private final DeleteStoreReviewUseCase deleteStoreReviewUseCase;
private final DeleteStoreReviewUseCase deleteStoreReviewUseCase;

@Operation(
summary = "리뷰 삭제 API",
description = "리뷰 ID를 통해 리뷰를 삭제합니다.",
operationId = "/review/{reviewId}"
)
@ApiErrorCode({GlobalErrorCode.class, DeleteStoreReviewErrorCode.class})
@Authorization
@DeleteMapping("/review/{reviewId}")
public ResponseEntity<DeleteStoreReviewResponse> deleteStoreReview(@PathVariable(name = "reviewId") @Schema(description = "리뷰 ID") UUID reviewId,
@Parameter(hidden = true) @LoginUser User user) {
DeleteStoreReviewUseCase.DeleteStoreReviewResponse deleteStoreReviewResponse = deleteStoreReviewUseCase.execute(
DeleteStoreReviewUseCase.DeleteStoreReviewRequest.builder()
.reviewId(reviewId)
.user(user)
.build());
if (deleteStoreReviewResponse == null || !deleteStoreReviewResponse.isSuccess()) {
Optional.ofNullable(deleteStoreReviewResponse)
.map(BaseResponse::getErrorCode)
.ifPresentOrElse(errorCode -> {
throw errorCode.toException();
}, () -> {
throw GlobalErrorCode.INTERNAL_ERROR.toException();
});
@Operation(
summary = "리뷰 삭제 API",
description = "리뷰 ID를 통해 리뷰를 삭제합니다.",
operationId = "/review/{reviewId}"
)
@ApiErrorCode({GlobalErrorType.class, ReviewErrorType.class})
@Authorization
@DeleteMapping("/review/{reviewId}")
public ApiResponse<?> deleteStoreReview(@PathVariable(name = "reviewId") @Schema(description = "리뷰 ID") UUID reviewId,
@Parameter(hidden = true) @LoginUser User user) {
deleteStoreReviewUseCase.execute(reviewId, user);
return ApiResponse.success();
}
return ResponseEntity.ok(DeleteStoreReviewResponse.builder().build());
}

@ToString
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Schema(description = "리뷰 삭제 응답")
public static class DeleteStoreReviewResponse extends BaseResponse<GlobalErrorCode> {
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,66 +3,41 @@
import com.zerozero.configuration.argumentresolver.LoginUser;
import com.zerozero.configuration.interceptor.Authorization;
import com.zerozero.configuration.swagger.ApiErrorCode;
import com.zerozero.core.application.BaseResponse;
import com.zerozero.core.domain.entity.User;
import com.zerozero.core.exception.error.GlobalErrorCode;
import com.zerozero.review.application.LikeStoreReviewUseCase;
import com.zerozero.review.application.LikeStoreReviewUseCase.LikeStoreReviewErrorCode;
import com.zerozero.core.support.error.GlobalErrorType;
import com.zerozero.core.support.response.ApiResponse;
import com.zerozero.review.domain.service.LikeStoreReviewUseCase;
import com.zerozero.review.exception.ReviewErrorType;
import com.zerozero.user.domain.model.User;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.*;
import lombok.experimental.SuperBuilder;
import org.springframework.http.ResponseEntity;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;
import java.util.UUID;

@RestController
@RequiredArgsConstructor
@Tag(name = "Review", description = "리뷰")
public class LikeStoreReviewController {

private final LikeStoreReviewUseCase likeStoreReviewUseCase;
private final LikeStoreReviewUseCase likeStoreReviewUseCase;

@Operation(
summary = "리뷰 좋아요 API",
description = "사용자가 리뷰 ID를 통해 좋아요를 누릅니다.",
operationId = "/review/like/{reviewId}"
)
@ApiErrorCode({GlobalErrorCode.class, LikeStoreReviewErrorCode.class})
@Authorization
@PatchMapping("/review/like/{reviewId}")
public ResponseEntity<LikeStoreReviewResponse> likeStoreReview(@PathVariable(name = "reviewId") @Schema(description = "리뷰 ID") UUID reviewId,
@Parameter(hidden = true) @LoginUser User user) {
LikeStoreReviewUseCase.LikeStoreReviewResponse likeStoreReviewResponse = likeStoreReviewUseCase.execute(
LikeStoreReviewUseCase.LikeStoreReviewRequest.builder()
.reviewId(reviewId)
.user(user)
.build());
if (likeStoreReviewResponse == null || !likeStoreReviewResponse.isSuccess()) {
Optional.ofNullable(likeStoreReviewResponse)
.map(BaseResponse::getErrorCode)
.ifPresentOrElse(errorCode -> {
throw errorCode.toException();
}, () -> {
throw GlobalErrorCode.INTERNAL_ERROR.toException();
});
@Operation(
summary = "리뷰 좋아요 API",
description = "사용자가 리뷰 ID를 통해 좋아요를 누릅니다.",
operationId = "/review/like/{reviewId}"
)
@ApiErrorCode({GlobalErrorType.class, ReviewErrorType.class})
@Authorization
@PatchMapping("/review/like/{reviewId}")
public ApiResponse<?> likeStoreReview(@PathVariable(name = "reviewId") @Schema(description = "리뷰 ID") UUID reviewId,
@Parameter(hidden = true) @LoginUser User user) {
likeStoreReviewUseCase.execute(reviewId, user);
return ApiResponse.success();
}
return ResponseEntity.ok().build();
}

@ToString
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Schema(description = "리뷰 좋아요 응답")
public static class LikeStoreReviewResponse extends BaseResponse<GlobalErrorCode> {
}

}
Loading

0 comments on commit 33825c5

Please sign in to comment.