Skip to content

Commit

Permalink
feat: #44 플레이리스트 업데이트
Browse files Browse the repository at this point in the history
  • Loading branch information
dgh06175 committed Sep 26, 2024
1 parent 9b959b1 commit a5f7aef
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public class PlaylistTrack extends BaseEntity {
@JoinColumn(name = "track_id", nullable = false)
private Track track;

@Setter
@Column(name = "order_index", nullable = false)
private int orderIndex;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.cabin.plat.domain.member.repository.MemberRepository;
import com.cabin.plat.domain.playlist.dto.PlaylistRequest;
import com.cabin.plat.domain.playlist.dto.PlaylistRequest.PlaylistOrders;
import com.cabin.plat.domain.playlist.dto.PlaylistRequest.TrackOrder;
import com.cabin.plat.domain.playlist.dto.PlaylistResponse;
import com.cabin.plat.domain.playlist.dto.PlaylistResponse.PlayListId;
import com.cabin.plat.domain.playlist.entity.Playlist;
Expand Down Expand Up @@ -146,16 +147,57 @@ public PlaylistResponse.PlayListId addTrackToPlaylist(Member member, Long playli
return playlistMapper.toPlaylistId(playlistId);
}

@Transactional
@Override
public PlayListId updateTrackOrders(Member member, Long playlistId, PlaylistOrders playlistOrders) {
return null;
Playlist playlist = findPlaylistByIdWithValidation(playlistId, member);

// 기존 플레이리스트의 모든 트랙
List<PlaylistTrack> playlistTracks = playlistTrackRepository.findAllByPlaylistIs(playlist);

// 플레이리스트의 업데이트할 트랙 순서 정보
Map<Long, Integer> trackOrderMap = playlistOrders.getTracks().stream()
.collect(Collectors.toMap(TrackOrder::getTrackId, TrackOrder::getOrderIndex));

validateTrackOrderCount(playlistOrders, playlistTracks);
validateTrackIds(playlistOrders, playlistTracks);

for (PlaylistTrack playlistTrack: playlistTracks) {
Long trackId = playlistTrack.getTrack().getId();
int newOrder = trackOrderMap.get(trackId);
playlistTrack.setOrderIndex(newOrder);
}

// playlistTrackRepository.saveAll(playlistTracks);
return playlistMapper.toPlaylistId(playlistId);
}

@Transactional
@Override
public PlayListId deleteTrackFromPlaylist(Member member, Long playlistId, Long trackId) {
return null;
}

private void validateTrackOrderCount(PlaylistOrders playlistOrders, List<PlaylistTrack> playlistTracks) {
if (playlistOrders.getTracks().size() != playlistTracks.size()) {
throw new RestApiException(PlaylistErrorCode.PLAYLIST_TRACK_COUNT_MISMATCH);
}
}

private void validateTrackIds(PlaylistOrders playlistOrders, List<PlaylistTrack> playlistTracks) {
Set<Long> playlistTrackIds = playlistTracks.stream()
.map(playlistTrack -> playlistTrack.getTrack().getId())
.collect(Collectors.toSet());

Set<Long> orderTrackIds = playlistOrders.getTracks().stream()
.map(TrackOrder::getTrackId)
.collect(Collectors.toSet());

if (!playlistTrackIds.equals(orderTrackIds)) {
throw new RestApiException(PlaylistErrorCode.PLAYLIST_TRACK_ID_MISMATCH);
}
}

private Track findTrackById(Long trackId) {
return trackRepository.findById(trackId)
.orElseThrow(() -> new RestApiException(TrackErrorCode.TRACK_NOT_FOUND));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ public enum PlaylistErrorCode implements ErrorCodeInterface{
PLAYLIST_TRACK_NOT_FOUND("PLAYLIST004", "플레이리스트에 해당 트랙이 존재하지 않습니다.", HttpStatus.NOT_FOUND),
PLAYLIST_TRACK_DELETE_FORBIDDEN("PLAYLIST005", "이 플레이리스트의 트랙을 삭제할 권한이 없습니다.", HttpStatus.FORBIDDEN),
PLAYLIST_TRACK_DUPLICATE("PLAYLIST006", "이미 추가된 트랙입니다.", HttpStatus.BAD_REQUEST),
PLAYLIST_TRACK_COUNT_MISMATCH("PLAYLIST007", "요청한 트랙 순서 정보의 개수와 플레이리스트에 존재하는 트랙 개수가 일치하지 않습니다.", HttpStatus.BAD_REQUEST),
TRACK_NOT_FOUND("PLAYLIST008", "플레이리스트 안에 Track이 존재하지 않습니다.", HttpStatus.NOT_FOUND),
PLAYLIST_TRACK_ID_MISMATCH("PLAYLIST009", "플레이리스트에 존재하는 트랙 ID 들과 요청한 트랙 ID 들이 일치하지 않습니다.", HttpStatus.BAD_REQUEST),
;

private final String code;
Expand Down

0 comments on commit a5f7aef

Please sign in to comment.