Skip to content
Merged
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 @@ -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;
Expand All @@ -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<Void> createEmotionDiary(
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<EmotionDiaryResponse> 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)
Expand Down Expand Up @@ -66,14 +75,17 @@ public ResponseEntity<EmotionDiaryResponse> readEmotionDiaryByDate(

// 감정일기 수정 (update)
@Operation(summary = "특정 감정일기 수정", description = "해당하는 날짜의 감정일기를 수정합니다.")
@PutMapping("/{date}")
@PutMapping(value ="/{date}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<EmotionDiaryResponse> 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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,4 @@ public class EmotionDiaryCreateRequest {

@NotNull
private LocalDate date;

private String imageUrl;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,4 @@
@Builder
public class EmotionDiaryUpdateRequest {
private String content;

private String imageUrl;
}
7 changes: 5 additions & 2 deletions src/main/java/Devroup/hidaddy/entity/EmotionDiary.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
37 changes: 30 additions & 7 deletions src/main/java/Devroup/hidaddy/service/EmotionDiaryService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
}

// 공통 조회 로직 실패 시 오류 발생
Expand Down Expand Up @@ -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);
}
Expand Down