From 81d585e86a01609393312943f9b3edf1109df3ad Mon Sep 17 00:00:00 2001 From: serak0310 Date: Tue, 17 Jun 2025 01:08:06 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EB=82=98=EC=9D=98=20=EC=B1=85=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20-=20auth=20=ED=95=84?= =?UTF-8?q?=ED=84=B0=EB=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 16 ---------------- .../mybook/controller/MyBookController.java | 7 +++++-- .../domain/mybook/model/MyBookDetailRes.java | 1 + .../domain/mybook/service/MyBookService.java | 4 +++- .../mybook/service/MyBookServiceImpl.java | 18 +++++++++++------- .../ikdaman/global/exception/ErrorCode.java | 12 ++++++++++++ 6 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/ikdaman/domain/member/controller/MemberController.java b/src/main/java/com/ikdaman/domain/member/controller/MemberController.java index baccff2..058e9de 100644 --- a/src/main/java/com/ikdaman/domain/member/controller/MemberController.java +++ b/src/main/java/com/ikdaman/domain/member/controller/MemberController.java @@ -30,22 +30,6 @@ public class MemberController { private final MemberService memberService; - // 회원 생성 테스트 - @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity createMember(@RequestBody MemberReq dto) { - Member member = memberService.createMember(dto); - System.out.println("aaaaaaaaa"); - return ResponseEntity.ok(member); - } - - // 회원 조회 테스트 - @GetMapping("/{memberId}") - public ResponseEntity getMember(@PathVariable UUID memberId) { - Optional member = memberService.findMemberById(memberId); - return member.map(ResponseEntity::ok) - .orElseGet(() -> ResponseEntity.notFound().build()); - } - // 닉네임 중복 확인 // TODO: 닉네임 형식에 대한 Validation (2025.05.01 기준 미정) @GetMapping("/check") diff --git a/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java b/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java index ca11931..63d54c9 100644 --- a/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java +++ b/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java @@ -3,10 +3,12 @@ import com.ikdaman.domain.bookLog.model.BookLogListRes; import com.ikdaman.domain.mybook.model.*; import com.ikdaman.domain.mybook.service.MyBookService; +import com.ikdaman.global.auth.model.AuthMember; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; @RestController @@ -61,8 +63,9 @@ public InProgressBooksRes searchInProgressBooks() { // 나의 책 정보 조회 @GetMapping("/{mybookId}") - public ResponseEntity getMyBookDetail(@PathVariable Long mybookId) { - MyBookDetailRes res = myBookService.getMyBookDetail(mybookId); + public ResponseEntity getMyBookDetail(@AuthenticationPrincipal AuthMember authMember, + @PathVariable Long mybookId) { + MyBookDetailRes res = myBookService.getMyBookDetail(authMember.getMember().getMemberId(), mybookId); return ResponseEntity.ok(res); } diff --git a/src/main/java/com/ikdaman/domain/mybook/model/MyBookDetailRes.java b/src/main/java/com/ikdaman/domain/mybook/model/MyBookDetailRes.java index 485d083..c009911 100644 --- a/src/main/java/com/ikdaman/domain/mybook/model/MyBookDetailRes.java +++ b/src/main/java/com/ikdaman/domain/mybook/model/MyBookDetailRes.java @@ -22,6 +22,7 @@ public class MyBookDetailRes { @NoArgsConstructor @AllArgsConstructor public static class BookInfo { + private String itemId; private String title; private String author; private String coverImage; diff --git a/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java b/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java index 6014fe9..76efdda 100644 --- a/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java +++ b/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java @@ -3,6 +3,8 @@ import com.ikdaman.domain.bookLog.model.BookLogListRes; import com.ikdaman.domain.mybook.model.*; +import java.util.UUID; + /** * 나의 책 서비스 */ @@ -19,7 +21,7 @@ public interface MyBookService { InProgressBooksRes searchInProgressBooks(); - MyBookDetailRes getMyBookDetail(Long mybookId); + MyBookDetailRes getMyBookDetail(UUID memberId, Long mybookId); BookLogListRes getMyBookLogs(Long mybookId, Integer page, Integer limit); } \ No newline at end of file diff --git a/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java b/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java index cc10b3f..31c56d5 100644 --- a/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java +++ b/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java @@ -4,12 +4,9 @@ import com.ikdaman.domain.bookLog.model.BookLogType; import com.ikdaman.domain.bookLog.repository.BookLogRepository; import com.ikdaman.domain.bookLog.model.BookLogListRes; -import com.ikdaman.domain.member.entity.Member; import com.ikdaman.domain.member.repository.MemberRepository; -import com.ikdaman.domain.bookLog.repository.BookLogRepository; import com.ikdaman.domain.book.entity.Author; import com.ikdaman.domain.book.entity.Book; -import com.ikdaman.domain.bookLog.entity.BookLog; import com.ikdaman.domain.mybook.entity.MyBook; import com.ikdaman.domain.book.entity.Writer; import com.ikdaman.domain.mybook.model.*; @@ -235,9 +232,14 @@ public InProgressBooksRes searchInProgressBooks() { // 나의 책 정보 조회 @Override @Transactional(readOnly = true) - public MyBookDetailRes getMyBookDetail(Long mybookId) { + public MyBookDetailRes getMyBookDetail(UUID memberId, Long mybookId) { MyBook myBook = myBookRepository.findById(mybookId) .orElseThrow(() -> new BaseException(NOT_FOUND_BOOK)); + + if (!myBook.getMemberId().equals(memberId)) { + throw new BaseException(BOOK_NOT_OWNED_BY_MEMBER); + } + Book book = myBook.getBook(); // 작가열 생성 @@ -246,13 +248,15 @@ public MyBookDetailRes getMyBookDetail(Long mybookId) { .map(a -> a.getWriter().getWriterName()) .collect(Collectors.joining(", ")); - // 첫인상 추가 + // 첫인상 조회 String impression = bookLogRepository.findFirstByMyBookAndBooklogType(myBook, "IMPRESSION") .map(BookLog::getContent) .orElse(null); - // 책 정보 추가 + // 책 정보 객체 생성 + // TODO: itemId 알라딘 item id로 변경해서 전달 필요(isbn -> aladinItemId) MyBookDetailRes.BookInfo bookInfo = MyBookDetailRes.BookInfo.builder() + .itemId(book.getIsbn()) .title(book.getTitle()) .author(authorNames) .coverImage(book.getCoverImage()) @@ -260,7 +264,7 @@ public MyBookDetailRes getMyBookDetail(Long mybookId) { .totalPage(book.getPage()) .build(); - // 나의책 정보 추가 + // 나의책 정보 객체 생성 return MyBookDetailRes.builder() .bookInfo(bookInfo) .mybookId(String.valueOf(myBook.getMybookId())) diff --git a/src/main/java/com/ikdaman/global/exception/ErrorCode.java b/src/main/java/com/ikdaman/global/exception/ErrorCode.java index 35658a6..ffc0c7f 100644 --- a/src/main/java/com/ikdaman/global/exception/ErrorCode.java +++ b/src/main/java/com/ikdaman/global/exception/ErrorCode.java @@ -28,6 +28,18 @@ public enum ErrorCode { // Notice(04) + /** + * 403 Forbidden + */ + // Auth(01) + + // Member(02) + + // MyBook(03) + BOOK_NOT_OWNED_BY_MEMBER(HttpStatus.FORBIDDEN.value(), 4030301, "본인의 책이 아닙니다."), + + // Notice(04) + /** * 404 Not found From b3faf04d74ae1c0470bbd8cef4cfc14f25700405 Mon Sep 17 00:00:00 2001 From: serak0310 Date: Tue, 17 Jun 2025 01:25:30 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=EB=82=98=EC=9D=98=20=EC=B1=85=20?= =?UTF-8?q?=EA=B8=B0=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20-=20auth=20=ED=95=84?= =?UTF-8?q?=ED=84=B0=EB=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybook/controller/MyBookController.java | 3 ++- .../domain/mybook/service/MyBookService.java | 2 +- .../mybook/service/MyBookServiceImpl.java | 26 ++++++++++++++----- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java b/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java index 63d54c9..002b1f6 100644 --- a/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java +++ b/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java @@ -72,10 +72,11 @@ public ResponseEntity getMyBookDetail(@AuthenticationPrincipal // 나의 책 기록 조회 @GetMapping("/{mybookId}/booklog") public ResponseEntity getMyBookLogs( + @AuthenticationPrincipal AuthMember authMember, @PathVariable("mybookId") Long mybookId, @RequestParam(value = "page", required = false, defaultValue = "1") Integer page, @RequestParam(value = "limit", required = false, defaultValue = "9") Integer limit ) { - return ResponseEntity.ok(myBookService.getMyBookLogs(mybookId, page, limit)); + return ResponseEntity.ok(myBookService.getMyBookLogs(authMember.getMember().getMemberId(), mybookId, page, limit)); } } \ No newline at end of file diff --git a/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java b/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java index 76efdda..b55725a 100644 --- a/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java +++ b/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java @@ -23,5 +23,5 @@ public interface MyBookService { MyBookDetailRes getMyBookDetail(UUID memberId, Long mybookId); - BookLogListRes getMyBookLogs(Long mybookId, Integer page, Integer limit); + BookLogListRes getMyBookLogs(UUID memberId, Long mybookId, Integer page, Integer limit); } \ No newline at end of file diff --git a/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java b/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java index 31c56d5..4a577ee 100644 --- a/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java +++ b/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java @@ -233,13 +233,9 @@ public InProgressBooksRes searchInProgressBooks() { @Override @Transactional(readOnly = true) public MyBookDetailRes getMyBookDetail(UUID memberId, Long mybookId) { - MyBook myBook = myBookRepository.findById(mybookId) - .orElseThrow(() -> new BaseException(NOT_FOUND_BOOK)); - - if (!myBook.getMemberId().equals(memberId)) { - throw new BaseException(BOOK_NOT_OWNED_BY_MEMBER); - } + // 책 주인 확인 + MyBook myBook = getMyBookIfOwner(mybookId, memberId); Book book = myBook.getBook(); // 작가열 생성 @@ -278,10 +274,16 @@ public MyBookDetailRes getMyBookDetail(UUID memberId, Long mybookId) { // 나의 책 기록 조회 @Override @Transactional(readOnly = true) - public BookLogListRes getMyBookLogs(Long mybookId, Integer page, Integer limit) { + public BookLogListRes getMyBookLogs(UUID memberId, Long mybookId, Integer page, Integer limit) { + + // 책 주인 확인 + getMyBookIfOwner(mybookId, memberId); + + // 페이지네이션 Pageable pageable = PageRequest.of(page - 1, limit, Sort.by(Sort.Direction.DESC, "createdAt")); Page resultPage = bookLogRepository.findByMyBook_MybookId(mybookId, pageable); + // 응답용 DTO 리스트 변환 List booklogs = resultPage.getContent().stream() .map(log -> new BookLogListRes.BookLogDTO( log.getBooklogId(), @@ -303,4 +305,14 @@ public void deleteMyBook(Integer id) { myBook.updateToInactive(); myBookRepository.save(myBook); } + + // 책 주인 확인 + private MyBook getMyBookIfOwner(Long mybookId, UUID memberId) { + MyBook myBook = myBookRepository.findById(mybookId) + .orElseThrow(() -> new BaseException(NOT_FOUND_BOOK)); + if (!myBook.getMemberId().equals(memberId)) { + throw new BaseException(BOOK_NOT_OWNED_BY_MEMBER); + } + return myBook; + } } \ No newline at end of file From 1dc90bfeb2f395f0cc4136715f82fc84d73832cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A1=E1=84=8C=E1=85=B5?= =?UTF-8?q?=E1=86=AB?= Date: Tue, 17 Jun 2025 23:18:53 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feature:=20=ED=86=A0=ED=81=B0=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20=EA=B4=80=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybook/controller/MyBookController.java | 16 ++++++-- .../mybook/repository/MyBookRepository.java | 38 +++++-------------- .../domain/mybook/service/MyBookService.java | 5 ++- .../mybook/service/MyBookServiceImpl.java | 22 ++++++----- 4 files changed, 36 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java b/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java index ca11931..f6392f0 100644 --- a/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java +++ b/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java @@ -4,6 +4,11 @@ import com.ikdaman.domain.mybook.model.*; import com.ikdaman.domain.mybook.service.MyBookService; import lombok.RequiredArgsConstructor; +import com.ikdaman.global.auth.model.AuthMember; +import org.springframework.security.core.annotation.AuthenticationPrincipal; + +import java.util.UUID; + import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -43,20 +48,23 @@ public MyBookSearchRes searchMyBooks( @RequestParam(required = false) String status, @RequestParam(required = false) String keyword, @RequestParam(required = false, defaultValue = "1") Integer page, - @RequestParam(required = false, defaultValue = "9") Integer limit + @RequestParam(required = false, defaultValue = "9") Integer limit, + @AuthenticationPrincipal AuthMember authMember ) { MyBookSearchReq request = new MyBookSearchReq(); request.setStatus(status); request.setKeyword(keyword); request.setPage(page); request.setLimit(limit); - return myBookService.searchMyBooks(request); + return myBookService.searchMyBooks(request, authMember); } // 독서중인 책 목록 조회 @GetMapping("/in-progress") - public InProgressBooksRes searchInProgressBooks() { - return myBookService.searchInProgressBooks(); + public InProgressBooksRes searchInProgressBooks( + @AuthenticationPrincipal AuthMember authMember + ) { + return myBookService.searchInProgressBooks(authMember); } // 나의 책 정보 조회 diff --git a/src/main/java/com/ikdaman/domain/mybook/repository/MyBookRepository.java b/src/main/java/com/ikdaman/domain/mybook/repository/MyBookRepository.java index 629f110..9b9bad5 100644 --- a/src/main/java/com/ikdaman/domain/mybook/repository/MyBookRepository.java +++ b/src/main/java/com/ikdaman/domain/mybook/repository/MyBookRepository.java @@ -12,36 +12,12 @@ public interface MyBookRepository extends JpaRepository { - @Query(""" - SELECT m FROM MyBook m - LEFT JOIN m.book b - LEFT JOIN b.author a - LEFT JOIN a.writer w - WHERE m.memberId = :memberId - AND ( - :status IS NULL OR - (:status = 'completed' AND m.isReading = false) OR - (:status = 'in-progress' AND m.isReading = true) - ) - AND ( - :keyword IS NULL OR - b.title LIKE :keyword OR - w.writerName LIKE :keyword - ) - """) - Page searchMyBooks( - @Param("memberId") UUID memberId, - @Param("status") String status, - @Param("keyword") String keyword, - Pageable pageable - ); - @Query(value = """ SELECT m FROM MyBook m LEFT JOIN m.book b LEFT JOIN b.author a LEFT JOIN a.writer w - WHERE + WHERE m.memberId = :memberId AND ( :status IS NULL OR (:status = 'completed' AND m.isReading = false) OR @@ -59,6 +35,7 @@ SELECT COUNT(m) FROM MyBook m LEFT JOIN b.author a LEFT JOIN a.writer w WHERE + m.memberId = :memberId AND ( :status IS NULL OR (:status = 'completed' AND m.isReading = false) OR @@ -71,7 +48,8 @@ SELECT COUNT(m) FROM MyBook m ) """ ) - Page searchMyBooksWithoutMemberId( + Page searchMyBooks( + @Param("memberId") UUID memberId, @Param("status") String status, @Param("keyword") String keyword, Pageable pageable @@ -93,7 +71,8 @@ Page searchMyBooksWithoutMemberId( LEFT JOIN m.book b LEFT JOIN m.bookLogs bl WHERE - m.isReading = true + m.memberId = :memberId + AND m.isReading = true AND m.status = 'ACTIVE' """, countQuery = """ @@ -101,10 +80,11 @@ SELECT COUNT(m) FROM MyBook m LEFT JOIN m.book b LEFT JOIN m.bookLogs bl WHERE - m.isReading = true + m.memberId = :memberId + AND m.isReading = true AND m.status = 'ACTIVE' """ ) - List findAllActiveReadingBooks(); + List findAllActiveReadingBooks(UUID memberId); } diff --git a/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java b/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java index 6014fe9..be21fcc 100644 --- a/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java +++ b/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java @@ -2,6 +2,7 @@ import com.ikdaman.domain.bookLog.model.BookLogListRes; import com.ikdaman.domain.mybook.model.*; +import com.ikdaman.global.auth.model.AuthMember; /** * 나의 책 서비스 @@ -15,9 +16,9 @@ public interface MyBookService { void deleteMyBook(Integer mybookId); - MyBookSearchRes searchMyBooks(MyBookSearchReq request); + MyBookSearchRes searchMyBooks(MyBookSearchReq request, AuthMember authMember); - InProgressBooksRes searchInProgressBooks(); + InProgressBooksRes searchInProgressBooks(AuthMember authMember); MyBookDetailRes getMyBookDetail(Long mybookId); diff --git a/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java b/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java index 9cec08a..96ab4df 100644 --- a/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java +++ b/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java @@ -18,6 +18,8 @@ import com.ikdaman.domain.mybook.repository.MyBookRepository; import com.ikdaman.domain.book.repository.WriterRepository; import com.ikdaman.global.exception.BaseException; +import com.ikdaman.global.auth.model.AuthMember; +import lombok.extern.slf4j.Slf4j; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -37,6 +39,7 @@ * 나의 책 서비스 구현체 */ @Service +@Slf4j @RequiredArgsConstructor public class MyBookServiceImpl implements MyBookService { @@ -155,17 +158,17 @@ public MyBookRes addImpression(Integer myBookId, ImpressionReq dto) { } @Override - public MyBookSearchRes searchMyBooks(MyBookSearchReq request) { + public MyBookSearchRes searchMyBooks(MyBookSearchReq request, AuthMember authMember) { int page = request.getPage() - 1; // PageRequest는 0부터 시작 int limit = request.getLimit(); Pageable pageable = PageRequest.of(page, limit); - //UUID memberId = request.getMemberId(); - //UUID memberId = UUID.fromString("d290f1ee-6c54-4b01-90e6-d701748f0851"); String keyword = request.getKeyword(); - System.out.println("keyword: " + keyword); - Page resultPage = myBookRepository.searchMyBooksWithoutMemberId( + log.info("keyword: {}", keyword); + + Page resultPage = myBookRepository.searchMyBooks( + authMember.getMember().getMemberId(), request.getStatus(), keyword, pageable @@ -195,11 +198,10 @@ public MyBookSearchRes searchMyBooks(MyBookSearchReq request) { } @Override - public InProgressBooksRes searchInProgressBooks() { - //UUID memberId = request.getMemberId(); - //UUID memberId = UUID.fromString("d290f1ee-6c54-4b01-90e6-d701748f0851"); - - List myBooks = myBookRepository.findAllActiveReadingBooks(); + public InProgressBooksRes searchInProgressBooks(AuthMember authMember) { + List myBooks = myBookRepository.findAllActiveReadingBooks( + authMember.getMember().getMemberId() + ); List bookDtos = myBooks.stream() .map(myBook -> { From 4d4dea68d719c67ff70f20e4010386bc1afc692b Mon Sep 17 00:00:00 2001 From: sonshn Date: Wed, 18 Jun 2025 21:46:17 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20Book=EC=97=90=20aladinItemId=20?= =?UTF-8?q?=EC=BB=AC=EB=9F=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ikdaman/domain/book/entity/Book.java | 6 +++++- .../ikdaman/domain/mybook/service/MyBookServiceImpl.java | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ikdaman/domain/book/entity/Book.java b/src/main/java/com/ikdaman/domain/book/entity/Book.java index b861bc5..eb32f46 100644 --- a/src/main/java/com/ikdaman/domain/book/entity/Book.java +++ b/src/main/java/com/ikdaman/domain/book/entity/Book.java @@ -41,11 +41,14 @@ public class Book extends BaseTime { @Column(name = "category_id") private int categoryId; + @Column(name = "aladin_item_id") + private String aladinItemId; + @OneToMany(mappedBy = "book", fetch = FetchType.LAZY) private List author; @Builder - public Book(int bookId, String title, String publisher, String isbn, int page, String coverImage, int categoryId, List author) { + public Book(int bookId, String title, String publisher, String isbn, int page, String coverImage, int categoryId, String aladinItemId, List author) { this.bookId = bookId; this.title = title; this.publisher = publisher; @@ -53,6 +56,7 @@ public Book(int bookId, String title, String publisher, String isbn, int page, S this.page = page; this.coverImage = coverImage; this.categoryId = categoryId; + this.aladinItemId = aladinItemId; this.author = author; } } \ No newline at end of file diff --git a/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java b/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java index 4a577ee..7ced2ec 100644 --- a/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java +++ b/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java @@ -64,6 +64,7 @@ public MyBookRes addMyBook(MyBookReq dto) { .isbn(dto.getIsbn()) .page(dto.getPage()) .coverImage(dto.getCoverImage()) + .aladinItemId(String.valueOf(dto.getItemId())) .build(); return bookRepository.save(newBook); From 172a22d7265810afc132c930b06c1042c07787ea Mon Sep 17 00:00:00 2001 From: sonshn Date: Wed, 18 Jun 2025 22:12:36 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20MyBook=EC=97=90=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/repository/BookRepository.java | 3 -- .../mybook/controller/MyBookController.java | 17 ++++++----- .../mybook/repository/MyBookRepository.java | 3 ++ .../domain/mybook/service/MyBookService.java | 7 ++--- .../mybook/service/MyBookServiceImpl.java | 29 ++++++++++--------- 5 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/ikdaman/domain/book/repository/BookRepository.java b/src/main/java/com/ikdaman/domain/book/repository/BookRepository.java index 6562398..1daeff8 100644 --- a/src/main/java/com/ikdaman/domain/book/repository/BookRepository.java +++ b/src/main/java/com/ikdaman/domain/book/repository/BookRepository.java @@ -4,10 +4,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; -import java.util.UUID; public interface BookRepository extends JpaRepository { Optional findByIsbn(String isbn); - - // boolean existsMyBookByMemberIdAndBook(UUID memberId, Book Book); } diff --git a/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java b/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java index f07ca8b..9b3a18b 100644 --- a/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java +++ b/src/main/java/com/ikdaman/domain/mybook/controller/MyBookController.java @@ -25,23 +25,26 @@ public class MyBookController { @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity addMyBook( - @RequestBody MyBookReq dto - // @RequestHeader("nickname") String nickname // 임시 인증 방식 + @RequestBody MyBookReq dto, + @AuthenticationPrincipal AuthMember authMember ) { - MyBookRes myBookRes = myBookService.addMyBook(dto); + MyBookRes myBookRes = myBookService.addMyBook(authMember.getMember().getMemberId(), dto); return ResponseEntity.status(HttpStatus.CREATED).build(); } @PostMapping("/{mybook_id}/impression") public ResponseEntity createImpression(@PathVariable("mybook_id") Integer myBookId, - @RequestBody ImpressionReq dto) { - myBookService.addImpression(myBookId, dto); + @RequestBody ImpressionReq dto, + @AuthenticationPrincipal AuthMember authMember) { + + myBookService.addImpression(authMember.getMember().getMemberId(), myBookId, dto); return ResponseEntity.status(HttpStatus.CREATED).build(); } @DeleteMapping("/{mybook_id}") - public ResponseEntity deleteMyBook(@PathVariable Integer mybook_id) { - myBookService.deleteMyBook(mybook_id); + public ResponseEntity deleteMyBook(@PathVariable Integer mybook_id, + @AuthenticationPrincipal AuthMember authMember) { + myBookService.deleteMyBook(authMember.getMember().getMemberId(), mybook_id); return ResponseEntity.status(HttpStatus.RESET_CONTENT).build(); } diff --git a/src/main/java/com/ikdaman/domain/mybook/repository/MyBookRepository.java b/src/main/java/com/ikdaman/domain/mybook/repository/MyBookRepository.java index 9b9bad5..a54f349 100644 --- a/src/main/java/com/ikdaman/domain/mybook/repository/MyBookRepository.java +++ b/src/main/java/com/ikdaman/domain/mybook/repository/MyBookRepository.java @@ -1,5 +1,6 @@ package com.ikdaman.domain.mybook.repository; +import com.ikdaman.domain.book.entity.Book; import com.ikdaman.domain.mybook.entity.MyBook; import io.lettuce.core.dynamic.annotation.Param; import org.springframework.data.domain.Page; @@ -87,4 +88,6 @@ SELECT COUNT(m) FROM MyBook m ) List findAllActiveReadingBooks(UUID memberId); + boolean existsMyBookByMemberIdAndBook(UUID memberId, Book Book); + } diff --git a/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java b/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java index ad8dbcf..8c7eeeb 100644 --- a/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java +++ b/src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java @@ -10,13 +10,12 @@ * 나의 책 서비스 */ public interface MyBookService { - MyBookRes addMyBook(MyBookReq dto); - // MyBookRes addMyBook(MyBookReq dto, String memberId); + MyBookRes addMyBook(UUID memberId, MyBookReq dto); // 첫인상 - MyBookRes addImpression(Integer myBookId, ImpressionReq dto); + MyBookRes addImpression(UUID memberId, Integer myBookId, ImpressionReq dto); - void deleteMyBook(Integer mybookId); + void deleteMyBook(UUID memberId, Integer mybookId); MyBookSearchRes searchMyBooks(MyBookSearchReq request, AuthMember authMember); diff --git a/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java b/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java index 3e9bf1c..1fbb464 100644 --- a/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java +++ b/src/main/java/com/ikdaman/domain/mybook/service/MyBookServiceImpl.java @@ -49,9 +49,7 @@ public class MyBookServiceImpl implements MyBookService { @Override @Transactional - public MyBookRes addMyBook(MyBookReq dto) { -// UUID memberId = UUID.fromString("d290f1ee-6c54-4b01-90e6-d701748f0851"); - + public MyBookRes addMyBook(UUID memberId, MyBookReq dto) { Writer writer = writerRepository.findByWriterName(dto.getWriter()) .orElseGet(() -> writerRepository.save( Writer.builder() @@ -80,16 +78,13 @@ public MyBookRes addMyBook(MyBookReq dto) { .build()); } -// Member member = memberRepository.findByNickname(nickname) -// .orElseThrow(() -> new RuntimeException("회원이 존재하지 않습니다.")); - -// if(bookRepository.existsMyBookByMemberIdAndBook(memberId, book)) { -// throw new BaseException(MY_BOOK_ALREADY_EXISTS); -// } + // 한 사용자가 책장에 같은 책을 중복으로 저장할 수 없음 + if(myBookRepository.existsMyBookByMemberIdAndBook(memberId, book)) { + throw new BaseException(MY_BOOK_ALREADY_EXISTS); + } MyBook myBook = MyBook.builder() -// .memberId(member.getMemberId()) -// .memberId(memberId) + .memberId(memberId) .book(book) .nowPage(0) .isReading(true) @@ -120,10 +115,14 @@ public MyBookRes addMyBook(MyBookReq dto) { @Override @Transactional - public MyBookRes addImpression(Integer myBookId, ImpressionReq dto) { + public MyBookRes addImpression(UUID memberId, Integer myBookId, ImpressionReq dto) { MyBook myBook = myBookRepository.findById(Long.valueOf(myBookId)) .orElseThrow(() -> new BaseException(NOT_FOUND_MY_BOOK)); + if (!myBook.getMemberId().equals(memberId)) { + throw new BaseException(BOOK_NOT_OWNED_BY_MEMBER); + } + Book book = bookRepository.findById(Long.valueOf(myBook.getBook().getBookId())) .orElseThrow(() -> new BaseException(NOT_FOUND_BOOK)); @@ -301,10 +300,14 @@ public BookLogListRes getMyBookLogs(UUID memberId, Long mybookId, Integer page, @Override @Transactional - public void deleteMyBook(Integer id) { + public void deleteMyBook(UUID memberId, Integer id) { MyBook myBook = myBookRepository.findById(Long.valueOf(id)) .orElseThrow(() -> new BaseException(NOT_FOUND_MY_BOOK)); + if (!myBook.getMemberId().equals(memberId)) { + throw new BaseException(BOOK_NOT_OWNED_BY_MEMBER); + } + myBook.updateToInactive(); myBookRepository.save(myBook); }