Skip to content

Commit

Permalink
Feat: 게시글, 한줄요약 등록 시 해당 책이 등록됐는지 검사 후 자동등록 (#79)
Browse files Browse the repository at this point in the history
* #78 - feat: 게시글, 한줄요약 등록을 book id 가 아닌 isbn13으로 받도록 변경하고 해당 책이 등록됐는지 검사 후 책을 자동등록

* #78 - test: 변경부분의 테스트코드 수정
  • Loading branch information
morenow98 authored Feb 6, 2024
1 parent 55d538d commit cc594c2
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 31 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package cotato.bookitlist.post.dto.requeset;

import cotato.bookitlist.book.controller.IsValidIsbn;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

public record PostRegisterRequest(
@NotNull
Long bookId,
@IsValidIsbn
String isbn13,
@Size(max = 256)
@NotBlank
String title,
Expand Down
14 changes: 9 additions & 5 deletions src/main/java/cotato/bookitlist/post/service/PostService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import cotato.bookitlist.book.domain.entity.Book;
import cotato.bookitlist.book.repository.BookRepository;
import cotato.bookitlist.book.service.BookService;
import cotato.bookitlist.member.domain.Member;
import cotato.bookitlist.member.repository.MemberRepository;
import cotato.bookitlist.post.domain.Post;
Expand All @@ -22,19 +23,22 @@
@RequiredArgsConstructor
public class PostService {

private final BookService bookService;
private final PostRepository postRepository;
private final MemberRepository memberRepository;
private final BookRepository bookRepository;

public Long registerPost(PostRegisterRequest request, Long memberId) {
Member member = memberRepository.getReferenceById(memberId);

Book book = bookRepository.findById(request.bookId())
.orElseThrow(() -> new EntityNotFoundException("책을 찾을 수 없습니다."));
Book book = bookRepository.findByIsbn13(request.isbn13())
.orElseGet(() -> bookRepository.getReferenceById(
bookService.registerBook(request.isbn13())
));

return postRepository.save(
Post.of(member, book, request.title(), request.content())
).getId();
Post post = Post.of(member, book, request.title(), request.content());

return postRepository.save(post).getId();
}

public void updatePost(Long postId, PostUpdateRequest request, Long memberId) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package cotato.bookitlist.review.dto.request;

import cotato.bookitlist.book.controller.IsValidIsbn;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

public record ReviewRegisterRequest(
@NotNull
Long bookId,
@IsValidIsbn
String isbn13,
@Size(max = 50)
@NotBlank
String content
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import cotato.bookitlist.book.domain.entity.Book;
import cotato.bookitlist.book.repository.BookRepository;
import cotato.bookitlist.book.service.BookService;
import cotato.bookitlist.member.domain.Member;
import cotato.bookitlist.member.repository.MemberRepository;
import cotato.bookitlist.review.domain.Review;
Expand All @@ -22,15 +23,18 @@
@RequiredArgsConstructor
public class ReviewService {

private final BookService bookService;
private final MemberRepository memberRepository;
private final BookRepository bookRepository;
private final ReviewRepository reviewRepository;

public Long registerReview(ReviewRegisterRequest request, Long memberId) {
Member member = memberRepository.getReferenceById(memberId);

Book book = bookRepository.findById(request.bookId())
.orElseThrow(() -> new EntityNotFoundException("존재하지 않는 책입니다."));
Book book = bookRepository.findByIsbn13(request.isbn13())
.orElseGet(() -> bookRepository.getReferenceById(
bookService.registerBook(request.isbn13())
));

Review review = Review.of(member, book, request.content());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,26 @@ class PostControllerTest {

@Test
@WithCustomMockUser
@DisplayName("게시글을 생성한다")
@DisplayName("DB에 등록된 책에 게시글을 생성한다")
void givenPostRegisterRequest_whenRegisteringPost_thenRegisterPost() throws Exception {
//given
PostRegisterRequest request = new PostRegisterRequest(1L, "title", "content");
PostRegisterRequest request = new PostRegisterRequest("9788931514810", "title", "content");

//when & then
mockMvc.perform(post("/posts")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsBytes(request)))
.andExpect(status().isCreated())
.andExpect(header().exists("Location"))
;
}

@Test
@WithCustomMockUser
@DisplayName("DB에 존재하지 않는 책으로 게시글을 생성요청하면 API 통신을 통해 책을 등록하고 게시글을 등록한다.")
void givenNonExistedInDataBaseIsbn13_whenRegisteringPost_thenRegisterBookAndPost() throws Exception {
//given
PostRegisterRequest request = new PostRegisterRequest("9791193235119", "title", "content");

//when & then
mockMvc.perform(post("/posts")
Expand All @@ -55,15 +71,15 @@ void givenPostRegisterRequest_whenRegisteringPost_thenRegisterPost() throws Exce
@Test
@WithCustomMockUser
@DisplayName("존재하지 않은 책으로 게시글을 생성요청하면 에러를 반환한다.")
void givenNonExistedBookId_whenRegisteringPost_thenReturnErrorResponse() throws Exception {
void givenNonExistedIsbn13_whenRegisteringPost_thenReturnErrorResponse() throws Exception {
//given
PostRegisterRequest request = new PostRegisterRequest(100L, "title", "content");
PostRegisterRequest request = new PostRegisterRequest("9782345678908", "title", "content");

//when & then
mockMvc.perform(post("/posts")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsBytes(request)))
.andExpect(status().isNotFound())
.andExpect(status().isBadRequest())
;
}

Expand All @@ -87,11 +103,11 @@ private static List<PostRegisterRequest> provideInvalidPostRequest() {
String tooLongTitle = "TooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooLongTitle";

return List.of(
new PostRegisterRequest(1L, "", "content"),
new PostRegisterRequest(1L, "title", ""),
new PostRegisterRequest(1L, "", ""),
new PostRegisterRequest(1L, tooLongTitle, ""),
new PostRegisterRequest(1L, tooLongTitle, "content")
new PostRegisterRequest("9788931514810", "", "content"),
new PostRegisterRequest("9788931514810", "title", ""),
new PostRegisterRequest("9788931514810", "", ""),
new PostRegisterRequest("9788931514810", tooLongTitle, ""),
new PostRegisterRequest("9788931514810", tooLongTitle, "content")
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ class ReviewControllerTest {

@Test
@WithCustomMockUser
@DisplayName("한줄요약을 생성한다")
@DisplayName("DB에 등록된 책에 한줄요약을 생성한다")
void givenReviewRegisterRequest_whenRegisteringReview_thenRegisterRegister() throws Exception {
//given
ReviewRegisterRequest request = new ReviewRegisterRequest(1L, "content");
ReviewRegisterRequest request = new ReviewRegisterRequest("9788931514810", "content");

//when & then
mockMvc.perform(post("/reviews")
Expand All @@ -54,16 +54,32 @@ void givenReviewRegisterRequest_whenRegisteringReview_thenRegisterRegister() thr

@Test
@WithCustomMockUser
@DisplayName("존재하지 않은 책으로 게시글을 생성요청하면 에러를 반환한다.")
void givenNonExistedBookId_whenRegisteringReview_thenReturnErrorResponse() throws Exception {
@DisplayName("DB에 존재하지 않는 책으로 한줄요약을 생성요청하면 API 통신을 통해 책을 등록하고 한줄요약을 등록한다.")
void givenNonExistedInDataBaseIsbn13_whenRegisteringReview_thenRegisterBookAndReview() throws Exception {
//given
ReviewRegisterRequest request = new ReviewRegisterRequest(100L, "content");
ReviewRegisterRequest request = new ReviewRegisterRequest("9791193235119", "content");

//when & then
mockMvc.perform(post("/reviews")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsBytes(request)))
.andExpect(status().isNotFound())
.andExpect(status().isCreated())
.andExpect(header().exists("Location"))
;
}

@Test
@WithCustomMockUser
@DisplayName("존재하지 않은 책으로 한줄요약을 생성요청하면 에러를 반환한다.")
void givenNonExistedIsbn13_whenRegisteringReview_thenReturnErrorResponse() throws Exception {
//given
ReviewRegisterRequest request = new ReviewRegisterRequest("9782345678908", "content");

//when & then
mockMvc.perform(post("/reviews")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsBytes(request)))
.andExpect(status().isBadRequest())
;
}

Expand All @@ -87,8 +103,8 @@ private static List<ReviewRegisterRequest> provideInvalidReviewRequest() {
String tooLongContent = "TooooooooooooooooooooooooooooooooooooooooooooooLong"; // 51글자

return List.of(
new ReviewRegisterRequest(1L, ""),
new ReviewRegisterRequest(1L, tooLongContent)
new ReviewRegisterRequest("9788931514810", ""),
new ReviewRegisterRequest("9788931514810", tooLongContent)
);
}

Expand Down

0 comments on commit cc594c2

Please sign in to comment.