Skip to content

Commit 78acfc0

Browse files
authored
Merge pull request #157 from dnd-side-project/dev
fix(PlaylistDetailResponse): μš”κ΅¬μ‚¬ν•­μ— 맞게 μ’‹μ•„μš” μ—¬λΆ€, μ œμž‘μž λ‹‰λ„€μž„ μΆ”κ°€
2 parents 22b57c7 + bb15be3 commit 78acfc0

File tree

8 files changed

+68
-10
lines changed

8 files changed

+68
-10
lines changed

β€Žchat-server/src/main/java/com/example/demo/controller/ChatController.javaβ€Ž

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.example.demo.controller;
22

33

4+
import com.example.demo.dto.ChatCountResponse;
45
import com.example.demo.dto.ChatHistoryResponseDto;
56
import com.example.demo.dto.ChatInbound;
67
import com.example.demo.global.redis.ChatRedisCounter;
@@ -35,7 +36,7 @@ public void onMessage(@DestinationVariable String roomId, @Valid @Payload ChatIn
3536
chatService.handleInbound(roomId, chatInbound);
3637
}
3738

38-
@GetMapping("/chat/rooms/{roomId}/count")
39+
@GetMapping("/chat/rooms/{roomId}/count/member")
3940
@Operation(
4041
summary = "μ±„νŒ…λ°© μ°Έμ—¬μž 수 쑰회",
4142
description = "ν•΄λ‹Ή μ±„νŒ…λ°©μ˜ ν˜„μž¬ μ°Έμ—¬μž 수λ₯Ό 1회 λ°˜ν™˜ν•©λ‹ˆλ‹€. (μ†ŒμΌ“ X)",
@@ -95,4 +96,16 @@ public ResponseEntity<String> deleteChat (@PathVariable String roomId,
9596
chatService.deleteMessage(roomId,messageId, user.getId());
9697
return ResponseEntity.ok().body("μ‚­μ œ 성곡");
9798
}
99+
100+
@GetMapping("/chat/rooms/{roomId}/count/chat")
101+
@Operation(
102+
summary = "μ±„νŒ…λ°© 총 λ©”μ‹œμ§€ 수",
103+
description = "ν•΄λ‹Ή roomId의 총 λ©”μ‹œμ§€ 개수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€."
104+
)
105+
public ResponseEntity<ChatCountResponse> count(@PathVariable String roomId) {
106+
int total = chatService.countByRoomId(roomId);
107+
return ResponseEntity.ok(ChatCountResponse.builder()
108+
.totalCount(total)
109+
.build());
110+
}
98111
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.example.demo.dto;
2+
3+
import lombok.Builder;
4+
5+
@Builder
6+
public record ChatCountResponse(int totalCount) {
7+
}

β€Žchat-server/src/main/java/com/example/demo/entity/repository/ChatRepository.javaβ€Ž

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,27 @@ public boolean deleteByPk(String roomId, String sentAt) {
117117
Chat deleted = t.deleteItem(r -> r.key(key));
118118
return deleted != null; // μ‘΄μž¬ν–ˆμœΌλ©΄ μ‚­μ œλœ μ—”ν‹°ν‹° λ°˜ν™˜
119119
}
120+
121+
public int countByRoomId(String roomId) {
122+
int total = 0;
123+
Map<String, AttributeValue> lek = null;
124+
125+
do {
126+
var req = QueryEnhancedRequest.builder()
127+
.queryConditional(QueryConditional.keyEqualTo(
128+
Key.builder().partitionValue(roomId).build()))
129+
.attributesToProject("roomId", "sentAt") // ν‚€λ§Œ
130+
.limit(1000) // νŽ˜μ΄μ§€ 크기
131+
.exclusiveStartKey(lek)
132+
.build();
133+
134+
Page<Chat> first = table().query(req).stream().findFirst().orElse(null);
135+
if (first == null) break;
136+
137+
total += first.items().size();
138+
lek = first.lastEvaluatedKey();
139+
} while (lek != null && !lek.isEmpty());
140+
141+
return total;
142+
}
120143
}

