Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Refactor] TalkRoom 조회 Query 리펙토링 #63

Merged
merged 3 commits into from
Apr 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions src/main/java/com/jisungin/api/SearchRequest.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.jisungin.api;

import com.jisungin.application.OrderType;
import com.jisungin.application.SearchServiceRequest;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -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")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 정렬 기준에서 "re"를 사용하시는 지 궁금해서 리뷰 남깁니다!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정렬 값이 null이 들어올 시 seach.getOrder() 로 가져오게 되면 예외가 발생하기 때문에 null이면 기본으로 최신순으로 정렬하게 하기 위해 짧게 "re" 값으로 넘겨줬습니다!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"re" 값이 불명확한거 같아서 디폴드 값이 무조건 최신순이라면 default나 recent로 값을 넘겨주어도 되지 않을까요?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

나중에 수정하도록 하겠습니다!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 알겠습니다!

.query(query)
.build();
}

Expand Down
15 changes: 12 additions & 3 deletions src/main/java/com/jisungin/api/comment/CommentController.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -25,21 +28,27 @@ public class CommentController {

private final CommentService commentService;

@PostMapping("/talk-rooms/{talkRoomId}/comments")
@PostMapping("{talkRoomId}/comments")
public ApiResponse<CommentResponse> 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<PageResponse<CommentQueryResponse>> findAllComments(@PathVariable Long talkRoomId,
@Auth AuthContext authContext) {
return ApiResponse.ok(commentService.findAllComments(talkRoomId, authContext));
}

@PatchMapping("/comments/{commentId}")
public ApiResponse<CommentResponse> 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<Void> deleteComment(@PathVariable Long commentId,
@Auth AuthContext authContext) {
commentService.deleteComment(commentId, authContext);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,14 @@ public ApiResponse<TalkRoomResponse> createTalkRoom(@Valid @RequestBody TalkRoom

@GetMapping("/talk-rooms")
public ApiResponse<PageResponse<TalkRoomFindAllResponse>> 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<TalkRoomFindOneResponse> findOneTalkRoom(@PathVariable Long talkRoomId) {
return ApiResponse.ok(talkRoomService.findOneTalkRoom(talkRoomId));
public ApiResponse<TalkRoomFindOneResponse> findOneTalkRoom(@PathVariable Long talkRoomId,
@Auth AuthContext authContext) {
return ApiResponse.ok(talkRoomService.findOneTalkRoom(talkRoomId, authContext));
}

@PatchMapping("/talk-rooms")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,16 @@ public class TalkRoomCreateRequest {
@NotEmpty(message = "참가 조건은 1개 이상 체크해야합니다.")
private List<String> readingStatus = new ArrayList<>();

private List<String> imageUrls = new ArrayList<>();

@Builder
private TalkRoomCreateRequest(String bookIsbn, String title, String content, List<String> readingStatus) {
private TalkRoomCreateRequest(String bookIsbn, String title, String content, List<String> readingStatus,
List<String> imageUrls) {
this.bookIsbn = bookIsbn;
this.title = title;
this.content = content;
this.readingStatus = readingStatus;
this.imageUrls = imageUrls;
}

public TalkRoomCreateServiceRequest toServiceRequest() {
Expand All @@ -43,6 +47,7 @@ public TalkRoomCreateServiceRequest toServiceRequest() {
.title(title)
.content(content)
.readingStatus(readingStatus)
.imageUrls(imageUrls)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,19 @@ public class TalkRoomEditRequest {
@NotEmpty(message = "참가 조건은 1개 이상 체크해야합니다.")
private List<String> readingStatus = new ArrayList<>();

private List<String> newImage = new ArrayList<>();

private List<String> removeImage = new ArrayList<>();

@Builder
private TalkRoomEditRequest(Long id, String title, String content, List<String> readingStatus) {
private TalkRoomEditRequest(Long id, String title, String content, List<String> readingStatus,
List<String> newImage, List<String> removeImage) {
this.id = id;
this.title = title;
this.content = content;
this.readingStatus = readingStatus;
this.newImage = newImage;
this.removeImage = removeImage;
}

public TalkRoomEditServiceRequest toServiceRequest() {
Expand All @@ -38,6 +45,8 @@ public TalkRoomEditServiceRequest toServiceRequest() {
.title(title)
.content(content)
.readingStatus(readingStatus)
.newImage(newImage)
.removeImage(removeImage)
.build();
}

Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/jisungin/application/PageResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,17 @@ public class PageResponse<T> {

private int size;

private List<Long> likeContents;

@Builder
private PageResponse(List<T> queryResponse, long totalCount, int size) {
this.queryResponse = queryResponse;
this.totalCount = totalCount;
this.size = size;
}

public void addContents(List<Long> contents) {
this.likeContents = contents;
}

}
10 changes: 5 additions & 5 deletions src/main/java/com/jisungin/application/SearchServiceRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/com/jisungin/application/comment/CommentService.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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) {
Expand All @@ -40,6 +45,17 @@ public CommentResponse writeComment(CommentCreateServiceRequest request, Long ta
return CommentResponse.of(comment.getContent(), user.getName());
}

public PageResponse<CommentQueryResponse> findAllComments(Long talkRoomId, AuthContext authContext) {
PageResponse<CommentQueryResponse> response = commentRepository.findAllComments(talkRoomId);

if (authContext.getUserId() != null) {
List<Long> 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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -15,7 +13,6 @@ public class CommentQueryResponse {
private String userName;
private String content;
private Long commentLikeCount;
private List<CommentLikeUserIdResponse> userIds = new ArrayList<>();

@Builder
@QueryProjection
Expand All @@ -26,8 +23,4 @@ public CommentQueryResponse(Long commentId, String userName, String content, Lon
this.commentLikeCount = commentLikeCount;
}

public void addLikeUserIds(List<CommentLikeUserIdResponse> userIds) {
this.userIds = userIds;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
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.repository.TalkRoomLikeRepository;
import com.jisungin.domain.user.User;
import com.jisungin.domain.user.repository.UserRepository;
import com.jisungin.exception.BusinessException;
Expand All @@ -35,6 +38,8 @@ public class TalkRoomService {
private final BookRepository bookRepository;
private final UserRepository userRepository;
private final CommentRepository commentRepository;
private final TalkRoomImageRepository talkRoomImageRepository;
private final TalkRoomLikeRepository talkRoomLikeRepository;

@Transactional
public TalkRoomResponse createTalkRoom(TalkRoomCreateServiceRequest request, AuthContext authContext) {
Expand All @@ -51,20 +56,49 @@ 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<String> imageUrls = talkRoomImageRepository.findByTalkRoomIdWithImageUrl(
talkRoom.getId());

response.addTalkRoomImages(imageUrls);
}

return response;
}

public PageResponse<TalkRoomFindAllResponse> findAllTalkRoom(SearchServiceRequest search) {
return talkRoomRepository.findAllTalkRoom(search);
public PageResponse<TalkRoomFindAllResponse> findAllTalkRoom(SearchServiceRequest search, AuthContext authContext) {
PageResponse<TalkRoomFindAllResponse> response = talkRoomRepository.findAllTalkRoom(search.getOffset(),
search.getSize(), search.getOrder(),
search.getQuery());

if (authContext.getUserId() != null) {
List<Long> 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
Expand All @@ -87,8 +121,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);
}
Comment on lines +124 to +132
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 if문이 어떤 동작을 하는지 간단하게 설명 부탁드립니다 !

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

유저가 토론방을 수정할 때, 새로운 이미지를 추가하고 기존에 있던 이미지를 삭제 할때 if문으로 새로운 이미지 혹은 삭제된 이미지 url이 있는지 체크를 하고 있다면 로직을 수행하도록 했습니다!


TalkRoomResponse response = TalkRoomResponse.of(user.getName(), talkRoom.getTitle(),
talkRoom.getContent(), readingStatus,
talkRoom.getBook().getImageUrl(), talkRoom.getBook().getTitle());

List<String> images = talkRoomImageRepository.findByTalkRoomIdWithImageUrl(talkRoom.getId());
response.addTalkRoomImages(images);

return response;
}

@Transactional
Expand All @@ -105,6 +155,10 @@ public void deleteTalkRoom(Long talkRoomId, AuthContext authContext) {

commentRepository.findByTalkRoom(talkRoom).ifPresent(commentRepository::delete);

List<TalkRoomImage> images = talkRoomImageRepository.findByTalkRoom(talkRoom);
if (images != null) {
talkRoomImageRepository.deleteAll(images);
}
talkRoomRoleRepository.deleteAllByTalkRoom(talkRoom);
talkRoomRepository.delete(talkRoom);
}
Expand Down
Loading
Loading