diff --git a/src/main/java/com/petlog/diary/controller/DiaryController.java b/src/main/java/com/petlog/diary/controller/DiaryController.java index 37b52c1..34a8f78 100644 --- a/src/main/java/com/petlog/diary/controller/DiaryController.java +++ b/src/main/java/com/petlog/diary/controller/DiaryController.java @@ -10,6 +10,7 @@ import com.petlog.diary.service.dto.CreateDiaryDto; import com.petlog.diary.service.dto.GetDiaryDto; import com.petlog.diary.service.dto.GetDiaryInfoDto; +import com.petlog.diary.service.dto.UpdateDiaryDto; import com.petlog.docs.DiaryControllerDocs; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -91,10 +92,19 @@ public ResponseEntity> getDiary( @PatchMapping("/{diaryId}") public ResponseEntity> updateDiary( + @Authenticated final Long memberId, @PathVariable final Long groupId, @PathVariable final Long diaryId, @RequestBody final UpdateDiaryRequestDto request ) { + final UpdateDiaryDto dto = new UpdateDiaryDto( + request.title(), + request.content(), + request.images(), + request.writtenAt() + ); + diaryService.updateDiary(memberId, groupId, diaryId, dto); + return ResponseEntity.ok( ApiResponse.success(UPDATE_DIARY) ); diff --git a/src/main/java/com/petlog/diary/controller/dto/request/UpdateDiaryRequestDto.java b/src/main/java/com/petlog/diary/controller/dto/request/UpdateDiaryRequestDto.java index 1fb762a..e3f4a3c 100644 --- a/src/main/java/com/petlog/diary/controller/dto/request/UpdateDiaryRequestDto.java +++ b/src/main/java/com/petlog/diary/controller/dto/request/UpdateDiaryRequestDto.java @@ -1,6 +1,8 @@ package com.petlog.diary.controller.dto.request; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; import java.util.List; @@ -16,6 +18,8 @@ public record UpdateDiaryRequestDto( @Schema(description = "0~6장") List images, + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd") + @DateTimeFormat(pattern = "yyyy.MM.dd") LocalDate writtenAt ) { diff --git a/src/main/java/com/petlog/diary/entity/Diary.java b/src/main/java/com/petlog/diary/entity/Diary.java index 96c5900..fe96243 100644 --- a/src/main/java/com/petlog/diary/entity/Diary.java +++ b/src/main/java/com/petlog/diary/entity/Diary.java @@ -64,4 +64,14 @@ public Diary( this.content = content; this.writtenAt = writtenAt; } + + public void update( + final String title, + final String content, + final LocalDate writtenAt + ) { + this.title = title; + this.content = content; + this.writtenAt = writtenAt; + } } diff --git a/src/main/java/com/petlog/diary/repository/DiaryImageRepository.java b/src/main/java/com/petlog/diary/repository/DiaryImageRepository.java index 3d2aa67..c440036 100644 --- a/src/main/java/com/petlog/diary/repository/DiaryImageRepository.java +++ b/src/main/java/com/petlog/diary/repository/DiaryImageRepository.java @@ -1,7 +1,10 @@ package com.petlog.diary.repository; +import com.petlog.diary.entity.Diary; import com.petlog.diary.entity.DiaryImage; import org.springframework.data.jpa.repository.JpaRepository; public interface DiaryImageRepository extends JpaRepository { + + void deleteAllByDiary(final Diary diary); } diff --git a/src/main/java/com/petlog/diary/service/DiaryService.java b/src/main/java/com/petlog/diary/service/DiaryService.java index 6332ec6..e3028db 100644 --- a/src/main/java/com/petlog/diary/service/DiaryService.java +++ b/src/main/java/com/petlog/diary/service/DiaryService.java @@ -7,6 +7,7 @@ import com.petlog.diary.service.dto.CreateDiaryDto; import com.petlog.diary.service.dto.GetDiaryDto; import com.petlog.diary.service.dto.GetDiaryInfoDto; +import com.petlog.diary.service.dto.UpdateDiaryDto; import com.petlog.member.entity.Member; import com.petlog.member.repository.MemberRepository; import com.petlog.petgroup.entity.PetGroup; @@ -86,6 +87,7 @@ public List getAllDiaries(final Long memberId, final Long group .toList(); } + @Transactional(readOnly = true) public GetDiaryDto getDiary(final Long memberId, final Long groupId, final Long diaryId) { final Member member = getMember(memberId); final PetGroup petGroup = getPetGroup(groupId); @@ -108,4 +110,33 @@ private Diary getDiaryDetail(final Long diaryId) { return diaryRepository.findById(diaryId) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 일기입니다.")); } + + @Transactional + public void updateDiary(final Long memberId, final Long groupId, final Long diaryId, final UpdateDiaryDto dto) { + final Member member = getMember(memberId); + final PetGroup petGroup = getPetGroup(groupId); + getPetGroupMember(member, petGroup); + + final Diary diary = getDiaryDetail(diaryId); + validateIsDairyWriter(member, diary); + + diary.update( + dto.title(), + dto.content(), + dto.writtenAt() + ); + + diaryImageRepository.deleteAllByDiary(diary); + + final List images = dto.images().stream() + .map(img -> new DiaryImage(diary, img)) + .toList(); + diaryImageRepository.saveAll(images); + } + + private void validateIsDairyWriter(final Member member, final Diary diary) { + if(!diary.getMember().equals(member)) { + throw new IllegalArgumentException("일기 작성자만 수정할 수 있습니다."); + } + } } diff --git a/src/main/java/com/petlog/diary/service/dto/UpdateDiaryDto.java b/src/main/java/com/petlog/diary/service/dto/UpdateDiaryDto.java new file mode 100644 index 0000000..aa460b8 --- /dev/null +++ b/src/main/java/com/petlog/diary/service/dto/UpdateDiaryDto.java @@ -0,0 +1,14 @@ +package com.petlog.diary.service.dto; + +import java.time.LocalDate; +import java.util.List; + +public record UpdateDiaryDto( + + String title, + String content, + List images, + LocalDate writtenAt + +) { +} diff --git a/src/main/java/com/petlog/docs/DiaryControllerDocs.java b/src/main/java/com/petlog/docs/DiaryControllerDocs.java index 70309ca..946b99f 100644 --- a/src/main/java/com/petlog/docs/DiaryControllerDocs.java +++ b/src/main/java/com/petlog/docs/DiaryControllerDocs.java @@ -29,7 +29,7 @@ public interface DiaryControllerDocs { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "일기 상세 내용 수정에 성공하였습니다.") @Operation(summary = "일기 상세 내용 수정 API") - ResponseEntity> updateDiary(@PathVariable final Long groupId, @PathVariable final Long diaryId, @RequestBody final UpdateDiaryRequestDto request); + ResponseEntity> updateDiary(@Authenticated final Long memberId, @PathVariable final Long groupId, @PathVariable final Long diaryId, @RequestBody final UpdateDiaryRequestDto request); @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "일기 삭제가 성공하였습니다.") @Operation(summary = "일기 삭제 API")