diff --git a/src/main/java/com/hansung/leafly/domain/bookreview/service/BookReviewServiceImpl.java b/src/main/java/com/hansung/leafly/domain/bookreview/service/BookReviewServiceImpl.java index 32d0ddc..619a3b5 100644 --- a/src/main/java/com/hansung/leafly/domain/bookreview/service/BookReviewServiceImpl.java +++ b/src/main/java/com/hansung/leafly/domain/bookreview/service/BookReviewServiceImpl.java @@ -9,6 +9,11 @@ import com.hansung.leafly.domain.bookreview.repository.BookTagRepository; import com.hansung.leafly.domain.bookreview.repository.ReviewImageRepository; import com.hansung.leafly.domain.bookreview.web.dto.*; +import com.hansung.leafly.domain.library.entity.Library; +import com.hansung.leafly.domain.library.entity.enums.LibraryStatus; +import com.hansung.leafly.domain.library.repository.LibraryRepository; +import com.hansung.leafly.domain.library.web.dto.LibraryReq; +import com.hansung.leafly.domain.library.web.dto.LibraryReqBuilder; import com.hansung.leafly.domain.member.entity.Member; import com.hansung.leafly.infra.s3.S3Service; import com.hansung.leafly.infra.s3.exception.S3RequestFailedException; @@ -20,6 +25,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Service @Transactional(readOnly = true) @@ -29,6 +35,7 @@ public class BookReviewServiceImpl implements BookReviewService { private final BookTagRepository bookTagRepository; private final ReviewImageRepository reviewImageRepository; private final S3Service s3Service; + private final LibraryRepository libraryRepository; @Override @Transactional @@ -41,6 +48,8 @@ public void create(Member member, ReviewReq req) { List images = processImages(req.getImages(), bookReview); reviewImageRepository.saveAll(images); + + saveLibraryAsDone(member, req); } @Override @@ -161,4 +170,21 @@ private List processImages(List images, BookReview r return result; } + private void saveLibraryAsDone(Member member, ReviewReq req) { + String isbn = req.getIsbn(); + + // 이미 서재에 존재하면 상태만 DONE으로 변경 + Optional existing = libraryRepository.findByMemberAndIsbn(member, isbn); + + if (existing.isPresent()) { + Library library = existing.get(); + library.updateStatus(LibraryStatus.DONE); // 상태 업데이트 + return; + } + + // 없으면 새로 추가 + LibraryReq libraryReq = new LibraryReqBuilder(req).buildDoneReq(); + Library library = Library.of(member, isbn, libraryReq); + libraryRepository.save(library); + } } diff --git a/src/main/java/com/hansung/leafly/domain/bookreview/web/dto/ReviewReq.java b/src/main/java/com/hansung/leafly/domain/bookreview/web/dto/ReviewReq.java index d73e05c..87d00b0 100644 --- a/src/main/java/com/hansung/leafly/domain/bookreview/web/dto/ReviewReq.java +++ b/src/main/java/com/hansung/leafly/domain/bookreview/web/dto/ReviewReq.java @@ -38,4 +38,7 @@ public class ReviewReq { // 이미지 최대 3개까지 @Size(max = 3, message = "이미지는 최대 3장까지 업로드 가능합니다.") private List images; + + @NotNull(message = "isbn을 입력해주세요.") + private String isbn; } diff --git a/src/main/java/com/hansung/leafly/domain/library/entity/Library.java b/src/main/java/com/hansung/leafly/domain/library/entity/Library.java index ae6f6eb..4c573c8 100644 --- a/src/main/java/com/hansung/leafly/domain/library/entity/Library.java +++ b/src/main/java/com/hansung/leafly/domain/library/entity/Library.java @@ -51,4 +51,8 @@ public static Library of(Member member, String isbn, LibraryReq req) { .status(req.getStatus()) .build(); } + + public void updateStatus(LibraryStatus status) { + this.status = status; + } } diff --git a/src/main/java/com/hansung/leafly/domain/library/repository/LibraryRepository.java b/src/main/java/com/hansung/leafly/domain/library/repository/LibraryRepository.java index 2f00dee..f2cba18 100644 --- a/src/main/java/com/hansung/leafly/domain/library/repository/LibraryRepository.java +++ b/src/main/java/com/hansung/leafly/domain/library/repository/LibraryRepository.java @@ -5,8 +5,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface LibraryRepository extends JpaRepository { boolean existsByMemberAndIsbn(Member member, String isbn13); + Optional findByMemberAndIsbn(Member member, String isbn); } diff --git a/src/main/java/com/hansung/leafly/domain/library/web/dto/LibraryReq.java b/src/main/java/com/hansung/leafly/domain/library/web/dto/LibraryReq.java index 8122d02..1af5e18 100644 --- a/src/main/java/com/hansung/leafly/domain/library/web/dto/LibraryReq.java +++ b/src/main/java/com/hansung/leafly/domain/library/web/dto/LibraryReq.java @@ -4,8 +4,10 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Getter; +import lombok.Setter; @Getter +@Setter public class LibraryReq { @NotBlank(message = "책 제목이 비어 있습니다.") private String title; diff --git a/src/main/java/com/hansung/leafly/domain/library/web/dto/LibraryReqBuilder.java b/src/main/java/com/hansung/leafly/domain/library/web/dto/LibraryReqBuilder.java new file mode 100644 index 0000000..5450933 --- /dev/null +++ b/src/main/java/com/hansung/leafly/domain/library/web/dto/LibraryReqBuilder.java @@ -0,0 +1,22 @@ +package com.hansung.leafly.domain.library.web.dto; + +import com.hansung.leafly.domain.bookreview.web.dto.ReviewReq; +import com.hansung.leafly.domain.library.entity.enums.LibraryStatus; + +public class LibraryReqBuilder { + + private final ReviewReq req; + + public LibraryReqBuilder(ReviewReq req) { + this.req = req; + } + + public LibraryReq buildDoneReq() { + LibraryReq libraryReq = new LibraryReq(); + libraryReq.setTitle(req.getTitle()); + libraryReq.setAuthor(req.getAuthor()); + libraryReq.setCover(req.getThumbnail()); + libraryReq.setStatus(LibraryStatus.DONE); + return libraryReq; + } +} \ No newline at end of file