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] 토크룸 목록 조회 API Slice로 리턴하도록 수정 #125

Merged
merged 16 commits into from
Jul 9, 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: 8 additions & 7 deletions src/main/java/com/jisungin/api/talkroom/TalkRoomController.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
import com.jisungin.api.talkroom.request.TalkRoomEditRequest;
import com.jisungin.application.OffsetLimit;
import com.jisungin.application.PageResponse;
import com.jisungin.application.SliceResponse;
import com.jisungin.application.talkroom.TalkRoomService;
import com.jisungin.application.talkroom.request.TalkRoomSearchCondition;
import com.jisungin.application.talkroom.request.UserTalkRoomSearchCondition;
import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse;
import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse;
import com.jisungin.application.talkroom.response.TalkRoomRelatedBookResponse;
Expand Down Expand Up @@ -49,7 +52,7 @@ public ApiResponse<TalkRoomFindOneResponse> createTalkRoom(@Valid @RequestBody T
}

@GetMapping("/talk-rooms")
public ApiResponse<PageResponse<TalkRoomFindAllResponse>> findAllTalkRoom(
public ApiResponse<SliceResponse<TalkRoomFindAllResponse>> findAllTalkRoom(
@RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
@RequestParam(value = "size", required = false, defaultValue = "10") Integer size,
@RequestParam(value = "order", required = false, defaultValue = "recent") String order,
Expand All @@ -58,9 +61,8 @@ public ApiResponse<PageResponse<TalkRoomFindAllResponse>> findAllTalkRoom(
) {
LocalDateTime now = LocalDateTime.now();

return ApiResponse.ok(
talkRoomService.findAllTalkRoom(OffsetLimit.of(page, size, order), search, day,
now));
return ApiResponse.ok(talkRoomService.findAllTalkRoom(OffsetLimit.of(page, size, order),
TalkRoomSearchCondition.of(search, day), now));
}

@GetMapping("/talk-rooms/{talkRoomId}")
Expand Down Expand Up @@ -98,9 +100,8 @@ public ApiResponse<PageResponse<TalkRoomFindAllResponse>> findUserTalkRoom(
@RequestParam(value = "likedFilter", required = false) boolean likedFilter,
@Auth Long userId
) {
return ApiResponse.ok(
talkRoomService.findUserTalkRoom(OffsetLimit.of(page, size), userTalkRoomsFilter, commentedFilter,
likedFilter, userId));
return ApiResponse.ok(talkRoomService.findUserTalkRoom(OffsetLimit.of(page, size),
UserTalkRoomSearchCondition.of(userTalkRoomsFilter, commentedFilter, likedFilter), userId));
}

}
30 changes: 30 additions & 0 deletions src/main/java/com/jisungin/application/SliceResponse.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.jisungin.application;

import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.ArrayList;
import java.util.List;
import lombok.Builder;
import lombok.Getter;
Expand Down Expand Up @@ -33,6 +34,27 @@ private SliceResponse(List<T> content, boolean hasContent, boolean first, boolea
this.size = size;
}

public static <T> SliceResponse<T> of(List<T> content, Integer offset, Integer limit) {
List<T> response = validateContent(content, limit);

boolean hasContent = !response.isEmpty();
boolean first = (offset == 0);
boolean last = isLast(content, limit);

Integer number = (offset / limit) + 1;
Integer size = response.size();

return SliceResponse.<T>builder()
.content(response)
.hasContent(hasContent)
.first(first)
.last(last)
.number(number)
.size(size)
.build();
}


public static <T> SliceResponse<T> of(List<T> content, Integer offset, Integer limit, boolean hasNext) {
boolean hasContent = !content.isEmpty();
boolean first = (offset == 0);
Expand All @@ -51,4 +73,12 @@ public static <T> SliceResponse<T> of(List<T> content, Integer offset, Integer l
.build();
}

private static <T> List<T> validateContent(List<T> content, Integer limit) {
return content.size() > limit ? content.subList(0, limit) : content;
}

private static <T> boolean isLast(List<T> content, Integer limit) {
return content.size() <= limit;
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.jisungin.application.book.response;

import com.jisungin.application.talkroom.response.TalkRoomQueryResponse;
import com.jisungin.application.talkroom.response.TalkRoomQueryEntity;
import com.jisungin.domain.ReadingStatus;
import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -33,7 +33,7 @@ public BookRelatedTalkRoomResponse(Long id, String profileImage, String username
this.readingStatuses = readingStatuses;
}

public static List<BookRelatedTalkRoomResponse> create(List<TalkRoomQueryResponse> talkRooms,
public static List<BookRelatedTalkRoomResponse> create(List<TalkRoomQueryEntity> talkRooms,
Map<Long, List<ReadingStatus>> readingStatuses) {
return talkRooms.stream()
.map(talkRoom -> {
Expand All @@ -54,7 +54,7 @@ public static List<BookRelatedTalkRoomResponse> create(List<TalkRoomQueryRespons
}

private static List<String> extractReadingStatuses(Map<Long, List<ReadingStatus>> readingStatuses,
TalkRoomQueryResponse talkRoom) {
TalkRoomQueryEntity talkRoom) {
return readingStatuses.get(talkRoom.getId()).stream()
.map(ReadingStatus::getText)
.toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@

import com.jisungin.application.OffsetLimit;
import com.jisungin.application.PageResponse;
import com.jisungin.application.SliceResponse;
import com.jisungin.application.talkroom.request.TalkRoomCreateServiceRequest;
import com.jisungin.application.talkroom.request.TalkRoomEditServiceRequest;
import com.jisungin.application.talkroom.request.TalkRoomSearchCondition;
import com.jisungin.application.talkroom.request.UserTalkRoomSearchCondition;
import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse;
import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse;
import com.jisungin.application.talkroom.response.TalkRoomQueryResponse;
import com.jisungin.application.talkroom.response.TalkRoomQueryEntity;
import com.jisungin.application.talkroom.response.TalkRoomRelatedBookResponse;
import com.jisungin.domain.ReadingStatus;
import com.jisungin.domain.book.Book;
Expand Down Expand Up @@ -45,10 +48,10 @@ public PageResponse<TalkRoomRelatedBookResponse> findBookTalkRooms(String isbn,
Book book = bookRepository.findById(isbn)
.orElseThrow(() -> new BusinessException(ErrorCode.BOOK_NOT_FOUND));

List<TalkRoomQueryResponse> talkRooms = talkRoomRepository.findTalkRoomsRelatedBook(book.getIsbn(),
List<TalkRoomQueryEntity> talkRooms = talkRoomRepository.findTalkRoomsRelatedBook(book.getIsbn(),
offsetLimit.getOffset(), offsetLimit.getLimit());

List<Long> talkRoomIds = talkRooms.stream().map(TalkRoomQueryResponse::getId).toList();
List<Long> talkRoomIds = talkRooms.stream().map(TalkRoomQueryEntity::getId).toList();
Map<Long, List<ReadingStatus>> readingStatusesMap = talkRoomRoleRepository.findTalkRoomRoleByIds(talkRoomIds);

Long totalCount = talkRoomRepository.countTalkRoomsRelatedBook(isbn);
Expand Down Expand Up @@ -86,27 +89,25 @@ public TalkRoomFindOneResponse createTalkRoom(TalkRoomCreateServiceRequest reque
return TalkRoomFindOneResponse.of(talkRoom, book, user, imageUrls, readingStatus);
}

public PageResponse<TalkRoomFindAllResponse> findAllTalkRoom(OffsetLimit offsetLimit, String search, String day,
LocalDateTime now
public SliceResponse<TalkRoomFindAllResponse> findAllTalkRoom(OffsetLimit offsetLimit,
TalkRoomSearchCondition condition,
LocalDateTime now
) {
List<TalkRoomQueryResponse> talkRooms = talkRoomRepository.findAllTalkRoom(offsetLimit.getOffset(),
offsetLimit.getLimit(), offsetLimit.getOrder(), search, day, now);

List<Long> talkRoomIds = talkRooms.stream().map(TalkRoomQueryResponse::getId).toList();
List<TalkRoomQueryEntity> talkRooms = talkRoomRepository.findAllTalkRoom(offsetLimit.getOffset(),
offsetLimit.getLimit(), offsetLimit.getOrder(), condition.getSearch(), condition.getDay(), now);

List<Long> talkRoomIds = talkRooms.stream().map(TalkRoomQueryEntity::getId).toList();
Map<Long, List<ReadingStatus>> talkRoomRoleMap = talkRoomRoleRepository.findTalkRoomRoleByIds(talkRoomIds);

Long totalCount = talkRoomRepository.countTalkRooms(search, day, now);

return PageResponse.of(talkRooms.size(), totalCount,
TalkRoomFindAllResponse.toList(talkRooms, talkRoomRoleMap));
return SliceResponse.of(TalkRoomFindAllResponse.toList(talkRooms, talkRoomRoleMap), offsetLimit.getOffset(),
offsetLimit.getLimit());
}

public TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId) {
TalkRoom talkRoom = talkRoomRepository.findById(talkRoomId)
.orElseThrow(() -> new BusinessException(ErrorCode.TALK_ROOM_NOT_FOUND));

TalkRoomQueryResponse queryTalkRoom = talkRoomRepository.findOneTalkRoom(talkRoom.getId());
TalkRoomQueryEntity queryTalkRoom = talkRoomRepository.findOneTalkRoom(talkRoom.getId());

List<ReadingStatus> readingStatuses = talkRoomRoleRepository.findTalkRoomRoleByTalkRoomId(
queryTalkRoom.getId());
Expand Down Expand Up @@ -170,24 +171,21 @@ public void deleteTalkRoom(Long talkRoomId, Long userId) {
talkRoomRepository.delete(talkRoom);
}

public PageResponse<TalkRoomFindAllResponse> findUserTalkRoom(OffsetLimit offsetLimit, boolean userTalkRoomsFilter,
boolean commentedFilter, boolean likedFilter,
Long userId
public PageResponse<TalkRoomFindAllResponse> findUserTalkRoom(OffsetLimit offsetLimit,
UserTalkRoomSearchCondition condition, Long userId
) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND));

List<TalkRoomQueryResponse> findTalkRoom = talkRoomRepository.findByTalkRoomOwner(offsetLimit.getOffset(),
offsetLimit.getLimit(),
userTalkRoomsFilter, commentedFilter,
likedFilter,
user.getId());
List<TalkRoomQueryEntity> findTalkRoom = talkRoomRepository.findByTalkRoomOwner(offsetLimit.getOffset(),
offsetLimit.getLimit(), condition.isUserTalkRoomFilter(), condition.isCommentedFilter(),
condition.isLikedFilter(), user.getId());

Map<Long, List<ReadingStatus>> talkRoomRoleMap = talkRoomRoleRepository.findTalkRoomRoleByIds(
findTalkRoom.stream().map(TalkRoomQueryResponse::getId).toList());
findTalkRoom.stream().map(TalkRoomQueryEntity::getId).toList());

Long totalCount = talkRoomRepository.countTalkRoomsByUserId(user.getId(), userTalkRoomsFilter, commentedFilter,
likedFilter);
Long totalCount = talkRoomRepository.countTalkRoomsByUserId(user.getId(), condition.isUserTalkRoomFilter(),
condition.isCommentedFilter(), condition.isLikedFilter());

return PageResponse.of(findTalkRoom.size(), totalCount,
TalkRoomFindAllResponse.toList(findTalkRoom, talkRoomRoleMap));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.jisungin.application.talkroom.request;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class TalkRoomSearchCondition {

private String search;
private String day;

@Builder
private TalkRoomSearchCondition(String search, String day) {
this.search = search;
this.day = day;
}

public static TalkRoomSearchCondition of(String search, String day) {
return TalkRoomSearchCondition.builder()
.search(search)
.day(day)
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.jisungin.application.talkroom.request;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class UserTalkRoomSearchCondition {

private boolean userTalkRoomFilter;
private boolean commentedFilter;
private boolean likedFilter;

@Builder
private UserTalkRoomSearchCondition(boolean userTalkRoomFilter, boolean commentedFilter, boolean likedFilter) {
this.userTalkRoomFilter = userTalkRoomFilter;
this.commentedFilter = commentedFilter;
this.likedFilter = likedFilter;
}

public static UserTalkRoomSearchCondition of(boolean userTalkRoomFilter, boolean commentedFilter, boolean likedFilter) {
return UserTalkRoomSearchCondition.builder()
.userTalkRoomFilter(userTalkRoomFilter)
.commentedFilter(commentedFilter)
.likedFilter(likedFilter)
.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ private TalkRoomFindAllResponse(Long id, String profileImage, String username, S
this.creatorId = creatorId;
}

public static TalkRoomFindAllResponse of(TalkRoomQueryResponse talkRoom, List<ReadingStatus> readingStatuses) {
public static TalkRoomFindAllResponse of(TalkRoomQueryEntity talkRoom, List<ReadingStatus> readingStatuses) {
return TalkRoomFindAllResponse.builder()
.id(talkRoom.getId())
.profileImage(talkRoom.getProfileImage())
Expand All @@ -62,7 +62,7 @@ public static TalkRoomFindAllResponse of(TalkRoomQueryResponse talkRoom, List<Re
.build();
}

public static List<TalkRoomFindAllResponse> toList(List<TalkRoomQueryResponse> talkRooms,
public static List<TalkRoomFindAllResponse> toList(List<TalkRoomQueryEntity> talkRooms,
Map<Long, List<ReadingStatus>> readingStatuses) {
return talkRooms.stream()
.map(talkRoom -> TalkRoomFindAllResponse.of(talkRoom, readingStatuses.get(talkRoom.getId())))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public static TalkRoomFindOneResponse of(TalkRoom talkRoom, Book book, User user
.build();
}

public static TalkRoomFindOneResponse of(TalkRoomQueryResponse talkRoom, List<String> images,
public static TalkRoomFindOneResponse of(TalkRoomQueryEntity talkRoom, List<String> images,
List<ReadingStatus> readingStatuses) {
return TalkRoomFindOneResponse.builder()
.id(talkRoom.getId())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

@Getter
@NoArgsConstructor
public class TalkRoomQueryResponse {
public class TalkRoomQueryEntity {

private Long id;
private String profileImage;
Expand All @@ -25,9 +25,9 @@ public class TalkRoomQueryResponse {

@Builder
@QueryProjection
public TalkRoomQueryResponse(Long id, String profileImage, String username, String title, String content,
String bookIsbn, String bookName, String bookAuthor, String bookThumbnail,
Long likeCount, LocalDateTime registeredDateTime, Long creatorId) {
public TalkRoomQueryEntity(Long id, String profileImage, String username, String title, String content,
String bookIsbn, String bookName, String bookAuthor, String bookThumbnail,
Long likeCount, LocalDateTime registeredDateTime, Long creatorId) {
this.id = id;
this.profileImage = profileImage;
this.username = username;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ private TalkRoomRelatedBookResponse(Long id, String profileImage, String usernam
this.creatorId = creatorId;
}

public static TalkRoomRelatedBookResponse of(TalkRoomQueryResponse talkRoom,
public static TalkRoomRelatedBookResponse of(TalkRoomQueryEntity talkRoom,
List<ReadingStatus> readingStatuses) {
return TalkRoomRelatedBookResponse.builder()
.id(talkRoom.getId())
Expand All @@ -55,7 +55,7 @@ public static TalkRoomRelatedBookResponse of(TalkRoomQueryResponse talkRoom,
.build();
}

public static List<TalkRoomRelatedBookResponse> toList(List<TalkRoomQueryResponse> talkRooms,
public static List<TalkRoomRelatedBookResponse> toList(List<TalkRoomQueryEntity> talkRooms,
Map<Long, List<ReadingStatus>> readingStatusesMap) {
return talkRooms.stream()
.map(talkRoom -> TalkRoomRelatedBookResponse.of(talkRoom, readingStatusesMap.get(talkRoom.getId())))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.jisungin.domain.talkroom.repository;

import static com.jisungin.domain.talkroom.QTalkRoom.talkRoom;
import static com.jisungin.domain.talkroomlike.QTalkRoomLike.talkRoomLike;

import com.querydsl.core.types.OrderSpecifier;
import java.util.function.Supplier;

public enum TalkRoomOrderType {

DEFAULT(() -> OrderByNull.DEFAULT),
RECENT(talkRoom.createDateTime::desc),
RECOMMEND(() -> talkRoomLike.count().desc());

private final Supplier<OrderSpecifier<?>> orderSpecifierSupplier;

TalkRoomOrderType(Supplier<OrderSpecifier<?>> orderSpecifierSupplier) {
this.orderSpecifierSupplier = orderSpecifierSupplier;
}

public static OrderSpecifier<?> getOrderSpecifierByName(String name) {
try {
return TalkRoomOrderType.valueOf(name.toUpperCase()).getOrderSpecifier();
} catch (IllegalArgumentException | NullPointerException e) {
return TalkRoomOrderType.DEFAULT.getOrderSpecifier();
}
}

private OrderSpecifier<?> getOrderSpecifier() {
return orderSpecifierSupplier.get();
}

}
Loading
Loading