From ecd0aff611f62c266acc44216f4bf0183f586646 Mon Sep 17 00:00:00 2001 From: ahnyunki Date: Thu, 4 Apr 2024 21:06:45 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20TalkRoom=20Service-Repository?= =?UTF-8?q?=20=EA=B3=84=EC=B8=B5=20=EB=B6=84=EB=A6=AC=20(#61)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/jisungin/api/SearchRequest.java | 15 +++++----- .../application/SearchServiceRequest.java | 10 +++---- .../talkroom/repository}/OrderType.java | 6 +++- .../repository/TalkRoomRepositoryCustom.java | 3 +- .../repository/TalkRoomRepositoryImpl.java | 28 +++++++++---------- 5 files changed, 31 insertions(+), 31 deletions(-) rename src/main/java/com/jisungin/{application => domain/talkroom/repository}/OrderType.java (78%) diff --git a/src/main/java/com/jisungin/api/SearchRequest.java b/src/main/java/com/jisungin/api/SearchRequest.java index 90ad0ae..1f1fe6e 100644 --- a/src/main/java/com/jisungin/api/SearchRequest.java +++ b/src/main/java/com/jisungin/api/SearchRequest.java @@ -1,6 +1,5 @@ package com.jisungin.api; -import com.jisungin.application.OrderType; import com.jisungin.application.SearchServiceRequest; import lombok.Builder; import lombok.Getter; @@ -18,22 +17,22 @@ public class SearchRequest { private String order; - private String search; + private String query; @Builder - private SearchRequest(Integer page, Integer size, String order, String search) { + private SearchRequest(Integer page, Integer size, String order, String query) { this.page = page != null ? page : 1; - this.size = size != null ? size : 1; - this.order = order != null ? order : "recent"; - this.search = search; + this.size = size != null ? size : 10; + this.order = order; + this.query = query; } public SearchServiceRequest toService() { return SearchServiceRequest.builder() .page(page) .size(size) - .search(search) - .orderType(OrderType.convertToOrderType(order)) + .order(order != null ? order : "re") + .query(query) .build(); } diff --git a/src/main/java/com/jisungin/application/SearchServiceRequest.java b/src/main/java/com/jisungin/application/SearchServiceRequest.java index f2d5cce..19c5004 100644 --- a/src/main/java/com/jisungin/application/SearchServiceRequest.java +++ b/src/main/java/com/jisungin/application/SearchServiceRequest.java @@ -17,16 +17,16 @@ public class SearchServiceRequest { private Integer size; - private OrderType orderType; + private String order; - private String search; + private String query; @Builder - private SearchServiceRequest(Integer page, Integer size, OrderType orderType, String search) { + private SearchServiceRequest(Integer page, Integer size, String order, String query) { this.page = page; this.size = size; - this.orderType = orderType; - this.search = search; + this.order = order; + this.query = query; } public long getOffset() { diff --git a/src/main/java/com/jisungin/application/OrderType.java b/src/main/java/com/jisungin/domain/talkroom/repository/OrderType.java similarity index 78% rename from src/main/java/com/jisungin/application/OrderType.java rename to src/main/java/com/jisungin/domain/talkroom/repository/OrderType.java index 013dca5..1351e41 100644 --- a/src/main/java/com/jisungin/application/OrderType.java +++ b/src/main/java/com/jisungin/domain/talkroom/repository/OrderType.java @@ -1,4 +1,4 @@ -package com.jisungin.application; +package com.jisungin.domain.talkroom.repository; import lombok.RequiredArgsConstructor; @@ -11,6 +11,10 @@ public enum OrderType { private final String text; public static OrderType convertToOrderType(String order) { + if (order == null) { + return null; + } + return switch (order) { case "recent" -> RECENT; case "recommend" -> RECOMMEND; diff --git a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryCustom.java b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryCustom.java index c93fd8c..9d4d2a5 100644 --- a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryCustom.java +++ b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryCustom.java @@ -1,13 +1,12 @@ package com.jisungin.domain.talkroom.repository; import com.jisungin.application.PageResponse; -import com.jisungin.application.SearchServiceRequest; import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse; import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse; public interface TalkRoomRepositoryCustom { - PageResponse findAllTalkRoom(SearchServiceRequest search); + PageResponse findAllTalkRoom(long offset, int size, String order, String query); TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId); } diff --git a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java index 17f64fc..4216b6b 100644 --- a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java +++ b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java @@ -1,18 +1,16 @@ package com.jisungin.domain.talkroom.repository; -import static com.jisungin.application.OrderType.RECENT; -import static com.jisungin.application.OrderType.RECOMMEND; import static com.jisungin.domain.book.QBook.book; import static com.jisungin.domain.comment.QComment.comment; import static com.jisungin.domain.commentlike.QCommentLike.commentLike; import static com.jisungin.domain.talkroom.QTalkRoom.talkRoom; import static com.jisungin.domain.talkroom.QTalkRoomRole.talkRoomRole; +import static com.jisungin.domain.talkroom.repository.OrderType.RECENT; +import static com.jisungin.domain.talkroom.repository.OrderType.RECOMMEND; import static com.jisungin.domain.talkroomlike.QTalkRoomLike.talkRoomLike; import static com.jisungin.domain.user.QUser.user; -import com.jisungin.application.OrderType; import com.jisungin.application.PageResponse; -import com.jisungin.application.SearchServiceRequest; import com.jisungin.application.comment.response.CommentLikeUserIdResponse; import com.jisungin.application.comment.response.CommentQueryResponse; import com.jisungin.application.comment.response.QCommentLikeUserIdResponse; @@ -40,10 +38,10 @@ public class TalkRoomRepositoryImpl implements TalkRoomRepositoryCustom { // 토크룸 페이징 조회 @Override - public PageResponse findAllTalkRoom(SearchServiceRequest search) { + public PageResponse findAllTalkRoom(long offset, int size, String order, String query) { //루트 조회(toOne 코드를 모두 한번에 조회) -> Query 1번 발생 - List findTalkRoom = findTalkRoomBySearch(search); + List findTalkRoom = findTalkRoomBySearch(offset, size, order, query); //TalkRoomRole 컬렉션을 MAP 한방에 조회 -> Query 1번 발생 Map> talkRoomRoleMap = findTalkRoomRoleMap( @@ -63,7 +61,7 @@ public PageResponse findAllTalkRoom(SearchServiceReques return PageResponse.builder() .queryResponse(findTalkRoom) .totalCount(totalCount) - .size(search.getSize()) + .size(size) .build(); } @@ -113,8 +111,8 @@ private List findAllUserTalkRooms(Long userId) { talkRoomLike.count().as("likeCount") )) .from(talkRoom) - .leftJoin(talkRoom.user, user).on(user.eq(talkRoom.user)) - .leftJoin(talkRoom.book, book).on(book.eq(talkRoom.book)) + .join(talkRoom.user, user) + .join(talkRoom.book, book) .leftJoin(talkRoomLike).on(talkRoom.eq(talkRoomLike.talkRoom)) .groupBy(talkRoom.id) .where(talkRoom.user.id.eq(userId)) @@ -122,7 +120,7 @@ private List findAllUserTalkRooms(Long userId) { } // 토크룸 페이징 조회 쿼리 - private List findTalkRoomBySearch(SearchServiceRequest search) { + private List findTalkRoomBySearch(long offset, int size, String order, String query) { return queryFactory.select(new QTalkRoomFindAllResponse( talkRoom.id.as("talkRoomId"), user.name.as("userName"), @@ -137,10 +135,10 @@ private List findTalkRoomBySearch(SearchServiceRequest .join(talkRoom.book, book) .leftJoin(talkRoomLike).on(talkRoom.eq(talkRoomLike.talkRoom)) .groupBy(talkRoom.id) - .where(searchQuery(search.getSearch())) - .offset(search.getOffset()) - .limit(search.getSize()) - .orderBy(condition(search.getOrderType())) + .where(searchQuery(query)) + .offset(offset) + .limit(size) + .orderBy(condition(OrderType.convertToOrderType(order))) .fetch(); } @@ -278,7 +276,7 @@ private TalkRoomFindOneResponse findTalkRoomByTalkRoomId(Long talkRoomId) { private OrderSpecifier condition(OrderType orderType) { if (RECENT.equals(orderType)) { - return talkRoom.id.desc(); + return talkRoom.createDateTime.desc(); } else if (RECOMMEND.equals(orderType)) { return talkRoomLike.count().desc(); } From 4a4239c6ea58fd1508dcdcc4747ac87591b6852d Mon Sep 17 00:00:00 2001 From: ahnyunki Date: Thu, 4 Apr 2024 21:07:28 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20TalkRoom=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=A0=80=EC=9E=A5=20URL=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1=20(#61)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/TalkRoomCreateRequest.java | 7 +- .../talkroom/request/TalkRoomEditRequest.java | 11 +- .../application/talkroom/TalkRoomService.java | 44 +++++++- .../request/TalkRoomCreateServiceRequest.java | 6 +- .../request/TalkRoomEditServiceRequest.java | 10 +- .../talkroom/response/TalkRoomResponse.java | 5 + .../domain/talkroomimage/TalkRoomImage.java | 47 ++++++++ .../repository/TalkRoomImageRepository.java | 20 ++++ .../api/talkroom/TalkRoomControllerTest.java | 14 +++ .../comment/CommentServiceTest.java | 5 + .../talkroom/TalkRoomServiceTest.java | 103 +++++++++++++++--- .../talkroom/TalkRoomControllerDocsTest.java | 66 +++++++---- .../repository/TalkRoomRepositoryTest.java | 21 ++-- 13 files changed, 307 insertions(+), 52 deletions(-) create mode 100644 src/main/java/com/jisungin/domain/talkroomimage/TalkRoomImage.java create mode 100644 src/main/java/com/jisungin/domain/talkroomimage/repository/TalkRoomImageRepository.java rename src/test/java/com/jisungin/application/{service => }/talkroom/TalkRoomServiceTest.java (92%) diff --git a/src/main/java/com/jisungin/api/talkroom/request/TalkRoomCreateRequest.java b/src/main/java/com/jisungin/api/talkroom/request/TalkRoomCreateRequest.java index 0ea8805..b40158d 100644 --- a/src/main/java/com/jisungin/api/talkroom/request/TalkRoomCreateRequest.java +++ b/src/main/java/com/jisungin/api/talkroom/request/TalkRoomCreateRequest.java @@ -29,12 +29,16 @@ public class TalkRoomCreateRequest { @NotEmpty(message = "참가 조건은 1개 이상 체크해야합니다.") private List readingStatus = new ArrayList<>(); + private List imageUrls = new ArrayList<>(); + @Builder - private TalkRoomCreateRequest(String bookIsbn, String title, String content, List readingStatus) { + private TalkRoomCreateRequest(String bookIsbn, String title, String content, List readingStatus, + List imageUrls) { this.bookIsbn = bookIsbn; this.title = title; this.content = content; this.readingStatus = readingStatus; + this.imageUrls = imageUrls; } public TalkRoomCreateServiceRequest toServiceRequest() { @@ -43,6 +47,7 @@ public TalkRoomCreateServiceRequest toServiceRequest() { .title(title) .content(content) .readingStatus(readingStatus) + .imageUrls(imageUrls) .build(); } diff --git a/src/main/java/com/jisungin/api/talkroom/request/TalkRoomEditRequest.java b/src/main/java/com/jisungin/api/talkroom/request/TalkRoomEditRequest.java index 0876334..688eaff 100644 --- a/src/main/java/com/jisungin/api/talkroom/request/TalkRoomEditRequest.java +++ b/src/main/java/com/jisungin/api/talkroom/request/TalkRoomEditRequest.java @@ -24,12 +24,19 @@ public class TalkRoomEditRequest { @NotEmpty(message = "참가 조건은 1개 이상 체크해야합니다.") private List readingStatus = new ArrayList<>(); + private List newImage = new ArrayList<>(); + + private List removeImage = new ArrayList<>(); + @Builder - private TalkRoomEditRequest(Long id, String title, String content, List readingStatus) { + private TalkRoomEditRequest(Long id, String title, String content, List readingStatus, + List newImage, List removeImage) { this.id = id; this.title = title; this.content = content; this.readingStatus = readingStatus; + this.newImage = newImage; + this.removeImage = removeImage; } public TalkRoomEditServiceRequest toServiceRequest() { @@ -38,6 +45,8 @@ public TalkRoomEditServiceRequest toServiceRequest() { .title(title) .content(content) .readingStatus(readingStatus) + .newImage(newImage) + .removeImage(removeImage) .build(); } diff --git a/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java b/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java index 518576a..5854ecd 100644 --- a/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java +++ b/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java @@ -16,6 +16,8 @@ import com.jisungin.domain.talkroom.TalkRoomRole; import com.jisungin.domain.talkroom.repository.TalkRoomRepository; import com.jisungin.domain.talkroom.repository.TalkRoomRoleRepository; +import com.jisungin.domain.talkroomimage.TalkRoomImage; +import com.jisungin.domain.talkroomimage.repository.TalkRoomImageRepository; import com.jisungin.domain.user.User; import com.jisungin.domain.user.repository.UserRepository; import com.jisungin.exception.BusinessException; @@ -35,6 +37,7 @@ public class TalkRoomService { private final BookRepository bookRepository; private final UserRepository userRepository; private final CommentRepository commentRepository; + private final TalkRoomImageRepository talkRoomImageRepository; @Transactional public TalkRoomResponse createTalkRoom(TalkRoomCreateServiceRequest request, AuthContext authContext) { @@ -52,12 +55,27 @@ public TalkRoomResponse createTalkRoom(TalkRoomCreateServiceRequest request, Aut readingStatus.stream().map(status -> TalkRoomRole.roleCreate(talkRoom, status)) .forEach(talkRoomRoleRepository::save); - return TalkRoomResponse.of(user.getName(), talkRoom.getTitle(), talkRoom.getContent(), readingStatus, + TalkRoomResponse response = TalkRoomResponse.of(user.getName(), talkRoom.getTitle(), + talkRoom.getContent(), readingStatus, book.getImageUrl(), book.getTitle()); + + if (request.getImageUrls() != null && !request.getImageUrls().isEmpty()) { + request.getImageUrls().stream() + .map(url -> TalkRoomImage.createImages(talkRoom, url)) + .forEach(talkRoomImageRepository::save); + + List imageUrls = talkRoomImageRepository.findByTalkRoomIdWithImageUrl( + talkRoom.getId()); + + response.addTalkRoomImages(imageUrls); + } + + return response; } public PageResponse findAllTalkRoom(SearchServiceRequest search) { - return talkRoomRepository.findAllTalkRoom(search); + return talkRoomRepository.findAllTalkRoom(search.getOffset(), search.getSize(), search.getOrder(), + search.getQuery()); } public TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId) { @@ -87,8 +105,24 @@ public TalkRoomResponse editTalkRoom(TalkRoomEditServiceRequest request, AuthCon readingStatus.stream().map(status -> TalkRoomRole.roleCreate(talkRoom, status)) .forEach(talkRoomRoleRepository::save); - return TalkRoomResponse.of(user.getName(), talkRoom.getTitle(), talkRoom.getContent(), readingStatus, + if (request.getNewImage() != null && !request.getNewImage().isEmpty()) { + request.getNewImage().stream().map(url -> TalkRoomImage.createImages(talkRoom, url)) + .forEach(talkRoomImageRepository::save); + } + + if (request.getRemoveImage() != null && !request.getRemoveImage().isEmpty()) { + request.getRemoveImage().stream().map(s -> talkRoomImageRepository.findByTalkRoomAndImageUrl(talkRoom, s)) + .forEach(talkRoomImageRepository::deleteAll); + } + + TalkRoomResponse response = TalkRoomResponse.of(user.getName(), talkRoom.getTitle(), + talkRoom.getContent(), readingStatus, talkRoom.getBook().getImageUrl(), talkRoom.getBook().getTitle()); + + List images = talkRoomImageRepository.findByTalkRoomIdWithImageUrl(talkRoom.getId()); + response.addTalkRoomImages(images); + + return response; } @Transactional @@ -105,6 +139,10 @@ public void deleteTalkRoom(Long talkRoomId, AuthContext authContext) { commentRepository.findByTalkRoom(talkRoom).ifPresent(commentRepository::delete); + List images = talkRoomImageRepository.findByTalkRoom(talkRoom); + if (images != null) { + talkRoomImageRepository.deleteAll(images); + } talkRoomRoleRepository.deleteAllByTalkRoom(talkRoom); talkRoomRepository.delete(talkRoom); } diff --git a/src/main/java/com/jisungin/application/talkroom/request/TalkRoomCreateServiceRequest.java b/src/main/java/com/jisungin/application/talkroom/request/TalkRoomCreateServiceRequest.java index 0e9fa13..951ff02 100644 --- a/src/main/java/com/jisungin/application/talkroom/request/TalkRoomCreateServiceRequest.java +++ b/src/main/java/com/jisungin/application/talkroom/request/TalkRoomCreateServiceRequest.java @@ -17,12 +17,16 @@ public class TalkRoomCreateServiceRequest { private List readingStatus; + private List imageUrls; + @Builder - private TalkRoomCreateServiceRequest(String bookIsbn, String title, String content, List readingStatus) { + private TalkRoomCreateServiceRequest(String bookIsbn, String title, String content, List readingStatus, + List imageUrls) { this.bookIsbn = bookIsbn; this.title = title; this.content = content; this.readingStatus = readingStatus; + this.imageUrls = imageUrls; } } diff --git a/src/main/java/com/jisungin/application/talkroom/request/TalkRoomEditServiceRequest.java b/src/main/java/com/jisungin/application/talkroom/request/TalkRoomEditServiceRequest.java index bc0a83e..9ed740f 100644 --- a/src/main/java/com/jisungin/application/talkroom/request/TalkRoomEditServiceRequest.java +++ b/src/main/java/com/jisungin/application/talkroom/request/TalkRoomEditServiceRequest.java @@ -2,6 +2,7 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.Size; +import java.util.ArrayList; import java.util.List; import lombok.Builder; import lombok.Getter; @@ -22,12 +23,19 @@ public class TalkRoomEditServiceRequest { @NotEmpty(message = "참가 조건은 1개 이상 체크해야합니다.") private List readingStatus; + private List newImage = new ArrayList<>(); + + private List removeImage = new ArrayList<>(); + @Builder - private TalkRoomEditServiceRequest(Long id, String title, String content, List readingStatus) { + private TalkRoomEditServiceRequest(Long id, String title, String content, List readingStatus, + List newImage, List removeImage) { this.id = id; this.title = title; this.content = content; this.readingStatus = readingStatus; + this.newImage = newImage; + this.removeImage = removeImage; } } diff --git a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomResponse.java b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomResponse.java index 721bc2d..49fd240 100644 --- a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomResponse.java +++ b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomResponse.java @@ -17,6 +17,7 @@ public class TalkRoomResponse { private String content; private List readingStatuses; private String bookImage; + private List imageUrls; @Builder @QueryProjection @@ -43,4 +44,8 @@ public static TalkRoomResponse of(String userName, String title, String content, .build(); } + public void addTalkRoomImages(List imageUrls) { + this.imageUrls = imageUrls; + } + } diff --git a/src/main/java/com/jisungin/domain/talkroomimage/TalkRoomImage.java b/src/main/java/com/jisungin/domain/talkroomimage/TalkRoomImage.java new file mode 100644 index 0000000..a39051c --- /dev/null +++ b/src/main/java/com/jisungin/domain/talkroomimage/TalkRoomImage.java @@ -0,0 +1,47 @@ +package com.jisungin.domain.talkroomimage; + +import com.jisungin.domain.talkroom.TalkRoom; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class TalkRoomImage { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "image_url") + private String imageUrl; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "talk_room_id") + private TalkRoom talkRoom; + + @Builder + private TalkRoomImage(Long id, String imageUrl, TalkRoom talkRoom) { + this.id = id; + this.imageUrl = imageUrl; + this.talkRoom = talkRoom; + } + + public static TalkRoomImage createImages(TalkRoom talkRoom, String imageUrl) { + return TalkRoomImage.builder() + .talkRoom(talkRoom) + .imageUrl(imageUrl) + .build(); + } + +} diff --git a/src/main/java/com/jisungin/domain/talkroomimage/repository/TalkRoomImageRepository.java b/src/main/java/com/jisungin/domain/talkroomimage/repository/TalkRoomImageRepository.java new file mode 100644 index 0000000..9b06c09 --- /dev/null +++ b/src/main/java/com/jisungin/domain/talkroomimage/repository/TalkRoomImageRepository.java @@ -0,0 +1,20 @@ +package com.jisungin.domain.talkroomimage.repository; + +import com.jisungin.domain.talkroom.TalkRoom; +import com.jisungin.domain.talkroomimage.TalkRoomImage; +import io.lettuce.core.dynamic.annotation.Param; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +public interface TalkRoomImageRepository extends JpaRepository { + List findByTalkRoom(TalkRoom talkRoom); + + @Query( + "select ti.imageUrl from TalkRoomImage ti where ti.talkRoom.id = :talkRoomId" + ) + List findByTalkRoomIdWithImageUrl(@Param("talkRoomId") Long talkRoomId); + + List findByTalkRoomAndImageUrl(TalkRoom talkRoom, String image); + +} diff --git a/src/test/java/com/jisungin/api/talkroom/TalkRoomControllerTest.java b/src/test/java/com/jisungin/api/talkroom/TalkRoomControllerTest.java index e4da65f..7e46d65 100644 --- a/src/test/java/com/jisungin/api/talkroom/TalkRoomControllerTest.java +++ b/src/test/java/com/jisungin/api/talkroom/TalkRoomControllerTest.java @@ -146,6 +146,20 @@ void editTalkRoomWithEmptyReadingStatus() throws Exception { .andExpect(jsonPath("$.message").value("참가 조건은 1개 이상 체크해야합니다.")); } + @Test + @DisplayName("사용자가 토크방을 10개씩 조회할 수 있다.") + void getTalkRooms() throws Exception { + // when // then + mockMvc.perform(get("/v1/talk-rooms?page=1&size=10&order=recent") + .contentType(APPLICATION_JSON) + ) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value("200")) + .andExpect(jsonPath("$.status").value("OK")) + .andExpect(jsonPath("$.message").value("OK")); + } + @Test @DisplayName("사용자가 토크방을 조회 했을 때 페이지를 -1 값을 보내면 첫 번째 페이지가 조회 되어야 한다.") void getTalkRoomWithMinus() throws Exception { diff --git a/src/test/java/com/jisungin/application/comment/CommentServiceTest.java b/src/test/java/com/jisungin/application/comment/CommentServiceTest.java index b3cb6ca..527e8af 100644 --- a/src/test/java/com/jisungin/application/comment/CommentServiceTest.java +++ b/src/test/java/com/jisungin/application/comment/CommentServiceTest.java @@ -19,6 +19,7 @@ import com.jisungin.domain.talkroom.TalkRoomRole; import com.jisungin.domain.talkroom.repository.TalkRoomRepository; import com.jisungin.domain.talkroom.repository.TalkRoomRoleRepository; +import com.jisungin.domain.talkroomimage.repository.TalkRoomImageRepository; import com.jisungin.domain.user.User; import com.jisungin.domain.user.repository.UserRepository; import com.jisungin.exception.BusinessException; @@ -50,12 +51,16 @@ class CommentServiceTest extends ServiceTestSupport { @Autowired CommentRepository commentRepository; + @Autowired + TalkRoomImageRepository talkRoomImageRepository; + @Autowired AuthContext authContext; @AfterEach void tearDown() { commentRepository.deleteAllInBatch(); + talkRoomImageRepository.deleteAllInBatch(); talkRoomRoleRepository.deleteAllInBatch(); talkRoomRepository.deleteAllInBatch(); userRepository.deleteAllInBatch(); diff --git a/src/test/java/com/jisungin/application/service/talkroom/TalkRoomServiceTest.java b/src/test/java/com/jisungin/application/talkroom/TalkRoomServiceTest.java similarity index 92% rename from src/test/java/com/jisungin/application/service/talkroom/TalkRoomServiceTest.java rename to src/test/java/com/jisungin/application/talkroom/TalkRoomServiceTest.java index dd4a9c1..3493010 100644 --- a/src/test/java/com/jisungin/application/service/talkroom/TalkRoomServiceTest.java +++ b/src/test/java/com/jisungin/application/talkroom/TalkRoomServiceTest.java @@ -1,14 +1,12 @@ -package com.jisungin.application.service.talkroom; +package com.jisungin.application.talkroom; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.jisungin.ServiceTestSupport; import com.jisungin.api.oauth.AuthContext; -import com.jisungin.application.OrderType; import com.jisungin.application.PageResponse; import com.jisungin.application.SearchServiceRequest; -import com.jisungin.application.talkroom.TalkRoomService; import com.jisungin.application.talkroom.request.TalkRoomCreateServiceRequest; import com.jisungin.application.talkroom.request.TalkRoomEditServiceRequest; import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse; @@ -27,6 +25,8 @@ import com.jisungin.domain.talkroom.TalkRoomRole; import com.jisungin.domain.talkroom.repository.TalkRoomRepository; import com.jisungin.domain.talkroom.repository.TalkRoomRoleRepository; +import com.jisungin.domain.talkroomimage.TalkRoomImage; +import com.jisungin.domain.talkroomimage.repository.TalkRoomImageRepository; import com.jisungin.domain.talkroomlike.TalkRoomLike; import com.jisungin.domain.talkroomlike.repository.TalkRoomLikeRepository; import com.jisungin.domain.user.User; @@ -68,6 +68,9 @@ class TalkRoomServiceTest extends ServiceTestSupport { @Autowired CommentLikeRepository commentLikeRepository; + @Autowired + TalkRoomImageRepository talkRoomImageRepository; + @Autowired AuthContext authContext; @@ -76,6 +79,7 @@ void tearDown() { commentLikeRepository.deleteAllInBatch(); talkRoomLikeRepository.deleteAllInBatch(); commentRepository.deleteAllInBatch(); + talkRoomImageRepository.deleteAllInBatch(); talkRoomRoleRepository.deleteAllInBatch(); talkRoomRepository.deleteAllInBatch(); userRepository.deleteAllInBatch(); @@ -339,11 +343,11 @@ void getTalkRooms() { SearchServiceRequest search = SearchServiceRequest.builder() .page(1) .size(10) - .orderType(OrderType.RECENT) + .order("recent") .build(); // when - PageResponse talkRooms = talkRoomRepository.findAllTalkRoom(search); + PageResponse talkRooms = talkRoomService.findAllTalkRoom(search); // then assertThat(10L).isEqualTo(talkRooms.getQueryResponse().size()); @@ -372,10 +376,11 @@ void getTalkRoomsPageTotalCount() { SearchServiceRequest search = SearchServiceRequest.builder() .page(1) .size(10) + .order("recommend") .build(); // when - PageResponse talkRooms = talkRoomRepository.findAllTalkRoom(search); + PageResponse talkRooms = talkRoomService.findAllTalkRoom(search); // then assertThat(103).isEqualTo(talkRooms.getTotalCount()); @@ -402,11 +407,11 @@ void getTalkRoomsMiddle() { SearchServiceRequest search = SearchServiceRequest.builder() .page(5) .size(10) - .orderType(OrderType.RECENT) + .order("recent") .build(); // when - PageResponse talkRooms = talkRoomRepository.findAllTalkRoom(search); + PageResponse talkRooms = talkRoomService.findAllTalkRoom(search); // then assertThat(talkRooms.getQueryResponse().size()).isEqualTo(10L); @@ -435,11 +440,11 @@ void getTalkRoomsLast() { SearchServiceRequest search = SearchServiceRequest.builder() .page(11) .size(10) - .orderType(OrderType.RECENT) + .order("recent") .build(); // when - PageResponse talkRooms = talkRoomRepository.findAllTalkRoom(search); + PageResponse talkRooms = talkRoomService.findAllTalkRoom(search); // then assertThat(talkRooms.getQueryResponse().size()).isEqualTo(3); @@ -654,7 +659,7 @@ void findAllTalkRoomWithLikeCount() { SearchServiceRequest search = SearchServiceRequest.builder() .page(2) .size(10) - .orderType(OrderType.RECENT) + .order("recent") .build(); // when @@ -704,7 +709,7 @@ void findAllTalkRoomWithLikeUserId() { SearchServiceRequest search = SearchServiceRequest.builder() .page(2) .size(10) - .orderType(OrderType.RECENT) + .order("recent") .build(); // when @@ -866,7 +871,7 @@ void findAllTalkRoomWithOrderLike() { SearchServiceRequest search = SearchServiceRequest.builder() .page(1) .size(10) - .orderType(OrderType.RECOMMEND) + .order("recommend") .build(); // when @@ -941,7 +946,7 @@ void findAllTalkRoomWithSearch() { SearchServiceRequest search = SearchServiceRequest.builder() .page(1) .size(10) - .search("검색어") + .query("검색어") .build(); // when @@ -989,6 +994,76 @@ void commentLikeCountTest() { assertThat(user.getId()).isEqualTo(findOneTalkRoom.getComments().get(0).getUserIds().get(0).getUserId()); } + @Test + @DisplayName("토크룸을 생성 했을 때 이미지 URL을 저장할 수 있다.") + void createTalkRoomWithImage() throws Exception { + // given + User user = createUser(); + userRepository.save(user); + + Book book = createBook(); + bookRepository.save(book); + + TalkRoomCreateServiceRequest request = TalkRoomCreateServiceRequest.builder() + .title("토론방 제목") + .content("토론방 내용") + .bookIsbn(book.getIsbn()) + .imageUrls(List.of("image.png")) + .readingStatus(List.of("읽는 중")) + .build(); + + AuthContext authContext = new AuthContext(); + + authContext.setUserId(user.getId()); + + // when + TalkRoomResponse response = talkRoomService.createTalkRoom(request, authContext); + + // then + assertThat(response.getImageUrls().get(0)).isEqualTo("image.png"); + + } + + @Test + @DisplayName("토크룸을 수정할 때 이미지도 변경할 수 있다.") + void editTalkRoomWithImage() throws Exception { + // given + User user = createUser(); + userRepository.save(user); + + Book book = createBook(); + bookRepository.save(book); + + TalkRoom talkRoom = createTalkRoom(book, user); + talkRoomRepository.save(talkRoom); + + createTalkRoomRole(talkRoom); + + TalkRoomImage talkRoomImage = TalkRoomImage.builder() + .imageUrl("이미지1") + .talkRoom(talkRoom) + .build(); + talkRoomImageRepository.save(talkRoomImage); + + TalkRoomEditServiceRequest request = TalkRoomEditServiceRequest.builder() + .id(talkRoom.getId()) + .newImage(List.of("이미지2")) + .removeImage(List.of("이미지1")) + .readingStatus(List.of("읽음")) + .build(); + + AuthContext authContext = new AuthContext(); + authContext.setUserId(user.getId()); + + // when + TalkRoomResponse response = talkRoomService.editTalkRoom(request, authContext); + + // then + assertThat(1).isEqualTo(response.getImageUrls().size()); + assertThat("이미지2").isEqualTo(response.getImageUrls().get(0)); + + } + private static List listUsers() { return IntStream.range(0, 10) .mapToObj(i -> User.builder() diff --git a/src/test/java/com/jisungin/docs/talkroom/TalkRoomControllerDocsTest.java b/src/test/java/com/jisungin/docs/talkroom/TalkRoomControllerDocsTest.java index 0c1f938..d78d656 100644 --- a/src/test/java/com/jisungin/docs/talkroom/TalkRoomControllerDocsTest.java +++ b/src/test/java/com/jisungin/docs/talkroom/TalkRoomControllerDocsTest.java @@ -9,6 +9,7 @@ import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; @@ -18,7 +19,6 @@ import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; import static org.springframework.restdocs.request.RequestDocumentation.queryParameters; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @@ -66,18 +66,23 @@ void crateTalkRoom() throws Exception { .bookIsbn("1111111") .title("토론방") .content("내용") - .readingStatus(List.of("WANT", "READING", "READ", "PAUSE", "STOP")) + .readingStatus(List.of("읽고 싶은", "읽는 중", "읽음", "잠시 멈춤", "중단")) + .imageUrls(List.of("이미지 URL")) .build(); + TalkRoomResponse response = TalkRoomResponse.builder() + .userName("user@mail.com") + .title("토론방 제목") + .bookName("책 제목") + .content("토론방 내용") + .readingStatuses(List.of(WANT, READING, READ, PAUSE, STOP)) + .bookImage("책 이미지 URL") + .build(); + + response.addTalkRoomImages(List.of("이미지 URL")); + given(talkRoomService.createTalkRoom(any(TalkRoomCreateServiceRequest.class), any(AuthContext.class))) - .willReturn(TalkRoomResponse.builder() - .userName("user@mail.com") - .title("토론방") - .bookName("책 제목") - .content("내용") - .readingStatuses(List.of(WANT, READING, READ, PAUSE, STOP)) - .bookImage("책 이미지 URL") - .build()); + .willReturn(response); mockMvc.perform( post("/v1/talk-rooms") @@ -97,7 +102,9 @@ void crateTalkRoom() throws Exception { fieldWithPath("content").type(JsonFieldType.STRING) .description("내용"), fieldWithPath("readingStatus").type(JsonFieldType.ARRAY) - .description("참가 조건") + .description("참가 조건 -> { 읽고 싶은, 읽는 중, 읽음, 잠시 멈춤, 중단 }"), + fieldWithPath("imageUrls").type(JsonFieldType.ARRAY) + .description("이미지 URL") ), responseFields( fieldWithPath("code").type(JsonFieldType.NUMBER) @@ -116,6 +123,8 @@ void crateTalkRoom() throws Exception { .description("책 제목"), fieldWithPath("data.content").type(JsonFieldType.STRING) .description("토론방 본문"), + fieldWithPath("data.imageUrls").type(JsonFieldType.ARRAY) + .description("이미지 URL 리스트"), fieldWithPath("data.readingStatuses").type(JsonFieldType.ARRAY) .description("참가 조건"), fieldWithPath("data.bookImage").type(JsonFieldType.STRING) @@ -133,8 +142,9 @@ void findAllTalkRooms() throws Exception { .page(1) .size(10) .order("RECENT") - .search(null) + .query(null) .build(); + given(talkRoomService.findAllTalkRoom(any(SearchServiceRequest.class))) .willReturn(PageResponse.builder() .queryResponse(talkRoomFindAllResponses) @@ -147,7 +157,7 @@ void findAllTalkRooms() throws Exception { .param("page", String.valueOf(request.getPage())) .param("size", String.valueOf(request.getSize())) .param("order", request.getOrder()) - .param("search", request.getSearch()) + .param("search", request.getQuery()) .contentType(MediaType.APPLICATION_JSON) ) .andDo(print()) @@ -227,7 +237,7 @@ void findOneTalkRoom() throws Exception { Long request = 1L; mockMvc.perform( - RestDocumentationRequestBuilders.get("/v1/talk-room/{talkRoomId}", request) + get("/v1/talk-room/{talkRoomId}", request) .contentType(MediaType.APPLICATION_JSON) ) .andDo(print()) @@ -306,17 +316,23 @@ void editTalkRoom() throws Exception { .title("토론방 제목 수정") .content("토론방 본문 수정") .readingStatus(List.of("READ")) + .newImage(List.of("새로운 이미지")) + .removeImage(List.of("기존에 있던 이미지")) .build(); + TalkRoomResponse response = TalkRoomResponse.builder() + .userName("user@mail.com") + .title("토론방 제목") + .bookName("책 제목") + .content("토론방 내용") + .readingStatuses(List.of(WANT, READING, READ, PAUSE, STOP)) + .bookImage("책 이미지 URL") + .build(); + + response.addTalkRoomImages(List.of("이미지 URL")); + given(talkRoomService.editTalkRoom(any(TalkRoomEditServiceRequest.class), any(AuthContext.class))) - .willReturn(TalkRoomResponse.builder() - .userName("user") - .title("토론방 제목 수정") - .bookName("책 제목") - .content("토론방 본문 수정") - .readingStatuses(List.of(READ)) - .bookImage("책 이미지 URL") - .build()); + .willReturn(response); mockMvc.perform( patch("/v1/talk-rooms") @@ -335,6 +351,10 @@ void editTalkRoom() throws Exception { .description("제목").optional(), fieldWithPath("content").type(JsonFieldType.STRING) .description("내용").optional(), + fieldWithPath("newImage").type(JsonFieldType.ARRAY) + .description("새로운 이미지 URL 저장"), + fieldWithPath("removeImage").type(JsonFieldType.ARRAY) + .description("기존의 있던 이미지 URL 삭제"), fieldWithPath("readingStatus").type(JsonFieldType.ARRAY) .description("참가 조건") ), @@ -355,6 +375,8 @@ void editTalkRoom() throws Exception { .description("책 제목"), fieldWithPath("data.content").type(JsonFieldType.STRING) .description("토론방 본문"), + fieldWithPath("data.imageUrls").type(JsonFieldType.ARRAY) + .description("이미지 URL"), fieldWithPath("data.readingStatuses").type(JsonFieldType.ARRAY) .description("참가 조건"), fieldWithPath("data.bookImage").type(JsonFieldType.STRING) diff --git a/src/test/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryTest.java b/src/test/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryTest.java index b8a78cd..3831f24 100644 --- a/src/test/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryTest.java +++ b/src/test/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryTest.java @@ -3,7 +3,6 @@ import static org.assertj.core.api.Assertions.assertThat; import com.jisungin.RepositoryTestSupport; -import com.jisungin.application.OrderType; import com.jisungin.application.PageResponse; import com.jisungin.application.SearchServiceRequest; import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse; @@ -95,11 +94,12 @@ void pageTest() { SearchServiceRequest search = SearchServiceRequest.builder() .page(1) .size(10) - .orderType(OrderType.RECENT) + .order("recent") .build(); // when - PageResponse talkRooms = talkRoomRepository.findAllTalkRoom(search); + PageResponse talkRooms = talkRoomRepository.findAllTalkRoom(search.getOffset(), + search.getSize(), search.getOrder(), search.getQuery()); // then assertThat(10L).isEqualTo(talkRooms.getQueryResponse().size()); @@ -194,11 +194,12 @@ void likeTalkRoomFindCount() { SearchServiceRequest search = SearchServiceRequest.builder() .page(2) .size(10) - .orderType(OrderType.RECENT) + .order("recent") .build(); // when - PageResponse response = talkRoomRepository.findAllTalkRoom(search); + PageResponse response = talkRoomRepository.findAllTalkRoom(search.getOffset(), + search.getSize(), search.getOrder(), search.getQuery()); // then assertThat(5L).isEqualTo(response.getQueryResponse().get(9).getLikeCount()); @@ -428,11 +429,12 @@ void findAllTalkRoomWithOrderLike() { SearchServiceRequest search = SearchServiceRequest.builder() .page(1) .size(10) - .orderType(OrderType.RECOMMEND) + .order("recommend") .build(); // when - PageResponse response = talkRoomRepository.findAllTalkRoom(search); + PageResponse response = talkRoomRepository.findAllTalkRoom(search.getOffset(), + search.getSize(), search.getOrder(), search.getQuery()); // then assertThat(10L).isEqualTo(response.getQueryResponse().get(0).getLikeCount()); @@ -520,11 +522,12 @@ void findAllTalkRoomWithSearch() { SearchServiceRequest search = SearchServiceRequest.builder() .page(1) .size(10) - .search("검색어") + .query("검색어") .build(); // when - PageResponse response = talkRoomRepository.findAllTalkRoom(search); + PageResponse response = talkRoomRepository.findAllTalkRoom(search.getOffset(), + search.getSize(), search.getOrder(), search.getQuery()); // then assertThat(talkRoom1.getTitle()).isEqualTo(response.getQueryResponse().get(0).getTitle()); From bcbaa61e5df6361ab792407ef63b32f9f2bd5c94 Mon Sep 17 00:00:00 2001 From: ahnyunki Date: Fri, 5 Apr 2024 18:17:49 +0900 Subject: [PATCH 3/3] =?UTF-8?q?refactor:=20TalkRoom=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20API=20CommentAPI=20=EC=A1=B0=ED=9A=8C=20=EB=B6=84=EB=A6=AC?= =?UTF-8?q?=20(#61)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/comment/CommentController.java | 15 +- .../api/talkroom/TalkRoomController.java | 9 +- .../jisungin/application/PageResponse.java | 6 + .../application/comment/CommentService.java | 16 ++ .../response/CommentQueryResponse.java | 7 - .../application/talkroom/TalkRoomService.java | 26 ++- .../response/TalkRoomFindAllResponse.java | 5 - .../response/TalkRoomFindOneResponse.java | 20 +- .../comment/repository/CommentRepository.java | 2 +- .../repository/CommentRepositoryCustom.java | 10 + .../repository/CommentRepositoryImpl.java | 62 ++++++ .../repository/CommentLikeRepository.java | 10 + .../repository/TalkRoomRepositoryCustom.java | 1 + .../repository/TalkRoomRepositoryImpl.java | 95 +-------- .../repository/TalkRoomLikeRepository.java | 15 ++ .../api/comment/CommentControllerTest.java | 23 ++- .../comment/CommentServiceTest.java | 104 +++++++++- .../talkroom/TalkRoomServiceTest.java | 158 +++------------ .../comment/CommentControllerDocsTest.java | 73 ++++++- .../talkroom/TalkRoomControllerDocsTest.java | 98 +++------- .../repository/CommentRepositoryImplTest.java | 184 ++++++++++++++++++ .../repository/TalkRoomRepositoryTest.java | 182 ----------------- .../templates/path-parameters.snippet | 2 +- .../templates/query-parameters.snippet | 6 +- .../restdocs/templates/request-fields.snippet | 6 +- .../restdocs/templates/respnse-fields.snippet | 8 +- 26 files changed, 600 insertions(+), 543 deletions(-) create mode 100644 src/main/java/com/jisungin/domain/comment/repository/CommentRepositoryCustom.java create mode 100644 src/main/java/com/jisungin/domain/comment/repository/CommentRepositoryImpl.java create mode 100644 src/test/java/com/jisungin/domain/comment/repository/CommentRepositoryImplTest.java rename src/test/resources/{org.springframework => org/springframework}/restdocs/templates/path-parameters.snippet (88%) rename src/test/resources/{org.springframework => org/springframework}/restdocs/templates/query-parameters.snippet (55%) rename src/test/resources/{org.springframework => org/springframework}/restdocs/templates/request-fields.snippet (61%) rename src/test/resources/{org.springframework => org/springframework}/restdocs/templates/respnse-fields.snippet (61%) diff --git a/src/main/java/com/jisungin/api/comment/CommentController.java b/src/main/java/com/jisungin/api/comment/CommentController.java index 9157034..6e9528b 100644 --- a/src/main/java/com/jisungin/api/comment/CommentController.java +++ b/src/main/java/com/jisungin/api/comment/CommentController.java @@ -5,12 +5,15 @@ import com.jisungin.api.comment.request.CommentEditRequest; import com.jisungin.api.oauth.Auth; import com.jisungin.api.oauth.AuthContext; +import com.jisungin.application.PageResponse; import com.jisungin.application.comment.CommentService; +import com.jisungin.application.comment.response.CommentQueryResponse; import com.jisungin.application.comment.response.CommentResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.DeleteMapping; +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; @@ -25,21 +28,27 @@ public class CommentController { private final CommentService commentService; - @PostMapping("/talk-rooms/{talkRoomId}/comments") + @PostMapping("{talkRoomId}/comments") public ApiResponse writeComment(@PathVariable Long talkRoomId, @Valid @RequestBody CommentCreateRequest request, @Auth AuthContext authContext) { return ApiResponse.ok(commentService.writeComment(request.toService(), talkRoomId, authContext)); } - @PatchMapping("/talk-rooms/comments/{commentId}") + @GetMapping("{talkRoomId}/comments") + public ApiResponse> findAllComments(@PathVariable Long talkRoomId, + @Auth AuthContext authContext) { + return ApiResponse.ok(commentService.findAllComments(talkRoomId, authContext)); + } + + @PatchMapping("/comments/{commentId}") public ApiResponse editComment(@PathVariable Long commentId, @Valid @RequestBody CommentEditRequest request, @Auth AuthContext authContext) { return ApiResponse.ok(commentService.editComment(commentId, request.toService(), authContext)); } - @DeleteMapping("/talk-rooms/comments/{commentId}") + @DeleteMapping("/comments/{commentId}") public ApiResponse deleteComment(@PathVariable Long commentId, @Auth AuthContext authContext) { commentService.deleteComment(commentId, authContext); diff --git a/src/main/java/com/jisungin/api/talkroom/TalkRoomController.java b/src/main/java/com/jisungin/api/talkroom/TalkRoomController.java index c070e45..ccf4ff2 100644 --- a/src/main/java/com/jisungin/api/talkroom/TalkRoomController.java +++ b/src/main/java/com/jisungin/api/talkroom/TalkRoomController.java @@ -39,13 +39,14 @@ public ApiResponse createTalkRoom(@Valid @RequestBody TalkRoom @GetMapping("/talk-rooms") public ApiResponse> findAllTalkRoom( - @ModelAttribute SearchRequest search) { - return ApiResponse.ok(talkRoomService.findAllTalkRoom(search.toService())); + @ModelAttribute SearchRequest search, @Auth AuthContext authContext) { + return ApiResponse.ok(talkRoomService.findAllTalkRoom(search.toService(), authContext)); } @GetMapping("/talk-room/{talkRoomId}") - public ApiResponse findOneTalkRoom(@PathVariable Long talkRoomId) { - return ApiResponse.ok(talkRoomService.findOneTalkRoom(talkRoomId)); + public ApiResponse findOneTalkRoom(@PathVariable Long talkRoomId, + @Auth AuthContext authContext) { + return ApiResponse.ok(talkRoomService.findOneTalkRoom(talkRoomId, authContext)); } @PatchMapping("/talk-rooms") diff --git a/src/main/java/com/jisungin/application/PageResponse.java b/src/main/java/com/jisungin/application/PageResponse.java index f46e52b..308bb54 100644 --- a/src/main/java/com/jisungin/application/PageResponse.java +++ b/src/main/java/com/jisungin/application/PageResponse.java @@ -16,6 +16,8 @@ public class PageResponse { private int size; + private List likeContents; + @Builder private PageResponse(List queryResponse, long totalCount, int size) { this.queryResponse = queryResponse; @@ -23,4 +25,8 @@ private PageResponse(List queryResponse, long totalCount, int size) { this.size = size; } + public void addContents(List contents) { + this.likeContents = contents; + } + } diff --git a/src/main/java/com/jisungin/application/comment/CommentService.java b/src/main/java/com/jisungin/application/comment/CommentService.java index d9a68c4..7831d9b 100644 --- a/src/main/java/com/jisungin/application/comment/CommentService.java +++ b/src/main/java/com/jisungin/application/comment/CommentService.java @@ -1,17 +1,21 @@ package com.jisungin.application.comment; import com.jisungin.api.oauth.AuthContext; +import com.jisungin.application.PageResponse; import com.jisungin.application.comment.request.CommentCreateServiceRequest; import com.jisungin.application.comment.request.CommentEditServiceRequest; +import com.jisungin.application.comment.response.CommentQueryResponse; import com.jisungin.application.comment.response.CommentResponse; import com.jisungin.domain.comment.Comment; import com.jisungin.domain.comment.repository.CommentRepository; +import com.jisungin.domain.commentlike.repository.CommentLikeRepository; import com.jisungin.domain.talkroom.TalkRoom; import com.jisungin.domain.talkroom.repository.TalkRoomRepository; import com.jisungin.domain.user.User; import com.jisungin.domain.user.repository.UserRepository; import com.jisungin.exception.BusinessException; import com.jisungin.exception.ErrorCode; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,6 +28,7 @@ public class CommentService { private final CommentRepository commentRepository; private final TalkRoomRepository talkRoomRepository; private final UserRepository userRepository; + private final CommentLikeRepository commentLikeRepository; @Transactional public CommentResponse writeComment(CommentCreateServiceRequest request, Long talkRoomId, AuthContext authContext) { @@ -40,6 +45,17 @@ public CommentResponse writeComment(CommentCreateServiceRequest request, Long ta return CommentResponse.of(comment.getContent(), user.getName()); } + public PageResponse findAllComments(Long talkRoomId, AuthContext authContext) { + PageResponse response = commentRepository.findAllComments(talkRoomId); + + if (authContext.getUserId() != null) { + List likeComments = commentLikeRepository.userLikeComments(authContext.getUserId()); + response.addContents(likeComments); + } + + return response; + } + @Transactional public CommentResponse editComment(Long commentId, CommentEditServiceRequest request, AuthContext authContext) { Comment comment = commentRepository.findById(commentId) diff --git a/src/main/java/com/jisungin/application/comment/response/CommentQueryResponse.java b/src/main/java/com/jisungin/application/comment/response/CommentQueryResponse.java index dabce46..c1ad32c 100644 --- a/src/main/java/com/jisungin/application/comment/response/CommentQueryResponse.java +++ b/src/main/java/com/jisungin/application/comment/response/CommentQueryResponse.java @@ -1,8 +1,6 @@ package com.jisungin.application.comment.response; import com.querydsl.core.annotations.QueryProjection; -import java.util.ArrayList; -import java.util.List; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -15,7 +13,6 @@ public class CommentQueryResponse { private String userName; private String content; private Long commentLikeCount; - private List userIds = new ArrayList<>(); @Builder @QueryProjection @@ -26,8 +23,4 @@ public CommentQueryResponse(Long commentId, String userName, String content, Lon this.commentLikeCount = commentLikeCount; } - public void addLikeUserIds(List userIds) { - this.userIds = userIds; - } - } diff --git a/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java b/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java index 5854ecd..4f6b84b 100644 --- a/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java +++ b/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java @@ -18,6 +18,7 @@ import com.jisungin.domain.talkroom.repository.TalkRoomRoleRepository; import com.jisungin.domain.talkroomimage.TalkRoomImage; import com.jisungin.domain.talkroomimage.repository.TalkRoomImageRepository; +import com.jisungin.domain.talkroomlike.repository.TalkRoomLikeRepository; import com.jisungin.domain.user.User; import com.jisungin.domain.user.repository.UserRepository; import com.jisungin.exception.BusinessException; @@ -38,6 +39,7 @@ public class TalkRoomService { private final UserRepository userRepository; private final CommentRepository commentRepository; private final TalkRoomImageRepository talkRoomImageRepository; + private final TalkRoomLikeRepository talkRoomLikeRepository; @Transactional public TalkRoomResponse createTalkRoom(TalkRoomCreateServiceRequest request, AuthContext authContext) { @@ -54,7 +56,7 @@ public TalkRoomResponse createTalkRoom(TalkRoomCreateServiceRequest request, Aut readingStatus.stream().map(status -> TalkRoomRole.roleCreate(talkRoom, status)) .forEach(talkRoomRoleRepository::save); - + TalkRoomResponse response = TalkRoomResponse.of(user.getName(), talkRoom.getTitle(), talkRoom.getContent(), readingStatus, book.getImageUrl(), book.getTitle()); @@ -73,16 +75,30 @@ public TalkRoomResponse createTalkRoom(TalkRoomCreateServiceRequest request, Aut return response; } - public PageResponse findAllTalkRoom(SearchServiceRequest search) { - return talkRoomRepository.findAllTalkRoom(search.getOffset(), search.getSize(), search.getOrder(), + public PageResponse findAllTalkRoom(SearchServiceRequest search, AuthContext authContext) { + PageResponse response = talkRoomRepository.findAllTalkRoom(search.getOffset(), + search.getSize(), search.getOrder(), search.getQuery()); + + if (authContext.getUserId() != null) { + List talkRoomIds = talkRoomLikeRepository.userLikeTalkRooms(authContext.getUserId()); + response.addContents(talkRoomIds); + } + + return response; } - public TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId) { + public TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId, AuthContext authContext) { TalkRoom talkRoom = talkRoomRepository.findById(talkRoomId) .orElseThrow(() -> new BusinessException(ErrorCode.TALK_ROOM_NOT_FOUND)); - return talkRoomRepository.findOneTalkRoom(talkRoom.getId()); + TalkRoomFindOneResponse response = talkRoomRepository.findOneTalkRoom(talkRoom.getId()); + + if (authContext.getUserId() != null) { + Long likeTalkRoom = talkRoomLikeRepository.userLikeTalkRoom(talkRoomId, authContext.getUserId()); + response.addTalkRoomLikeId(likeTalkRoom); + } + return response; } @Transactional diff --git a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindAllResponse.java b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindAllResponse.java index 8c928db..f475ec9 100644 --- a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindAllResponse.java +++ b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindAllResponse.java @@ -18,7 +18,6 @@ public class TalkRoomFindAllResponse { private String bookName; private String bookImage; private List readingStatuses = new ArrayList<>(); - private List userIds = new ArrayList<>(); private Long likeCount; @Builder @@ -38,8 +37,4 @@ public void addTalkRoomStatus(List readingSt this.readingStatuses = readingStatuses; } - public void addTalkRoomLikeUserIds(List userIds) { - this.userIds = userIds; - } - } diff --git a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindOneResponse.java b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindOneResponse.java index e361bde..58106bf 100644 --- a/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindOneResponse.java +++ b/src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindOneResponse.java @@ -1,6 +1,5 @@ package com.jisungin.application.talkroom.response; -import com.jisungin.application.comment.response.CommentQueryResponse; import com.querydsl.core.annotations.QueryProjection; import java.util.ArrayList; import java.util.List; @@ -19,15 +18,13 @@ public class TalkRoomFindOneResponse { private String bookName; private String bookImage; private List readingStatuses = new ArrayList<>(); - private List comments = new ArrayList<>(); private Long likeCount; - private Long commentCount; - private List userIds = new ArrayList<>(); + private Long likeTalkRoomId; @Builder @QueryProjection public TalkRoomFindOneResponse(Long talkRoomId, String userName, String title, String content, String bookName, - String bookImage, Long likeCount, Long commentCount) { + String bookImage, Long likeCount) { this.talkRoomId = talkRoomId; this.userName = userName; this.title = title; @@ -35,23 +32,14 @@ public TalkRoomFindOneResponse(Long talkRoomId, String userName, String title, S this.bookName = bookName; this.bookImage = bookImage; this.likeCount = likeCount; - this.commentCount = commentCount; } public void addTalkRoomStatus(List readingStatuses) { this.readingStatuses = readingStatuses; } - public void addTalkRoomComments(List comments) { - this.comments = comments; - } - - public void addCommentCount(Long commentCount) { - this.commentCount = commentCount; - } - - public void addUserIds(List userIds) { - this.userIds = userIds; + public void addTalkRoomLikeId(Long talkRoomId) { + this.likeTalkRoomId = talkRoomId; } } diff --git a/src/main/java/com/jisungin/domain/comment/repository/CommentRepository.java b/src/main/java/com/jisungin/domain/comment/repository/CommentRepository.java index deafba2..42a5d56 100644 --- a/src/main/java/com/jisungin/domain/comment/repository/CommentRepository.java +++ b/src/main/java/com/jisungin/domain/comment/repository/CommentRepository.java @@ -7,7 +7,7 @@ import org.springframework.stereotype.Repository; @Repository -public interface CommentRepository extends JpaRepository { +public interface CommentRepository extends JpaRepository, CommentRepositoryCustom { Optional findByTalkRoom(TalkRoom talkRoom); } diff --git a/src/main/java/com/jisungin/domain/comment/repository/CommentRepositoryCustom.java b/src/main/java/com/jisungin/domain/comment/repository/CommentRepositoryCustom.java new file mode 100644 index 0000000..07a55c8 --- /dev/null +++ b/src/main/java/com/jisungin/domain/comment/repository/CommentRepositoryCustom.java @@ -0,0 +1,10 @@ +package com.jisungin.domain.comment.repository; + +import com.jisungin.application.PageResponse; +import com.jisungin.application.comment.response.CommentQueryResponse; + +public interface CommentRepositoryCustom { + + PageResponse findAllComments(Long talkRoomId); + +} diff --git a/src/main/java/com/jisungin/domain/comment/repository/CommentRepositoryImpl.java b/src/main/java/com/jisungin/domain/comment/repository/CommentRepositoryImpl.java new file mode 100644 index 0000000..6e5d1d8 --- /dev/null +++ b/src/main/java/com/jisungin/domain/comment/repository/CommentRepositoryImpl.java @@ -0,0 +1,62 @@ +package com.jisungin.domain.comment.repository; + +import static com.jisungin.domain.comment.QComment.comment; +import static com.jisungin.domain.commentlike.QCommentLike.commentLike; +import static com.jisungin.domain.talkroom.QTalkRoom.talkRoom; +import static com.jisungin.domain.user.QUser.user; + +import com.jisungin.application.PageResponse; +import com.jisungin.application.comment.response.CommentQueryResponse; +import com.jisungin.application.comment.response.QCommentQueryResponse; +import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.List; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class CommentRepositoryImpl implements CommentRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + @Override + public PageResponse findAllComments(Long talkRoomId) { + List findAllComment = getComments(talkRoomId); + + Long commentCount = totalCount(talkRoomId); + + return PageResponse.builder() + .queryResponse(findAllComment) + .size(50) + .totalCount(commentCount) + .build(); + } + + private Long totalCount(Long talkRoomId) { + Long commentCount = queryFactory + .select(comment.count()) + .from(comment) + .join(comment.talkRoom, talkRoom) + .join(comment.user, user) + .where(comment.talkRoom.id.eq(talkRoomId)) + .fetchOne(); + return commentCount; + } + + private List getComments(Long talkRoomId) { + List findAllComment = queryFactory.select(new QCommentQueryResponse( + comment.id.as("commentId"), + user.name.as("userName"), + comment.content, + commentLike.count().as("commentLiKeCount") + )) + .from(comment) + .join(comment.talkRoom, talkRoom) + .join(comment.user, user) + .leftJoin(commentLike).on(comment.eq(commentLike.comment)) + .groupBy(comment.id) + .where(comment.talkRoom.id.eq(talkRoomId)) + .orderBy(comment.createDateTime.desc()) + .fetch(); + return findAllComment; + } + +} diff --git a/src/main/java/com/jisungin/domain/commentlike/repository/CommentLikeRepository.java b/src/main/java/com/jisungin/domain/commentlike/repository/CommentLikeRepository.java index 7208d77..b154572 100644 --- a/src/main/java/com/jisungin/domain/commentlike/repository/CommentLikeRepository.java +++ b/src/main/java/com/jisungin/domain/commentlike/repository/CommentLikeRepository.java @@ -1,12 +1,22 @@ package com.jisungin.domain.commentlike.repository; import com.jisungin.domain.commentlike.CommentLike; +import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface CommentLikeRepository extends JpaRepository { Optional findByCommentIdAndUserId(Long commentId, Long userId); + + @Query( + "SELECT c.id FROM Comment c JOIN CommentLike cl ON c.id = " + + "cl.comment.id WHERE cl.user.id = :userId" + ) + List userLikeComments(@Param("userId") Long userId); + } diff --git a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryCustom.java b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryCustom.java index 9d4d2a5..4b622a8 100644 --- a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryCustom.java +++ b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryCustom.java @@ -9,4 +9,5 @@ public interface TalkRoomRepositoryCustom { PageResponse findAllTalkRoom(long offset, int size, String order, String query); TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId); + } diff --git a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java index 4216b6b..e0e3a5c 100644 --- a/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java +++ b/src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java @@ -1,8 +1,6 @@ package com.jisungin.domain.talkroom.repository; import static com.jisungin.domain.book.QBook.book; -import static com.jisungin.domain.comment.QComment.comment; -import static com.jisungin.domain.commentlike.QCommentLike.commentLike; import static com.jisungin.domain.talkroom.QTalkRoom.talkRoom; import static com.jisungin.domain.talkroom.QTalkRoomRole.talkRoomRole; import static com.jisungin.domain.talkroom.repository.OrderType.RECENT; @@ -11,17 +9,11 @@ import static com.jisungin.domain.user.QUser.user; import com.jisungin.application.PageResponse; -import com.jisungin.application.comment.response.CommentLikeUserIdResponse; -import com.jisungin.application.comment.response.CommentQueryResponse; -import com.jisungin.application.comment.response.QCommentLikeUserIdResponse; -import com.jisungin.application.comment.response.QCommentQueryResponse; import com.jisungin.application.talkroom.response.QTalkRoomFindAllResponse; import com.jisungin.application.talkroom.response.QTalkRoomFindOneResponse; -import com.jisungin.application.talkroom.response.QTalkRoomLikeUserIdResponse; import com.jisungin.application.talkroom.response.QTalkRoomQueryReadingStatusResponse; import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse; import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse; -import com.jisungin.application.talkroom.response.TalkRoomLikeUserIdResponse; import com.jisungin.application.talkroom.response.TalkRoomQueryReadingStatusResponse; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.dsl.BooleanExpression; @@ -50,11 +42,6 @@ public PageResponse findAllTalkRoom(long offset, int si //루프를 돌면서 컬렉션 추가(추가 쿼리 실행X) findTalkRoom.forEach(t -> t.addTalkRoomStatus(talkRoomRoleMap.get(t.getTalkRoomId()))); - // 좋아요한 유저 ID 정보들 추가 -> Query 1번 발생 - Map> talkRoomLikeUserMap = findAllTalkRoomLikeUserId( - toTalkRoomIds(findTalkRoom)); - findTalkRoom.forEach(t -> t.addTalkRoomLikeUserIds(talkRoomLikeUserMap.get(t.getTalkRoomId()))); - // query 1번 발생 long totalCount = getTotalTalkRoomCount(); @@ -73,19 +60,6 @@ public TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId) { List talkRoomRoles = findTalkRoomRoleByTalkRoomId(talkRoomId); findOneTalkRoom.addTalkRoomStatus(talkRoomRoles); - List talkRoomComments = findCommentsByTalkRoomId(talkRoomId); - findOneTalkRoom.addTalkRoomComments(talkRoomComments); - - List commentIds = talkRoomComments.stream() - .map(CommentQueryResponse::getCommentId) - .collect(Collectors.toList()); - - List userIds = findOneTalkRoomLikeUserId(talkRoomId); - findOneTalkRoom.addUserIds(userIds); - - Map> CommentLikeUserIdMap = findAllCommentLikeUserId(commentIds); - talkRoomComments.forEach(c -> c.addLikeUserIds(CommentLikeUserIdMap.get(c.getCommentId()))); - return findOneTalkRoom; } @@ -95,9 +69,6 @@ public TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId) { public void findAllUserCreatedTalkRooms(Long userId) { List userTalkRooms = findAllUserTalkRooms(userId); - Map> talkRoomLikeUserMap = findAllTalkRoomLikeUserId( - toTalkRoomIds(userTalkRooms)); - userTalkRooms.forEach(t -> t.addTalkRoomLikeUserIds(talkRoomLikeUserMap.get(t.getTalkRoomId()))); } private List findAllUserTalkRooms(Long userId) { @@ -169,35 +140,6 @@ private Map> findTalkRoomRoleMap( .collect(Collectors.groupingBy(TalkRoomQueryReadingStatusResponse::getTalkRoomId)); } - // 페이징 조회 -> 토크룸 좋아요 누른 사용자 ID 가져온 후 Map<>에 넣어주는 로직 - private Map> findAllTalkRoomLikeUserId(List talkRoomIds) { - List talkRoomLikeUserIds = queryFactory.select(new QTalkRoomLikeUserIdResponse( - talkRoom.id.as("talkRoomId"), - user.id.as("userId") - )) - .from(talkRoomLike) - .join(talkRoomLike.talkRoom, talkRoom) - .join(talkRoomLike.user, user) - .where(talkRoomLike.talkRoom.id.in(talkRoomIds)) - .fetch(); - - return talkRoomLikeUserIds.stream() - .collect(Collectors.groupingBy(TalkRoomLikeUserIdResponse::getTalkRoomId)); - } - - // 단건 조회 -> 토크룸 좋아요 누른 사용자 ID 가져온 후 Map<>에 넣어주는 로직 - private List findOneTalkRoomLikeUserId(Long talkRoomId) { - return queryFactory.select(new QTalkRoomLikeUserIdResponse( - talkRoom.id.as("talkRoomId"), - user.id.as("userId") - )) - .from(talkRoomLike) - .join(talkRoomLike.talkRoom, talkRoom) - .join(talkRoomLike.user, user) - .where(talkRoomLike.talkRoom.id.eq(talkRoomId)) - .fetch(); - } - // 토크룸 단건 조회 시 토크룸 상태 가져오는 쿼리 private List findTalkRoomRoleByTalkRoomId(Long talkRoomId) { return queryFactory.select(new QTalkRoomQueryReadingStatusResponse( @@ -210,38 +152,6 @@ private List findTalkRoomRoleByTalkRoomId(Lo .fetch(); } - // 토크룸에 저장된 의견들 가져오는 쿼리 - private List findCommentsByTalkRoomId(Long talkRoomId) { - return queryFactory.select(new QCommentQueryResponse( - comment.id.as("commentId"), - user.name.as("userName"), - comment.content, - commentLike.count().as("commentLikeCount") - )) - .from(comment) - .join(comment.talkRoom, talkRoom) - .join(comment.user, user) - .leftJoin(commentLike).on(comment.eq(commentLike.comment)) - .groupBy(comment.id) - .where(comment.talkRoom.id.eq(talkRoomId)) - .fetch(); - } - - private Map> findAllCommentLikeUserId(List commentIds) { - List commentLikeUserIds = queryFactory.select(new QCommentLikeUserIdResponse( - comment.id.as("commentId"), - user.id.as("userId") - )) - .from(commentLike) - .join(commentLike.comment, comment) - .join(commentLike.user, user) - .where(commentLike.comment.id.in(commentIds)) - .fetch(); - - return commentLikeUserIds.stream() - .collect(Collectors.groupingBy(CommentLikeUserIdResponse::getCommentId)); - } - // 토크룸 전체 개수 가져오는 쿼리 private long getTotalTalkRoomCount() { return queryFactory @@ -261,15 +171,12 @@ private TalkRoomFindOneResponse findTalkRoomByTalkRoomId(Long talkRoomId) { talkRoom.content, book.title, book.imageUrl.as("bookImage"), - talkRoomLike.count().as("likeCount"), - comment.count().as("commentCount") + talkRoomLike.count().as("likeCount") )) .from(talkRoom) .join(talkRoom.user, user) .join(talkRoom.book, book) .leftJoin(talkRoomLike).on(talkRoom.eq(talkRoomLike.talkRoom)) - .leftJoin(comment).on(talkRoom.eq(comment.talkRoom)) - .groupBy(talkRoom.id) .where(talkRoom.id.eq(talkRoomId)) .fetchOne(); } diff --git a/src/main/java/com/jisungin/domain/talkroomlike/repository/TalkRoomLikeRepository.java b/src/main/java/com/jisungin/domain/talkroomlike/repository/TalkRoomLikeRepository.java index fb33c44..748072a 100644 --- a/src/main/java/com/jisungin/domain/talkroomlike/repository/TalkRoomLikeRepository.java +++ b/src/main/java/com/jisungin/domain/talkroomlike/repository/TalkRoomLikeRepository.java @@ -1,12 +1,27 @@ package com.jisungin.domain.talkroomlike.repository; import com.jisungin.domain.talkroomlike.TalkRoomLike; +import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface TalkRoomLikeRepository extends JpaRepository { Optional findByTalkRoomIdAndUserId(Long talkRoomId, Long userId); + + @Query( + "SELECT tr.id FROM TalkRoom tr JOIN TalkRoomLike trl ON tr.id = " + + "trl.talkRoom.id WHERE trl.user.id = :userId" + ) + List userLikeTalkRooms(@Param("userId") Long userId); + + @Query( + "SELECT tr.id FROM TalkRoom tr JOIN TalkRoomLike trl ON tr.id =" + + " trl.talkRoom.id WHERE trl.user.id = :userId AND trl.talkRoom.id = :talkRoomId" + ) + Long userLikeTalkRoom(@Param("talkRoomId") Long talkRoomId, @Param("userId") Long userId); } diff --git a/src/test/java/com/jisungin/api/comment/CommentControllerTest.java b/src/test/java/com/jisungin/api/comment/CommentControllerTest.java index 04543d0..fc40b9d 100644 --- a/src/test/java/com/jisungin/api/comment/CommentControllerTest.java +++ b/src/test/java/com/jisungin/api/comment/CommentControllerTest.java @@ -2,6 +2,7 @@ import static org.springframework.http.MediaType.APPLICATION_JSON; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @@ -25,7 +26,7 @@ void writeComment() throws Exception { .build(); // when // then - mockMvc.perform(post("/v1/talk-rooms/1/comments") + mockMvc.perform(post("/v1/1/comments") .content(objectMapper.writeValueAsString(request)) .contentType(APPLICATION_JSON) ) @@ -44,7 +45,7 @@ void writeCommentWithEmptyContent() throws Exception { .build(); // when // then - mockMvc.perform(post("/v1/talk-rooms/1/comments") + mockMvc.perform(post("/v1/1/comments") .content(objectMapper.writeValueAsString(request)) .contentType(APPLICATION_JSON) ) @@ -63,7 +64,7 @@ void editComment() throws Exception { .build(); // when // then - mockMvc.perform(patch("/v1/talk-rooms/comments/1") + mockMvc.perform(patch("/v1/comments/1") .content(objectMapper.writeValueAsString(request)) .contentType(APPLICATION_JSON) ) @@ -78,7 +79,21 @@ void editComment() throws Exception { @DisplayName("의견을 작성한 유저가 자신의 의견을 삭제한다.") void deleteComment() throws Exception { // when // then - mockMvc.perform(delete("/v1/talk-rooms/comments/1") + mockMvc.perform(delete("/v1/comments/1") + .contentType(APPLICATION_JSON) + ) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value("200")) + .andExpect(jsonPath("$.status").value("OK")) + .andExpect(jsonPath("$.message").value("OK")); + } + + @Test + @DisplayName("의견을 조회한다.") + void getComments() throws Exception { + // when // then + mockMvc.perform(get("/v1/1/comments") .contentType(APPLICATION_JSON) ) .andDo(print()) diff --git a/src/test/java/com/jisungin/application/comment/CommentServiceTest.java b/src/test/java/com/jisungin/application/comment/CommentServiceTest.java index 527e8af..260b7d1 100644 --- a/src/test/java/com/jisungin/application/comment/CommentServiceTest.java +++ b/src/test/java/com/jisungin/application/comment/CommentServiceTest.java @@ -5,14 +5,18 @@ import com.jisungin.ServiceTestSupport; import com.jisungin.api.oauth.AuthContext; +import com.jisungin.application.PageResponse; import com.jisungin.application.comment.request.CommentCreateServiceRequest; import com.jisungin.application.comment.request.CommentEditServiceRequest; +import com.jisungin.application.comment.response.CommentQueryResponse; import com.jisungin.application.comment.response.CommentResponse; import com.jisungin.domain.ReadingStatus; import com.jisungin.domain.book.Book; import com.jisungin.domain.book.repository.BookRepository; import com.jisungin.domain.comment.Comment; import com.jisungin.domain.comment.repository.CommentRepository; +import com.jisungin.domain.commentlike.CommentLike; +import com.jisungin.domain.commentlike.repository.CommentLikeRepository; import com.jisungin.domain.oauth.OauthId; import com.jisungin.domain.oauth.OauthType; import com.jisungin.domain.talkroom.TalkRoom; @@ -26,6 +30,8 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -54,11 +60,15 @@ class CommentServiceTest extends ServiceTestSupport { @Autowired TalkRoomImageRepository talkRoomImageRepository; + @Autowired + CommentLikeRepository commentLikeRepository; + @Autowired AuthContext authContext; @AfterEach void tearDown() { + commentLikeRepository.deleteAllInBatch(); commentRepository.deleteAllInBatch(); talkRoomImageRepository.deleteAllInBatch(); talkRoomRoleRepository.deleteAllInBatch(); @@ -122,7 +132,7 @@ void editComment() { authContext.setUserId(user.getId()); // when - CommentResponse response = commentService.editComment(talkRoom.getId(), request, authContext); + CommentResponse response = commentService.editComment(comment.getId(), request, authContext); // then assertThat(response) @@ -154,7 +164,7 @@ void editCommentWithNullContent() { authContext.setUserId(user.getId()); // when - CommentResponse response = commentService.editComment(talkRoom.getId(), request, authContext); + CommentResponse response = commentService.editComment(comment.getId(), request, authContext); // then assertThat(response) @@ -199,7 +209,7 @@ void editCommentWithUserB() { authContext.setUserId(userB.getId()); // when // then - assertThatThrownBy(() -> commentService.editComment(talkRoom.getId(), request, authContext)) + assertThatThrownBy(() -> commentService.editComment(comment.getId(), request, authContext)) .isInstanceOf(BusinessException.class) .hasMessage("권한이 없는 사용자입니다."); } @@ -270,6 +280,94 @@ void deleteCommentWithUserB() { .hasMessage("권한이 없는 사용자입니다."); } + @Test + @DisplayName("의견을 조회한다.") + void findAllComments() throws Exception { + // given + User user = createUser(); + userRepository.save(user); + + Book book = createBook(); + bookRepository.save(book); + + TalkRoom talkRoom = createTalkRoom(book, user); + talkRoomRepository.save(talkRoom); + + createTalkRoomRole(talkRoom); + + List comments = IntStream.range(1, 6) + .mapToObj(i -> Comment.builder() + .talkRoom(talkRoom) + .user(user) + .content("의견 " + i) + .build()) + .collect(Collectors.toList()); + + for (int i = 0; i < 5; i++) { + commentRepository.save(comments.get(i)); + } + + AuthContext authContext = new AuthContext(); + // when + PageResponse response = commentService.findAllComments(talkRoom.getId(), authContext); + + // then + assertThat(5L).isEqualTo(response.getTotalCount()); + assertThat("의견 5").isEqualTo(response.getQueryResponse().get(0).getContent()); + assertThat("의견 4").isEqualTo(response.getQueryResponse().get(1).getContent()); + assertThat("의견 3").isEqualTo(response.getQueryResponse().get(2).getContent()); + assertThat("의견 2").isEqualTo(response.getQueryResponse().get(3).getContent()); + assertThat("의견 1").isEqualTo(response.getQueryResponse().get(4).getContent()); + } + + @Test + @DisplayName("유저가 로그인을 한 상태에서 의견을 조회하면 본인이 좋아요한 의견을 확인할 수 있다.") + void findAllCommentsWithLike() throws Exception { + // given + User user = createUser(); + userRepository.save(user); + + Book book = createBook(); + bookRepository.save(book); + + TalkRoom talkRoom = createTalkRoom(book, user); + talkRoomRepository.save(talkRoom); + + createTalkRoomRole(talkRoom); + + List comments = IntStream.range(1, 6) + .mapToObj(i -> Comment.builder() + .talkRoom(talkRoom) + .user(user) + .content("의견 " + i) + .build()) + .collect(Collectors.toList()); + + for (int i = 0; i < 5; i++) { + commentRepository.save(comments.get(i)); + } + + CommentLike.builder().build(); + List likes = IntStream.range(0, 5).mapToObj(i -> CommentLike.builder() + .user(user) + .comment(comments.get(i)) + .build()).collect(Collectors.toList()); + + commentLikeRepository.saveAll(likes); + + authContext.setUserId(user.getId()); + + // when + PageResponse response = commentService.findAllComments(talkRoom.getId(), authContext); + + // then + assertThat(comments.get(0).getId()).isEqualTo(response.getLikeContents().get(0)); + assertThat(comments.get(1).getId()).isEqualTo(response.getLikeContents().get(1)); + assertThat(comments.get(2).getId()).isEqualTo(response.getLikeContents().get(2)); + assertThat(comments.get(3).getId()).isEqualTo(response.getLikeContents().get(3)); + assertThat(comments.get(4).getId()).isEqualTo(response.getLikeContents().get(4)); + } + private static Comment createComment(User user, TalkRoom talkRoom) { return Comment.builder() .content("의견") diff --git a/src/test/java/com/jisungin/application/talkroom/TalkRoomServiceTest.java b/src/test/java/com/jisungin/application/talkroom/TalkRoomServiceTest.java index 3493010..0bf12a0 100644 --- a/src/test/java/com/jisungin/application/talkroom/TalkRoomServiceTest.java +++ b/src/test/java/com/jisungin/application/talkroom/TalkRoomServiceTest.java @@ -17,7 +17,6 @@ import com.jisungin.domain.book.repository.BookRepository; import com.jisungin.domain.comment.Comment; import com.jisungin.domain.comment.repository.CommentRepository; -import com.jisungin.domain.commentlike.CommentLike; import com.jisungin.domain.commentlike.repository.CommentLikeRepository; import com.jisungin.domain.oauth.OauthId; import com.jisungin.domain.oauth.OauthType; @@ -35,7 +34,6 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import java.util.stream.IntStream; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; @@ -347,7 +345,7 @@ void getTalkRooms() { .build(); // when - PageResponse talkRooms = talkRoomService.findAllTalkRoom(search); + PageResponse talkRooms = talkRoomService.findAllTalkRoom(search, authContext); // then assertThat(10L).isEqualTo(talkRooms.getQueryResponse().size()); @@ -380,7 +378,7 @@ void getTalkRoomsPageTotalCount() { .build(); // when - PageResponse talkRooms = talkRoomService.findAllTalkRoom(search); + PageResponse talkRooms = talkRoomService.findAllTalkRoom(search, authContext); // then assertThat(103).isEqualTo(talkRooms.getTotalCount()); @@ -411,7 +409,7 @@ void getTalkRoomsMiddle() { .build(); // when - PageResponse talkRooms = talkRoomService.findAllTalkRoom(search); + PageResponse talkRooms = talkRoomService.findAllTalkRoom(search, authContext); // then assertThat(talkRooms.getQueryResponse().size()).isEqualTo(10L); @@ -444,7 +442,7 @@ void getTalkRoomsLast() { .build(); // when - PageResponse talkRooms = talkRoomService.findAllTalkRoom(search); + PageResponse talkRooms = talkRoomService.findAllTalkRoom(search, authContext); // then assertThat(talkRooms.getQueryResponse().size()).isEqualTo(3); @@ -466,17 +464,13 @@ void findOneTalkRoom() { createTalkRoomRole(talkRoom); - Comment comment = createComment(talkRoom, user); - - commentRepository.save(comment); // when - TalkRoomFindOneResponse findOneTalkRoomResponse = talkRoomService.findOneTalkRoom(talkRoom.getId()); + TalkRoomFindOneResponse findOneTalkRoomResponse = talkRoomService.findOneTalkRoom(talkRoom.getId(), + authContext); // then assertThat("토크방").isEqualTo(findOneTalkRoomResponse.getTitle()); assertThat(2).isEqualTo(findOneTalkRoomResponse.getReadingStatuses().size()); - assertThat("의견 남기기").isEqualTo(findOneTalkRoomResponse.getComments().get(0).getContent()); - assertThat("user@gmail.com").isEqualTo(findOneTalkRoomResponse.getComments().get(0).getUserName()); } @Test @@ -495,7 +489,8 @@ void findOneTalkRoomWithCommentNull() { createTalkRoomRole(talkRoom); // when - TalkRoomFindOneResponse findOneTalkRoomResponse = talkRoomService.findOneTalkRoom(talkRoom.getId()); + TalkRoomFindOneResponse findOneTalkRoomResponse = talkRoomService.findOneTalkRoom(talkRoom.getId(), + authContext); // then assertThat("토크방").isEqualTo(findOneTalkRoomResponse.getTitle()); @@ -517,24 +512,13 @@ void findOneTalkRoomWithFindAllComment() { createTalkRoomRole(talkRoom); - List comments = IntStream.range(0, 20) - .mapToObj(i -> Comment.builder() - .talkRoom(talkRoom) - .user(user) - .content("의견 " + i) - .build()) - .toList(); - - commentRepository.saveAll(comments); // when - TalkRoomFindOneResponse findOneTalkRoomResponse = talkRoomService.findOneTalkRoom(talkRoom.getId()); + TalkRoomFindOneResponse findOneTalkRoomResponse = talkRoomService.findOneTalkRoom(talkRoom.getId(), + authContext); // then assertThat("토크방").isEqualTo(findOneTalkRoomResponse.getTitle()); assertThat(2).isEqualTo(findOneTalkRoomResponse.getReadingStatuses().size()); - assertThat(20).isEqualTo(findOneTalkRoomResponse.getComments().size()); - assertThat("의견 0").isEqualTo(findOneTalkRoomResponse.getComments().get(0).getContent()); - assertThat("의견 19").isEqualTo(findOneTalkRoomResponse.getComments().get(19).getContent()); } @Test @@ -663,15 +647,15 @@ void findAllTalkRoomWithLikeCount() { .build(); // when - PageResponse response = talkRoomService.findAllTalkRoom(search); + PageResponse response = talkRoomService.findAllTalkRoom(search, authContext); // then assertThat(5L).isEqualTo(response.getQueryResponse().get(9).getLikeCount()); } @Test - @DisplayName("토크방 페이지 조회 시 토크방에 좋아요 누른 사용자 ID들이 프론트에 전송되어야 한다.") - void findAllTalkRoomWithLikeUserId() { + @DisplayName("로그인한 유저가 토크룸을 조회했을 때 본인이 좋아요한 토크룸들이 표시 된다.") + void findAllTalkRoomWithLike() { // given List users = listUsers(); @@ -688,22 +672,12 @@ void findAllTalkRoomWithLikeUserId() { createTalkRoomRole(t); } - List likes1 = IntStream.range(0, 5).mapToObj(i -> TalkRoomLike.builder() - .user(users.get(i)) - .talkRoom(talkRoom.get(0)) - .build()) - .toList(); - - List likes2 = IntStream.range(5, 10).mapToObj(i -> TalkRoomLike.builder() - .user(users.get(i)) + List likes = IntStream.range(0, 5).mapToObj(i -> TalkRoomLike.builder() + .user(users.get(0)) .talkRoom(talkRoom.get(i)) .build()) .toList(); - List likes = new ArrayList<>(); - likes.addAll(likes1); - likes.addAll(likes2); - talkRoomLikeRepository.saveAll(likes); SearchServiceRequest search = SearchServiceRequest.builder() @@ -712,15 +686,16 @@ void findAllTalkRoomWithLikeUserId() { .order("recent") .build(); + authContext.setUserId(users.get(0).getId()); // when - PageResponse response = talkRoomService.findAllTalkRoom(search); + PageResponse response = talkRoomService.findAllTalkRoom(search, authContext); // then - assertThat(users.get(0).getId()).isEqualTo(response.getQueryResponse().get(9).getUserIds().get(0).getUserId()); - assertThat(users.get(1).getId()).isEqualTo(response.getQueryResponse().get(9).getUserIds().get(1).getUserId()); - assertThat(users.get(2).getId()).isEqualTo(response.getQueryResponse().get(9).getUserIds().get(2).getUserId()); - assertThat(users.get(3).getId()).isEqualTo(response.getQueryResponse().get(9).getUserIds().get(3).getUserId()); - assertThat(users.get(4).getId()).isEqualTo(response.getQueryResponse().get(9).getUserIds().get(4).getUserId()); + assertThat(talkRoom.get(0).getId()).isEqualTo(response.getLikeContents().get(0)); + assertThat(talkRoom.get(1).getId()).isEqualTo(response.getLikeContents().get(1)); + assertThat(talkRoom.get(2).getId()).isEqualTo(response.getLikeContents().get(2)); + assertThat(talkRoom.get(3).getId()).isEqualTo(response.getLikeContents().get(3)); + assertThat(talkRoom.get(4).getId()).isEqualTo(response.getLikeContents().get(4)); } @Test @@ -751,14 +726,14 @@ void findOneTalkRoomWithLikeCount() { talkRoomLikeRepository.saveAll(likes); // when - TalkRoomFindOneResponse response = talkRoomService.findOneTalkRoom(talkRoom.get(0).getId()); + TalkRoomFindOneResponse response = talkRoomService.findOneTalkRoom(talkRoom.get(0).getId(), authContext); // then assertThat(5L).isEqualTo(response.getLikeCount()); } @Test - @DisplayName("토크방 단건 조회 시 좋아요한 유저의 ID가 보내진다.") + @DisplayName("토크방 단건 조회 시 로그인한 유저가 토론방에 좋아요를 눌렀으면 토론방 ID값을 리턴해준다.") void findOneTalkRoomWithLikeUserId() { // given List users = listUsers(); @@ -784,51 +759,12 @@ void findOneTalkRoomWithLikeUserId() { talkRoomLikeRepository.saveAll(likes); + authContext.setUserId(users.get(0).getId()); // when - TalkRoomFindOneResponse response = talkRoomService.findOneTalkRoom(talkRoom.get(0).getId()); + TalkRoomFindOneResponse response = talkRoomService.findOneTalkRoom(talkRoom.get(0).getId(), authContext); // then - assertThat(users.get(0).getId()).isEqualTo(response.getUserIds().get(0).getUserId()); - assertThat(users.get(1).getId()).isEqualTo(response.getUserIds().get(1).getUserId()); - assertThat(users.get(2).getId()).isEqualTo(response.getUserIds().get(2).getUserId()); - assertThat(users.get(3).getId()).isEqualTo(response.getUserIds().get(3).getUserId()); - assertThat(users.get(4).getId()).isEqualTo(response.getUserIds().get(4).getUserId()); - } - - @Test - @DisplayName("토크방 단건 조회 시 의견 개수가 표시 된다.") - void findOneTalkRoomWithCommentCount() { - // given - List users = listUsers(); - - userRepository.saveAll(users); - - Book book = createBook(); - bookRepository.save(book); - - List talkRoom = listTalkRooms(20, users.get(0), book); - - talkRoomRepository.saveAll(talkRoom); - - for (TalkRoom t : talkRoom) { - createTalkRoomRole(t); - } - - List comments = IntStream.range(0, 5) - .mapToObj(i -> Comment.builder() - .talkRoom(talkRoom.get(0)) - .user(users.get(0)) - .content("의견 " + i) - .build()) - .collect(Collectors.toList()); - - commentRepository.saveAll(comments); - - // when - TalkRoomFindOneResponse response = talkRoomService.findOneTalkRoom(talkRoom.get(0).getId()); - - // then - assertThat(5L).isEqualTo(response.getCommentCount()); + assertThat(talkRoom.get(0).getId()).isEqualTo(response.getLikeTalkRoomId()); } @Test @@ -875,7 +811,7 @@ void findAllTalkRoomWithOrderLike() { .build(); // when - PageResponse response = talkRoomService.findAllTalkRoom(search); + PageResponse response = talkRoomService.findAllTalkRoom(search, authContext); // then assertThat(10L).isEqualTo(response.getQueryResponse().get(0).getLikeCount()); @@ -950,7 +886,7 @@ void findAllTalkRoomWithSearch() { .build(); // when - PageResponse response = talkRoomService.findAllTalkRoom(search); + PageResponse response = talkRoomService.findAllTalkRoom(search, authContext); // then assertThat(talkRoom1.getTitle()).isEqualTo(response.getQueryResponse().get(0).getTitle()); @@ -958,42 +894,6 @@ void findAllTalkRoomWithSearch() { assertThat(talkRoom3.getTitle()).isEqualTo(response.getQueryResponse().get(2).getTitle()); } - @Test - @DisplayName("토크방 단건 조회 시 의견의 좋아요 개수가 표시 되어야한다.") - void commentLikeCountTest() { - // given - User user = createUser(); - userRepository.save(user); - - Book book = createBook(); - bookRepository.save(book); - - TalkRoom talkRoom = createTalkRoom(book, user); - talkRoomRepository.save(talkRoom); - - createTalkRoomRole(talkRoom); - - Comment comment = createComment(talkRoom, user); - commentRepository.save(comment); - - CommentLike commentLike = CommentLike.builder() - .comment(comment) - .user(user) - .build(); - commentLikeRepository.save(commentLike); - - // when - TalkRoomFindOneResponse findOneTalkRoom = talkRoomService.findOneTalkRoom(talkRoom.getId()); - - // then - assertThat("토크방").isEqualTo(findOneTalkRoom.getTitle()); - assertThat(2).isEqualTo(findOneTalkRoom.getReadingStatuses().size()); - assertThat("의견 남기기").isEqualTo(findOneTalkRoom.getComments().get(0).getContent()); - assertThat("user@gmail.com").isEqualTo(findOneTalkRoom.getComments().get(0).getUserName()); - assertThat(1L).isEqualTo(findOneTalkRoom.getComments().get(0).getCommentLikeCount()); - assertThat(user.getId()).isEqualTo(findOneTalkRoom.getComments().get(0).getUserIds().get(0).getUserId()); - } - @Test @DisplayName("토크룸을 생성 했을 때 이미지 URL을 저장할 수 있다.") void createTalkRoomWithImage() throws Exception { diff --git a/src/test/java/com/jisungin/docs/comment/CommentControllerDocsTest.java b/src/test/java/com/jisungin/docs/comment/CommentControllerDocsTest.java index e39f270..191ae95 100644 --- a/src/test/java/com/jisungin/docs/comment/CommentControllerDocsTest.java +++ b/src/test/java/com/jisungin/docs/comment/CommentControllerDocsTest.java @@ -1,6 +1,7 @@ package com.jisungin.docs.comment; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; @@ -19,11 +20,14 @@ import com.jisungin.api.comment.request.CommentCreateRequest; import com.jisungin.api.comment.request.CommentEditRequest; import com.jisungin.api.oauth.AuthContext; +import com.jisungin.application.PageResponse; import com.jisungin.application.comment.CommentService; import com.jisungin.application.comment.request.CommentCreateServiceRequest; import com.jisungin.application.comment.request.CommentEditServiceRequest; +import com.jisungin.application.comment.response.CommentQueryResponse; import com.jisungin.application.comment.response.CommentResponse; import com.jisungin.docs.RestDocsSupport; +import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; @@ -55,7 +59,7 @@ void createComment() throws Exception { .build()); mockMvc.perform( - RestDocumentationRequestBuilders.post("/v1/talk-rooms/{talkRoomId}/comments", talkRoomId) + RestDocumentationRequestBuilders.post("/v1/{talkRoomId}/comments", talkRoomId) .content(objectMapper.writeValueAsString(request)) .contentType(MediaType.APPLICATION_JSON) ) @@ -89,6 +93,69 @@ void createComment() throws Exception { )); } + @Test + @DisplayName("의견을 조화하는 API") + void getComments() throws Exception { + CommentQueryResponse query = CommentQueryResponse.builder() + .commentId(1L) + .userName("유저 이름") + .content("의견 내용") + .commentLikeCount(0L) + .build(); + + PageResponse response = PageResponse.builder() + .queryResponse(List.of(query)) + .size(50) + .totalCount(1L) + .build(); + + response.addContents(List.of(1L)); + + given(commentService.findAllComments(anyLong(), any(AuthContext.class))) + .willReturn(response); + + mockMvc.perform( + RestDocumentationRequestBuilders.get("/v1/{talkRoomId}/comments", 1L) + .contentType(MediaType.APPLICATION_JSON) + ) + .andDo(print()) + .andExpect(status().isOk()) + .andDo(document("comment/create", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + pathParameters( + parameterWithName("talkRoomId") + .description("토론방 ID") + ), + responseFields( + fieldWithPath("code").type(JsonFieldType.NUMBER) + .description("코드"), + fieldWithPath("status").type(JsonFieldType.STRING) + .description("상태"), + fieldWithPath("message").type(JsonFieldType.STRING) + .description("메시지"), + fieldWithPath("data").type(JsonFieldType.OBJECT) + .description("응답 데이터"), + fieldWithPath("data..queryResponse").type(JsonFieldType.ARRAY) + .description("의견 데이터"), + fieldWithPath("data.queryResponse[].commentId").type(JsonFieldType.NUMBER) + .description("의견 ID"), + fieldWithPath("data.queryResponse[].userName").type(JsonFieldType.STRING) + .description("작성자 이름"), + fieldWithPath("data.queryResponse[].content").type(JsonFieldType.STRING) + .description("의견 내용"), + fieldWithPath("data.queryResponse[].commentLikeCount").type(JsonFieldType.NUMBER) + .description("의견 좋아요 개수"), + fieldWithPath("data.totalCount").type(JsonFieldType.NUMBER) + .description("의견 총 개수"), + fieldWithPath("data.size").type(JsonFieldType.NUMBER) + .description("조회 크기"), + fieldWithPath("data.likeContents").type(JsonFieldType.ARRAY) + .description("로그인한 유저가 좋아요 누른 의견 ID들").optional() + ) + )); + } + @Test @DisplayName("의견을 수정하는 API") void editComment() throws Exception { @@ -105,7 +172,7 @@ void editComment() throws Exception { .build()); mockMvc.perform( - RestDocumentationRequestBuilders.patch("/v1/talk-rooms/comments/{commentId}", commentId) + RestDocumentationRequestBuilders.patch("/v1/comments/{commentId}", commentId) .content(objectMapper.writeValueAsString(request)) .contentType(MediaType.APPLICATION_JSON) ) @@ -145,7 +212,7 @@ void deleteComment() throws Exception { Long commentId = 1L; mockMvc.perform( - RestDocumentationRequestBuilders.delete("/v1/talk-rooms/comments/{commentId}", commentId) + RestDocumentationRequestBuilders.delete("/v1/comments/{commentId}", commentId) ) .andDo(print()) .andExpect(status().isOk()) diff --git a/src/test/java/com/jisungin/docs/talkroom/TalkRoomControllerDocsTest.java b/src/test/java/com/jisungin/docs/talkroom/TalkRoomControllerDocsTest.java index d78d656..3a2ad2e 100644 --- a/src/test/java/com/jisungin/docs/talkroom/TalkRoomControllerDocsTest.java +++ b/src/test/java/com/jisungin/docs/talkroom/TalkRoomControllerDocsTest.java @@ -6,6 +6,7 @@ import static com.jisungin.domain.ReadingStatus.STOP; import static com.jisungin.domain.ReadingStatus.WANT; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; @@ -31,8 +32,6 @@ import com.jisungin.api.talkroom.request.TalkRoomEditRequest; import com.jisungin.application.PageResponse; import com.jisungin.application.SearchServiceRequest; -import com.jisungin.application.comment.response.CommentLikeUserIdResponse; -import com.jisungin.application.comment.response.CommentQueryResponse; import com.jisungin.application.talkroom.TalkRoomService; import com.jisungin.application.talkroom.request.TalkRoomCreateServiceRequest; import com.jisungin.application.talkroom.request.TalkRoomEditServiceRequest; @@ -104,7 +103,7 @@ void crateTalkRoom() throws Exception { fieldWithPath("readingStatus").type(JsonFieldType.ARRAY) .description("참가 조건 -> { 읽고 싶은, 읽는 중, 읽음, 잠시 멈춤, 중단 }"), fieldWithPath("imageUrls").type(JsonFieldType.ARRAY) - .description("이미지 URL") + .description("이미지 URL").optional() ), responseFields( fieldWithPath("code").type(JsonFieldType.NUMBER) @@ -145,12 +144,16 @@ void findAllTalkRooms() throws Exception { .query(null) .build(); - given(talkRoomService.findAllTalkRoom(any(SearchServiceRequest.class))) - .willReturn(PageResponse.builder() - .queryResponse(talkRoomFindAllResponses) - .totalCount(10L) - .size(10) - .build()); + PageResponse response = PageResponse.builder() + .queryResponse(talkRoomFindAllResponses) + .totalCount(10L) + .size(10) + .build(); + + response.addContents(List.of(1L)); + + given(talkRoomService.findAllTalkRoom(any(SearchServiceRequest.class), any(AuthContext.class))) + .willReturn(response); mockMvc.perform( get("/v1/talk-rooms") @@ -210,15 +213,10 @@ void findAllTalkRooms() throws Exception { fieldWithPath("data.queryResponse[].readingStatuses[].readingStatus").type( JsonFieldType.STRING) .description("참가 조건"), - fieldWithPath("data.queryResponse[].userIds").type(JsonFieldType.ARRAY) - .description("좋아요한 사용자 ID와 좋아요가 눌린 토론방 ID").optional(), - fieldWithPath("data.queryResponse[].userIds[].talkRoomId").type(JsonFieldType.NUMBER) - .description("좋아요가 눌린 토론방 ID"), - fieldWithPath("data.queryResponse[].userIds[].userId") - .description("좋아요를 누른 사용자 ID"), fieldWithPath("data.queryResponse[].likeCount").type(JsonFieldType.NUMBER) - .description("좋아요 총 개수") - + .description("좋아요 총 개수"), + fieldWithPath("data.likeContents").type(JsonFieldType.ARRAY) + .description("로그인한 유저가 좋아요한 토론방 ID들").optional() ) )); @@ -227,12 +225,11 @@ void findAllTalkRooms() throws Exception { @Test @DisplayName("토론방을 단건 조회하는 API") void findOneTalkRoom() throws Exception { - TalkRoomFindOneResponse talkRoomFindOneResponse = createFindOneTalkRoom(1L, 1L); + TalkRoomFindOneResponse talkRoomFindOneResponse = createFindOneTalkRoom(1L); talkRoomFindOneResponse.addTalkRoomStatus(createReadingStatuses(1)); - talkRoomFindOneResponse.addTalkRoomComments(createComments()); - talkRoomFindOneResponse.addUserIds(createTalkRoomLikeUserIdResponses()); + talkRoomFindOneResponse.addTalkRoomLikeId(1L); - given(talkRoomService.findOneTalkRoom(any(Long.class))) + given(talkRoomService.findOneTalkRoom(anyLong(), any(AuthContext.class))) .willReturn(talkRoomFindOneResponse); Long request = 1L; @@ -278,32 +275,10 @@ void findOneTalkRoom() throws Exception { fieldWithPath("data.readingStatuses[].readingStatus").type( JsonFieldType.STRING) .description("참가 조건"), - fieldWithPath("data.comments").type(JsonFieldType.ARRAY) - .description("토론방의 달린 의견 데이터"), - fieldWithPath("data.comments[].commentId").type(JsonFieldType.NUMBER) - .description("의견 ID"), - fieldWithPath("data.comments[].userName").type(JsonFieldType.STRING) - .description("의견 생성자 이름"), - fieldWithPath("data.comments[].content").type(JsonFieldType.STRING) - .description("의견 내용"), - fieldWithPath("data.comments[].commentLikeCount").type(JsonFieldType.NUMBER) - .description("의견 좋아요 총 개수"), - fieldWithPath("data.comments[].userIds").type(JsonFieldType.ARRAY) - .description("의견에 좋아요한 사용자 ID와 해당 의견 ID"), - fieldWithPath("data.comments[].userIds[].commentId").type(JsonFieldType.NUMBER) - .description("좋아요가 눌린 의견 ID"), - fieldWithPath("data.comments[].userIds[].userId").type(JsonFieldType.NUMBER) - .description("좋아요를 누른 사용자 ID"), fieldWithPath("data.likeCount").type(JsonFieldType.NUMBER) .description("토론방 좋아요 총 개수"), - fieldWithPath("data.commentCount").type(JsonFieldType.NUMBER) - .description("의견이 달린 개수"), - fieldWithPath("data.userIds").type(JsonFieldType.ARRAY) - .description("좋아요한 사용자 ID와 좋아요가 눌린 토론방 ID").optional(), - fieldWithPath("data.userIds[].talkRoomId").type(JsonFieldType.NUMBER) - .description("좋아요가 눌린 토론방 ID"), - fieldWithPath("data.userIds[].userId") - .description("좋아요를 누른 사용자 ID") + fieldWithPath("data.likeTalkRoomId").type(JsonFieldType.NUMBER) + .description("사용자가 좋아요한 토론방 ID").optional() ) )); } @@ -414,31 +389,6 @@ void deleteTalkRoom() throws Exception { )); } - private List createComments() { - List comments = new ArrayList<>(); - comments.add( - CommentQueryResponse.builder() - .commentId(1L) - .userName("user") - .content("의견 내용") - .commentLikeCount(1L) - .build() - ); - comments.get(0).addLikeUserIds(createCommentLikeUserIdResponses()); - return comments; - } - - private List createCommentLikeUserIdResponses() { - List commentLikeUserIdResponses = new ArrayList<>(); - commentLikeUserIdResponses.add( - CommentLikeUserIdResponse.builder() - .commentId(1L) - .userId(1L) - .build() - ); - return commentLikeUserIdResponses; - } - private List createTalkRoomLikeUserIdResponses() { List talkRoomLikeUserIdResponses = new ArrayList<>(); talkRoomLikeUserIdResponses.add( @@ -450,16 +400,15 @@ private List createTalkRoomLikeUserIdResponses() { return talkRoomLikeUserIdResponses; } - private static TalkRoomFindOneResponse createFindOneTalkRoom(Long likeCount, Long commentCount) { + private static TalkRoomFindOneResponse createFindOneTalkRoom(Long likeCount) { return TalkRoomFindOneResponse.builder() .talkRoomId(1L) - .userName("user") - .title("토론방") + .userName("유저 이름") + .title("토론방 제목") .content("토론방 본문") .bookName("책 제목") .bookImage("책 이미지 URL") .likeCount(likeCount) - .commentCount(commentCount) .build(); } @@ -481,7 +430,6 @@ private List createTalkRoomFindAllResponses() { .build(); roomResponse.addTalkRoomStatus(readingStatuses); - roomResponse.addTalkRoomLikeUserIds(userIds); talkRoomFindAllResponses.add(roomResponse); } diff --git a/src/test/java/com/jisungin/domain/comment/repository/CommentRepositoryImplTest.java b/src/test/java/com/jisungin/domain/comment/repository/CommentRepositoryImplTest.java new file mode 100644 index 0000000..578e9c8 --- /dev/null +++ b/src/test/java/com/jisungin/domain/comment/repository/CommentRepositoryImplTest.java @@ -0,0 +1,184 @@ +package com.jisungin.domain.comment.repository; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.jisungin.RepositoryTestSupport; +import com.jisungin.application.PageResponse; +import com.jisungin.application.comment.response.CommentQueryResponse; +import com.jisungin.domain.ReadingStatus; +import com.jisungin.domain.book.Book; +import com.jisungin.domain.book.repository.BookRepository; +import com.jisungin.domain.comment.Comment; +import com.jisungin.domain.commentlike.repository.CommentLikeRepository; +import com.jisungin.domain.oauth.OauthId; +import com.jisungin.domain.oauth.OauthType; +import com.jisungin.domain.talkroom.TalkRoom; +import com.jisungin.domain.talkroom.TalkRoomRole; +import com.jisungin.domain.talkroom.repository.TalkRoomRepository; +import com.jisungin.domain.talkroom.repository.TalkRoomRoleRepository; +import com.jisungin.domain.talkroomlike.repository.TalkRoomLikeRepository; +import com.jisungin.domain.user.User; +import com.jisungin.domain.user.repository.UserRepository; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class CommentRepositoryImplTest extends RepositoryTestSupport { + + @Autowired + TalkRoomRepository talkRoomRepository; + + @Autowired + TalkRoomRoleRepository talkRoomRoleRepository; + + @Autowired + BookRepository bookRepository; + + @Autowired + UserRepository userRepository; + + @Autowired + CommentRepository commentRepository; + + @Autowired + TalkRoomLikeRepository talkRoomLikeRepository; + + @Autowired + CommentLikeRepository commentLikeRepository; + + @AfterEach + void tearDown() { + commentLikeRepository.deleteAllInBatch(); + talkRoomLikeRepository.deleteAllInBatch(); + commentRepository.deleteAllInBatch(); + talkRoomRoleRepository.deleteAllInBatch(); + talkRoomRepository.deleteAllInBatch(); + userRepository.deleteAllInBatch(); + bookRepository.deleteAllInBatch(); + } + + @Test + @DisplayName("querydsl 의견 조회 테스트") + void findAllComment() throws Exception { + // given + User user = createUser(); + userRepository.save(user); + + Book book = createBook(); + bookRepository.save(book); + + TalkRoom talkRoom = createTalkRoom(book, user); + talkRoomRepository.save(talkRoom); + + createTalkRoomRole(talkRoom); + + Comment comment = createComment(talkRoom, user); + commentRepository.save(comment); + + // when + PageResponse response = commentRepository.findAllComments(talkRoom.getId()); + + // then + assertThat("의견 남기기").isEqualTo(response.getQueryResponse().get(0).getContent()); + assertThat(1L).isEqualTo(response.getTotalCount()); + } + + @Test + @DisplayName("querydsl 의견 여러개 조회 테스트") + void findAllCommentsList() throws Exception { + // given + User user = createUser(); + userRepository.save(user); + + Book book = createBook(); + bookRepository.save(book); + + TalkRoom talkRoom = createTalkRoom(book, user); + talkRoomRepository.save(talkRoom); + + createTalkRoomRole(talkRoom); + + List comments = IntStream.range(1, 6) + .mapToObj(i -> Comment.builder() + .talkRoom(talkRoom) + .user(user) + .content("의견 " + i) + .build()) + .collect(Collectors.toList()); + + for (int i = 0; i < 5; i++) { + commentRepository.save(comments.get(i)); + } + + // when + PageResponse response = commentRepository.findAllComments(talkRoom.getId()); + + // then + assertThat(5L).isEqualTo(response.getTotalCount()); + assertThat("의견 5").isEqualTo(response.getQueryResponse().get(0).getContent()); + assertThat("의견 4").isEqualTo(response.getQueryResponse().get(1).getContent()); + assertThat("의견 3").isEqualTo(response.getQueryResponse().get(2).getContent()); + assertThat("의견 2").isEqualTo(response.getQueryResponse().get(3).getContent()); + assertThat("의견 1").isEqualTo(response.getQueryResponse().get(4).getContent()); + } + + private static Comment createComment(TalkRoom talkRoom, User user) { + return Comment.builder() + .talkRoom(talkRoom) + .user(user) + .content("의견 남기기") + .build(); + } + + private void createTalkRoomRole(TalkRoom talkRoom) { + List request = new ArrayList<>(); + request.add("읽는 중"); + request.add("읽음"); + + List readingStatus = ReadingStatus.createReadingStatus(request); + + readingStatus.stream().map(status -> TalkRoomRole.roleCreate(talkRoom, status)) + .forEach(talkRoomRoleRepository::save); + } + + private static TalkRoom createTalkRoom(Book book, User user) { + return TalkRoom.builder() + .book(book) + .title("토론방") + .content("내용") + .user(user) + .build(); + } + + private static User createUser() { + return User.builder() + .name("user@gmail.com") + .profileImage("image") + .oauthId( + OauthId.builder() + .oauthId("oauthId") + .oauthType(OauthType.KAKAO) + .build() + ) + .build(); + } + + private static Book createBook() { + return Book.builder() + .title("제목") + .content("내용") + .authors("작가") + .isbn("11111") + .publisher("publisher") + .dateTime(LocalDateTime.now()) + .imageUrl("www") + .build(); + } + +} \ No newline at end of file diff --git a/src/test/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryTest.java b/src/test/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryTest.java index 3831f24..2d71515 100644 --- a/src/test/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryTest.java +++ b/src/test/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryTest.java @@ -10,9 +10,7 @@ import com.jisungin.domain.ReadingStatus; import com.jisungin.domain.book.Book; import com.jisungin.domain.book.repository.BookRepository; -import com.jisungin.domain.comment.Comment; import com.jisungin.domain.comment.repository.CommentRepository; -import com.jisungin.domain.commentlike.CommentLike; import com.jisungin.domain.commentlike.repository.CommentLikeRepository; import com.jisungin.domain.oauth.OauthId; import com.jisungin.domain.oauth.OauthType; @@ -25,7 +23,6 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import java.util.stream.IntStream; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; @@ -109,34 +106,6 @@ void pageTest() { assertThat(20).isEqualTo(talkRooms.getTotalCount()); } - @Test - @DisplayName("querydsl 단건 조회 토크방 의견 조회 테스트") - void talkRoomFindOneComment() { - // given - User user = createUser(); - userRepository.save(user); - - Book book = createBook(); - bookRepository.save(book); - - TalkRoom talkRoom = createTalkRoom(book, user); - talkRoomRepository.save(talkRoom); - - createTalkRoomRole(talkRoom); - - Comment comment = createComment(talkRoom, user); - - commentRepository.save(comment); - // when - TalkRoomFindOneResponse findOneTalkRoom = talkRoomRepository.findOneTalkRoom(talkRoom.getId()); - - // then - assertThat("토론방").isEqualTo(findOneTalkRoom.getTitle()); - assertThat(2).isEqualTo(findOneTalkRoom.getReadingStatuses().size()); - assertThat("의견 남기기").isEqualTo(findOneTalkRoom.getComments().get(0).getContent()); - assertThat("user@gmail.com").isEqualTo(findOneTalkRoom.getComments().get(0).getUserName()); - } - @Test @DisplayName("querydsl 좋아요 총 개수 조회") void likeTalkRoomFindCount() { @@ -265,113 +234,6 @@ void findOneTalkRoomWithLikeCount() { assertThat(5L).isEqualTo(response.getLikeCount()); } - @Test - @DisplayName("querydsl 토크방 단건 조회 시 의견 개수 표시 테스트") - void findOneTalkRoomWithCommentCount() { - List users = IntStream.range(0, 10) - .mapToObj(i -> User.builder() - .name("user@gmail.com " + i) - .profileImage("image") - .oauthId( - OauthId.builder() - .oauthId("oauthId " + i) - .oauthType(OauthType.KAKAO) - .build() - ) - .build()).toList(); - - userRepository.saveAll(users); - - Book book = createBook(); - bookRepository.save(book); - - List talkRoom = IntStream.range(0, 20) - .mapToObj(i -> TalkRoom.builder() - .user(users.get(0)) - .book(book) - .title("토론방 " + i) - .content("내용 " + i) - .build()) - .toList(); - - talkRoomRepository.saveAll(talkRoom); - - for (TalkRoom t : talkRoom) { - createTalkRoomRole(t); - } - - List comments = IntStream.range(0, 5) - .mapToObj(i -> Comment.builder() - .talkRoom(talkRoom.get(0)) - .user(users.get(0)) - .content("의견 " + i) - .build()) - .collect(Collectors.toList()); - - commentRepository.saveAll(comments); - - // when - TalkRoomFindOneResponse response = talkRoomRepository.findOneTalkRoom(talkRoom.get(0).getId()); - - // then - assertThat(5L).isEqualTo(response.getCommentCount()); - } - - @Test - @DisplayName("querydsl 토크방 단건 조회 시 좋아요 누른 userId 반환") - void findOneTalkRoomWithUserId() { - // given - List users = IntStream.range(0, 10) - .mapToObj(i -> User.builder() - .name("user@gmail.com " + i) - .profileImage("image") - .oauthId( - OauthId.builder() - .oauthId("oauthId " + i) - .oauthType(OauthType.KAKAO) - .build() - ) - .build()).toList(); - - userRepository.saveAll(users); - - Book book = createBook(); - bookRepository.save(book); - - List talkRoom = IntStream.range(0, 20) - .mapToObj(i -> TalkRoom.builder() - .user(users.get(0)) - .book(book) - .title("토론방 " + i) - .content("내용 " + i) - .build()) - .toList(); - - talkRoomRepository.saveAll(talkRoom); - - for (TalkRoom t : talkRoom) { - createTalkRoomRole(t); - } - - List likes = IntStream.range(0, 5).mapToObj(i -> TalkRoomLike.builder() - .user(users.get(i)) - .talkRoom(talkRoom.get(0)) - .build()) - .toList(); - - talkRoomLikeRepository.saveAll(likes); - - // when - TalkRoomFindOneResponse response = talkRoomRepository.findOneTalkRoom(talkRoom.get(0).getId()); - - // then - assertThat(users.get(0).getId()).isEqualTo(response.getUserIds().get(0).getUserId()); - assertThat(users.get(1).getId()).isEqualTo(response.getUserIds().get(1).getUserId()); - assertThat(users.get(2).getId()).isEqualTo(response.getUserIds().get(2).getUserId()); - assertThat(users.get(3).getId()).isEqualTo(response.getUserIds().get(3).getUserId()); - assertThat(users.get(4).getId()).isEqualTo(response.getUserIds().get(4).getUserId()); - } - @Test @DisplayName("querydsl 좋아요순 정렬 조회") void findAllTalkRoomWithOrderLike() { @@ -535,50 +397,6 @@ void findAllTalkRoomWithSearch() { assertThat(talkRoom3.getTitle()).isEqualTo(response.getQueryResponse().get(2).getTitle()); } - @Test - @DisplayName("querydsl 단건 조회 토크방 의견 좋아요 표시 테스트") - void commentLikeCountTest() { - // given - User user = createUser(); - userRepository.save(user); - - Book book = createBook(); - bookRepository.save(book); - - TalkRoom talkRoom = createTalkRoom(book, user); - talkRoomRepository.save(talkRoom); - - createTalkRoomRole(talkRoom); - - Comment comment = createComment(talkRoom, user); - commentRepository.save(comment); - - CommentLike commentLike = CommentLike.builder() - .comment(comment) - .user(user) - .build(); - commentLikeRepository.save(commentLike); - - // when - TalkRoomFindOneResponse findOneTalkRoom = talkRoomRepository.findOneTalkRoom(talkRoom.getId()); - - // then - assertThat("토론방").isEqualTo(findOneTalkRoom.getTitle()); - assertThat(2).isEqualTo(findOneTalkRoom.getReadingStatuses().size()); - assertThat("의견 남기기").isEqualTo(findOneTalkRoom.getComments().get(0).getContent()); - assertThat("user@gmail.com").isEqualTo(findOneTalkRoom.getComments().get(0).getUserName()); - assertThat(1L).isEqualTo(findOneTalkRoom.getComments().get(0).getCommentLikeCount()); - assertThat(user.getId()).isEqualTo(findOneTalkRoom.getComments().get(0).getUserIds().get(0).getUserId()); - } - - private static Comment createComment(TalkRoom talkRoom, User user) { - return Comment.builder() - .talkRoom(talkRoom) - .user(user) - .content("의견 남기기") - .build(); - } - private void createTalkRoomRole(TalkRoom talkRoom) { List request = new ArrayList<>(); request.add("읽는 중"); diff --git a/src/test/resources/org.springframework/restdocs/templates/path-parameters.snippet b/src/test/resources/org/springframework/restdocs/templates/path-parameters.snippet similarity index 88% rename from src/test/resources/org.springframework/restdocs/templates/path-parameters.snippet rename to src/test/resources/org/springframework/restdocs/templates/path-parameters.snippet index c23456d..503107f 100644 --- a/src/test/resources/org.springframework/restdocs/templates/path-parameters.snippet +++ b/src/test/resources/org/springframework/restdocs/templates/path-parameters.snippet @@ -1,6 +1,6 @@ ==== Request Fields |=== -|Parameter|Description +|파라미터|설명 {{#parameters}} |{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}} diff --git a/src/test/resources/org.springframework/restdocs/templates/query-parameters.snippet b/src/test/resources/org/springframework/restdocs/templates/query-parameters.snippet similarity index 55% rename from src/test/resources/org.springframework/restdocs/templates/query-parameters.snippet rename to src/test/resources/org/springframework/restdocs/templates/query-parameters.snippet index b59f61d..8004402 100644 --- a/src/test/resources/org.springframework/restdocs/templates/query-parameters.snippet +++ b/src/test/resources/org/springframework/restdocs/templates/query-parameters.snippet @@ -1,10 +1,10 @@ -==== Request Fields +===== Request Fields |=== -|Parameter|Optional|Description +|파라미터|필수값|설명 {{#parameters}} |{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}} -|{{#tableCellContent}}{{^optional}}O{{/optional}}{{/tableCellContent}} +|{{#tableCellContent}}{{^optional}}true{{/optional}}{{/tableCellContent}} |{{#tableCellContent}}{{description}}{{/tableCellContent}} {{/parameters}} diff --git a/src/test/resources/org.springframework/restdocs/templates/request-fields.snippet b/src/test/resources/org/springframework/restdocs/templates/request-fields.snippet similarity index 61% rename from src/test/resources/org.springframework/restdocs/templates/request-fields.snippet rename to src/test/resources/org/springframework/restdocs/templates/request-fields.snippet index 96c1a7a..4687fee 100644 --- a/src/test/resources/org.springframework/restdocs/templates/request-fields.snippet +++ b/src/test/resources/org/springframework/restdocs/templates/request-fields.snippet @@ -1,12 +1,12 @@ -==== Request Fields +====== Request Fields |=== -|Path|Type|Optional|Description +|필드명|타입|필수값|설명 {{#fields}} |{{#tableCellContent}}`+{{path}}+`{{/tableCellContent}} |{{#tableCellContent}}`+{{type}}+`{{/tableCellContent}} -|{{#tableCellContent}}{{^optional}}O{{/optional}}{{/tableCellContent}} +|{{#tableCellContent}}{{^optional}}true{{/optional}}{{/tableCellContent}} |{{#tableCellContent}}{{description}}{{/tableCellContent}} {{/fields}} diff --git a/src/test/resources/org.springframework/restdocs/templates/respnse-fields.snippet b/src/test/resources/org/springframework/restdocs/templates/respnse-fields.snippet similarity index 61% rename from src/test/resources/org.springframework/restdocs/templates/respnse-fields.snippet rename to src/test/resources/org/springframework/restdocs/templates/respnse-fields.snippet index f3cc493..0ba0f77 100644 --- a/src/test/resources/org.springframework/restdocs/templates/respnse-fields.snippet +++ b/src/test/resources/org/springframework/restdocs/templates/respnse-fields.snippet @@ -1,14 +1,12 @@ -==== Response Fields +===== Response Fields |=== -|Path|Type|Optional|Description +|필드명|타입|필수값|설명 {{#fields}} - |{{#tableCellContent}}`+{{path}}+`{{/tableCellContent}} |{{#tableCellContent}}`+{{type}}+`{{/tableCellContent}} -|{{#tableCellContent}}{{^optional}}O{{/optional}}{{/tableCellContent}} +|{{#tableCellContent}}{{^optional}}true{{/optional}}{{/tableCellContent}} |{{#tableCellContent}}{{description}}{{/tableCellContent}} - {{/fields}} |=== \ No newline at end of file