Skip to content

Commit

Permalink
Develop -> Main (#122)
Browse files Browse the repository at this point in the history
* feat: Add Suggest API (#119)

* feat: Add default thumbnail to valley (#121)

* feat: Add sorting to valley search (#123)

* Member name 추가 및 공개 부분 수정 (#124)

* feat : ReviewServiceTest 코드 작성

* feat : ReviewDetailResponse에 유저의 프로필url 추가 및 Null 체크

* fix : ReviewDetailResponse 부분 수정

* fix : 기존 리뷰 이미지에서 업데이트를 통해 리뷰 이미지가 삭제되는 경우 추가

* feat : 리뷰를 기준으로 추천 계곡 api 추가

* feat : 추천 계곡 api 테스트 코드 추가

* feat : 10개에서 5개로 수정

* fix : deleteByMember 추가

* fix : response 부분 수정 (전체 Tag 보내기)

* fix : 계곡 사진 조회 부분 수정

* fix : 계곡 사진 조회 response 수정

* fix : member -> set login date, review -> update memberId, placeId

* feat : place 에 업데이트 되는 부분 수정

* feat : member name 추가 및 공개/비공개 부분 수정

* feat : 리뷰 공개 범위에 따라 필터링

* Fix : 리뷰 업데이트 사진 업로드 부분 로직 수정 (#125)

* feat : ReviewServiceTest 코드 작성

* feat : ReviewDetailResponse에 유저의 프로필url 추가 및 Null 체크

* fix : ReviewDetailResponse 부분 수정

* fix : 기존 리뷰 이미지에서 업데이트를 통해 리뷰 이미지가 삭제되는 경우 추가

* feat : 리뷰를 기준으로 추천 계곡 api 추가

* feat : 추천 계곡 api 테스트 코드 추가

* feat : 10개에서 5개로 수정

* fix : deleteByMember 추가

* fix : response 부분 수정 (전체 Tag 보내기)

* fix : 계곡 사진 조회 부분 수정

* fix : 계곡 사진 조회 response 수정

* fix : member -> set login date, review -> update memberId, placeId

* feat : place 에 업데이트 되는 부분 수정

* feat : member name 추가 및 공개/비공개 부분 수정

* feat : 리뷰 공개 범위에 따라 필터링

* fix : 리뷰 수정하기 사진 업로드 부분 수정

* fix : update review image And add testcode (#126)

* Fix/review : import 수정 (#127)

* fix : update review image And add testcode

* Fix : import 수정

* Fix : import 수정

* Fix : updateReview

* change : ReviewPostRequest

* fix : update 작성 시 deleteimageurls 추가 후 add, delete 구분

* fix : imageUrls 타입 오류 수정

* fix : s3에서 이미지 삭제

* fix : test용 코드

* fix : update review

* fix : update review

* fix : updateReviewWithImages

* fix : create review

* fix : update review -> delete image

---------

Co-authored-by: RALLY <berygna@gmail.com>
Co-authored-by: hanni66 <72500673+hanni66@users.noreply.github.com>
Co-authored-by: hanni66 <haeunkim0807@gmail.com>
  • Loading branch information
4 people authored Nov 12, 2024
1 parent b16bd38 commit 3c9d8ce
Show file tree
Hide file tree
Showing 17 changed files with 221 additions and 585 deletions.
24 changes: 15 additions & 9 deletions src/main/java/jjhhyb/deepvalley/community/ReviewController.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import jjhhyb.deepvalley.community.dto.response.ReviewsResponse;
import jjhhyb.deepvalley.community.service.ReviewService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
Expand Down Expand Up @@ -56,11 +55,12 @@ public ReviewDetailResponse createReview(
public ReviewDetailResponse updateReview(
@PathVariable("review-id") String reviewId,
@RequestPart("reviewPostRequest") ReviewPostRequest reviewPostRequest,
@RequestPart(value = "imageUrls", required = false) List<MultipartFile> imageFiles,
@RequestParam(value = "imageUrls", required = false) List<MultipartFile> imageFiles,
@RequestParam(value = "deletedImages", required = false) String deletedImages,
Authentication auth
) {
String userId = auth.getName(); // 인증이 되어 있는 UserID
return reviewService.updateReview(reviewId, reviewPostRequest, imageFiles, userId);
return reviewService.updateReview(reviewId, reviewPostRequest, imageFiles, deletedImages, userId);
}

@DeleteMapping("/api/review/{review-id}")
Expand Down Expand Up @@ -89,9 +89,11 @@ public ResponseEntity<String> deleteReview(
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
})
public List<PlaceImageResponse> searchReviewImage(
@PathVariable("valley-id") String placeId
@PathVariable("valley-id") String placeId,
Authentication auth
) {
return reviewService.searchReviewImage(placeId);
String userId = auth.getName();
return reviewService.searchReviewImage(placeId, userId);
}

@GetMapping("/api/valley/{valley-id}/review")
Expand All @@ -102,9 +104,11 @@ public List<PlaceImageResponse> searchReviewImage(
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
})
public ReviewsResponse getPlaceReviews(
@PathVariable("valley-id") String placeId
@PathVariable("valley-id") String placeId,
Authentication auth
) {
return reviewService.getPlaceReviews(placeId);
String userId = auth.getName();
return reviewService.getPlaceReviews(placeId, userId);
}

@GetMapping("/api/review/{review-id}/detail")
Expand All @@ -115,9 +119,11 @@ public ReviewsResponse getPlaceReviews(
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
})
public ReviewDetailResponse getReviewDetail(
@PathVariable("review-id") String reviewId
@PathVariable("review-id") String reviewId,
Authentication auth
) {
return reviewService.getReviewDetail(reviewId);
String userId = auth.getName();
return reviewService.getReviewDetail(reviewId, userId);
}

@GetMapping("/api/member/{member-id}/review")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ public class ReviewPostRequest {
private String visitedDate;
private String privacy;
private String placeId;
private List<String> tagNames;
private List<String> imageUrls;
private List<String> tagNames;
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class PlaceImageResponse {
private String reviewId;
private String memberName;
private String title;
private String content;
private LocalDate visitedDate;
private List<String> imageUrls;
private String profile_image_url;
private String profileImageUrl;
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class ReviewDetailResponse {
private String visitedDate;
private String privacy;
private String memberId;
private String memberName;
private String placeId;
private String valleyName;
private String createdDate;
Expand All @@ -38,6 +39,7 @@ public static ReviewDetailResponse from(Review review) {
.visitedDate(String.valueOf(review.getVisitedDate()))
.privacy(review.getPrivacy().name())
.memberId(String.valueOf(review.getMember().getLoginEmail()))
.memberName(String.valueOf(review.getMember().getName()))
.placeId(String.valueOf(review.getPlace().getUuid()))
.valleyName(review.getPlace().getName())
.createdDate(String.valueOf(review.getCreatedDate()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,76 +6,55 @@
import jjhhyb.deepvalley.community.entity.Review;
import jjhhyb.deepvalley.community.entity.ReviewImage;
import jjhhyb.deepvalley.entityId.ReviewImageId;
import jjhhyb.deepvalley.image.ImageService;
import jjhhyb.deepvalley.image.S3Service;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class ReviewImageService {
private final ImageRepository imageRepository;
private final ReviewImageRepository reviewImageRepository;
private final ImageService imageService;
private final S3Service s3Service;

// 이미지 URL 리스트로 ReviewImage 객체 리스트 생성
// 이미지 처리 (ReviewImage 객체 리스트 생성)
public List<ReviewImage> processImages(List<String> imageUrls, Review review) {
return imageUrls.stream()
// 각 이미지 URL에 대해 이미지가 데이터베이스에 존재하는지 확인하고, 없으면 새로 저장
List<String> urls = imageUrls != null ? imageUrls : Collections.emptyList();
return urls.stream()
.map(imageUrl -> createOrUpdateImage(imageUrl, review))
.collect(Collectors.toList());
}

// 이미지 URL로 Image 객체 생성 or 업데이트
private ReviewImage createOrUpdateImage(String imageUrl, Review review) {
// 데이터베이스에서 이미지 조회, 없으면 새로 생성
// 주어진 이미지 URL에 대한 Image 객체를 조회하거나 새로 생성
Image image = imageRepository.findByImageUrl(imageUrl);
if (image == null) {
image = imageRepository.save(new Image(imageUrl));
}
// ReviewImage 객체 생성
return ReviewImage.builder()
.id(new ReviewImageId(review.getReviewId(), image.getImageId()))
.review(review)
.image(image)
.build();
}

// 리뷰와 연결된 이미지 업데이트
public void updateReviewImages(Review review, List<ReviewImage> updatedImages) {
Set<Long> updatedImageIds = updatedImages.stream()
.map(reviewImage -> reviewImage.getId().getImageId())
.collect(Collectors.toSet());

// 기존 이미지 리스트와 업데이트된 이미지 IDs를 비교하여 삭제할 이미지들을 결정
List<ReviewImage> existingImages = new ArrayList<>(review.getReviewImages()); // 모든 기존 이미지
List<ReviewImage> imagesToDelete = existingImages.stream() // 더 이상 사용되지 않는 이미지를 필터링해 포함
.filter(existingImage -> !updatedImageIds.contains(existingImage.getId().getImageId()))
.toList();

// 기존 이미지를 리뷰와의 연관관계에서 제거
review.getReviewImages().removeAll(existingImages);
reviewImageRepository.flush();

review.getReviewImages().clear();
review.getReviewImages().addAll(updatedImages);

// S3에서 이미지 삭제
imageService.deleteImages(imagesToDelete.stream()
.map(image -> image.getImage().getImageUrl())
.collect(Collectors.toList()));
// 데이터 베이스에서 삭제
reviewImageRepository.deleteAll(existingImages);
}

// 주어진 ReviewImage 리스트의 모든 이미지 삭제
// 주어진 ReviewImage 리스트의 모든 이미지를 삭제
@Transactional
public void deleteAll(List<ReviewImage> reviewImages) {
imageService.deleteImages(reviewImages.stream()
.map(image -> image.getImage().getImageUrl())
.collect(Collectors.toList()));
reviewImageRepository.deleteAll(reviewImages);
for (ReviewImage reviewImage : reviewImages) {
// S3에서 이미지 삭제 (imageUrl 필드 사용)
String imageUrl = reviewImage.getImage().getImageUrl();
s3Service.deleteImage(imageUrl); // S3에서 이미지 삭제하는 메서드 호출

// DB에서 ReviewImage 삭제
reviewImageRepository.delete(reviewImage);
}
}
}
}
Loading

0 comments on commit 3c9d8ce

Please sign in to comment.