Skip to content

Commit 4735a49

Browse files
authored
Merge pull request #62 from dnd-side-project/dev
main
2 parents 021da2e + 86f9623 commit 4735a49

File tree

10 files changed

+126
-18
lines changed

10 files changed

+126
-18
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public void onMessage(@DestinationVariable String roomId, @Valid @Payload ChatIn
4141
@GetMapping("/chat/rooms/{roomId}/count")
4242
@Operation(
4343
summary = "채팅방 참여자 수 조회",
44-
description = "해당 채팅방의 현재 참여자 수를 반환합니다.",
44+
description = "해당 채팅방의 현재 참여자 수를 1회 반환합니다. (소켓 X)",
4545
responses = {
4646
@ApiResponse(
4747
responseCode = "200",

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

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
import com.example.demo.domain.playlist.dto.playlistdto.PlaylistResponse;
99
import com.example.demo.domain.playlist.dto.playlistdto.PlaylistWithSongsResponse;
1010
import com.example.demo.domain.playlist.service.PlaylistMyPageService;
11+
import com.example.demo.domain.representative.entity.RepresentativePlaylist;
12+
import com.example.demo.domain.representative.service.RepresentativePlaylistService;
13+
import com.example.demo.domain.user.entity.Users;
14+
import com.example.demo.domain.user.service.UsersService;
1115
import com.example.demo.global.security.filter.CustomUserDetails;
1216
import io.swagger.v3.oas.annotations.Operation;
1317
import io.swagger.v3.oas.annotations.Parameter;
@@ -33,7 +37,9 @@
3337
public class PlaylistMyPageController {
3438

3539
private final PlaylistMyPageService playlistMyPageService;
40+
private final RepresentativePlaylistService representativePlaylistService;
3641
private final CdService cdService;
42+
private final UsersService usersService;
3743

3844
@Operation(
3945
summary = "임시 플레이리스트 저장(세션)",
@@ -75,8 +81,7 @@ public ResponseEntity<PlaylistWithSongsResponse> savePlaylist(
7581
throw new IllegalStateException("세션에 임시 저장된 플레이리스트가 없습니다.");
7682
}
7783

78-
PlaylistWithSongsResponse response = playlistMyPageService.savePlaylistWithSongs(user.getId(), request,
79-
finalPlaylistRequest.theme());
84+
PlaylistWithSongsResponse response = playlistMyPageService.savePlaylistWithSongs(user.getId(), request);
8085

8186
cdService.saveCdItemList(response.playlistId(), finalPlaylistRequest.saveCdRequestDto().cdItems());
8287

@@ -144,7 +149,6 @@ public ResponseEntity<List<PlaylistDetailResponse>> getPlaylistsByCreator(
144149
}
145150

146151

147-
148152
@Operation(
149153
summary = "내 플레이리스트 상세 조회",
150154
description = "플레이리스트 상세 및 곡 목록, 좋아요/조회수 등 메타 정보를 반환합니다."
@@ -166,6 +170,27 @@ public ResponseEntity<PlaylistDetailResponse> getPlaylistDetail(
166170
return ResponseEntity.ok(response);
167171
}
168172

173+
@Operation(
174+
summary = "공유된 링크로 플레이리스트 상세 조회",
175+
description = "공유된 링크로 플레이리스트 상세 및 곡 목록, 좋아요/조회수 등 메타 정보를 반환합니다."
176+
)
177+
@ApiResponse(
178+
responseCode = "200",
179+
description = "플레이리스트 상세",
180+
content = @Content(schema = @Schema(implementation = PlaylistDetailResponse.class))
181+
)
182+
@ApiResponse(responseCode = "404", description = "플레이리스트를 찾을 수 없음")
183+
@GetMapping("/shared/{shareCode}")
184+
public ResponseEntity<PlaylistDetailResponse> getSharedPlaylistDetail(
185+
@Parameter(description = "플레이리스트 ID", example = "123")
186+
@PathVariable String shareCode
187+
) {
188+
Users user = usersService.findUserByShareCode(shareCode);
189+
RepresentativePlaylist representativePlaylist = representativePlaylistService.findRepresentativePlaylistByUserId(user.getId());
190+
PlaylistDetailResponse response = playlistMyPageService.getPlaylistDetail(user.getId(), representativePlaylist.getPlaylist().getId());
191+
return ResponseEntity.ok(response);
192+
}
193+
169194
@Operation(
170195
summary = "내 플레이리스트 삭제",
171196
description = "플레이리스트를 삭제합니다."

main-server/src/main/java/com/example/demo/domain/playlist/dto/FinalPlaylistRequest.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55

66
@Schema(description = "플레이리스트 생성 요청 DTO")
77
public record FinalPlaylistRequest(
8-
@Schema(description = "플레이리스트 테마", example = "여름/운동/집중")
9-
String theme,
10-
118
@Schema(description = "CD 저장")
129
SaveCdRequestDto saveCdRequestDto) {
1310
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
public interface PlaylistMyPageService {
1212

13-
PlaylistWithSongsResponse savePlaylistWithSongs(String users, PlaylistCreateRequest request, String theme);
13+
PlaylistWithSongsResponse savePlaylistWithSongs(String users, PlaylistCreateRequest request);
1414

1515
List<PlaylistResponse> getMyPlaylistsSorted(String userId, PlaylistSortOption sortOption);
1616

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.example.demo.domain.playlist.dto.playlistdto.PlaylistWithSongsResponse;
1313
import com.example.demo.domain.playlist.entity.Playlist;
1414
import com.example.demo.domain.playlist.repository.PlaylistRepository;
15+
import com.example.demo.domain.playlist.util.ShareCodeGenerator;
1516
import com.example.demo.domain.representative.entity.RepresentativePlaylist;
1617
import com.example.demo.domain.representative.repository.RepresentativePlaylistRepository;
1718
import com.example.demo.domain.song.dto.SongMapper;
@@ -76,7 +77,7 @@ private void updateRepresentativePlaylist(Users user, Playlist playlist) {
7677

7778
@Override
7879
@Transactional
79-
public PlaylistWithSongsResponse savePlaylistWithSongs(String usersId, PlaylistCreateRequest request, String theme) {
80+
public PlaylistWithSongsResponse savePlaylistWithSongs(String usersId, PlaylistCreateRequest request) {
8081
Playlist savedPlaylist = savePlaylist(usersId, request);
8182

8283
List<Song> songsToSave = new ArrayList<>();
@@ -138,14 +139,23 @@ public void deletePlaylist(String userId, Long playlistId) {
138139

139140
@Transactional
140141
public String sharePlaylist(String userId) {
141-
boolean exists = representativePlaylistRepository.existsByUser_Id(userId);
142-
if (!exists) {
143-
throw new IllegalStateException("대표 플레이리스트가 설정되어 있지 않습니다.");
142+
Users users = usersRepository.findById(userId)
143+
.orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND));
144+
145+
if (users.getShareCode() != null && !users.getShareCode().isBlank()) {
146+
return users.getShareCode();
144147
}
145-
return "/shared/" + userId;
148+
149+
String shareCode = ShareCodeGenerator.generate(userId);
150+
users.assignShareCode(shareCode);
151+
152+
usersRepository.save(users);
153+
154+
return "/shared/" + shareCode;
146155
}
147156

148157

158+
149159
@Override
150160
@Transactional
151161
public void updateRepresentative(String userId, Long playlistId) {
Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,32 @@
11
package com.example.demo.domain.playlist.util;
22

3+
import java.nio.ByteBuffer;
4+
import java.util.Base64;
35
import java.util.UUID;
46

57
public class ShareCodeGenerator {
6-
public static String generate() {
7-
return UUID.randomUUID()
8-
.toString()
9-
.replace("-", "")
10-
.substring(0, 8);
8+
9+
private static final int LENGTH = 8; // 원하는 길이
10+
11+
public static String generate(String userId) {
12+
if (userId == null || userId.isBlank()) {
13+
throw new IllegalArgumentException("userId must be a non-empty UUID string");
14+
}
15+
16+
UUID uuid = UUID.fromString(userId.trim());
17+
byte[] bytes = toBytes(uuid);
18+
19+
String b64 = Base64.getUrlEncoder()
20+
.withoutPadding()
21+
.encodeToString(bytes);
22+
23+
return b64.substring(0, LENGTH);
24+
}
25+
26+
private static byte[] toBytes(UUID uuid) {
27+
ByteBuffer bb = ByteBuffer.allocate(16);
28+
bb.putLong(uuid.getMostSignificantBits());
29+
bb.putLong(uuid.getLeastSignificantBits());
30+
return bb.array();
1131
}
1232
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.example.demo.domain.representative.service;
2+
3+
import com.example.common.error.code.PlaylistErrorCode;
4+
import com.example.common.error.exception.PlaylistException;
5+
import com.example.demo.domain.representative.entity.RepresentativePlaylist;
6+
import com.example.demo.domain.representative.repository.RepresentativePlaylistRepository;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.stereotype.Service;
9+
10+
@Service
11+
@RequiredArgsConstructor
12+
public class RepresentativePlaylistService {
13+
14+
private final RepresentativePlaylistRepository representativePlaylistRepository;
15+
16+
public RepresentativePlaylist findRepresentativePlaylistByUserId(String userId) {
17+
return representativePlaylistRepository.findByUser_Id(userId)
18+
.orElseThrow(()-> new PlaylistException(PlaylistErrorCode.PLAYLIST_NOT_FOUND));
19+
}
20+
21+
}

main-server/src/main/java/com/example/demo/domain/user/entity/Users.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ public class Users extends BaseTimeEntity {
2727

2828
@Column(name = "username")
2929
private String username;
30+
31+
@Column(name = "share_code", unique = true)
32+
private String shareCode;
33+
3034
//
3135
// @Column(name = "nickname")
3236
// private String nickname;
@@ -36,6 +40,13 @@ public class Users extends BaseTimeEntity {
3640

3741
private boolean enabled;
3842

43+
public void assignShareCode(String shareCode) {
44+
if (this.shareCode != null) {
45+
throw new IllegalStateException("이미 shareCode가 존재합니다.");
46+
}
47+
this.shareCode = shareCode;
48+
}
49+
3950
@Builder
4051
public Users(String kakaoId, String username, boolean enabled) {
4152
this.kakaoId = kakaoId;

main-server/src/main/java/com/example/demo/domain/user/repository/UsersRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22

33
import com.example.demo.domain.user.entity.Users;
44
import java.util.List;
5+
import java.util.Optional;
6+
57
import org.springframework.data.jpa.repository.JpaRepository;
68
import org.springframework.data.jpa.repository.Query;
79

810
public interface UsersRepository extends JpaRepository<Users, String> {
911

1012
@Query("SELECT u.id FROM Users u")
1113
List<String> findAllUserIds();
14+
15+
Optional<Users> findUsersByShareCode(String shareCode);
1216
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.example.demo.domain.user.service;
2+
3+
import com.example.common.error.code.UserErrorCode;
4+
import com.example.common.error.exception.UserException;
5+
import com.example.demo.domain.user.entity.Users;
6+
import com.example.demo.domain.user.repository.UsersRepository;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.stereotype.Service;
9+
10+
@Service
11+
@RequiredArgsConstructor
12+
public class UsersService {
13+
14+
private final UsersRepository usersRepository;
15+
16+
public Users findUserByShareCode(String shareCode) {
17+
return usersRepository.findUsersByShareCode(shareCode)
18+
.orElseThrow(()-> new UserException(UserErrorCode.USER_NOT_FOUND));
19+
}
20+
}

0 commit comments

Comments
 (0)