From 513d693ad3f931006e24f2b991676e3665987e16 Mon Sep 17 00:00:00 2001 From: asfslaf Date: Tue, 5 Aug 2025 13:41:05 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EA=B0=90=EC=A0=95=EC=9D=BC=EA=B8=B0=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/EmotionDiaryController.java | 30 ++++++++++----- .../EmotionDiaryCreateRequest.java | 2 - .../EmotionDiaryUpdateRequest.java | 2 - .../Devroup/hidaddy/entity/EmotionDiary.java | 7 +++- .../hidaddy/service/EmotionDiaryService.java | 38 +++++++++++++++---- 5 files changed, 57 insertions(+), 22 deletions(-) diff --git a/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java b/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java index fb985e9..032e286 100644 --- a/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java +++ b/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java @@ -10,9 +10,11 @@ import lombok.extern.slf4j.XSlf4j; import org.springframework.cglib.core.Local; import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.time.LocalDate; @@ -27,14 +29,21 @@ public class EmotionDiaryController { // 감정일기 생성 (create) @Operation(summary = "감정일기 생성", description = "특정 날짜의 감정일기를 생성합니다.") - @PostMapping - public ResponseEntity createEmotionDiary( + @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public ResponseEntity createEmotionDiary( @AuthenticationPrincipal UserDetailsImpl userDetails, - @RequestBody EmotionDiaryCreateRequest dto + @RequestParam("content") String content, + @RequestParam (value = "date", required = false) String dateString, + @RequestPart(value = "image", required = false) MultipartFile image ) { - User currentUser = userDetails.getUser(); - emotionDiaryService.create(dto, currentUser); - return ResponseEntity.ok().build(); + LocalDate date; + if (dateString == null || dateString.trim().isEmpty()) { + date = LocalDate.now(); + } else { + date = LocalDate.parse(dateString); + } + EmotionDiaryCreateRequest dto = new EmotionDiaryCreateRequest(content, date); + return ResponseEntity.ok(emotionDiaryService.create(dto, image, userDetails.getUser())); } // 감정일기 조회 (read) @@ -66,14 +75,17 @@ public ResponseEntity readEmotionDiaryByDate( // 감정일기 수정 (update) @Operation(summary = "특정 감정일기 수정", description = "해당하는 날짜의 감정일기를 수정합니다.") - @PutMapping("/{date}") + @PutMapping(value ="/{date}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity updateEmotionDiary( @AuthenticationPrincipal UserDetailsImpl userDetails, @PathVariable("date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date, - @RequestBody EmotionDiaryUpdateRequest request + @RequestParam("content") String content, + @RequestPart(value = "image", required = false) MultipartFile image + ) { User currentUser = userDetails.getUser(); - EmotionDiaryResponse response = emotionDiaryService.updateEmotionDiary(currentUser, date, request); + EmotionDiaryUpdateRequest request = new EmotionDiaryUpdateRequest(content); + EmotionDiaryResponse response = emotionDiaryService.updateEmotionDiary(currentUser, date, request, image); return ResponseEntity.ok(response); } diff --git a/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryCreateRequest.java b/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryCreateRequest.java index 7fd4270..8dffb5d 100644 --- a/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryCreateRequest.java +++ b/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryCreateRequest.java @@ -18,6 +18,4 @@ public class EmotionDiaryCreateRequest { @NotNull private LocalDate date; - - private String imageUrl; } diff --git a/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryUpdateRequest.java b/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryUpdateRequest.java index 0388af4..f6b717e 100644 --- a/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryUpdateRequest.java +++ b/src/main/java/Devroup/hidaddy/dto/emotionDiary/EmotionDiaryUpdateRequest.java @@ -11,6 +11,4 @@ @Builder public class EmotionDiaryUpdateRequest { private String content; - - private String imageUrl; } diff --git a/src/main/java/Devroup/hidaddy/entity/EmotionDiary.java b/src/main/java/Devroup/hidaddy/entity/EmotionDiary.java index 818871f..19efd73 100644 --- a/src/main/java/Devroup/hidaddy/entity/EmotionDiary.java +++ b/src/main/java/Devroup/hidaddy/entity/EmotionDiary.java @@ -54,10 +54,13 @@ protected void onUpdate() { updatedAt = LocalDateTime.now(); } - public void update(String content, String imageUrl) + public void update(String content) { this.content = content; - this.imageUrl = imageUrl; this.updatedAt = LocalDateTime.now(); } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } } \ No newline at end of file diff --git a/src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java b/src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java index 6dfe968..d838fd7 100644 --- a/src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java +++ b/src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java @@ -4,10 +4,12 @@ import Devroup.hidaddy.entity.EmotionDiary; import Devroup.hidaddy.entity.User; import Devroup.hidaddy.repository.emotionDiary.*; -import com.fasterxml.jackson.annotation.JsonInclude; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import Devroup.hidaddy.util.S3Uploader; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.beans.factory.annotation.Value; import java.time.LocalDate; import java.util.List; @@ -16,19 +18,28 @@ @RequiredArgsConstructor @Transactional public class EmotionDiaryService { - + private final S3Uploader s3Uploader; private final EmotionDiaryRepository diaryRepository; + @Value("${cloudfront.domain}") + private String cloudFrontDomain; - public void create(EmotionDiaryCreateRequest dto, User currentUser) { + public EmotionDiaryResponse create(EmotionDiaryCreateRequest dto, MultipartFile image, User currentUser) { LocalDate dataToSave = (dto.getDate() == null) ? LocalDate.now() : dto.getDate(); + String imageUrl = null; + if (image != null && !image.isEmpty()) { + imageUrl = s3Uploader.upload(image, "emotionDiary"); + imageUrl = cloudFrontDomain + "/" + imageUrl; + } + EmotionDiary diary = EmotionDiary.builder() .user(currentUser) .content(dto.getContent()) - .imageUrl(dto.getImageUrl()) + .imageUrl(imageUrl) .date(dataToSave) .build(); diaryRepository.save(diary); + return EmotionDiaryResponse.from(diary); } // 공통 조회 로직 실패 시 오류 발생 @@ -62,14 +73,27 @@ public EmotionDiaryResponse readEmotionDiaryByDate(User currentUser, LocalDate d } // 감정일기 수정 (update) - + @Transactional public EmotionDiaryResponse updateEmotionDiary( User currentUser, LocalDate date, - EmotionDiaryUpdateRequest dto + EmotionDiaryUpdateRequest dto, + MultipartFile image ) { EmotionDiary diary = findDiaryOrThrow(currentUser.getId(), date); - diary.update(dto.getContent(), dto.getImageUrl()); + diary.update(dto.getContent()); + + if (image != null && !image.isEmpty()) { + // 기존 이미지 삭제 + if (diary.getImageUrl() != null && !diary.getImageUrl().isEmpty()) { + String imageKey = diary.getImageUrl().replace(cloudFrontDomain + "/", ""); + s3Uploader.delete(imageKey); + } + // 새 이미지 업로드 + String imageUrl = s3Uploader.upload(image, "emotionDiary"); + imageUrl = cloudFrontDomain + "/" + imageUrl; + diary.setImageUrl(imageUrl); + } return EmotionDiaryResponse.from(diary); } From dff4f841b660bb5b22a28a8b6e6b82a9f440976b Mon Sep 17 00:00:00 2001 From: asfslaf Date: Tue, 5 Aug 2025 18:56:26 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EA=B0=90=EC=A0=95=EC=9D=BC=EA=B8=B0=20conf?= =?UTF-8?q?lict=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/Devroup/hidaddy/controller/EmotionDiaryController.java | 2 +- src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java b/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java index 032e286..97d135f 100644 --- a/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java +++ b/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java @@ -23,7 +23,7 @@ @RestController @RequestMapping("/api/emotion-diaries") @RequiredArgsConstructor -@Tag(name = "Emotion-Diary", description = "감정일기 API") +@Tag(name = "Emotion-Diary", description = "감Z정일기 API") public class EmotionDiaryController { private final EmotionDiaryService emotionDiaryService; diff --git a/src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java b/src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java index d838fd7..38194ed 100644 --- a/src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java +++ b/src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java @@ -73,7 +73,6 @@ public EmotionDiaryResponse readEmotionDiaryByDate(User currentUser, LocalDate d } // 감정일기 수정 (update) - @Transactional public EmotionDiaryResponse updateEmotionDiary( User currentUser, LocalDate date,