Skip to content

Commit 117f544

Browse files
committed
feat(review): 리뷰 수정
1 parent 0026789 commit 117f544

File tree

5 files changed

+118
-0
lines changed

5 files changed

+118
-0
lines changed

src/main/java/com/somemore/domains/review/controller/ReviewCommandApiController.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.somemore.domains.review.controller;
22

33
import com.somemore.domains.review.dto.request.ReviewCreateRequestDto;
4+
import com.somemore.domains.review.dto.request.ReviewUpdateRequestDto;
45
import com.somemore.domains.review.usecase.CreateReviewUseCase;
56
import com.somemore.domains.review.usecase.DeleteReviewUseCase;
7+
import com.somemore.domains.review.usecase.UpdateReviewUseCase;
68
import com.somemore.global.auth.annotation.CurrentUser;
79
import com.somemore.global.common.response.ApiResponse;
810
import com.somemore.global.imageupload.dto.ImageUploadRequestDto;
@@ -26,6 +28,7 @@
2628
public class ReviewCommandApiController {
2729

2830
private final CreateReviewUseCase createReviewUseCase;
31+
private final UpdateReviewUseCase updateReviewUseCase;
2932
private final DeleteReviewUseCase deleteReviewUseCase;
3033
private final ImageUploadUseCase imageUploadUseCase;
3134

@@ -45,6 +48,38 @@ public ApiResponse<Long> createReview(
4548
);
4649
}
4750

51+
@Secured("ROLE_VOLUNTEER")
52+
@Operation(summary = "리뷰 수정", description = "리뷰를 수정합니다.")
53+
@PutMapping(value = "/review/{id}")
54+
public ApiResponse<String> updateReview(
55+
@CurrentUser UUID userId,
56+
@PathVariable Long id,
57+
@Valid @RequestBody ReviewUpdateRequestDto requestDto) {
58+
59+
updateReviewUseCase.updateReview(id, userId, requestDto);
60+
61+
return ApiResponse.ok(
62+
200,
63+
"리뷰 수정 성공"
64+
);
65+
}
66+
67+
@Secured("ROLE_VOLUNTEER")
68+
@Operation(summary = "리뷰 이미지 수정", description = "리뷰 이미지를 수정합니다.")
69+
@PutMapping(value = "/review/{id}", consumes = MULTIPART_FORM_DATA_VALUE)
70+
public ApiResponse<String> updateReviewImage(
71+
@CurrentUser UUID userId,
72+
@PathVariable Long id,
73+
@RequestPart(value = "img_file", required = false) MultipartFile image) {
74+
75+
String newImgUrl = imageUploadUseCase.uploadImage(new ImageUploadRequestDto(image));
76+
updateReviewUseCase.updateReviewImageUrl(id, userId, newImgUrl);
77+
return ApiResponse.ok(
78+
200,
79+
"리뷰 이미지 수정 성공"
80+
);
81+
}
82+
4883
@Secured("ROLE_VOLUNTEER")
4984
@Operation(summary = "리뷰 삭제", description = "리뷰를 삭제합니다.")
5085
@DeleteMapping(value = "/review/{id}")

src/main/java/com/somemore/domains/review/domain/Review.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static jakarta.persistence.GenerationType.IDENTITY;
44
import static lombok.AccessLevel.PROTECTED;
55

6+
import com.somemore.domains.review.dto.request.ReviewUpdateRequestDto;
67
import com.somemore.global.common.entity.BaseEntity;
78
import jakarta.persistence.Column;
89
import jakarta.persistence.Entity;
@@ -54,4 +55,13 @@ public Review(Long volunteerApplyId, UUID volunteerId, String title,
5455
public boolean isAuthor(UUID volunteerId) {
5556
return this.volunteerId.equals(volunteerId);
5657
}
58+
59+
public void updateWith(ReviewUpdateRequestDto dto) {
60+
this.title = dto.title();
61+
this.content = dto.content();
62+
}
63+
64+
public void updateWith(String imgUrl) {
65+
this.imgUrl = imgUrl;
66+
}
5767
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.somemore.domains.review.dto.request;
2+
3+
import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy;
4+
import com.fasterxml.jackson.databind.annotation.JsonNaming;
5+
import io.swagger.v3.oas.annotations.media.Schema;
6+
import jakarta.validation.constraints.NotBlank;
7+
import lombok.Builder;
8+
9+
@JsonNaming(SnakeCaseStrategy.class)
10+
@Builder
11+
public record ReviewUpdateRequestDto(
12+
@Schema(description = "리뷰 제목", example = "내 인생 최고의 봉사 활동")
13+
@NotBlank(message = "리뷰 제목은 필수 값입니다.")
14+
String title,
15+
@Schema(description = "리뷰 내용", example = "담당자님도 정말 친절하였고 정말 보람찬 봉사였어요 <br>")
16+
@NotBlank(message = "리뷰 내용은 필수 값입니다.")
17+
String content
18+
) {
19+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.somemore.domains.review.service;
2+
3+
import com.somemore.domains.review.domain.Review;
4+
import com.somemore.domains.review.dto.request.ReviewUpdateRequestDto;
5+
import com.somemore.domains.review.repository.ReviewRepository;
6+
import com.somemore.domains.review.service.validator.ReviewValidator;
7+
import com.somemore.domains.review.usecase.UpdateReviewUseCase;
8+
import com.somemore.global.exception.ExceptionMessage;
9+
import com.somemore.global.exception.NoSuchElementException;
10+
import lombok.RequiredArgsConstructor;
11+
import org.springframework.stereotype.Service;
12+
import org.springframework.transaction.annotation.Transactional;
13+
14+
import java.util.UUID;
15+
16+
@RequiredArgsConstructor
17+
@Transactional
18+
@Service
19+
public class UpdateReviewService implements UpdateReviewUseCase {
20+
21+
private final ReviewRepository reviewRepository;
22+
private final ReviewValidator reviewValidator;
23+
24+
@Override
25+
public void updateReview(Long id, UUID volunteerId, ReviewUpdateRequestDto requestDto) {
26+
Review review = getReview(id);
27+
reviewValidator.validateAuthor(review, volunteerId);
28+
review.updateWith(requestDto);
29+
}
30+
31+
@Override
32+
public void updateReviewImageUrl(Long id, UUID volunteerId, String imgUrl) {
33+
Review review = getReview(id);
34+
reviewValidator.validateAuthor(review, volunteerId);
35+
review.updateWith(imgUrl);
36+
}
37+
38+
private Review getReview(Long id) {
39+
return reviewRepository.findById(id).orElseThrow(
40+
() -> new NoSuchElementException(ExceptionMessage.NOT_EXISTS_REVIEW));
41+
}
42+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.somemore.domains.review.usecase;
2+
3+
import com.somemore.domains.review.dto.request.ReviewUpdateRequestDto;
4+
5+
import java.util.UUID;
6+
7+
public interface UpdateReviewUseCase {
8+
9+
void updateReview(Long id, UUID volunteerId, ReviewUpdateRequestDto requestDto);
10+
11+
void updateReviewImageUrl(Long id, UUID volunteerId, String imgUrl);
12+
}

0 commit comments

Comments
 (0)