Skip to content

Commit

Permalink
Merge pull request #125 from jisung-in/feature/124-get-talk-rooms-ret…
Browse files Browse the repository at this point in the history
…urn-slice

[Refactor] 토크룸 목록 조회 API Slice로 리턴하도록 수정
  • Loading branch information
jwooo authored Jul 9, 2024
2 parents 4a6c90a + 335d014 commit 4909ca1
Show file tree
Hide file tree
Showing 16 changed files with 290 additions and 283 deletions.
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

0 comments on commit 4909ca1

Please sign in to comment.