Skip to content

Commit

Permalink
refactor [#41] 코드리뷰 반영
Browse files Browse the repository at this point in the history
  • Loading branch information
Ivoryeee committed Jan 21, 2025
1 parent a23b152 commit b27c5e7
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 59 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.sopt.confeti.api.performance.facade.dto.response.PerformanceReservationDTO;
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;
Expand All @@ -32,6 +33,7 @@ public class PerformanceFacade {
private final FestivalFavoriteService festivalFavoriteService;
private final S3FileHandler s3FileHandler;
private final PerformanceService performanceService;
private final ConcertFavoriteService concertFavoriteService;

@Transactional(readOnly = true)
public ConcertDetailDTO getConcertDetailInfo(final long concertId) {
Expand Down Expand Up @@ -81,7 +83,16 @@ protected void validateFestivalNotPassed(final Festival festival) {

@Transactional(readOnly = true)
public PerformanceReservationDTO getPerformReservationInfo(final Long userId){
List<PerformanceTicketDTO> performanceReserve=performanceService.getFavoritePerformancesReservation(userId);
boolean isUserExist = userId != null && userService.existsById(userId);
boolean isCFExist = isUserExist && concertFavoriteService.existsByUserId(userId);
boolean isFFExist = isUserExist && festivalFavoriteService.existsByUserId(userId);

if (isCFExist || isFFExist) {
List<PerformanceTicketDTO> performanceReserve=performanceService.getFavoritePerformancesReservation(userId);
return PerformanceReservationDTO.from(performanceReserve);
}

List<PerformanceTicketDTO> performanceReserve=performanceService.getPerformancesReservation();
return PerformanceReservationDTO.from(performanceReserve);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,9 @@ public void addFavorite(final User user, final Concert concert) {
public void removeFavorite(final long userId, final long concertId) {
concertFavoriteRepository.deleteByUserIdAndConcertId(userId, concertId);
}

@Transactional
public boolean existsByUserId(final Long userId){
return concertFavoriteRepository.existsByUserId(userId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
public interface ConcertFavoriteRepository extends JpaRepository<ConcertFavorite, Long> {
boolean existsByUserIdAndConcertId(final long userId, final long concertId);
void deleteByUserIdAndConcertId(final long userId, final long concertId);
boolean existsByUserId(final Long userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,8 @@ public void delete(User user, Festival festival) {
public boolean isFavorite(final long userId, final long festivalId) {
return festivalFavoriteRepository.existsByUserIdAndFestivalId(userId, festivalId);
}

public boolean existsByUserId(final Long userId) {
return festivalFavoriteRepository.existsByUserId(userId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ public interface FestivalFavoriteRepository extends JpaRepository<FestivalFavori
Optional<FestivalFavorite> findByUserIdAndFestivalId(long userId, long festivalId);

boolean existsByUserIdAndFestivalId(long userId, long festivalId);
boolean existsByUserId(Long userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,9 @@ public List<PerformanceDTO> getFavoritePerformancesPreview(final long userId) {
public List<PerformanceTicketDTO> getFavoritePerformancesReservation(final Long userId) {
return performanceRepository.findFavoritePerformancesReservation(userId);
}

@Transactional(readOnly = true)
public List<PerformanceTicketDTO> getPerformancesReservation() {
return performanceRepository.findPerformancesReservation();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ public class PerformanceRepository {

private final EntityManager em;

int PREVIEW_FAVORITE_PERFORMANCE_COUNT = 3;
int RESERVE_FAVORITE_PERFORMANCE_COUNT = 5;
private static final int PREVIEW_FAVORITE_PERFORMANCE_COUNT = 3;
private static final int RESERVE_FAVORITE_PERFORMANCE_COUNT = 5;

public List<PerformanceDTO> findFavoritePerformancesPreview(final Long userId) {
String sql =
Expand Down Expand Up @@ -53,84 +53,56 @@ private List<PerformanceDTO> convertToPerformanceDTOs(final List<Object[]> resul
}

public List<PerformanceTicketDTO> findFavoritePerformancesReservation(final Long userId) {
String sql;
boolean isUserIdValid = userId != null && userId > 0;

if (!isUserIdValid) {
sql = getAllPerformancesQuery();
} else {
boolean hasFavorites = checkUserHasFavorites(userId);
sql = hasFavorites ? getFavoritePerformancesQuery() : getAllPerformancesQuery();
}
String sql = """
SELECT ROW_NUMBER() OVER (ORDER BY reserve_at ASC) AS ind, performance_id, type, subtitle, reserve_at, reservation_bg_url
FROM (
SELECT c.concert_id performance_id, :concertType type, c.concert_subtitle subtitle, c.reserve_at, c.concert_reservation_bg_path reservation_bg_url
FROM concert_favorites cf
JOIN concerts c ON cf.concert_id = c.concert_id
WHERE cf.user_id = :userId AND c.reserve_at >= CURRENT_DATE
UNION ALL
SELECT f.festival_id performance_id, :festivalType type, f.festival_subtitle subtitle, f.reserve_at, f.festival_reservation_bg_path reservation_bg_url
FROM festival_favorites ff
JOIN festivals f ON ff.festival_id = f.festival_id
WHERE ff.user_id = :userId AND f.reserve_at >= CURRENT_DATE
) AS favorite_performances
ORDER BY reserve_at ASC
LIMIT :performanceReservationCount
""";;

Query query = em.createNativeQuery(sql)
.setParameter("userId", userId)
.setParameter("concertType", PerformanceType.CONCERT.getType())
.setParameter("festivalType", PerformanceType.FESTIVAL.getType())
.setParameter("performanceReservationCount", RESERVE_FAVORITE_PERFORMANCE_COUNT);

if (isUserIdValid && sql.contains(":userId")) {
query.setParameter("userId", userId);
}

List<Object[]> results = query.getResultList();
return convertToPerformanceTicketDTOs(results);
}

private boolean checkUserHasFavorites(Long userId) {
String checkFavoritesQuery = """
SELECT COUNT(*) > 0
FROM (
SELECT 1 FROM concert_favorites cf
JOIN concerts c ON cf.concert_id = c.concert_id
WHERE cf.user_id = ?1 AND c.reserve_at >= CURRENT_DATE
UNION ALL
SELECT 1 FROM festival_favorites ff
JOIN festivals f ON ff.festival_id = f.festival_id
WHERE ff.user_id = ?1 AND f.reserve_at >= CURRENT_DATE
LIMIT 1
) AS favorites
""";

Query checkQuery = em.createNativeQuery(checkFavoritesQuery)
.setParameter(1, userId);

return ((Number) checkQuery.getSingleResult()).intValue() > 0;
}

private String getAllPerformancesQuery() {
return """
public List<PerformanceTicketDTO> findPerformancesReservation() {
String sql = """
SELECT ROW_NUMBER() OVER (ORDER BY reserve_at ASC) AS ind, performance_id, type, subtitle, reserve_at, reservation_bg_url
FROM (
SELECT c.concert_id AS performance_id, :concertType AS type, c.concert_subtitle AS subtitle, c.reserve_at, c.concert_reservation_bg_path AS reservation_bg_url
SELECT c.concert_id performance_id, :concertType type, c.concert_subtitle subtitle, c.reserve_at, c.concert_reservation_bg_path reservation_bg_url
FROM concerts c
WHERE c.reserve_at >= CURRENT_DATE
UNION ALL
SELECT f.festival_id, :festivalType, f.festival_subtitle, f.reserve_at, f.festival_reservation_bg_path
SELECT f.festival_id performance_id, :festivalType type, f.festival_subtitle subtitle, f.reserve_at, f.festival_reservation_bg_path reservation_bg_url
FROM festivals f
WHERE f.reserve_at >= CURRENT_DATE
) AS all_performances
ORDER BY reserve_at ASC
LIMIT :performanceReservationCount
""";
}

private String getFavoritePerformancesQuery() {
return """
SELECT ROW_NUMBER() OVER (ORDER BY reserve_at ASC) AS ind, performance_id, type, subtitle, reserve_at, reservation_bg_url
FROM (
SELECT c.concert_id AS performance_id, :concertType AS type, c.concert_subtitle AS subtitle, c.reserve_at, c.concert_reservation_bg_path AS reservation_bg_url
FROM concert_favorites cf
JOIN concerts c ON cf.concert_id = c.concert_id
WHERE cf.user_id = :userId AND c.reserve_at >= CURRENT_DATE
UNION ALL
SELECT f.festival_id, :festivalType, f.festival_subtitle, f.reserve_at, f.festival_reservation_bg_path
FROM festival_favorites ff
JOIN festivals f ON ff.festival_id = f.festival_id
WHERE ff.user_id = :userId AND f.reserve_at >= CURRENT_DATE
) AS favorite_performances
ORDER BY reserve_at ASC
LIMIT :performanceReservationCount
""";
Query query = em.createNativeQuery(sql)
.setParameter("concertType", PerformanceType.CONCERT.getType())
.setParameter("festivalType", PerformanceType.FESTIVAL.getType())
.setParameter("performanceReservationCount", RESERVE_FAVORITE_PERFORMANCE_COUNT);

List<Object[]> results = query.getResultList();
return convertToPerformanceTicketDTOs(results);
}

private List<PerformanceTicketDTO> convertToPerformanceTicketDTOs(List<Object[]> results) {
Expand Down

0 comments on commit b27c5e7

Please sign in to comment.