diff --git a/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java b/src/main/java/Devroup/hidaddy/controller/EmotionDiaryController.java index fb985e9..97d135f 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; @@ -21,20 +23,27 @@ @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; // 감정일기 생성 (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..38194ed 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,26 @@ public EmotionDiaryResponse readEmotionDiaryByDate(User currentUser, LocalDate d } // 감정일기 수정 (update) - 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); }