Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -106,4 +106,20 @@ public ResponseEntity<ApiResponse<ReviewImageUploadResponseDto>> uploadReviewIma
ApiResponse<ReviewImageUploadResponseDto> apiResponse = ApiResponse.success("이미지가 성공적으로 업로드되었습니다.", responseDto);
return ResponseEntity.status(HttpStatus.CREATED).body(apiResponse);
}

@DeleteMapping("/images/{imageId}")
public ResponseEntity<ApiResponse<Void>> deleteReviewImage(
@PathVariable Long imageId,
@AuthenticationPrincipal UserDetails userDetails) {

// TODO
// 현재 인증된 사용자 ID 가져오기
// Long userId = ((CustomUserDetails) userDetails).getId();
Long userId = null;

reviewService.deleteReviewImage(imageId, userId);

ApiResponse<Void> apiResponse = ApiResponse.success("이미지가 성공적으로 삭제되었습니다.", null);
return ResponseEntity.ok(apiResponse);
}
}
42 changes: 39 additions & 3 deletions src/main/java/com/demo/pteam/review/service/ReviewService.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.demo.pteam.schedule.repository.entity.ScheduleEntity;
import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
Expand All @@ -28,7 +29,7 @@
import java.util.List;
import java.util.stream.Collectors;


@Slf4j
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
Expand Down Expand Up @@ -170,10 +171,16 @@ public void deleteReview(Long reviewId, Long userId) {
throw new ApiException(ReviewErrorCode.NOT_REVIEW_OWNER);
}

// 리뷰 이미지 연결 해제
List<ReviewImageEntity> images = reviewImageRepository.findByReviewId(reviewId);
images.forEach(image -> image.updateReview(null));

images.forEach(image -> {
try {
fileStorageService.deleteFile(image.getImageUrl());
} catch (IOException e) {
log.error("Failed to delete image file: {}", e.getMessage());
}
});
reviewImageRepository.deleteAll(images);
reviewRepository.delete(reviewEntity);
}

Expand Down Expand Up @@ -223,6 +230,35 @@ public ReviewImageUploadResponseDto uploadReviewImage(MultipartFile multipartFil
}
}

/**
* 리뷰 임시 이미지 삭제
* @param imageId 삭제할 이미지 ID
* @param userId 현재 인증된 사용자 ID
*/
@Transactional
public void deleteReviewImage(Long imageId, Long userId) {
ReviewImageEntity imageEntity = reviewImageRepository.findById(imageId)
.orElseThrow(() -> new ApiException(ReviewErrorCode.IMAGE_NOT_FOUND));

if (!imageEntity.getUserId().equals(userId)) {
throw new ApiException(ReviewErrorCode.NOT_IMAGE_OWNER);
}

if (imageEntity.getReview() != null) {
throw new ApiException(ReviewErrorCode.IMAGE_ALREADY_LINKED);
}

// 파일 스토리지에서 삭제
try {
fileStorageService.deleteFile(imageEntity.getImageUrl());
} catch (IOException e) {
log.error("Failed to delete image file: {}", e.getMessage());
}

// DB에서 삭제
reviewImageRepository.delete(imageEntity);
}



// 메서드
Expand Down