Skip to content
6 changes: 5 additions & 1 deletion src/main/java/com/ikdaman/domain/book/entity/Book.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,18 +41,22 @@ 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> author;

@Builder
public Book(int bookId, String title, String publisher, String isbn, int page, String coverImage, int categoryId, List<Author> author) {
public Book(int bookId, String title, String publisher, String isbn, int page, String coverImage, int categoryId, String aladinItemId, List<Author> author) {
this.bookId = bookId;
this.title = title;
this.publisher = publisher;
this.isbn = isbn;
this.page = page;
this.coverImage = coverImage;
this.categoryId = categoryId;
this.aladinItemId = aladinItemId;
this.author = author;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,7 @@
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;
import java.util.UUID;

public interface BookRepository extends JpaRepository<Book, Long> {
Optional<Book> findByIsbn(String isbn);

// boolean existsMyBookByMemberIdAndBook(UUID memberId, Book Book);
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,6 @@ public class MemberController {

private final MemberService memberService;

// 회원 생성 테스트
@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Member> createMember(@RequestBody MemberReq dto) {
Member member = memberService.createMember(dto);
System.out.println("aaaaaaaaa");
return ResponseEntity.ok(member);
}

// 회원 조회 테스트
@GetMapping("/{memberId}")
public ResponseEntity<Member> getMember(@PathVariable UUID memberId) {
Optional<Member> member = memberService.findMemberById(memberId);
return member.map(ResponseEntity::ok)
.orElseGet(() -> ResponseEntity.notFound().build());
}

// 닉네임 중복 확인
// TODO: 닉네임 형식에 대한 Validation (2025.05.01 기준 미정)
@GetMapping("/check")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,17 @@
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 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;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

@RestController
Expand All @@ -18,23 +25,26 @@ public class MyBookController {

@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<MyBookRes> 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<Void> 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<Void> deleteMyBook(@PathVariable Integer mybook_id) {
myBookService.deleteMyBook(mybook_id);
public ResponseEntity<Void> deleteMyBook(@PathVariable Integer mybook_id,
@AuthenticationPrincipal AuthMember authMember) {
myBookService.deleteMyBook(authMember.getMember().getMemberId(), mybook_id);
return ResponseEntity.status(HttpStatus.RESET_CONTENT).build();
}

Expand All @@ -43,36 +53,41 @@ 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);
}

// 나의 책 정보 조회
@GetMapping("/{mybookId}")
public ResponseEntity<MyBookDetailRes> getMyBookDetail(@PathVariable Long mybookId) {
MyBookDetailRes res = myBookService.getMyBookDetail(mybookId);
public ResponseEntity<MyBookDetailRes> getMyBookDetail(@AuthenticationPrincipal AuthMember authMember,
@PathVariable Long mybookId) {
MyBookDetailRes res = myBookService.getMyBookDetail(authMember.getMember().getMemberId(), mybookId);
return ResponseEntity.ok(res);
}

// 나의 책 기록 조회
@GetMapping("/{mybookId}/booklog")
public ResponseEntity<BookLogListRes> 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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -12,36 +13,12 @@

public interface MyBookRepository extends JpaRepository<MyBook, Long> {

@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<MyBook> 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
Expand All @@ -59,6 +36,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
Expand All @@ -71,7 +49,8 @@ SELECT COUNT(m) FROM MyBook m
)
"""
)
Page<MyBook> searchMyBooksWithoutMemberId(
Page<MyBook> searchMyBooks(
@Param("memberId") UUID memberId,
@Param("status") String status,
@Param("keyword") String keyword,
Pageable pageable
Expand All @@ -93,18 +72,22 @@ Page<MyBook> 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 = """
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<MyBook> findAllActiveReadingBooks();
List<MyBook> findAllActiveReadingBooks(UUID memberId);

boolean existsMyBookByMemberIdAndBook(UUID memberId, Book Book);

}
18 changes: 10 additions & 8 deletions src/main/java/com/ikdaman/domain/mybook/service/MyBookService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,26 @@

import com.ikdaman.domain.bookLog.model.BookLogListRes;
import com.ikdaman.domain.mybook.model.*;
import com.ikdaman.global.auth.model.AuthMember;

import java.util.UUID;

/**
* 나의 책 서비스
*/
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);
MyBookSearchRes searchMyBooks(MyBookSearchReq request, AuthMember authMember);

InProgressBooksRes searchInProgressBooks();
InProgressBooksRes searchInProgressBooks(AuthMember authMember);

MyBookDetailRes getMyBookDetail(Long mybookId);
MyBookDetailRes getMyBookDetail(UUID memberId, Long mybookId);

BookLogListRes getMyBookLogs(Long mybookId, Integer page, Integer limit);
BookLogListRes getMyBookLogs(UUID memberId, Long mybookId, Integer page, Integer limit);
}
Loading