Skip to content

Commit

Permalink
Merge branch 'main' into feat/#472
Browse files Browse the repository at this point in the history
  • Loading branch information
cruelladevil authored Sep 29, 2023
2 parents 3e3ff84 + dd71358 commit ca4a4d4
Show file tree
Hide file tree
Showing 35 changed files with 618 additions and 119 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public void addInterceptors(final InterceptorRegistry registry) {

private HandlerInterceptor loginCheckerInterceptor() {
return new PathMatcherInterceptor(loginCheckerInterceptor)
.includePathPattern("/songs/*", PathMethod.GET);
.includePathPattern("/songs/high-liked/**", PathMethod.GET);
}

private HandlerInterceptor tokenInterceptor() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,13 @@
import shook.shook.member.exception.MemberException;
import shook.shook.member.exception.MemberException.MemberNotExistException;
import shook.shook.song.application.dto.LikedKillingPartResponse;
import shook.shook.song.domain.killingpart.KillingPart;
import shook.shook.song.domain.killingpart.KillingPartLike;
import shook.shook.song.domain.killingpart.repository.KillingPartLikeRepository;
import shook.shook.song.domain.killingpart.repository.dto.SongKillingPartKillingPartLikeCreatedAtDto;

@RequiredArgsConstructor
@Transactional(readOnly = true)
@Service
public class KillingPartService {
public class MyPageService {

private final KillingPartLikeRepository killingPartLikeRepository;
private final MemberRepository memberRepository;
Expand All @@ -33,14 +32,18 @@ public List<LikedKillingPartResponse> findLikedKillingPartByMemberId(
final Member member = memberRepository.findById(memberInfo.getMemberId())
.orElseThrow(MemberNotExistException::new);

final List<KillingPartLike> likes =
killingPartLikeRepository.findAllByMemberAndIsDeleted(member, false);
final List<SongKillingPartKillingPartLikeCreatedAtDto> likedKillingPartAndSongByMember =
killingPartLikeRepository.findLikedKillingPartAndSongByMember(member);

return likes.stream()
.sorted(Comparator.comparing(KillingPartLike::getUpdatedAt).reversed())
.map(killingPartLike -> {
final KillingPart killingPart = killingPartLike.getKillingPart();
return LikedKillingPartResponse.of(killingPart.getSong(), killingPart);
}).toList();
return likedKillingPartAndSongByMember.stream()
.sorted(Comparator.comparing(
SongKillingPartKillingPartLikeCreatedAtDto::getKillingPartLikeCreatedAt,
Comparator.reverseOrder()
))
.map(songKillingPart -> LikedKillingPartResponse.of(
songKillingPart.getSong(),
songKillingPart.getKillingPart()
))
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import shook.shook.song.domain.InMemorySongs;
import shook.shook.song.domain.Song;
import shook.shook.song.domain.SongTitle;
import shook.shook.song.domain.killingpart.repository.KillingPartLikeRepository;
import shook.shook.song.domain.killingpart.repository.KillingPartRepository;
import shook.shook.song.domain.repository.SongRepository;
import shook.shook.song.exception.SongException;
Expand All @@ -34,6 +35,7 @@ public class SongService {

private final SongRepository songRepository;
private final KillingPartRepository killingPartRepository;
private final KillingPartLikeRepository killingPartLikeRepository;
private final MemberRepository memberRepository;
private final InMemorySongs inMemorySongs;
private final SongDataExcelReader songDataExcelReader;
Expand Down Expand Up @@ -85,8 +87,8 @@ private SongSwipeResponse convertToSongSwipeResponse(
}

final Member member = findMemberById(memberInfo.getMemberId());

return SongSwipeResponse.of(member, currentSong, beforeSongs, afterSongs);
final List<Long> killingPartIds = killingPartLikeRepository.findLikedKillingPartIdsByMember(member);
return SongSwipeResponse.of(currentSong, beforeSongs, afterSongs, killingPartIds);
}

private Member findMemberById(final Long memberId) {
Expand Down Expand Up @@ -121,9 +123,11 @@ private List<SongResponse> convertToSongResponses(
}

final Member member = findMemberById(memberInfo.getMemberId());
final List<Long> likedKillingPartIds =
killingPartLikeRepository.findLikedKillingPartIdsByMember(member);

return songs.stream()
.map(song -> SongResponse.of(song, member))
.map(song -> SongResponse.of(song, likedKillingPartIds))
.toList();
}

Expand Down Expand Up @@ -168,7 +172,9 @@ public SongSwipeResponse findSongsByGenreForSwipe(
}

final Member member = findMemberById(memberInfo.getMemberId());
return SongSwipeResponse.of(member, currentSong, prevSongs, nextSongs);
final List<Long> likedKillingPartIds =
killingPartLikeRepository.findLikedKillingPartIdsByMember(member);
return SongSwipeResponse.of(currentSong, prevSongs, nextSongs, likedKillingPartIds);
}

public List<SongResponse> findPrevSongsByGenre(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import shook.shook.member.domain.Member;
import shook.shook.song.domain.Song;
import shook.shook.song.domain.killingpart.KillingPart;

Expand Down Expand Up @@ -41,7 +40,7 @@ public static KillingPartResponse of(
final Song song,
final KillingPart killingPart,
final int rank,
final Member member
final boolean isLiked
) {
return new KillingPartResponse(
killingPart.getId(),
Expand All @@ -51,7 +50,7 @@ public static KillingPartResponse of(
killingPart.getEndSecond(),
song.getPartVideoUrl(killingPart),
killingPart.getLength(),
killingPart.isLikedByMember(member)
isLiked
);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package shook.shook.song.application.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import shook.shook.member.domain.Member;
import shook.shook.song.domain.Song;
import shook.shook.song.domain.killingpart.KillingPart;

Expand Down Expand Up @@ -40,7 +39,7 @@ public class SongResponse {
@Schema(description = "킬링파트 3개")
private final List<KillingPartResponse> killingParts;

public static SongResponse of(final Song song, final Member member) {
public static SongResponse of(final Song song, final List<Long> likedKillingPartIds) {
return new SongResponse(
song.getId(),
song.getTitle(),
Expand All @@ -49,21 +48,30 @@ public static SongResponse of(final Song song, final Member member) {
song.getVideoId(),
song.getAlbumCoverUrl(),
song.getGenre().name(),
toKillingPartResponses(song, member)
toKillingPartResponses(song, likedKillingPartIds)
);
}

public static SongResponse fromUnauthorizedUser(final Song song) {
return SongResponse.of(song, null);
return SongResponse.of(song, Collections.emptyList());
}

private static List<KillingPartResponse> toKillingPartResponses(final Song song,
final Member member) {
final List<Long> likedKillingPartIds) {
final List<KillingPart> songKillingParts = song.getLikeCountSortedKillingParts();

return IntStream.range(0, songKillingParts.size())
.mapToObj(index ->
KillingPartResponse.of(song, songKillingParts.get(index), index + 1, member))
.collect(Collectors.toList());
{
final KillingPart killingPart = songKillingParts.get(index);
final int killingPartRank = index + 1;
return KillingPartResponse.of(
song,
killingPart,
killingPartRank,
likedKillingPartIds.contains(killingPart.getId())
);
})
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import shook.shook.member.domain.Member;
import shook.shook.song.domain.Song;

@Schema(description = "첫 스와이프 시, 현재 노래와 이전, 이후 노래 리스트 조회 응답")
Expand All @@ -23,17 +22,17 @@ public class SongSwipeResponse {
private final List<SongResponse> nextSongs;

public static SongSwipeResponse of(
final Member member,
final Song currentSong,
final List<Song> prevSongs,
final List<Song> nextSongs
final List<Song> nextSongs,
final List<Long> likedKillingPartIds
) {
final SongResponse currentResponse = SongResponse.of(currentSong, member);
final SongResponse currentResponse = SongResponse.of(currentSong, likedKillingPartIds);
final List<SongResponse> prevResponses = prevSongs.stream()
.map(song -> SongResponse.of(song, member))
.map(song -> SongResponse.of(song, likedKillingPartIds))
.toList();
final List<SongResponse> nextResponses = nextSongs.stream()
.map(song -> SongResponse.of(song, member))
.map(song -> SongResponse.of(song, likedKillingPartIds))
.toList();

return new SongSwipeResponse(prevResponses, currentResponse, nextResponses);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import shook.shook.member.domain.Member;
import shook.shook.song.domain.killingpart.KillingPart;
import shook.shook.song.domain.killingpart.KillingPartLike;
import shook.shook.song.domain.killingpart.repository.dto.SongKillingPartKillingPartLikeCreatedAtDto;

@Repository
public interface KillingPartLikeRepository extends JpaRepository<KillingPartLike, Long> {
Expand All @@ -15,4 +18,18 @@ Optional<KillingPartLike> findByKillingPartAndMember(final KillingPart killingPa
final Member member);

List<KillingPartLike> findAllByMemberAndIsDeleted(final Member member, final boolean isDeleted);

@Query("SELECT s as song, kp as killingPart, kp_like.createdAt as killingPartLikeCreatedAt "
+ "FROM Song s "
+ "LEFT JOIN KillingPart kp ON s = kp.song "
+ "LEFT JOIN KillingPartLike kp_like ON kp = kp_like.killingPart "
+ "WHERE kp_like.member = :member and kp_like.isDeleted = false")
List<SongKillingPartKillingPartLikeCreatedAtDto> findLikedKillingPartAndSongByMember(
@Param("member") final Member member
);

@Query("SELECT kp_like.killingPart.id "
+ "FROM KillingPartLike kp_like "
+ "WHERE kp_like.member=:member and kp_like.isDeleted=false")
List<Long> findLikedKillingPartIdsByMember(@Param("member") final Member member);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package shook.shook.song.domain.killingpart.repository.dto;

import java.time.LocalDateTime;
import shook.shook.song.domain.Song;
import shook.shook.song.domain.killingpart.KillingPart;

public interface SongKillingPartKillingPartLikeCreatedAtDto {

Song getSong();

KillingPart getKillingPart();

LocalDateTime getKillingPartLikeCreatedAt();
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import org.springframework.web.bind.annotation.RestController;
import shook.shook.auth.ui.argumentresolver.Authenticated;
import shook.shook.auth.ui.argumentresolver.MemberInfo;
import shook.shook.song.application.KillingPartService;
import shook.shook.song.application.MyPageService;
import shook.shook.song.application.dto.LikedKillingPartResponse;
import shook.shook.song.ui.openapi.MyPageApi;

Expand All @@ -17,12 +17,12 @@
@RequestMapping("/my-page")
public class MyPageController implements MyPageApi {

private final KillingPartService killingPartService;
private final MyPageService myPageService;

@GetMapping
public ResponseEntity<List<LikedKillingPartResponse>> getMemberLikedKillingParts(
@Authenticated final MemberInfo memberInfo
) {
return ResponseEntity.ok(killingPartService.findLikedKillingPartByMemberId(memberInfo));
return ResponseEntity.ok(myPageService.findLikedKillingPartByMemberId(memberInfo));
}
}
Loading

0 comments on commit ca4a4d4

Please sign in to comment.