β€Žchat-server/src/main/java/com/example/demo/service/ChatService.javaβ€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,8 @@ public void deleteMessage(String roomId, String messageId, String userId) {
104104
throw new IllegalStateException("μ‚­μ œ μ‹€νŒ¨");
105105
}
106106
}
107+
108+
public int countByRoomId(String roomId) {
109+
return chatRepository.countByRoomId(roomId);
110+
}
107111
}

β€Žmain-server/src/main/java/com/example/demo/domain/playlist/controller/PlaylistMyPageController.javaβ€Ž

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.example.demo.domain.follow.dto.response.FollowedPlaylistsResponse;
44
import com.example.demo.domain.playlist.dto.*;
5+
import com.example.demo.domain.playlist.dto.playlistdto.MainPlaylistDetailResponse;
56
import com.example.demo.domain.playlist.dto.playlistdto.PlaylistDetailResponse;
67
import com.example.demo.domain.playlist.dto.playlistdto.PlaylistResponse;
78
import com.example.demo.domain.playlist.service.PlaylistMyPageService;
@@ -110,7 +111,7 @@ public ResponseEntity<List<PlaylistDetailResponse>> getPlaylistsByCreator(
110111

111112
@Operation(
112113
summary = "λ‚΄ ν”Œλ ˆμ΄λ¦¬μŠ€νŠΈ 상세 쑰회",
113-
description = "ν”Œλ ˆμ΄λ¦¬μŠ€νŠΈ 상세 및 곑 λͺ©λ‘, μ’‹μ•„μš”/쑰회수 λ“± 메타 정보λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€."
114+
description = "λ‚΄ ν”Œλ ˆμ΄λ¦¬μŠ€νŠΈ 상세 및 곑 λͺ©λ‘, μ’‹μ•„μš”/쑰회수 λ“± 메타 정보λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€."
114115
)
115116
@ApiResponse(
116117
responseCode = "200",
@@ -119,13 +120,13 @@ public ResponseEntity<List<PlaylistDetailResponse>> getPlaylistsByCreator(
119120
)
120121
@ApiResponse(responseCode = "404", description = "ν”Œλ ˆμ΄λ¦¬μŠ€νŠΈλ₯Ό 찾을 수 μ—†μŒ")
121122
@GetMapping("/me/{playlistId}")
122-
public ResponseEntity<PlaylistDetailResponse> getPlaylistDetail(
123+
public ResponseEntity<MainPlaylistDetailResponse> getMyPlaylistDetail(
123124
@Parameter(description = "ν”Œλ ˆμ΄λ¦¬μŠ€νŠΈ ID", example = "123")
124125
@PathVariable Long playlistId,
125126
@Parameter(hidden = true)
126127
@AuthenticationPrincipal CustomUserDetails user
127128
) {
128-
PlaylistDetailResponse response = playlistMyPageService.getPlaylistDetail(user.getId(), playlistId);
129+
MainPlaylistDetailResponse response = playlistMyPageService.getMyPlaylistDetail(user.getId(), playlistId);
129130
return ResponseEntity.ok(response);
130131
}
131132

β€Žmain-server/src/main/java/com/example/demo/domain/playlist/dto/playlistdto/PlaylistResponse.javaβ€Ž

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,20 @@ public record PlaylistResponse(
2121
@Schema(description = "ν”Œλ ˆμ΄λ¦¬μŠ€νŠΈ 곡개 μ—¬λΆ€", example = "true")
2222
boolean isPublic,
2323

24+
@Schema(description = "ν”Œλ ˆμ΄λ¦¬μŠ€νŠΈ μ’‹μ•„μš” μ—¬λΆ€", example = "true")
25+
boolean isLiked,
26+
2427
@Schema(description = "cd 정보")
2528
CdResponse cdResponse
2629

2730
) {
28-
public static PlaylistResponse from(Playlist playlist, CdResponse cd) {
31+
public static PlaylistResponse from(Playlist playlist, CdResponse cd, boolean isLiked) {
2932
return PlaylistResponse.builder()
3033
.playlistId(playlist.getId())
3134
.playlistName(playlist.getName())
3235
.creatorNickname(playlist.getUsers().getUsername())
3336
.isPublic(playlist.isPublic())
37+
.isLiked(isLiked)
3438
.cdResponse(cd)
3539
.build();
3640
}

β€Žmain-server/src/main/java/com/example/demo/domain/playlist/service/PlaylistMyPageService.javaβ€Ž

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.example.demo.domain.playlist.service;
22

33
import com.example.demo.domain.follow.dto.response.FollowedPlaylistsResponse;
4+
import com.example.demo.domain.playlist.dto.playlistdto.MainPlaylistDetailResponse;
45
import com.example.demo.domain.playlist.dto.playlistdto.PlaylistDetailResponse;
56
import com.example.demo.domain.playlist.dto.playlistdto.PlaylistResponse;
67
import com.example.demo.domain.playlist.dto.PlaylistSortOption;
@@ -12,7 +13,7 @@ public interface PlaylistMyPageService {
1213

1314
List<PlaylistResponse> getLikedPlaylistsSorted(String userId, PlaylistSortOption sortOption);
1415

15-
PlaylistDetailResponse getPlaylistDetail(String id, Long playlistId);
16+
MainPlaylistDetailResponse getMyPlaylistDetail(String id, Long playlistId);
1617

1718
void updateIsPublic(String userId, Long playlistId);
1819

β€Žmain-server/src/main/java/com/example/demo/domain/playlist/service/PlaylistMyPageServiceImpl.javaβ€Ž

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.example.demo.domain.like.repository.LikesRepository;
1212
import com.example.demo.domain.playlist.dto.*;
1313
import com.example.demo.domain.playlist.dto.SongDto;
14+
import com.example.demo.domain.playlist.dto.playlistdto.MainPlaylistDetailResponse;
1415
import com.example.demo.domain.playlist.dto.playlistdto.PlaylistDetailResponse;
1516
import com.example.demo.domain.playlist.dto.playlistdto.PlaylistResponse;
1617
import com.example.demo.domain.playlist.entity.Playlist;
@@ -51,7 +52,9 @@ public List<PlaylistResponse> getMyPlaylistsSorted(String userId, PlaylistSortOp
5152
};
5253

5354
return all.stream()
54-
.map(p -> PlaylistResponse.from(p, cdService.getOnlyCdByPlaylistId(p.getId())))
55+
.map(p -> PlaylistResponse.from(p,
56+
cdService.getOnlyCdByPlaylistId(p.getId()),
57+
likesRepository.existsByUsers_IdAndPlaylist_Id(userId, p.getId())))
5558
.toList();
5659
}
5760

@@ -61,21 +64,23 @@ public List<PlaylistResponse> getLikedPlaylistsSorted(String userId, PlaylistSor
6164
List<Playlist> likedPlaylists = likesRepository.findLikedPlaylistsWithMeta(userId, sortOption, DEFAULT_LIMIT);
6265

6366
return likedPlaylists.stream()
64-
.map(p -> PlaylistResponse.from(p, cdService.getOnlyCdByPlaylistId(p.getId())))
67+
.map(p -> PlaylistResponse.from(p,
68+
cdService.getOnlyCdByPlaylistId(p.getId()),
69+
likesRepository.existsByUsers_IdAndPlaylist_Id(userId, p.getId())))
6570
.toList();
6671
}
6772

6873
@Override
6974
@Transactional(readOnly = true)
70-
public PlaylistDetailResponse getPlaylistDetail(String userId, Long playlistId) {
75+
public MainPlaylistDetailResponse getMyPlaylistDetail(String userId, Long playlistId) {
7176
Playlist playlist = playlistRepository.findByIdAndUsers_Id(playlistId, userId)
7277
.orElseThrow(() -> new PlaylistException("ν”Œλ ˆμ΄λ¦¬μŠ€νŠΈκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šκ±°λ‚˜ κΆŒν•œμ΄ μ—†μŠ΅λ‹ˆλ‹€.",
7378
PlaylistErrorCode.PLAYLIST_NOT_FOUND));
7479

7580
List<Song> songs = songRepository.findSongsByPlaylistId(playlistId);
7681
List<SongDto> songDtos = songs.stream().map(SongDto::from).toList();
7782

78-
return PlaylistDetailResponse.from(playlist, songDtos, cdService.getOnlyCdByPlaylistId(playlistId));
83+
return MainPlaylistDetailResponse.from(playlist, songDtos, cdService.getOnlyCdByPlaylistId(playlistId));
7984
}
8085

8186

0 commit comments

Comments
Β (0)