From da46be3807e8070e059ddcba9a7804c704d19312 Mon Sep 17 00:00:00 2001 From: jihyun Date: Mon, 16 Jun 2025 17:08:05 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[=20front=20/=20feat=20]=201=20:=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=EA=B0=80=20=EB=B3=B4=EC=9C=A0=ED=95=9C=20?= =?UTF-8?q?=EB=AA=A8=EB=93=A0=20=EC=B1=85=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/controller/BookController.java | 26 +++++++++++++++++++ .../book/repository/BookRepository.java | 4 +++ .../domain/book/service/BookService.java | 9 +++++++ .../domain/book/service/BookServiceTest.java | 5 +++- 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/example/booktree/domain/book/controller/BookController.java b/backend/src/main/java/com/example/booktree/domain/book/controller/BookController.java index 6951808..9a7361f 100644 --- a/backend/src/main/java/com/example/booktree/domain/book/controller/BookController.java +++ b/backend/src/main/java/com/example/booktree/domain/book/controller/BookController.java @@ -3,13 +3,19 @@ import com.example.booktree.domain.book.dto.request.BookRequestDto; import com.example.booktree.domain.book.dto.response.BookResponseDto; +import com.example.booktree.domain.book.entity.Book; import com.example.booktree.domain.book.service.BookService; import com.example.booktree.global.utils.dto.ApiResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -18,6 +24,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @@ -53,6 +60,25 @@ public ResponseEntity getBookById(@Valid @PathVariable Long bookId) { return ResponseEntity.ok(apiResponse); } + @GetMapping + @Operation( + summary = "사용자가 보유한 모든 책 조회 ", + description = "유저가 보유한 모든 책을 조회 합니다. " + ) + @PreAuthorize("hasAnyRole('USER','ADMIN')") + public ResponseEntity getBookListById( @RequestParam(defaultValue = "1") int page, + @RequestParam(defaultValue = "10") int size) { + // ✅ 생성일 기준 내림차순 정렬 + Pageable pageable = PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "createdAt")); + Page bookList = bookService.getBookList(pageable); + Page bookResponseDto = bookList.map(BookResponseDto::new); + ApiResponse apiResponse = ApiResponse.of(HttpStatus.OK.value(),"모든 책 조회 성공",bookResponseDto); + return ResponseEntity.ok(apiResponse); + } + + + + diff --git a/backend/src/main/java/com/example/booktree/domain/book/repository/BookRepository.java b/backend/src/main/java/com/example/booktree/domain/book/repository/BookRepository.java index 1a0fee6..e722c3a 100644 --- a/backend/src/main/java/com/example/booktree/domain/book/repository/BookRepository.java +++ b/backend/src/main/java/com/example/booktree/domain/book/repository/BookRepository.java @@ -1,11 +1,15 @@ package com.example.booktree.domain.book.repository; import com.example.booktree.domain.book.entity.Book; +import com.example.booktree.domain.user.entity.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface BookRepository extends JpaRepository { + Page findAllByUser(User user, Pageable pageable); } diff --git a/backend/src/main/java/com/example/booktree/domain/book/service/BookService.java b/backend/src/main/java/com/example/booktree/domain/book/service/BookService.java index c222dd2..97c5c5b 100644 --- a/backend/src/main/java/com/example/booktree/domain/book/service/BookService.java +++ b/backend/src/main/java/com/example/booktree/domain/book/service/BookService.java @@ -14,8 +14,11 @@ import com.example.booktree.global.exception.ExceptionCode; import com.example.booktree.global.image.service.ImageService; import com.example.booktree.global.security.jwt.service.TokenService; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -57,6 +60,12 @@ public Book getBookById(Long bookId){ } + public Page getBookList(Pageable pageable){ + User user = userService.findById(tokenService.getIdFromToken()); + return bookRepository.findAllByUser(user,pageable); + } + + } diff --git a/backend/src/test/java/com/example/booktree/domain/book/service/BookServiceTest.java b/backend/src/test/java/com/example/booktree/domain/book/service/BookServiceTest.java index b4f341d..684e2b7 100644 --- a/backend/src/test/java/com/example/booktree/domain/book/service/BookServiceTest.java +++ b/backend/src/test/java/com/example/booktree/domain/book/service/BookServiceTest.java @@ -69,7 +69,7 @@ void createBook_shouldCreateBookSuccessfully(){ dto.setAuthor("테스트 저자"); dto.setTransactionType(TransactionType.SELL); - // 이미지 파일은 MultipartFile이라서 보통 MockMultipartFile로 만듦 (필요한 경우) + // 이미지 파일은 MultipartFile이라서 보통 MockMultipartFile로 만듦 MockMultipartFile mockImage = new MockMultipartFile( "image", "test-image.jpg", @@ -139,4 +139,7 @@ void getBookById_shouldThrowException_whenBookNotFound() { } + + + } From 39a635bd85f0df8546f288015531521cdb78dfd4 Mon Sep 17 00:00:00 2001 From: jihyun Date: Mon, 16 Jun 2025 17:15:30 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[=20back=20/=20teat=20]=20:=20=EC=B1=85=20?= =?UTF-8?q?=EB=8B=A8=EA=B6=8C=20=EC=A1=B0=ED=9A=8C=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../booktree/domain/book/service/BookServiceTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backend/src/test/java/com/example/booktree/domain/book/service/BookServiceTest.java b/backend/src/test/java/com/example/booktree/domain/book/service/BookServiceTest.java index 684e2b7..27f1afe 100644 --- a/backend/src/test/java/com/example/booktree/domain/book/service/BookServiceTest.java +++ b/backend/src/test/java/com/example/booktree/domain/book/service/BookServiceTest.java @@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -22,6 +23,7 @@ import com.example.booktree.global.exception.ExceptionCode; import com.example.booktree.global.image.service.ImageService; import com.example.booktree.global.security.jwt.service.TokenService; +import java.util.List; import java.util.Optional; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -30,6 +32,11 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.context.ActiveProfiles; import org.springframework.transaction.annotation.Transactional; From 96e2aad8c4d67cc63c1f34a5fec8db28524ec138 Mon Sep 17 00:00:00 2001 From: jihyun Date: Wed, 18 Jun 2025 16:39:10 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[=20back=20/=20feat]=20=201=20:=20=EC=B1=85?= =?UTF-8?q?=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?Dto=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/controller/BookController.java | 5 +++ .../dto/request/BookUpdateRequestDto.java | 32 +++++++++++++++++++ .../domain/book/service/BookService.java | 3 ++ .../global/exception/ExceptionCode.java | 7 ++-- .../domain/book/service/BookServiceTest.java | 4 --- 5 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 backend/src/main/java/com/example/booktree/domain/book/dto/request/BookUpdateRequestDto.java diff --git a/backend/src/main/java/com/example/booktree/domain/book/controller/BookController.java b/backend/src/main/java/com/example/booktree/domain/book/controller/BookController.java index 9a7361f..c008da2 100644 --- a/backend/src/main/java/com/example/booktree/domain/book/controller/BookController.java +++ b/backend/src/main/java/com/example/booktree/domain/book/controller/BookController.java @@ -2,6 +2,7 @@ import com.example.booktree.domain.book.dto.request.BookRequestDto; +import com.example.booktree.domain.book.dto.request.BookUpdateRequestDto; import com.example.booktree.domain.book.dto.response.BookResponseDto; import com.example.booktree.domain.book.entity.Book; import com.example.booktree.domain.book.service.BookService; @@ -20,6 +21,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -84,4 +86,7 @@ public ResponseEntity getBookListById( @RequestParam(defaultValue = "1") + + + } diff --git a/backend/src/main/java/com/example/booktree/domain/book/dto/request/BookUpdateRequestDto.java b/backend/src/main/java/com/example/booktree/domain/book/dto/request/BookUpdateRequestDto.java new file mode 100644 index 0000000..143b47e --- /dev/null +++ b/backend/src/main/java/com/example/booktree/domain/book/dto/request/BookUpdateRequestDto.java @@ -0,0 +1,32 @@ +package com.example.booktree.domain.book.dto.request; + +import com.example.booktree.enums.TransactionStatus; +import com.example.booktree.enums.TransactionType; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; +import org.springframework.web.multipart.MultipartFile; + +@Getter +@Setter +public class BookUpdateRequestDto { + + @NotNull + private Long mainCategoryId; + + @NotBlank + @NotNull + private String name; + + @NotNull + private String author; + + @NotNull + private TransactionType transactionType; + + private MultipartFile image; + + private TransactionStatus transactionStatus; + +} diff --git a/backend/src/main/java/com/example/booktree/domain/book/service/BookService.java b/backend/src/main/java/com/example/booktree/domain/book/service/BookService.java index 97c5c5b..d133655 100644 --- a/backend/src/main/java/com/example/booktree/domain/book/service/BookService.java +++ b/backend/src/main/java/com/example/booktree/domain/book/service/BookService.java @@ -2,6 +2,7 @@ import com.example.booktree.domain.book.dto.request.BookRequestDto; +import com.example.booktree.domain.book.dto.request.BookUpdateRequestDto; import com.example.booktree.domain.book.entity.Book; import com.example.booktree.domain.book.repository.BookRepository; import com.example.booktree.domain.maincategory.entity.MainCategory; @@ -15,6 +16,7 @@ import com.example.booktree.global.image.service.ImageService; import com.example.booktree.global.security.jwt.service.TokenService; import java.util.List; +import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -68,4 +70,5 @@ public Page getBookList(Pageable pageable){ + } diff --git a/backend/src/main/java/com/example/booktree/global/exception/ExceptionCode.java b/backend/src/main/java/com/example/booktree/global/exception/ExceptionCode.java index 936beb5..c9af19c 100644 --- a/backend/src/main/java/com/example/booktree/global/exception/ExceptionCode.java +++ b/backend/src/main/java/com/example/booktree/global/exception/ExceptionCode.java @@ -33,9 +33,12 @@ public enum ExceptionCode { BLOG_NOT_OWNER(403, "해당 블로그의 소유자가 아닙니다."), MAIN_CATEGORY_NOT_FOUND(404, "메인 카테고리가 존재하지 않습니다."), EMAIL_TYPE_NOT_FOUND(404, "이메일 타입이 존재하지 않습니다"), - INVALID_CONTENT_PARTS(404, "게시글의 내용 이미지와 글의 조합이 유효하지 않습니다."); + INVALID_CONTENT_PARTS(404, "게시글의 내용 이미지와 글의 조합이 유효하지 않습니다."), + + + //책 + BOOK_NOT_FOUNT(404, "존재하지 않는 책입니다. "); - // BOARD_NOT_FOUND(404, "Board not found"), // USER_NOT_FOUND(404, "User not found"), diff --git a/backend/src/test/java/com/example/booktree/domain/book/service/BookServiceTest.java b/backend/src/test/java/com/example/booktree/domain/book/service/BookServiceTest.java index 27f1afe..354e9ed 100644 --- a/backend/src/test/java/com/example/booktree/domain/book/service/BookServiceTest.java +++ b/backend/src/test/java/com/example/booktree/domain/book/service/BookServiceTest.java @@ -145,8 +145,4 @@ void getBookById_shouldThrowException_whenBookNotFound() { assertEquals(ExceptionCode.BOOK_NOT_FOUND, exception.getExceptionCode()); } - - - - }