From fd9188083908bdbfca10fed4b0b8f577076a9a6f Mon Sep 17 00:00:00 2001 From: huncozyboy Date: Tue, 12 Nov 2024 04:43:16 +0900 Subject: [PATCH] =?UTF-8?q?hotfix=20:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/image/service/S3ImageService.java | 4 -- .../controller/UserProfileController.java | 12 +++--- .../leets/Carrot/domain/user/entity/User.java | 4 ++ .../user/service/UserProfileService.java | 39 +++++++++++++++++++ 4 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/main/java/land/leets/Carrot/domain/image/service/S3ImageService.java b/src/main/java/land/leets/Carrot/domain/image/service/S3ImageService.java index 059e721..c17627f 100644 --- a/src/main/java/land/leets/Carrot/domain/image/service/S3ImageService.java +++ b/src/main/java/land/leets/Carrot/domain/image/service/S3ImageService.java @@ -103,8 +103,4 @@ private void deleteLocalFile(File file) { log.warn("Failed to delete local file: {}", file.getName()); } } - - private String generateFileUrl(String fileName) { - return String.format("https://%s.s3.%s.amazonaws.com/%s", bucketName, region, fileName); - } } diff --git a/src/main/java/land/leets/Carrot/domain/user/controller/UserProfileController.java b/src/main/java/land/leets/Carrot/domain/user/controller/UserProfileController.java index cc02e1f..380aaa8 100644 --- a/src/main/java/land/leets/Carrot/domain/user/controller/UserProfileController.java +++ b/src/main/java/land/leets/Carrot/domain/user/controller/UserProfileController.java @@ -75,28 +75,26 @@ public ResponseEntity> updateBasicInfo(@RequestBody @Valid Bas @PostMapping("/upload-profile-image") @Operation(summary = "프로필 이미지 업로드") - public ResponseEntity> uploadProfileImage( + public ResponseEntity> uploadProfileImage( @RequestParam("image") MultipartFile image, @Parameter(hidden = true) @CurrentUser Long userId) { String imageUrl = s3ImageService.uploadImage(image, "profile-images"); userProfileService.updateProfileImageUrl(userId, imageUrl); return ResponseEntity.ok( ResponseDto.response(IMAGE_UPLOAD_SUCCESS.getCode(), - IMAGE_UPLOAD_SUCCESS.getMessage()) + IMAGE_UPLOAD_SUCCESS.getMessage(), imageUrl) ); } @PatchMapping("/update-profile-image") @Operation(summary = "프로필 이미지 수정") - public ResponseEntity> updateProfileImage( + public ResponseEntity> updateProfileImage( @RequestParam("image") MultipartFile image, - @RequestParam("oldFileName") String oldFileName, @Parameter(hidden = true) @CurrentUser Long userId) { - String imageUrl = s3ImageService.updateImage(image, oldFileName, "profile-images"); - userProfileService.updateProfileImageUrl(userId, imageUrl); + String imageUrl = userProfileService.updateProfileImage(image, userId); return ResponseEntity.ok( ResponseDto.response(IMAGE_UPDATE_SUCCESS.getCode(), - IMAGE_UPDATE_SUCCESS.getMessage()) + IMAGE_UPDATE_SUCCESS.getMessage(), imageUrl) ); } diff --git a/src/main/java/land/leets/Carrot/domain/user/entity/User.java b/src/main/java/land/leets/Carrot/domain/user/entity/User.java index f416cda..4b79522 100644 --- a/src/main/java/land/leets/Carrot/domain/user/entity/User.java +++ b/src/main/java/land/leets/Carrot/domain/user/entity/User.java @@ -55,4 +55,8 @@ public void updateBasicInfo(Gender gender, Integer birthYear) { public void updateProfileImageUrl(String profileImageUrl) { this.profileImageUrl = profileImageUrl; } + + public void updateProfileImage(String profileImageUrl) { + this.profileImageUrl = profileImageUrl; + } } diff --git a/src/main/java/land/leets/Carrot/domain/user/service/UserProfileService.java b/src/main/java/land/leets/Carrot/domain/user/service/UserProfileService.java index 6361182..ae7a700 100644 --- a/src/main/java/land/leets/Carrot/domain/user/service/UserProfileService.java +++ b/src/main/java/land/leets/Carrot/domain/user/service/UserProfileService.java @@ -1,6 +1,7 @@ package land.leets.Carrot.domain.user.service; import jakarta.transaction.Transactional; +import land.leets.Carrot.domain.image.service.S3ImageService; import land.leets.Carrot.domain.user.dto.request.AdditionalInfoUpdateRequest; import land.leets.Carrot.domain.user.dto.request.BasicInfoUpdateRequest; import land.leets.Carrot.domain.user.dto.request.CareerUpdateRequest; @@ -15,12 +16,20 @@ import land.leets.Carrot.domain.user.exception.UserNotFoundException; import land.leets.Carrot.domain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; @Service @RequiredArgsConstructor public class UserProfileService { private final UserRepository userRepository; + private final S3ImageService s3ImageService; + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @Value("${cloud.aws.region.static}") + private String region; @Transactional public UserBasicInfoResponse check(Long userId) { @@ -127,6 +136,36 @@ public void updateProfileImageUrl(Long userId, String imageUrl) { user.updateProfileImageUrl(imageUrl); // 새로운 메서드를 통한 업데이트 } + @Transactional + public String updateProfileImage(MultipartFile image, Long userId) { + // 사용자 정보 조회 + User user = userRepository.findById(userId) + .orElseThrow(UserNotFoundException::new); + + // 기존 프로필 이미지 URL 가져오기 + String priorUrl = user.getProfileImageUrl(); + + // 새로운 이미지 업로드 + String newImageUrl = s3ImageService.uploadImage(image, "profile-images"); + + // 사용자 엔티티에 새로운 프로필 이미지 URL 업데이트 + user.updateProfileImage(newImageUrl); + userRepository.save(user); + + // 기존 이미지 삭제 (priorUrl이 존재할 경우) + if (priorUrl != null) { + String priorFileName = extractFileNameFromUrl(priorUrl, "profile-images"); + s3ImageService.deleteImage(priorFileName); + } + + return newImageUrl; + } + + private String extractFileNameFromUrl(String url, String dirName) { + String baseUrl = String.format("https://%s.s3.%s.amazonaws.com/%s", bucketName, region, dirName); + return url.replace(baseUrl, ""); // URL에서 파일 이름만 추출 + } + @Transactional public EmployeeProfileResponse employeeAll(Long userId) { User user = userRepository.findById(userId)