Skip to content

Commit 0280451

Browse files
authored
Merge pull request #35 from jisung-in/feature/33-talkroom-findOne-api
[Feature] TalkRoom 단건 조회 API 구현
2 parents e120dee + 86f891e commit 0280451

File tree

11 files changed

+342
-81
lines changed

11 files changed

+342
-81
lines changed

src/main/java/com/jisungin/api/talkroom/TalkRoomController.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
import com.jisungin.api.talkroom.request.TalkRoomSearchRequest;
99
import com.jisungin.application.response.PageResponse;
1010
import com.jisungin.application.talkroom.TalkRoomService;
11-
import com.jisungin.application.talkroom.response.TalkRoomQueryResponse;
11+
import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse;
12+
import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse;
1213
import com.jisungin.application.talkroom.response.TalkRoomResponse;
1314
import jakarta.validation.Valid;
1415
import lombok.RequiredArgsConstructor;
1516
import org.springframework.web.bind.annotation.GetMapping;
1617
import org.springframework.web.bind.annotation.ModelAttribute;
1718
import org.springframework.web.bind.annotation.PatchMapping;
19+
import org.springframework.web.bind.annotation.PathVariable;
1820
import org.springframework.web.bind.annotation.PostMapping;
1921
import org.springframework.web.bind.annotation.RequestBody;
2022
import org.springframework.web.bind.annotation.RequestMapping;
@@ -35,8 +37,14 @@ public ApiResponse<TalkRoomResponse> createTalkRoom(@Valid @RequestBody TalkRoom
3537
}
3638

3739
@GetMapping("/talk-rooms")
38-
public ApiResponse<PageResponse<TalkRoomQueryResponse>> getTalkRooms(@ModelAttribute TalkRoomSearchRequest search) {
39-
return ApiResponse.ok(talkRoomService.getTalkRooms(search.toService()));
40+
public ApiResponse<PageResponse<TalkRoomFindAllResponse>> findAllTalkRoom(
41+
@ModelAttribute TalkRoomSearchRequest search) {
42+
return ApiResponse.ok(talkRoomService.findAllTalkRoom(search.toService()));
43+
}
44+
45+
@GetMapping("/talk-room/{talkRoomId}")
46+
public ApiResponse<TalkRoomFindOneResponse> findOneTalkRoom(@PathVariable Long talkRoomId) {
47+
return ApiResponse.ok(talkRoomService.findOneTalkRoom(talkRoomId));
4048
}
4149

4250
@PatchMapping("/talk-rooms")

src/main/java/com/jisungin/application/talkroom/TalkRoomService.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
import com.jisungin.application.talkroom.request.TalkRoomCreateServiceRequest;
55
import com.jisungin.application.talkroom.request.TalkRoomEditServiceRequest;
66
import com.jisungin.application.talkroom.request.TalkRoomSearchServiceRequest;
7-
import com.jisungin.application.talkroom.response.TalkRoomQueryResponse;
7+
import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse;
8+
import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse;
89
import com.jisungin.application.talkroom.response.TalkRoomResponse;
910
import com.jisungin.domain.ReadingStatus;
1011
import com.jisungin.domain.book.Book;
@@ -52,15 +53,22 @@ public TalkRoomResponse createTalkRoom(TalkRoomCreateServiceRequest request, Lon
5253
book.getImageUrl(), book.getTitle());
5354
}
5455

55-
public PageResponse<TalkRoomQueryResponse> getTalkRooms(TalkRoomSearchServiceRequest search) {
56-
return talkRoomRepository.getTalkRooms(search);
56+
public PageResponse<TalkRoomFindAllResponse> findAllTalkRoom(TalkRoomSearchServiceRequest search) {
57+
return talkRoomRepository.findAllTalkRoom(search);
58+
}
59+
60+
public TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId) {
61+
TalkRoom talkRoom = talkRoomRepository.findById(talkRoomId)
62+
.orElseThrow(() -> new BusinessException(ErrorCode.TALK_ROOM_NOT_FOUND));
63+
64+
return talkRoomRepository.findOneTalkRoom(talkRoom.getId());
5765
}
5866

5967
@Transactional
6068
public TalkRoomResponse editTalkRoom(TalkRoomEditServiceRequest request, Long userId) {
6169
User user = userRepository.findById(userId)
6270
.orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND));
63-
71+
6472
TalkRoom talkRoom = talkRoomRepository.findByIdWithUserAndBook(request.getId());
6573

