From d0b05a0e8fd007fde7c431cdd4581b1a84b3efc8 Mon Sep 17 00:00:00 2001 From: chyun Date: Thu, 23 Jan 2025 04:55:53 +0900 Subject: [PATCH 01/11] =?UTF-8?q?feat=20[#136]=20=EC=B5=9C=EC=8B=A0=20?= =?UTF-8?q?=EA=B3=B5=EC=97=B0=20=EC=A0=95=EB=B3=B4=20DTO=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../facade/dto/response/RecentPerformanceDTO.java | 15 +++++++++++++++ .../dto/response/RecentPerformancesDTO.java | 8 ++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformanceDTO.java create mode 100644 src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java diff --git a/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformanceDTO.java b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformanceDTO.java new file mode 100644 index 0000000..c406ab4 --- /dev/null +++ b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformanceDTO.java @@ -0,0 +1,15 @@ +package org.sopt.confeti.api.performance.facade.dto.response; + +import java.time.LocalDateTime; +import org.sopt.confeti.global.common.constant.PerformanceType; + +public record RecentPerformanceDTO( + long performanceId, + long typeId, + PerformanceType type, + String title, + String subtitle, + LocalDateTime performanceAt, + String posterPath +) { +} diff --git a/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java new file mode 100644 index 0000000..b2536d0 --- /dev/null +++ b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java @@ -0,0 +1,8 @@ +package org.sopt.confeti.api.performance.facade.dto.response; + +import java.util.List; + +public record RecentPerformancesDTO( + List performances +) { +} From a7e61ecdd8670ab889e54d4b211c282d7964b53f Mon Sep 17 00:00:00 2001 From: chyun Date: Thu, 23 Jan 2025 05:28:08 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat=20[#136]=20=EC=B5=9C=EC=8B=A0=20?= =?UTF-8?q?=EA=B3=B5=EC=97=B0=20=EC=A1=B0=ED=9A=8C=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/concert/infra/repository/ConcertRepository.java | 5 +++++ .../domain/festival/infra/repository/FestivalRepository.java | 3 +++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/org/sopt/confeti/domain/concert/infra/repository/ConcertRepository.java b/src/main/java/org/sopt/confeti/domain/concert/infra/repository/ConcertRepository.java index b4add2e..07080f1 100644 --- a/src/main/java/org/sopt/confeti/domain/concert/infra/repository/ConcertRepository.java +++ b/src/main/java/org/sopt/confeti/domain/concert/infra/repository/ConcertRepository.java @@ -1,7 +1,12 @@ package org.sopt.confeti.domain.concert.infra.repository; +import java.time.LocalDateTime; +import java.util.List; import org.sopt.confeti.domain.concert.Concert; +import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.JpaRepository; public interface ConcertRepository extends JpaRepository { + + List findAllByConcertEndAtLessThan(final LocalDateTime localDateTime, PageRequest pageRequest); } diff --git a/src/main/java/org/sopt/confeti/domain/festival/infra/repository/FestivalRepository.java b/src/main/java/org/sopt/confeti/domain/festival/infra/repository/FestivalRepository.java index 2ca8ae6..ccc06c1 100644 --- a/src/main/java/org/sopt/confeti/domain/festival/infra/repository/FestivalRepository.java +++ b/src/main/java/org/sopt/confeti/domain/festival/infra/repository/FestivalRepository.java @@ -1,5 +1,6 @@ package org.sopt.confeti.domain.festival.infra.repository; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import org.sopt.confeti.domain.festival.Festival; @@ -71,4 +72,6 @@ Optional findFestivalCursor( final @Param("userId") long userId, final @Param("festivalId") long festivalId ); + + List findAllByFestivalEndAtLessThan(final LocalDateTime now, final PageRequest pageRequest); } From 9fb149d4a2cd9259454b551f6b46e7efb1f7eb10 Mon Sep 17 00:00:00 2001 From: chyun Date: Thu, 23 Jan 2025 05:28:18 +0900 Subject: [PATCH 03/11] =?UTF-8?q?feat=20[#136]=20=EC=B5=9C=EC=8B=A0=20?= =?UTF-8?q?=EA=B3=B5=EC=97=B0=20=EC=A1=B0=ED=9A=8C=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concert/application/ConcertService.java | 26 +++++++++++++++++++ .../festival/application/FestivalService.java | 22 +++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/confeti/domain/concert/application/ConcertService.java b/src/main/java/org/sopt/confeti/domain/concert/application/ConcertService.java index b081f01..38bd6af 100644 --- a/src/main/java/org/sopt/confeti/domain/concert/application/ConcertService.java +++ b/src/main/java/org/sopt/confeti/domain/concert/application/ConcertService.java @@ -1,11 +1,16 @@ package org.sopt.confeti.domain.concert.application; +import java.time.LocalDateTime; +import java.util.List; import lombok.RequiredArgsConstructor; import org.sopt.confeti.domain.concert.Concert; import org.sopt.confeti.domain.concert.infra.repository.ConcertRepository; import org.sopt.confeti.global.exception.NotFoundException; import org.sopt.confeti.global.message.ErrorMessage; import org.sopt.confeti.global.util.artistsearcher.ArtistResolver; +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; @@ -13,6 +18,9 @@ @RequiredArgsConstructor public class ConcertService { + private static final int INIT_PAGE = 0; + private static final String START_AT_COLUMN = "concertStartAt"; + private final ConcertRepository concertRepository; private final ArtistResolver artistResolver; @@ -40,4 +48,22 @@ public Concert findById(final long concertId) { () -> new NotFoundException(ErrorMessage.NOT_FOUND) ); } + + @Transactional(readOnly = true) + public List getRecentConcerts(final int size) { + return concertRepository.findAllByConcertEndAtLessThan( + LocalDateTime.now(), + getPageRequest(size, getRecentConcertsSort()) + ); + } + + private PageRequest getPageRequest(final int size, final Sort sort) { + return PageRequest.of(INIT_PAGE, size, sort); + } + + private Sort getRecentConcertsSort() { + return Sort.by( + Order.asc(START_AT_COLUMN) + ); + } } diff --git a/src/main/java/org/sopt/confeti/domain/festival/application/FestivalService.java b/src/main/java/org/sopt/confeti/domain/festival/application/FestivalService.java index ff8a378..7fcdf5e 100644 --- a/src/main/java/org/sopt/confeti/domain/festival/application/FestivalService.java +++ b/src/main/java/org/sopt/confeti/domain/festival/application/FestivalService.java @@ -1,6 +1,7 @@ package org.sopt.confeti.domain.festival.application; import jakarta.persistence.EntityManager; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import lombok.RequiredArgsConstructor; @@ -21,9 +22,10 @@ @RequiredArgsConstructor public class FestivalService { + private static final String START_AT_COLUMN = "festivalStartAt"; + private final FestivalRepository festivalRepository; private final ArtistResolver artistResolver; - private final EntityManager em; private static final int INIT_PAGE = 0; private static final String FESTIVAL_TITLE_COLUMN_NAME = "festivalTitle"; @@ -100,4 +102,22 @@ public List findFestivalsUsingCursor( public Optional findFestivalCursor(final long userId, final long festivalId) { return festivalRepository.findFestivalCursor(userId, festivalId); } + + @Transactional(readOnly = true) + public List getRecentFestivals(final int size) { + return festivalRepository.findAllByFestivalEndAtLessThan( + LocalDateTime.now(), + getPageRequest(size, getRecentFestivalsSort()) + ); + } + + private PageRequest getPageRequest(final int size, final Sort sort) { + return PageRequest.of(INIT_PAGE, size, sort); + } + + private Sort getRecentFestivalsSort() { + return Sort.by( + Order.asc(START_AT_COLUMN) + ); + } } From f3adc73422d24b2b3b7f3dc1b7d15e7d2fd66542 Mon Sep 17 00:00:00 2001 From: chyun Date: Thu, 23 Jan 2025 06:06:37 +0900 Subject: [PATCH 04/11] =?UTF-8?q?feat=20[#136]=20=EC=BD=98=EC=84=9C?= =?UTF-8?q?=ED=8A=B8/=ED=8E=98=EC=8A=A4=ED=8B=B0=EB=B2=8C=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EB=94=94=EC=99=80=20=ED=83=80=EC=9E=85=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EA=B3=B5=EC=97=B0=20=EC=95=84=EC=9D=B4=EB=94=94=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD/=EC=9D=91=EB=8B=B5=20DTO=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/GetPerformanceIdRequest.java | 24 +++++++++++++++++++ .../response/GetPerformanceIdResponse.java | 18 ++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/main/java/org/sopt/confeti/domain/view/performance/application/dto/request/GetPerformanceIdRequest.java create mode 100644 src/main/java/org/sopt/confeti/domain/view/performance/application/dto/response/GetPerformanceIdResponse.java diff --git a/src/main/java/org/sopt/confeti/domain/view/performance/application/dto/request/GetPerformanceIdRequest.java b/src/main/java/org/sopt/confeti/domain/view/performance/application/dto/request/GetPerformanceIdRequest.java new file mode 100644 index 0000000..1fc1483 --- /dev/null +++ b/src/main/java/org/sopt/confeti/domain/view/performance/application/dto/request/GetPerformanceIdRequest.java @@ -0,0 +1,24 @@ +package org.sopt.confeti.domain.view.performance.application.dto.request; + +import org.sopt.confeti.domain.concert.Concert; +import org.sopt.confeti.domain.festival.Festival; +import org.sopt.confeti.global.common.constant.PerformanceType; + +public record GetPerformanceIdRequest( + long typeId, + PerformanceType type +) { + public static GetPerformanceIdRequest from(final Festival festival) { + return new GetPerformanceIdRequest( + festival.getId(), + PerformanceType.FESTIVAL + ); + } + + public static GetPerformanceIdRequest from(final Concert concert) { + return new GetPerformanceIdRequest( + concert.getId(), + PerformanceType.CONCERT + ); + } +} diff --git a/src/main/java/org/sopt/confeti/domain/view/performance/application/dto/response/GetPerformanceIdResponse.java b/src/main/java/org/sopt/confeti/domain/view/performance/application/dto/response/GetPerformanceIdResponse.java new file mode 100644 index 0000000..cbe372a --- /dev/null +++ b/src/main/java/org/sopt/confeti/domain/view/performance/application/dto/response/GetPerformanceIdResponse.java @@ -0,0 +1,18 @@ +package org.sopt.confeti.domain.view.performance.application.dto.response; + +import org.sopt.confeti.domain.view.performance.Performance; +import org.sopt.confeti.global.common.constant.PerformanceType; + +public record GetPerformanceIdResponse( + long performanceId, + long typeId, + PerformanceType type +) { + public static GetPerformanceIdResponse from(final Performance performance) { + return new GetPerformanceIdResponse( + performance.getId(), + performance.getTypeId(), + performance.getType() + ); + } +} From bfdeb79f90c084c34556992af9a83627e85b126e Mon Sep 17 00:00:00 2001 From: chyun Date: Thu, 23 Jan 2025 06:07:08 +0900 Subject: [PATCH 05/11] =?UTF-8?q?feat=20[#136]=20=ED=8C=8C=EC=82=AC?= =?UTF-8?q?=EB=93=9C=20=EA=B3=84=EC=B8=B5=EC=97=90=EC=84=9C=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EA=B3=84=EC=B8=B5=20=EC=B5=9C?= =?UTF-8?q?=EC=8B=A0=20=EA=B3=B5=EC=97=B0=20=EA=B0=92=20DTO=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/RecentPerformanceDTO.java | 25 +++++++++++++++++++ .../dto/response/RecentPerformancesDTO.java | 22 ++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformanceDTO.java b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformanceDTO.java index c406ab4..8ae84e2 100644 --- a/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformanceDTO.java +++ b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformanceDTO.java @@ -1,6 +1,8 @@ package org.sopt.confeti.api.performance.facade.dto.response; import java.time.LocalDateTime; +import org.sopt.confeti.domain.concert.Concert; +import org.sopt.confeti.domain.festival.Festival; import org.sopt.confeti.global.common.constant.PerformanceType; public record RecentPerformanceDTO( @@ -12,4 +14,27 @@ public record RecentPerformanceDTO( LocalDateTime performanceAt, String posterPath ) { + public static RecentPerformanceDTO of(final Concert concert, final long performanceId) { + return new RecentPerformanceDTO( + performanceId, + concert.getId(), + PerformanceType.CONCERT, + concert.getConcertTitle(), + concert.getConcertSubtitle(), + concert.getConcertStartAt(), + concert.getConcertPosterPath() + ); + } + + public static RecentPerformanceDTO of(final Festival festival, final long performanceId) { + return new RecentPerformanceDTO( + performanceId, + festival.getId(), + PerformanceType.CONCERT, + festival.getFestivalTitle(), + festival.getFestivalSubtitle(), + festival.getFestivalStartAt(), + festival.getFestivalPosterPath() + ); + } } diff --git a/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java index b2536d0..ce79593 100644 --- a/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java +++ b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java @@ -1,8 +1,30 @@ package org.sopt.confeti.api.performance.facade.dto.response; +import java.util.Comparator; import java.util.List; +import java.util.Map; +import java.util.stream.Stream; +import org.sopt.confeti.domain.concert.Concert; +import org.sopt.confeti.domain.festival.Festival; public record RecentPerformancesDTO( List performances ) { + public static RecentPerformancesDTO of( + final List concerts, final Map concertMapper, + final List festivals, final Map festivalMapper, + final int size + ) { + return new RecentPerformancesDTO( + Stream.concat( + concerts.stream() + .map(concert -> RecentPerformanceDTO.of(concert, concertMapper.get(concert.getId()))), + festivals.stream() + .map(festival -> RecentPerformanceDTO.of(festival, festivalMapper.get(festival.getId()))) + ) + .sorted(Comparator.comparing(RecentPerformanceDTO::performanceAt)) + .limit(size) + .toList() + ); + } } From 80ae3b73fbd749721169377fc09b93e071b12cc0 Mon Sep 17 00:00:00 2001 From: chyun Date: Thu, 23 Jan 2025 06:07:58 +0900 Subject: [PATCH 06/11] =?UTF-8?q?feat=20[#136]=20=EC=BD=98=EC=84=9C?= =?UTF-8?q?=ED=8A=B8/=ED=8E=98=EC=8A=A4=ED=8B=B0=EB=B2=8C=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EB=94=94,=20=EA=B3=B5=EC=97=B0=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EA=B3=B5=EC=97=B0=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EB=94=94=20=EC=A1=B0=ED=9A=8C=ED=95=98=EB=8A=94=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/PerformanceService.java | 14 ++++++++++++++ .../infra/repository/PerformanceRepository.java | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/src/main/java/org/sopt/confeti/domain/view/performance/application/PerformanceService.java b/src/main/java/org/sopt/confeti/domain/view/performance/application/PerformanceService.java index 2070bd0..df4930d 100644 --- a/src/main/java/org/sopt/confeti/domain/view/performance/application/PerformanceService.java +++ b/src/main/java/org/sopt/confeti/domain/view/performance/application/PerformanceService.java @@ -7,6 +7,8 @@ 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.stereotype.Service; @@ -45,4 +47,16 @@ public void create(final Festival festival) { .toList() ); } + + @Transactional(readOnly = true) + public List getPerformanceIds(final List getPerformanceIdRequests) { + List performances = getPerformanceIdRequests.stream() + .map(getPerformanceIdRequest -> performanceRepository.findPerformanceByTypeIdAndType( + getPerformanceIdRequest.typeId(), getPerformanceIdRequest.type() + )).toList(); + + return performances.stream() + .map(GetPerformanceIdResponse::from) + .toList(); + } } \ No newline at end of file diff --git a/src/main/java/org/sopt/confeti/domain/view/performance/infra/repository/PerformanceRepository.java b/src/main/java/org/sopt/confeti/domain/view/performance/infra/repository/PerformanceRepository.java index f9964e2..e48da7e 100644 --- a/src/main/java/org/sopt/confeti/domain/view/performance/infra/repository/PerformanceRepository.java +++ b/src/main/java/org/sopt/confeti/domain/view/performance/infra/repository/PerformanceRepository.java @@ -1,7 +1,11 @@ package org.sopt.confeti.domain.view.performance.infra.repository; +import java.util.List; import org.sopt.confeti.domain.view.performance.Performance; +import org.sopt.confeti.global.common.constant.PerformanceType; import org.springframework.data.jpa.repository.JpaRepository; public interface PerformanceRepository extends JpaRepository { + + Performance findPerformanceByTypeIdAndType(final long typeId, final PerformanceType type); } From 0c623fd2ef44d5ad23f5dd510ad707f83db0a74e Mon Sep 17 00:00:00 2001 From: chyun Date: Thu, 23 Jan 2025 06:08:17 +0900 Subject: [PATCH 07/11] =?UTF-8?q?style=20[#136]=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/view/performance/application/dto/request/.gitkeep | 0 .../domain/view/performance/application/dto/response/.gitkeep | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/org/sopt/confeti/domain/view/performance/application/dto/request/.gitkeep delete mode 100644 src/main/java/org/sopt/confeti/domain/view/performance/application/dto/response/.gitkeep diff --git a/src/main/java/org/sopt/confeti/domain/view/performance/application/dto/request/.gitkeep b/src/main/java/org/sopt/confeti/domain/view/performance/application/dto/request/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/org/sopt/confeti/domain/view/performance/application/dto/response/.gitkeep b/src/main/java/org/sopt/confeti/domain/view/performance/application/dto/response/.gitkeep deleted file mode 100644 index e69de29..0000000 From f15fed64939b7c965aab51bfe74710b782ebefd0 Mon Sep 17 00:00:00 2001 From: chyun Date: Thu, 23 Jan 2025 06:29:54 +0900 Subject: [PATCH 08/11] =?UTF-8?q?feat=20[#136]=20=EC=B5=9C=EC=8B=A0=20?= =?UTF-8?q?=EA=B3=B5=EC=97=B0=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20DTO=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/RecentPerformanceResponse.java | 27 +++++++++++++++++++ .../response/RecentPerformancesResponse.java | 17 ++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/main/java/org/sopt/confeti/api/performance/dto/response/RecentPerformanceResponse.java create mode 100644 src/main/java/org/sopt/confeti/api/performance/dto/response/RecentPerformancesResponse.java diff --git a/src/main/java/org/sopt/confeti/api/performance/dto/response/RecentPerformanceResponse.java b/src/main/java/org/sopt/confeti/api/performance/dto/response/RecentPerformanceResponse.java new file mode 100644 index 0000000..20f92cf --- /dev/null +++ b/src/main/java/org/sopt/confeti/api/performance/dto/response/RecentPerformanceResponse.java @@ -0,0 +1,27 @@ +package org.sopt.confeti.api.performance.dto.response; + +import org.sopt.confeti.api.performance.facade.dto.response.RecentPerformanceDTO; +import org.sopt.confeti.global.util.DateConvertor; +import org.sopt.confeti.global.util.S3FileHandler; + +public record RecentPerformanceResponse( + long performanceId, + long typeId, + String type, + String title, + String subtitle, + String performanceAt, + String posterUrl +) { + public static RecentPerformanceResponse of(final RecentPerformanceDTO recentPerformanceDTO, final S3FileHandler s3FileHandler) { + return new RecentPerformanceResponse( + recentPerformanceDTO.performanceId(), + recentPerformanceDTO.typeId(), + recentPerformanceDTO.type().getType(), + recentPerformanceDTO.title(), + recentPerformanceDTO.subtitle(), + DateConvertor.convertToLocalDate(recentPerformanceDTO.performanceAt()), + s3FileHandler.getFileUrl(recentPerformanceDTO.posterPath()) + ); + } +} diff --git a/src/main/java/org/sopt/confeti/api/performance/dto/response/RecentPerformancesResponse.java b/src/main/java/org/sopt/confeti/api/performance/dto/response/RecentPerformancesResponse.java new file mode 100644 index 0000000..ae0d004 --- /dev/null +++ b/src/main/java/org/sopt/confeti/api/performance/dto/response/RecentPerformancesResponse.java @@ -0,0 +1,17 @@ +package org.sopt.confeti.api.performance.dto.response; + +import java.util.List; +import org.sopt.confeti.api.performance.facade.dto.response.RecentPerformancesDTO; +import org.sopt.confeti.global.util.S3FileHandler; + +public record RecentPerformancesResponse( + List performances +) { + public static RecentPerformancesResponse of(final RecentPerformancesDTO recentPerformancesDTO, final S3FileHandler s3FileHandler) { + return new RecentPerformancesResponse( + recentPerformancesDTO.performances().stream() + .map(recentPerformanceDTO -> RecentPerformanceResponse.of(recentPerformanceDTO, s3FileHandler)) + .toList() + ); + } +} From 257dc551c62e71dd864b1b5bd3d641c3ab284a71 Mon Sep 17 00:00:00 2001 From: chyun Date: Thu, 23 Jan 2025 06:30:41 +0900 Subject: [PATCH 09/11] =?UTF-8?q?feat=20[#136]=20=ED=8C=8C=EC=82=AC?= =?UTF-8?q?=EB=93=9C=20=EA=B3=84=EC=B8=B5=20=EC=B5=9C=EC=8B=A0=20=EA=B3=B5?= =?UTF-8?q?=EC=97=B0=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20DTO=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/RecentPerformancesDTO.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java index ce79593..f4235b3 100644 --- a/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java +++ b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java @@ -1,8 +1,7 @@ package org.sopt.confeti.api.performance.facade.dto.response; -import java.util.Comparator; import java.util.List; -import java.util.Map; +import java.util.stream.IntStream; import java.util.stream.Stream; import org.sopt.confeti.domain.concert.Concert; import org.sopt.confeti.domain.festival.Festival; @@ -11,20 +10,16 @@ public record RecentPerformancesDTO( List performances ) { public static RecentPerformancesDTO of( - final List concerts, final Map concertMapper, - final List festivals, final Map festivalMapper, - final int size + List concerts, + List festivals ) { return new RecentPerformancesDTO( Stream.concat( - concerts.stream() - .map(concert -> RecentPerformanceDTO.of(concert, concertMapper.get(concert.getId()))), - festivals.stream() - .map(festival -> RecentPerformanceDTO.of(festival, festivalMapper.get(festival.getId()))) - ) - .sorted(Comparator.comparing(RecentPerformanceDTO::performanceAt)) - .limit(size) - .toList() + IntStream.range(0, concerts.size()) + .mapToObj(i -> RecentPerformanceDTO.of(concerts.get(i), i)), + IntStream.range(concerts.size(), festivals.size()) + .mapToObj(i -> RecentPerformanceDTO.of(festivals.get(i), i)) + ).toList() ); } } From bc7ff6708e5035941155fb758e4eb8dde6f65038 Mon Sep 17 00:00:00 2001 From: chyun Date: Thu, 23 Jan 2025 06:30:58 +0900 Subject: [PATCH 10/11] =?UTF-8?q?feat=20[#136]=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94=20=EC=A0=95=EB=B3=B4=20=EC=97=86=EC=9D=84=20=EB=95=8C?= =?UTF-8?q?=20=EC=B5=9C=EC=8B=A0=20=EA=B3=B5=EC=97=B0=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PerformanceController.java | 10 +++++ .../performance/facade/PerformanceFacade.java | 38 +++++++++++++++++++ .../concert/application/ConcertService.java | 2 +- .../infra/repository/ConcertRepository.java | 2 +- .../festival/application/FestivalService.java | 2 +- .../infra/repository/FestivalRepository.java | 2 +- 6 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/sopt/confeti/api/performance/controller/PerformanceController.java b/src/main/java/org/sopt/confeti/api/performance/controller/PerformanceController.java index de14b0b..13d6124 100644 --- a/src/main/java/org/sopt/confeti/api/performance/controller/PerformanceController.java +++ b/src/main/java/org/sopt/confeti/api/performance/controller/PerformanceController.java @@ -5,12 +5,14 @@ import org.sopt.confeti.api.performance.dto.request.CreateFestivalRequest; import org.sopt.confeti.api.performance.dto.response.ConcertDetailResponse; import org.sopt.confeti.api.performance.dto.response.FestivalDetailResponse; +import org.sopt.confeti.api.performance.dto.response.RecentPerformancesResponse; import org.sopt.confeti.api.performance.facade.PerformanceFacade; import org.sopt.confeti.api.performance.facade.dto.request.CreateFestivalDTO; import org.sopt.confeti.api.performance.facade.dto.response.ConcertDetailDTO; import org.sopt.confeti.api.performance.facade.dto.response.FestivalDetailDTO; import org.sopt.confeti.api.performance.dto.response.PerformanceReservationResponse; import org.sopt.confeti.api.performance.facade.dto.response.PerformanceReservationDTO; +import org.sopt.confeti.api.performance.facade.dto.response.RecentPerformancesDTO; import org.sopt.confeti.global.common.BaseResponse; import org.sopt.confeti.global.message.SuccessMessage; import org.sopt.confeti.global.util.ApiResponseUtil; @@ -63,4 +65,12 @@ public ResponseEntity> getPerformReservationInfo(@RequestHeader( PerformanceReservationDTO performanceReservationDTO = performanceFacade.getPerformReservationInfo(userId); return ApiResponseUtil.success(SuccessMessage.SUCCESS, PerformanceReservationResponse.of(performanceReservationDTO, s3FileHandler)); } + + @GetMapping("/info") + public ResponseEntity> getRecentPerformances( + @RequestHeader(name = "Authorization", required = false) Long userId + ) { + RecentPerformancesDTO recentPerformances = performanceFacade.getRecentPerformances(userId); + return ApiResponseUtil.success(SuccessMessage.SUCCESS, RecentPerformancesResponse.of(recentPerformances, s3FileHandler)); + } } diff --git a/src/main/java/org/sopt/confeti/api/performance/facade/PerformanceFacade.java b/src/main/java/org/sopt/confeti/api/performance/facade/PerformanceFacade.java index 9393d7d..7519036 100644 --- a/src/main/java/org/sopt/confeti/api/performance/facade/PerformanceFacade.java +++ b/src/main/java/org/sopt/confeti/api/performance/facade/PerformanceFacade.java @@ -3,12 +3,16 @@ import java.time.LocalDateTime; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import lombok.RequiredArgsConstructor; import org.sopt.confeti.annotation.Facade; import org.sopt.confeti.api.performance.facade.dto.request.CreateFestivalDTO; import org.sopt.confeti.api.performance.facade.dto.response.ConcertDetailDTO; 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.concert.Concert; import org.sopt.confeti.domain.concert.application.ConcertService; import org.sopt.confeti.domain.concertfavorite.application.ConcertFavoriteService; @@ -18,6 +22,9 @@ import org.sopt.confeti.domain.user.application.UserService; 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; +import org.sopt.confeti.domain.view.performance.application.dto.response.GetPerformanceIdResponse; +import org.sopt.confeti.global.common.constant.PerformanceType; import org.sopt.confeti.global.exception.NotFoundException; import org.sopt.confeti.global.message.ErrorMessage; import org.sopt.confeti.global.util.S3FileHandler; @@ -27,6 +34,8 @@ @RequiredArgsConstructor public class PerformanceFacade { + private static final int RECENT_PERFORMANCES_SIZE = 7; + private final ConcertService concertService; private final FestivalService festivalService; private final UserService userService; @@ -105,4 +114,33 @@ public PerformanceReservationDTO getPerformReservationInfo(final Long userId){ List performanceReserve=performanceService.getPerformancesReservation(); return PerformanceReservationDTO.from(performanceReserve); } + + @Transactional(readOnly = true) + public RecentPerformancesDTO getRecentPerformances(final Long userId) { + if (userId == null || (!hasFavoriteFestivals(userId) && !hasFavoriteConcerts(userId))) { + return getRecentPerformancesWithoutFavorites(); + } + return null; + } + + @Transactional(readOnly = true) + public RecentPerformancesDTO getRecentPerformancesWithoutFavorites() { + // 최신 콘서트 조회 + List concerts = concertService.getRecentConcerts(RECENT_PERFORMANCES_SIZE); + + // 최신 페스티벌 조회 + List festivals = festivalService.getRecentFestivals(RECENT_PERFORMANCES_SIZE); + + return RecentPerformancesDTO.of(concerts, festivals); + } + + @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); + } } diff --git a/src/main/java/org/sopt/confeti/domain/concert/application/ConcertService.java b/src/main/java/org/sopt/confeti/domain/concert/application/ConcertService.java index 38bd6af..342f711 100644 --- a/src/main/java/org/sopt/confeti/domain/concert/application/ConcertService.java +++ b/src/main/java/org/sopt/confeti/domain/concert/application/ConcertService.java @@ -51,7 +51,7 @@ public Concert findById(final long concertId) { @Transactional(readOnly = true) public List getRecentConcerts(final int size) { - return concertRepository.findAllByConcertEndAtLessThan( + return concertRepository.findAllByConcertEndAtGreaterThanEqual( LocalDateTime.now(), getPageRequest(size, getRecentConcertsSort()) ); diff --git a/src/main/java/org/sopt/confeti/domain/concert/infra/repository/ConcertRepository.java b/src/main/java/org/sopt/confeti/domain/concert/infra/repository/ConcertRepository.java index 07080f1..fbce496 100644 --- a/src/main/java/org/sopt/confeti/domain/concert/infra/repository/ConcertRepository.java +++ b/src/main/java/org/sopt/confeti/domain/concert/infra/repository/ConcertRepository.java @@ -8,5 +8,5 @@ public interface ConcertRepository extends JpaRepository { - List findAllByConcertEndAtLessThan(final LocalDateTime localDateTime, PageRequest pageRequest); + List findAllByConcertEndAtGreaterThanEqual(final LocalDateTime localDateTime, PageRequest pageRequest); } diff --git a/src/main/java/org/sopt/confeti/domain/festival/application/FestivalService.java b/src/main/java/org/sopt/confeti/domain/festival/application/FestivalService.java index 7fcdf5e..d942853 100644 --- a/src/main/java/org/sopt/confeti/domain/festival/application/FestivalService.java +++ b/src/main/java/org/sopt/confeti/domain/festival/application/FestivalService.java @@ -105,7 +105,7 @@ public Optional findFestivalCursor(final long userId, final l @Transactional(readOnly = true) public List getRecentFestivals(final int size) { - return festivalRepository.findAllByFestivalEndAtLessThan( + return festivalRepository.findAllByFestivalEndAtGreaterThanEqual( LocalDateTime.now(), getPageRequest(size, getRecentFestivalsSort()) ); diff --git a/src/main/java/org/sopt/confeti/domain/festival/infra/repository/FestivalRepository.java b/src/main/java/org/sopt/confeti/domain/festival/infra/repository/FestivalRepository.java index ccc06c1..4c83b4d 100644 --- a/src/main/java/org/sopt/confeti/domain/festival/infra/repository/FestivalRepository.java +++ b/src/main/java/org/sopt/confeti/domain/festival/infra/repository/FestivalRepository.java @@ -73,5 +73,5 @@ Optional findFestivalCursor( final @Param("festivalId") long festivalId ); - List findAllByFestivalEndAtLessThan(final LocalDateTime now, final PageRequest pageRequest); + List findAllByFestivalEndAtGreaterThanEqual(final LocalDateTime now, final PageRequest pageRequest); } From 291ce0778de27f686381254598563bc1379d1954 Mon Sep 17 00:00:00 2001 From: chyun Date: Thu, 23 Jan 2025 15:17:24 +0900 Subject: [PATCH 11/11] =?UTF-8?q?feat=20[#136]=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94=20=EC=A0=95=EB=B3=B4=20=EC=9E=88=EB=8A=94=20=EB=95=8C?= =?UTF-8?q?=20=EC=B5=9C=EC=8B=A0=20=EA=B3=B5=EC=97=B0=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../performance/facade/PerformanceFacade.java | 33 ++++++++++++----- .../dto/response/RecentPerformanceDTO.java | 13 +++++++ .../dto/response/RecentPerformancesDTO.java | 9 +++++ .../application/ArtistFavoriteService.java | 5 +++ .../repository/ArtistFavoriteRepository.java | 2 ++ .../application/PerformanceService.java | 35 ++++++++++++------- .../repository/PerformanceRepository.java | 8 ++++- 7 files changed, 83 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/sopt/confeti/api/performance/facade/PerformanceFacade.java b/src/main/java/org/sopt/confeti/api/performance/facade/PerformanceFacade.java index 7519036..6ac3d73 100644 --- a/src/main/java/org/sopt/confeti/api/performance/facade/PerformanceFacade.java +++ b/src/main/java/org/sopt/confeti/api/performance/facade/PerformanceFacade.java @@ -13,6 +13,8 @@ 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; @@ -20,6 +22,7 @@ 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; @@ -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 @@ -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) { @@ -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 artistFavorites = artistFavoriteService.getArtistList(userId); + + return RecentPerformancesDTO.from( + performanceService.getPerformancesByArtistIds( + artistFavorites.stream() + .map(artistFavorite -> artistFavorite.getArtist().getArtistId()) + .toList(), + RECENT_PERFORMANCES_SIZE + ) + ); } @Transactional(readOnly = true) @@ -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); } } diff --git a/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformanceDTO.java b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformanceDTO.java index 8ae84e2..873b899 100644 --- a/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformanceDTO.java +++ b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformanceDTO.java @@ -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( @@ -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() + ); + } } diff --git a/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java index f4235b3..cccb9c3 100644 --- a/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java +++ b/src/main/java/org/sopt/confeti/api/performance/facade/dto/response/RecentPerformancesDTO.java @@ -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 performances @@ -22,4 +23,12 @@ public static RecentPerformancesDTO of( ).toList() ); } + + public static RecentPerformancesDTO from(final List performances) { + return new RecentPerformancesDTO( + performances.stream() + .map(RecentPerformanceDTO::from) + .toList() + ); + } } diff --git a/src/main/java/org/sopt/confeti/domain/artistfavorite/application/ArtistFavoriteService.java b/src/main/java/org/sopt/confeti/domain/artistfavorite/application/ArtistFavoriteService.java index ab62bfa..6de51d8 100644 --- a/src/main/java/org/sopt/confeti/domain/artistfavorite/application/ArtistFavoriteService.java +++ b/src/main/java/org/sopt/confeti/domain/artistfavorite/application/ArtistFavoriteService.java @@ -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); + } } diff --git a/src/main/java/org/sopt/confeti/domain/artistfavorite/infra/repository/ArtistFavoriteRepository.java b/src/main/java/org/sopt/confeti/domain/artistfavorite/infra/repository/ArtistFavoriteRepository.java index 60e099f..6452662 100644 --- a/src/main/java/org/sopt/confeti/domain/artistfavorite/infra/repository/ArtistFavoriteRepository.java +++ b/src/main/java/org/sopt/confeti/domain/artistfavorite/infra/repository/ArtistFavoriteRepository.java @@ -14,4 +14,6 @@ public interface ArtistFavoriteRepository extends JpaRepository getPerformanceIds(final List getPerformanceIdRequests) { - List performances = getPerformanceIdRequests.stream() - .map(getPerformanceIdRequest -> performanceRepository.findPerformanceByTypeIdAndType( - getPerformanceIdRequest.typeId(), getPerformanceIdRequest.type() - )).toList(); - - return performances.stream() - .map(GetPerformanceIdResponse::from) - .toList(); + public List getPerformancesByArtistIds(final List 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) + ); } } \ No newline at end of file diff --git a/src/main/java/org/sopt/confeti/domain/view/performance/infra/repository/PerformanceRepository.java b/src/main/java/org/sopt/confeti/domain/view/performance/infra/repository/PerformanceRepository.java index e48da7e..7579b1b 100644 --- a/src/main/java/org/sopt/confeti/domain/view/performance/infra/repository/PerformanceRepository.java +++ b/src/main/java/org/sopt/confeti/domain/view/performance/infra/repository/PerformanceRepository.java @@ -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 findPerformanceByTypeIdAndType(final long typeId, final PerformanceType type); + List findPerformancesByArtistIdInAndEndAtGreaterThanEqual( + final List artistIds, + final LocalDateTime now, + final PageRequest pageRequest + ); }