Skip to content

Commit

Permalink
feat [#136] 좋아요 정보 있는 때 최신 공연 정보 조회 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
ch1hyun committed Jan 23, 2025
1 parent 3b76b4f commit 91574a0
Show file tree
Hide file tree
Showing 7 changed files with 83 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,16 @@
import org.sopt.confeti.api.performance.facade.dto.response.FestivalDetailDTO;
import org.sopt.confeti.api.performance.facade.dto.response.PerformanceReservationDTO;
import org.sopt.confeti.api.performance.facade.dto.response.RecentPerformancesDTO;
import org.sopt.confeti.domain.artistfavorite.ArtistFavorite;
import org.sopt.confeti.domain.artistfavorite.application.ArtistFavoriteService;
import org.sopt.confeti.domain.concert.Concert;
import org.sopt.confeti.domain.concert.application.ConcertService;
import org.sopt.confeti.domain.concertfavorite.application.ConcertFavoriteService;
import org.sopt.confeti.domain.festival.Festival;
import org.sopt.confeti.domain.festival.application.FestivalService;
import org.sopt.confeti.domain.festivalfavorite.application.FestivalFavoriteService;
import org.sopt.confeti.domain.user.application.UserService;
import org.sopt.confeti.domain.view.performance.Performance;
import org.sopt.confeti.domain.view.performance.PerformanceTicketDTO;
import org.sopt.confeti.domain.view.performance.application.PerformanceService;
import org.sopt.confeti.domain.view.performance.application.dto.request.GetPerformanceIdRequest;
Expand All @@ -28,6 +31,7 @@
import org.sopt.confeti.global.exception.NotFoundException;
import org.sopt.confeti.global.message.ErrorMessage;
import org.sopt.confeti.global.util.S3FileHandler;
import org.sopt.confeti.global.util.artistsearcher.ConfetiArtist;
import org.springframework.transaction.annotation.Transactional;

@Facade
Expand All @@ -43,6 +47,7 @@ public class PerformanceFacade {
private final S3FileHandler s3FileHandler;
private final PerformanceService performanceService;
private final ConcertFavoriteService concertFavoriteService;
private final ArtistFavoriteService artistFavoriteService;

@Transactional(readOnly = true)
public ConcertDetailDTO getConcertDetailInfo(final Long userId, final long concertId) {
Expand Down Expand Up @@ -117,10 +122,25 @@ public PerformanceReservationDTO getPerformReservationInfo(final Long userId){

@Transactional(readOnly = true)
public RecentPerformancesDTO getRecentPerformances(final Long userId) {
if (userId == null || (!hasFavoriteFestivals(userId) && !hasFavoriteConcerts(userId))) {
if (userId == null || !hasFavoriteArtists(userId)) {
return getRecentPerformancesWithoutFavorites();
}
return null;

return getRecentPerformancesWithFavorites(userId);
}

@Transactional(readOnly = true)
public RecentPerformancesDTO getRecentPerformancesWithFavorites(final long userId) {
List<ArtistFavorite> artistFavorites = artistFavoriteService.getArtistList(userId);

return RecentPerformancesDTO.from(
performanceService.getPerformancesByArtistIds(
artistFavorites.stream()
.map(artistFavorite -> artistFavorite.getArtist().getArtistId())
.toList(),
RECENT_PERFORMANCES_SIZE
)
);
}

@Transactional(readOnly = true)
Expand All @@ -135,12 +155,7 @@ public RecentPerformancesDTO getRecentPerformancesWithoutFavorites() {
}

@Transactional(readOnly = true)
public boolean hasFavoriteFestivals(final long userId) {
return festivalFavoriteService.existsByUserId(userId);
}

@Transactional(readOnly = true)
public boolean hasFavoriteConcerts(final long userId) {
return concertFavoriteService.existsByUserId(userId);
public boolean hasFavoriteArtists(final long userId) {
return artistFavoriteService.existsByUserId(userId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.time.LocalDateTime;
import org.sopt.confeti.domain.concert.Concert;
import org.sopt.confeti.domain.festival.Festival;
import org.sopt.confeti.domain.view.performance.Performance;
import org.sopt.confeti.global.common.constant.PerformanceType;

public record RecentPerformanceDTO(
Expand Down Expand Up @@ -37,4 +38,16 @@ public static RecentPerformanceDTO of(final Festival festival, final long perfor
festival.getFestivalPosterPath()
);
}

public static RecentPerformanceDTO from(final Performance performance) {
return new RecentPerformanceDTO(
performance.getId(),
performance.getTypeId(),
performance.getType(),
performance.getTitle(),
performance.getSubtitle(),
performance.getStartAt(),
performance.getPosterPath()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.util.stream.Stream;
import org.sopt.confeti.domain.concert.Concert;
import org.sopt.confeti.domain.festival.Festival;
import org.sopt.confeti.domain.view.performance.Performance;

public record RecentPerformancesDTO(
List<RecentPerformanceDTO> performances
Expand All @@ -22,4 +23,12 @@ public static RecentPerformancesDTO of(
).toList()
);
}

public static RecentPerformancesDTO from(final List<Performance> performances) {
return new RecentPerformancesDTO(
performances.stream()
.map(RecentPerformanceDTO::from)
.toList()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,9 @@ public void addFavorite(final User user, final String artistId) {
public void removeFavorite(final long userId, final String artistId) {
artistFavoriteRepository.deleteByUserIdAndArtist_ArtistId(userId, artistId);
}

@Transactional(readOnly = true)
public boolean existsByUserId(final long userId) {
return artistFavoriteRepository.existsByUserId(userId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,6 @@ public interface ArtistFavoriteRepository extends JpaRepository<ArtistFavorite,
boolean existsByUserIdAndArtist_ArtistId(long userId, String artistId);

void deleteByUserIdAndArtist_ArtistId(final long userId, final String artistId);

boolean existsByUserId(final long userId);
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,27 @@
package org.sopt.confeti.domain.view.performance.application;

import java.time.LocalDateTime;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.sopt.confeti.api.performance.facade.dto.request.CreateFestivalDTO;
import org.sopt.confeti.domain.festival.Festival;
import org.sopt.confeti.domain.view.performance.Performance;
import org.sopt.confeti.domain.view.performance.PerformanceDTO;
import org.sopt.confeti.domain.view.performance.PerformanceTicketDTO;
import org.sopt.confeti.domain.view.performance.application.dto.request.GetPerformanceIdRequest;
import org.sopt.confeti.domain.view.performance.application.dto.response.GetPerformanceIdResponse;
import org.sopt.confeti.domain.view.performance.infra.repository.PerformanceDTORepository;
import org.sopt.confeti.domain.view.performance.infra.repository.PerformanceRepository;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Order;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class PerformanceService {

private static final int INIT_PAGE = 0;
private static final String START_AT_COLUMN = "startAt";

private final PerformanceDTORepository performanceDTORepository;
private final PerformanceRepository performanceRepository;

Expand Down Expand Up @@ -49,14 +53,21 @@ public void create(final Festival festival) {
}

@Transactional(readOnly = true)
public List<GetPerformanceIdResponse> getPerformanceIds(final List<GetPerformanceIdRequest> getPerformanceIdRequests) {
List<Performance> performances = getPerformanceIdRequests.stream()
.map(getPerformanceIdRequest -> performanceRepository.findPerformanceByTypeIdAndType(
getPerformanceIdRequest.typeId(), getPerformanceIdRequest.type()
)).toList();

return performances.stream()
.map(GetPerformanceIdResponse::from)
.toList();
public List<Performance> getPerformancesByArtistIds(final List<String> artistIds, final int size) {
return performanceRepository.findPerformancesByArtistIdInAndEndAtGreaterThanEqual(
artistIds,
LocalDateTime.now(),
getPageRequest(size, getRecentPerformancesSort())
);
}

private PageRequest getPageRequest(final int size, final Sort sort) {
return PageRequest.of(INIT_PAGE, size, sort);
}

private Sort getRecentPerformancesSort() {
return Sort.by(
Order.asc(START_AT_COLUMN)
);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
package org.sopt.confeti.domain.view.performance.infra.repository;

import java.time.LocalDateTime;
import java.util.List;
import org.sopt.confeti.domain.view.performance.Performance;
import org.sopt.confeti.global.common.constant.PerformanceType;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PerformanceRepository extends JpaRepository<Performance, Long> {

Performance findPerformanceByTypeIdAndType(final long typeId, final PerformanceType type);
List<Performance> findPerformancesByArtistIdInAndEndAtGreaterThanEqual(
final List<String> artistIds,
final LocalDateTime now,
final PageRequest pageRequest
);
}

0 comments on commit 91574a0

Please sign in to comment.