6674
if (!talkRoom.isTalkRoomOwner(user.getId())) {

src/main/java/com/jisungin/application/talkroom/response/TalkRoomQueryResponse.java renamed to src/main/java/com/jisungin/application/talkroom/response/TalkRoomFindAllResponse.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
@Getter
1111
@NoArgsConstructor
12-
public class TalkRoomQueryResponse {
12+
public class TalkRoomFindAllResponse {
1313

1414
private Long talkRoomId;
1515
private String userName;
@@ -21,8 +21,8 @@ public class TalkRoomQueryResponse {
2121

2222
@Builder
2323
@QueryProjection
24-
public TalkRoomQueryResponse(Long talkRoomId, String userName, String title, String content, String bookName,
25-
String bookImage) {
24+
public TalkRoomFindAllResponse(Long talkRoomId, String userName, String title, String content, String bookName,
25+
String bookImage) {
2626
this.talkRoomId = talkRoomId;
2727
this.userName = userName;
2828
this.title = title;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.jisungin.application.talkroom.response;
2+
3+
import com.querydsl.core.annotations.QueryProjection;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
@Getter
11+
@NoArgsConstructor
12+
public class TalkRoomFindOneResponse {
13+
14+
private Long talkRoomId;
15+
private String userName;
16+
private String title;
17+
private String content;
18+
private String bookName;
19+
private String bookImage;
20+
private List<TalkRoomQueryReadingStatus> readingStatuses = new ArrayList<>();
21+
private List<TalkRoomQueryComments> comments = new ArrayList<>();
22+
23+
@Builder
24+
@QueryProjection
25+
public TalkRoomFindOneResponse(Long talkRoomId, String userName, String title, String content, String bookName,
26+
String bookImage) {
27+
this.talkRoomId = talkRoomId;
28+
this.userName = userName;
29+
this.title = title;
30+
this.content = content;
31+
this.bookName = bookName;
32+
this.bookImage = bookImage;
33+
}
34+
35+
public void addTalkRoomStatus(List<TalkRoomQueryReadingStatus> readingStatuses) {
36+
this.readingStatuses = readingStatuses;
37+
}
38+
39+
public void addTalkRoomComments(List<TalkRoomQueryComments> comments) {
40+
this.comments = comments;
41+
}
42+
43+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.jisungin.application.talkroom.response;
2+
3+
import com.querydsl.core.annotations.QueryProjection;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
public class TalkRoomQueryComments {
11+
12+
private Long commentId;
13+
private String userName;
14+
private String content;
15+
16+
@Builder
17+
@QueryProjection
18+
public TalkRoomQueryComments(Long commentId, String userName, String content) {
19+
this.commentId = commentId;
20+
this.userName = userName;
21+
this.content = content;
22+
}
23+
24+
}

src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryCustom.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import com.jisungin.application.response.PageResponse;
44
import com.jisungin.application.talkroom.request.TalkRoomSearchServiceRequest;
5-
import com.jisungin.application.talkroom.response.TalkRoomQueryResponse;
5+
import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse;
6+
import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse;
67

78
public interface TalkRoomRepositoryCustom {
89

9-
PageResponse<TalkRoomQueryResponse> getTalkRooms(TalkRoomSearchServiceRequest search);
10+
PageResponse<TalkRoomFindAllResponse> findAllTalkRoom(TalkRoomSearchServiceRequest search);
1011

12+
TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId);
1113
}

src/main/java/com/jisungin/domain/talkroom/repository/TalkRoomRepositoryImpl.java

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
package com.jisungin.domain.talkroom.repository;
22

33
import static com.jisungin.domain.book.QBook.book;
4+
import static com.jisungin.domain.comment.QComment.comment;
45
import static com.jisungin.domain.talkroom.QTalkRoom.talkRoom;
56
import static com.jisungin.domain.talkroom.QTalkRoomRole.talkRoomRole;
67
import static com.jisungin.domain.user.QUser.user;
78

89
import com.jisungin.application.response.PageResponse;
910
import com.jisungin.application.talkroom.request.TalkRoomSearchServiceRequest;
11+
import com.jisungin.application.talkroom.response.QTalkRoomFindAllResponse;
12+
import com.jisungin.application.talkroom.response.QTalkRoomFindOneResponse;
13+
import com.jisungin.application.talkroom.response.QTalkRoomQueryComments;
1014
import com.jisungin.application.talkroom.response.QTalkRoomQueryReadingStatus;
11-
import com.jisungin.application.talkroom.response.QTalkRoomQueryResponse;
15+
import com.jisungin.application.talkroom.response.TalkRoomFindAllResponse;
16+
import com.jisungin.application.talkroom.response.TalkRoomFindOneResponse;
17+
import com.jisungin.application.talkroom.response.TalkRoomQueryComments;
1218
import com.jisungin.application.talkroom.response.TalkRoomQueryReadingStatus;
13-
import com.jisungin.application.talkroom.response.TalkRoomQueryResponse;
1419
import com.querydsl.core.types.OrderSpecifier;
1520
import com.querydsl.jpa.impl.JPAQueryFactory;
1621
import java.util.List;
@@ -24,10 +29,10 @@ public class TalkRoomRepositoryImpl implements TalkRoomRepositoryCustom {
2429
private final JPAQueryFactory queryFactory;
2530

2631
@Override
27-
public PageResponse<TalkRoomQueryResponse> getTalkRooms(TalkRoomSearchServiceRequest search) {
32+
public PageResponse<TalkRoomFindAllResponse> findAllTalkRoom(TalkRoomSearchServiceRequest search) {
2833

2934
//루트 조회(toOne 코드를 모두 한번에 조회)
30-
List<TalkRoomQueryResponse> findTalkRoom = findTalkRoom(search);
35+
List<TalkRoomFindAllResponse> findTalkRoom = findTalkRoomBySearch(search);
3136

3237
//TalkRoomRole 컬렉션을 MAP 한방에 조회
3338
Map<Long, List<TalkRoomQueryReadingStatus>> talkRoomRoleMap = findTalkRoomRoleMap(toTalkRoomIds(findTalkRoom));
@@ -37,14 +42,52 @@ public PageResponse<TalkRoomQueryResponse> getTalkRooms(TalkRoomSearchServiceReq
3742

3843
long totalCount = getTotalTalkRoomCount();
3944

40-
return PageResponse.<TalkRoomQueryResponse>builder()
45+
return PageResponse.<TalkRoomFindAllResponse>builder()
4146
.queryResponse(findTalkRoom)
4247
.totalCount(totalCount)
4348
.size(search.getSize())
4449
.build();
4550
}
4651

47-
private List<Long> toTalkRoomIds(List<TalkRoomQueryResponse> findTalkRoom) {
52+
@Override
53+
public TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId) {
54+
TalkRoomFindOneResponse findOneTalkRoom = findTalkRoomByTalkRoomId(talkRoomId);
55+
56+
List<TalkRoomQueryReadingStatus> talkRoomRoles = findTalkRoomRoleByTalkRoomId(talkRoomId);
57+
findOneTalkRoom.addTalkRoomStatus(talkRoomRoles);
58+
59+
List<TalkRoomQueryComments> talkRoomComments = findCommentsByTalkRoomId(talkRoomId);
60+
findOneTalkRoom.addTalkRoomComments(talkRoomComments);
61+
62+
return findOneTalkRoom;
63+
64+
}
65+
66+
private List<TalkRoomQueryComments> findCommentsByTalkRoomId(Long talkRoomId) {
67+
return queryFactory.select(new QTalkRoomQueryComments(
68+
comment.id.as("commentId"),
69+
user.name.as("userName"),
70+
comment.content
71+
))
72+
.from(comment)
73+
.join(comment.talkRoom, talkRoom)
74+
.join(comment.user, user)
75+
.where(comment.talkRoom.id.eq(talkRoomId))
76+
.fetch();
77+
}
78+
79+
private List<TalkRoomQueryReadingStatus> findTalkRoomRoleByTalkRoomId(Long talkRoomId) {
80+
return queryFactory.select(new QTalkRoomQueryReadingStatus(
81+
talkRoom.id,
82+
talkRoomRole.readingStatus
83+
))
84+
.from(talkRoomRole)
85+
.join(talkRoomRole.talkRoom, talkRoom)
86+
.where(talkRoomRole.talkRoom.id.eq(talkRoomId))
87+
.fetch();
88+
}
89+
90+
private List<Long> toTalkRoomIds(List<TalkRoomFindAllResponse> findTalkRoom) {
4891
return findTalkRoom.stream()
4992
.map(t -> t.getTalkRoomId())
5093
.collect(Collectors.toList());
@@ -73,8 +116,8 @@ private long getTotalTalkRoomCount() {
73116
.fetchOne();
74117
}
75118

76-
private List<TalkRoomQueryResponse> findTalkRoom(TalkRoomSearchServiceRequest search) {
77-
return queryFactory.select(new QTalkRoomQueryResponse(
119+
private List<TalkRoomFindAllResponse> findTalkRoomBySearch(TalkRoomSearchServiceRequest search) {
120+
return queryFactory.select(new QTalkRoomFindAllResponse(
78121
talkRoom.id.as("talkRoomId"),
79122
user.name.as("userName"),
80123
talkRoom.title,
@@ -91,6 +134,22 @@ private List<TalkRoomQueryResponse> findTalkRoom(TalkRoomSearchServiceRequest se
91134
.fetch();
92135
}
93136

137+
private TalkRoomFindOneResponse findTalkRoomByTalkRoomId(Long talkRoomId) {
138+
return queryFactory.select(new QTalkRoomFindOneResponse(
139+
talkRoom.id.as("talkRoomId"),
140+
user.name.as("userName"),
141+
talkRoom.title,
142+
talkRoom.content,
143+
book.title,
144+
book.imageUrl.as("bookImage")
145+
))
146+
.from(talkRoom)
147+
.join(talkRoom.user, user)
148+
.join(talkRoom.book, book)
149+
.where(talkRoom.id.eq(talkRoomId))
150+
.fetchOne();
151+
}
152+
94153
/**
95154
* 아직 좋아요 기능이 구현 되지 않아 최신순으로만 정렬
96155
*/
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.jisungin;
2+
3+
import com.jisungin.config.QueryDslConfig;
4+
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
5+
import org.springframework.context.annotation.Import;
6+
7+
@DataJpaTest
8+
@Import(QueryDslConfig.class)
9+
public abstract class RepositoryTestSupport {
10+
11+
}

src/test/java/com/jisungin/api/talkroom/TalkRoomControllerTest.java

Lines changed: 13 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -174,49 +174,18 @@ void getTalkRoomsEmpty() throws Exception {
174174
.andExpect(jsonPath("$.message").value("OK"));
175175
}
176176

177-
// private void createTalkRoomRole(TalkRoom talkRoom) {
178-
// List<String> request = new ArrayList<>();
179-
// request.add("읽는 중");
180-
// request.add("읽음");
181-
//
182-
// List<ReadingStatus> readingStatus = ReadingStatus.createReadingStatus(request);
183-
//
184-
// readingStatus.stream().map(status -> TalkRoomRole.roleCreate(talkRoom, status))
185-
// .forEach(talkRoomRoleRepository::save);
186-
// }
187-
//
188-
// private static TalkRoom createTalkRoom(Book book, User user) {
189-
// return TalkRoom.builder()
190-
// .book(book)
191-
// .title("토크방")
192-
// .content("내용")
193-
// .user(user)
194-
// .build();
195-
// }
196-
//
197-
// private static User createUser() {
198-
// return User.builder()
199-
// .name("[email protected]")
200-
// .profileImage("image")
201-
// .oauthId(
202-
// OauthId.builder()
203-
// .oauthId("oauthId")
204-
// .oauthType(OauthType.KAKAO)
205-
// .build()
206-
// )
207-
// .build();
208-
// }
209-
//
210-
// private static Book createBook() {
211-
// return Book.builder()
212-
// .title("제목")
213-
// .content("내용")
214-
// .authors("작가")
215-
// .isbn("11111")
216-
// .publisher("publisher")
217-
// .dateTime(LocalDateTime.now())
218-
// .imageUrl("www")
219-
// .build();
220-
// }
177+
@Test
178+
@DisplayName("토크방 단건 조회를 한다.")
179+
void findOneTalkRoom() throws Exception {
180+
// when // then
181+
mockMvc.perform(get("/v1/talk-room/1")
182+
.contentType(APPLICATION_JSON)
183+
)
184+
.andDo(print())
185+
.andExpect(status().isOk())
186+
.andExpect(jsonPath("$.code").value("200"))
187+
.andExpect(jsonPath("$.status").value("OK"))
188+
.andExpect(jsonPath("$.message").value("OK"));
189+
}
221190

222191
}

0 commit comments

Comments
 (0)